diff --git a/.github/workflows/maven.yml b/.github/workflows/maven.yml new file mode 100644 index 000000000..77c087bb6 --- /dev/null +++ b/.github/workflows/maven.yml @@ -0,0 +1,52 @@ +# This workflow automatically tests new commits and pull requests as they come in. +# Note that this does not upload any artifacts, you will need to compile mcMMO manually +# if you wish to create the actual jar. +name: Compile and test + +on: + # We run our tests whenever the pom or a source file was touched. + # There is no need to run Maven when only the changelog was touched. + # We may also want to re-run this workflow when the workflow file itself + # was updated too. + push: + paths: + - 'src/**' + - 'pom.xml' + - '.github/workflows/maven.yml' + + # Whenever someone submits a new pull request which modified the pom or a source file, + # we want to ensure it compiles successfully and that all tests will pass. + pull_request: + paths: + - 'src/**' + - 'pom.xml' + +jobs: + compile: + name: Maven compiler + runs-on: ubuntu-latest + steps: + + # 1. Check out the current working tree + - name: Checkout repository + uses: actions/checkout@v2 + + # 2. Setup Java 17 JDK (Adopt) + - name: Java 17 setup + uses: actions/setup-java@v2 + with: + distribution: 'adopt' + java-package: jdk + java-version: '17' + + # 3. Setup local Maven package cache to speed up building + - name: Cache Maven packages + uses: actions/cache@v2 + with: + path: ~/.m2 + key: ${{ runner.os }}-m2-${{ hashFiles('**/pom.xml') }} + restore-keys: ${{ runner.os }}-m2 + + # 4. Build via Maven + - name: Build via Maven + run: mvn verify -B --file pom.xml diff --git a/1 b/1 deleted file mode 100644 index c0087c86d..000000000 --- a/1 +++ /dev/null @@ -1,11 +0,0 @@ -SkillShot tweaks -# Please enter the commit message for your changes. Lines starting -# with '#' will be ignored, and an empty message aborts the commit. -# -# On branch master -# Your branch is up to date with 'origin/master'. -# -# Changes to be committed: -# modified: src/main/java/com/gmail/nossr50/skills/archery/Archery.java -# modified: src/main/java/com/gmail/nossr50/util/skills/CombatUtils.java -# diff --git a/Changelog.txt b/Changelog.txt index c9fec6109..9221f7f4c 100644 --- a/Changelog.txt +++ b/Changelog.txt @@ -1,11 +1,1172 @@ +Version 2.1.210 + Fixed a memory leak involving mob metadata + mcMMO doesn't disable itself when configs are invalid anymore + mcMMO will fix bad config values when loading (WIP) + + NOTES: + There was a big rewrite in this update relating to how various types of metadata were being tracked/stored/retrieved + If you run into issues with this version of mcMMO, please post about it on GitHub + +Version 2.1.209 + Fixed a bug where some config files did not get trimmed completely + + NOTES: + This should fix the issue for everyone, let me know if you still run into trouble! + Don't be afraid to ping me on discord + +Version 2.1.208 + Significantly rewrote to how mcMMO loads/updates config files + Fixed a bug where huge config files caused the server to take forever to start/shutdown + Fixed config files duplicating comments and updated their code to use Spigot API (thanks the456gamer) + mcMMO now repairs config files (removing duplicate comments, see notes) + Updated lithuanian locale (thanks dexasz) + + NOTES: + Due to a change in Spigot mcMMO started growing config files at an alarming rate until they became so big they wouldn't load, and well before they got to that stage they slowed down loading the server + mcMMO now uses the Spigot API in a smarter way for config files + +Version 2.1.207 + Fixed an IndexOutOfBounds exception with our BlockTracker + Fixed a bug where leveling up a party at level cap would spam the chat with messages + mcMMO will no longer use enchanted repair materials (thanks JeBobs) + Added an option to allow enchanted repair materials 'Skills.Repair.Use_Enchanted_Materials' in config.yml + Temporarily rolling required Java version back to 16 + Added unicode (UTF-8) support to locale files (no more UTF-16 codes needed) + Added locale key 'Scoreboard.Disabled' to en_US + Added locale key 'Scoreboard.NotSetupYet' to en_US + Fixed a bug where Salvage sent messages even though the event was cancelled (Thanks TheBusyBiscuit) + +Version 2.1.206 + Fixed a memory leak involving Herbalism under specific circumstances + Fixed a memory leak involving Rupture under specific circumstances + Fixed a memory leak involving Dodge + Fixed a memory leak involving Endermen and block pickups + Fixed a memory leak from plugin conflicts when double drops get activated + Fixed a memory leak that required a specific config.yml setup with mob health bars + You can no longer set mob health bars to -1 in config.yml to set it to display permanently (this was problematic behavior) + Fixed a bug preventing Action Bar messages from showing + Fixed a bug where Alchemy XP wasn't being granted + Lowered the default volume of level up from .75 to .3 in sounds.yml (delete sounds.yml to get this change automagically) + Updated adventure platform dependency + Updated to use Java 17 + + NOTES: + mcMMO will target the newest version of MC moving forward, any backwards compatibility with prior versions of Minecraft should be considered a side effect rather than intended. + +Version 2.1.205 + Fixed yet another exception preventing Alchemy from working (thanks NemuruYama) + Added some code to cleanup potential memory leaks + + NOTES: + Sorry for the delay in this patch, I have had a terrible cold all weekend, feeling better now + +Version 2.1.204 + Fixed IndexOutOfBounds exception (thanks gecko10000) (related to Alchemy) + Added double smelt to copper ingot and netherite scrap (thanks Lyther) + +Version 2.1.203 + mcMMO now requires Java 16 + mcMMO now requires the newest version of Minecraft (currently 1.17.1) + Fixed several API breaks (mostly affected Alchemy) + Fixed a bug relating to Shake percentages (thanks Lyther) + Fixed hexcolors not displaying correctly in level up milestone broadcasts (thanks gecko10000) + (API) Added deprecated constructors for PlayerProfile (thanks PikaMug) + mcMMO has had many of its dependencies updated to newer builds + + NOTES: + If you want to play mcMMO on older versions, simply use 2.1.202 instead + Keeping mcMMO backwards compatible with older versions is getting messy, and I'd rather be able to focus my attention at newer features than having to make an elaborate build process (or alternatively hacky code) to support older versions of the game + Furthermore, it seems most people are playing 1.17.1 by a wide margin + You may have trouble compiling the source code if your maven is not setup to run JDK16, if you get any errors when compiling this is likely the reason + + The data from bstats went into making this decision (shoutout to Qixils for typing this up too) + 71.9% of servers are running 1.17.X + 97.9% of servers are running ≥1.16 + 99.3% of servers are running ≥1.15 + +Version 2.1.202 + Fixed a bug where mcMMO didn't reward XP for Kelp + Fixed a bug where mcMMO marked bonemealed Azalea trees as unnatural (and thus did not give XP or get affected by Tree Feller) + Added Amethyst_Block to experience.yml for Mining + Added Flowering Azalea Leaves to Tree Feller's white list + Fixed a bug where mcMMO didn't appropriately flag blocks as natural in some tree growing events + (SQL) Added more MySQL/MariaDB settings (allowPublicKeyRetrieval - thanks rosaage) + (API) Added CREATED_PARTY and DISBANDED_PARTY to EventReason (used in some party events - thanks PikaMug ) + Party member name matching is no longer case sensitive (thanks Wariorrrr) + Updated zh_CN locale (thanks GhostDC) + Added some settings for over fishing (Settings are in experience.yml under Fishing_ExploitFix_Options - thanks tunagohan) + + NOTES: + This means tree feller will correctly traverse flowering azalea leaves during its ability + +Version 2.1.201 + Tweaked the visual/audio effect for Rupture + (API) TNT is set as the source in Blast Mining (1.16.1 and up) + Fixed an exploit related to Ability Buffs remaining on tools + Blast Mining no longer drops Budding Amethyst since its not legal to obtain this item through normal gameplay + Added mcinspect and mmoinspect aliases to inspect command + Portuguese translation of Woodcutting changed back to Lenhador + Updated zh_CN (Chinese) locale, thanks GhostDC! + Major changes to zh_TW locale, thanks gregman98 + Added '/skill keep' shortcut (for example /mining keep) thanks GriffinCodes + Impact is now more balanced as the formula has been changed (see notes) thanks emanondev + + NOTES: + Impact will deal less durability damage to armors without unbreaking, and more to armors with unbreaking + +Version 2.1.200 + Fixed a major 1.17 exploit + Dodge will no longer trigger while blocking + Action Bar messages can now be disabled (thanks TheBusyBiscuit) + mcMMO is better at MC version parsing now (thanks stepech & TheBusyBiscuit) + +Version 2.1.199 + Fixed IndexOutOfBounds error for servers running 1.17 or higher + Fixed a bug that caused MySQL/MariaDB to malfunction for 1.17 (see notes) + Renamed Deepslate Lapis Lazuli Ore to Deepslate Lapis Ore in experience.yml and config.yml + Added some code to prevent mcMMO from breaking if it doesn't recognize the version of the game + Optimized CompatibilitySupportLayer - this handles some of the logic for supporting multiple versions of the game + Added Unit Tests for MinecraftGameVersion + + NOTES: + I have temporarily disabled SSL for MySQL/MariaDB for 1.17 ( proper fix coming soon ) + +Version 2.1.198 + Fixed a bug where Smelting didn't work with the new 1.17 materials + Updated dependency Adventure to 4.8.0 (thanks TheBusyBiscuit) + +Version 2.1.197 + This update adds compatibility for new mobs and blocks from 1.17 + This build of mcMMO should be more compatible with certain versions of ViaVersion + Players are no longer launched from Minecarts when using a Fishing Rod (they are still dismounted) thanks lexikiq + Updated Japanese locale (thanks ViaSnake) + Updated Brazil Portuguese (pt_BR) locale (thanks Paulo Guilherme) + Added Goat to experience.yml for combat and taming + Added Axolotl to experience.yml for combat and taming + Added Glow_Squid to experience.yml for combat and taming + Added Glow Berries to Farmer's Diet + Updated Super Breaker to recognize the new pick-axe appropriate blocks + Updated Tree Feller to recognize Azalea Leaves + + Added Rooted Dirt to experience.yml for Excavation + Added Small Dripleaf to experience.yml for Herbalism + Added Big Dripleaf to experience.yml for Herbalism + Added Moss Block to experience.yml for Herbalism + Added Cave Vines to experience.yml for Herbalism + Added Cave Vines Plant to experience.yml for Herbalism + Added Glow Lichen to experience.yml for Herbalism + Added Tuff to experience.yml for Mining + Added Calcite to experience.yml for Mining + Added Smooth Basalt to experience.yml for Mining + Added Block_Of_Amethyst to experience.yml for Mining + Added Budding Amethyst to experience.yml for Mining + Added Small_Amethyst_Bud to experience.yml for Mining + Added Medium Amethyst Bud to experience.yml for Mining + Added Large Amethyst Bud to experience.yml for Mining + Added Amethyst Cluster to experience.yml for Mining + Added Deepslate to experience.yml for Mining + Added Cobbled Deepslate to experience.yml for Mining + Added Copper Ore to experience.yml for Mining + Added Deepslate Redstone Ore to experience.yml for Mining + Added Deepslate Copper Ore to experience.yml for Mining + Added Deepslate Coal Ore to experience.yml for Mining + Added Deepslate Diamond Ore to experience.yml for Mining + Added Deepslate Emerald Ore to experience.yml for Mining + Added Deepslate Iron Ore to experience.yml for Mining + Added Deepslate Gold Ore to experience.yml for Mining + Added Deepslate Lapis Lazuli Ore to experience.yml for Mining + Added Lapis Lazuli Ore to experience.yml for Mining (was missing) + + Added Moss Block to Bonus Drops for Herbalism in config.yml + Added Glow Berries to Bonus Drops for Herbalism in config.yml + Added Cave Vines to Bonus Drops for Herbalism in config.yml + Added Cave Vines Plant to Bonus Drops for Herbalism in config.yml + Added Tuff to Bonus Drops for Mining in config.yml + Added Amethyst Shard to Bonus Drops for Mining in config.yml + Added Calcite to Bonus Drops for Mining in config.yml + Added Smooth Basalt to Bonus Drops for Mining in config.yml + Added Block_Of_Amethyst to Bonus Drops for Mining in config.yml + Added Budding Amethyst to Bonus Drops for Mining in config.yml + Added Small_Amethyst_Bud to Bonus Drops for Mining in config.yml + Added Medium Amethyst Bud to Bonus Drops for Mining in config.yml + Added Large Amethyst Bud to Bonus Drops for Mining in config.yml + Added Amethyst Cluster to Bonus Drops for Mining in config.yml + Added Deepslate to Bonus Drops for Mining in config.yml + Added Cobbled Deepslate to Bonus Drops for Mining in config.yml + Added Raw Iron to Bonus Drops for Mining in config.yml + Added Raw Gold to Bonus Drops for Mining in config.yml + Added Raw Copper to Bonus Drops for Mining in config.yml + Added Copper Ore to Bonus Drops for Mining in config.yml + Added Deepslate Redstone Ore to Bonus Drops for Mining in config.yml + Added Deepslate Copper Ore to Bonus Drops for Mining in config.yml + Added Deepslate Coal Ore to Bonus Drops for Mining in config.yml + Added Deepslate Diamond Ore to Bonus Drops for Mining in config.yml + Added Deepslate Emerald Ore to Bonus Drops for Mining in config.yml + Added Deepslate Iron Ore to Bonus Drops for Mining in config.yml + Added Deepslate Gold Ore to Bonus Drops for Mining in config.yml + Added Deepslate Lapis Lazuli Ore to Bonus Drops for Mining in config.yml + Added Lapis Lazuli Ore to Bonus Drops for Mining in config.yml (was missing) + + Added Cobbled Deepslate to experience.yml for Smelting + Added Raw Copper to experience.yml for Smelting + Added Raw Iron to experience.yml for Smelting + Added Raw Gold to experience.yml for Smelting + Added Copper Ore to experience.yml for Smelting + Added Deepslate Redstone Ore to experience.yml for Smelting + Added Deepslate Copper Ore to experience.yml for Smelting + Added Deepslate Coal Ore to experience.yml for Smelting + Added Deepslate Diamond Ore to experience.yml for Smelting + Added Deepslate Emerald Ore to experience.yml for Smelting + Added Deepslate Iron Ore to experience.yml for Smelting + Added Deepslate Gold Ore to experience.yml for Smelting + Added Deepslate Lapis Lazuli Ore to experience.yml for Smelting + Added Lapis Lazuli Ore to experience.yml for Smelting (was missing) + + NOTES: + Another patch will follow this one shortly to add more 1.17 support, I am waiting on the Spigot API to test some stuff which isn't out yet. + You shouldn't need to edit your configs for this update, your configs should update automatically. + Expect some patches following this update for Axolotl and other new entities, waiting on the Spigot API to become available + If you run into any issues with ViaVersion or ViaBackwards, use the latest dev builds for each. + +Version 2.1.196 + Removed the explosion from Rupture + Adjusted Rupture to play its particle effect less often + Fixed a bug where Rupture never applied to additional targets during Serrated Strikes + Fixed a bug where players without Rupture permission could use Rupture during Serrated Strikes + Fixed a possible null error for our SelfListener + Added locale string 'Swords.Combat.Rupture.Note.Update.One' + Updated locale string 'Guides.Swords.Section.1' + Crossbows can now be fished up with enchantments + (API) Added McMMOEntityDamageByRuptureEvent (thanks qixils) + + NOTES: + For now Rupture is non-lethal, I may add back a lethal component at the end of its damage + Rupture will be in a state of change for a while as I receive feedback (give me feedback in Discord!) + Crossbows is not in the default fishing loot list, you'd have to add it yourself. + For Devs: McMMOEntityDamageByRuptureEvent extends EntityDamageByEntityEvent and uses CUSTOM type damage + +Version 2.1.195 + Fixed a null connection error which affected some SQL users + +Version 2.1.194 + Fixed an XP exploit + Updated SQL to not throw errors if upgrades.yml was reset for any reason + Updated SQL to use the newest driver path (and fall back to the old one if the new one doesn't exist on the server) + Locale override files are now named locale_override.properties (converted automatically/generated automatically) + Existing in use locale override files will be renamed to locale_override.properties and have some useful text put in them + mcMMO will now generate a locale override file with some detailed instructions if one doesn't exist (will be found in /plugins/mcMMO/locales/locale_override.properties) + + NOTES: + If you were overriding locale before this update mcMMO will just rename the existing override file to locale_override.properties add some useful text and then load it + Remember you can use /mcreloadlocale to swap the edits in without restarting the server + +Version 2.1.193 + Fixed another bug where mcrank/mctop/leaderboards weren't loading + Fixed a bug where override locales weren't being loaded (but worked after a reloadlocale command) + (Unit Tests) Added a test to make sure leaderboards for FlatFile were working + Fixed blocks being dropped from blast mining even if yield was set to 0 (thanks Warriorrrr) + Fixed Tree feller not working entirely if one fake block break event is cancelled. (thanks Warriorrrr) + Fixes no woodcutting xp being rewarded if a tree is too big while using tree feller. (thanks Warriorrrr) + Updated pl locale (thanks Mich3l3k) + +Version 2.1.192 + Removed some debug messages from FlatFileDatabaseManager + Fixed another bug where player names could be saved as null for FlatFileDB (they will update on the players next login at the next save interval) + (API) Removed deprecation from com.gmail.nossr50.api.ExperienceAPI.getOfflineProfile(java.lang.String) + (API) Added com.gmail.nossr50.api.DatabaseAPI.doesPlayerExistInDB(org.bukkit.OfflinePlayer) + (API) Added com.gmail.nossr50.api.ExperienceAPI.getOfflineProfile(org.bukkit.OfflinePlayer) + (API) Added com.gmail.nossr50.api.ExperienceAPI.getOfflineXP(org.bukkit.OfflinePlayer, java.lang.String) + (API) Added com.gmail.nossr50.api.ExperienceAPI.getOfflineXPRaw(org.bukkit.OfflinePlayer, com.gmail.nossr50.datatypes.skills.PrimarySkillType) + (API) Added com.gmail.nossr50.api.ExperienceAPI.getOfflineXPRaw(org.bukkit.OfflinePlayer, java.lang.String) + (API) Added com.gmail.nossr50.api.ExperienceAPI.getOfflineXPToNextLevel(org.bukkit.OfflinePlayer, java.lang.String) + (API) Added com.gmail.nossr50.api.DatabaseAPI.doesPlayerExistInDB(java.lang.String) + (Unit Tests) Added some more unit tests to FlatFileDB + +Version 2.1.191 + Fixed a bug related to our blocktracker + Fixed a bug that prevented the leaderboards from working on FlatFile in some circumstances + Some minor optimizations to our Block events + (Unit Tests) Added a test for initializing the leaderboard on FlatFile +Version 2.1.190 + Fixed a null error in BitSetChunkStore +Version 2.1.189 + Fixed a bug that would remove components from death messages when players were killed by mobs (thanks lexikiq) + Rewrote how FlatFileDatabase verifies data integrity + FlatFileDatabase has much better data validation and will repair broken/invalid data much better + Fixed a bug where FlatFileDatabase users could have their names saved as "null" (names will be fixed the next time the player logs in) + Added 20~ unit tests for FlatFileDatabaseManager (see notes) + FlatFileDB now stores the last login of users again (was completely non functional for a while) + Newly created flat file databases (mcmmo.users file) will have a comment line at the top noting the date the database was created + Minor performance optimizations to FlatFile database + mcMMO will once again purge old users if the config option is on (see notes) + Fixed a bug where FlatFileDatabaseManager didn't properly upgrade older database entries to the newest schema + The setting to disable the mcMMO user block tracker has been moved from our "hidden config" to persistent_data.yml + Added 'mcMMO_Region_System.Enabled' to persistent_data.yml (don't touch this setting unless you know what you are doing) + Removed MHD command (it didn't do anything for a while now) + Removed UltraPermissions warning + Updated pl locale (Thanks Mich3l3k) + Fixed an IllegalPluginAccessException error that could happen during server shutdown + Minor performance optimizations to misc parts of the codebase + (API) Added com.gmail.nossr50.database.DatabaseManager.loadPlayerProfile(org.bukkit.OfflinePlayer) + (API) Deprecated com.gmail.nossr50.database.DatabaseManager.loadPlayerProfile(java.util.UUID, java.lang.String) + (API) Removed com.gmail.nossr50.database.DatabaseManager.newUser(java.lang.String, java.util.UUID) + (API) PrimarySkillType will soon be just an enum with nothing special going on + (API) Deprecated the members of PrimarySkillType use mcMMO::getSkillTools instead, deprecated members will be removed in Tridents & Crossbows (due soon) + (API) Some members of PrimarySkillType were removed and not deprecated (such as the field constants) + + NOTES: + I spent over 26 hours refactoring FlatFileDB and writing unit tests for it, this will ensure that any changes in the code that could break the database are caught at compile time (so long as we have enough tests, could probably use more) + Regarding purging old users on the FlatFileDB, since this wasn't functioning for a while, the last login of users has been reset and if mcMMO hasn't seen that user since this update, it won't purge them as it has no way to know if they are truly an old user + I'm likely going to add SQLite DB as an option in the future, I spent time to fix up the FlatFileDB as some Unit Testing practice. + Ultra Permissions is SAFE to use with mcMMO, disregard previous messages stating otherwise + After getting in contact with the UltraPermissions devs and exhaustive testing, I have concluded that using UltraPermissions is completely safe with mcMMO. The users who had an issue with performance currently have an unknown cause, potentially it is from a plugin using the UltraPermissions API I really can't say without more data. My apologies to the UltraPermissions team for reporting an issue between our two plugins directly, as that is not the case. I would have tested it myself sooner but UltraPermissions was closed source and premium so I wasn't particularly motivated to do so, however I have been given access to the binaries so now I can do all the testing I want if future issues ever arise which I have zero expectations that they will. + +Version 2.1.188 + Updated default entries in treasures.yml to use "Level_Requirement" instead of "Drop_Level" + Fixed a bug where excavation treasures only required level 0 instead of loading the value from the config + Fixed a bug where /fishing was showing the wrong shake chance + Default Shake chance increased from 15% to 30% (update advanced.yml manually or delete the file to regenerate it and receive these changes) + Removed entries for ranks 2-8 of Shake from advanced.yml (Shake only has one rank, the extra entries were a mistake) + Modified the warning about UltraPermissions + Removed the debug message about potentially unused keys (only shown if you had debug mode enabled in config.yml) + + NOTES: + This update makes changes to treasures.yml automatically to apply the fix, you don't need to do anything + UltraPermissions devs are working on a fix for the performance issue bug + +Version 2.1.187 + Fixed a ClassCastException error involving Rupture + +Version 2.1.186 + Rupture has been reworked to solve a few outstanding issues (see notes) + Fixed an exploit involving enchantments (thanks TheBusyBiscuit) + Fixed a very small memory leak that would only happen in very rare situations + Fixed a bug where XP wasn't granted while sneaking and interacting with a berry bush + Gore no longer applies Rupture + Gore no longer sends a message to the Wolf owner when it triggers + Gore no longer sends a message to players that are hit by it + Rupture no longer sends a message telling you that your target is bleeding + Updated locale string 'Swords.SubSkill.Rupture.Description' + Updated locale string 'Swords.SubSkill.Rupture.Stat.Extra' + Updated locale string 'Swords.Combat.Rupture.Note' + Added locale string 'Swords.SubSkill.Rupture.Stat.TickDamage' + Added locale string 'Swords.SubSkill.Rupture.Stat.ExplosionDamage' + Added 'Skills.Swords.Rupture.Rupture_Mechanics.Chance_To_Apply_On_Hit' to advanced.yml + Added 'Skills.Swords.Rupture.Rupture_Mechanics.Duration_In_Seconds.Against_Players' to advanced.yml + Added 'Skills.Swords.Rupture.Rupture_Mechanics.Duration_In_Seconds.Against_Mobs' to advanced.yml + Added 'Skills.Swords.Rupture.Rupture_Mechanics.Tick_Interval_Damage.Against_Players' to advanced.yml + Added 'Skills.Swords.Rupture.Rupture_Mechanics.Tick_Interval_Damage.Against_Mobs' to advanced.yml + Added 'Skills.Swords.Rupture.Rupture_Mechanics.Explosion_Damage.Against_Players' to advanced.yml + Added 'Skills.Swords.Rupture.Rupture_Mechanics.Explosion_Damage.Against_Mobs' to advanced.yml + Removed 'Skills.Swords.Rupture.ChanceMax' from advanced.yml + Removed 'Skills.Swords.Rupture.MaxBonusLevel.Standard' from advanced.yml + Removed 'Skills.Swords.Rupture.MaxBonusLevel.RetroMode' from advanced.yml + Removed 'Skills.Swords.Rupture.MaxTicks' from advanced.yml + Removed 'Skills.Swords.Rupture.BaseTicks' from advanced.yml + Removed 'Skills.Swords.Rupture.DamagePlayer' from advanced.yml + Removed 'Skills.Swords.Rupture.DamageMobs' from advanced.yml + + NOTES: + The old Rupture would constantly interfere with your ability to do a Sweep Attack/Swipe with swords, the new one solves this problem + Targets will bleed and take "pure" damage while bleeding, this never kills the target. It will reduce them to 0.01 HP. + After 5 seconds of not applying Rupture on the target Rupture explodes dealing a large amount of damage, this damage is not pure and is affected by armor etc. + Rupture no longer tells you that you that you applied it to the target, it should be obvious from the sounds/particle effects + The new Rupture no longer constantly interferes with the vanilla Swipe (the AOE attack built into Minecraft) + The new Rupture has not had a fine tuned balance pass, I will be balancing it frequently after this patch, it may be too weak or too strong in its current form + Rupture does not stack between players, whoever applied Rupture first determines its strength, this will change in the future (Stronger Ruptures will overwrite weaker ones) + When you reapply rupture it immediately triggers a damage tick + + + +Version 2.1.185 + Fixed an exploit for Herbalism + +Version 2.1.184 + Removed April Fools event + Fixed a bug where the default treasures.yml file had incorrect keys (see notes) + + NOTES: + mcMMO will fix bad config files automatically, you don't need to do anything + +Version 2.1.183 + Players now gain Acrobatics XP from falling even if they don't have the Roll permission node (checks for Acrobatics skill permission) + treasures.yml now has separate settings for Drop_Level for Standard/Retro mode (see notes / this change is automatic) + Updated Russian locale (thanks ImDaniX) + Added Donkeys to beat lore (thanks QuantumToasted) + Alchemy guide now correctly labels Rabbit's foot for potion of leaping (thanks mldriscoll) + Fixed a bug where sweet berry bushes would give XP in situations where they shouldn't + The /mmoinfo for Roll is removed for the time being, it will return in a future update (see notes) + + NOTES: + Previously treasures.yml would take drop_level and multiply it by 10 if you were on Retro Mode, this is confusing so it has been changed + treasures.yml will update old entries to follow the new format automatically, please review them to make sure they match expected values, and if not edit them and save then reboot your server + Roll is actually the only skill that had an /mmoinfo, its one big mess, I'll fix it in the future + +Version 2.1.182 + Players now receive XP from harvesting Sweet Berry bushes (double XP for harvesting fully grown berries) + Fixed an error when using mcMMO with Featherboard that broke mcMMO skill boards when using certain commands + Fixed a NPE with Scoreboards enabled when trying to update scoreboards + Added 'Scoreboard.Recovery' locale key + Sweet Berry Bush will no longer ready tools for Super Abilities + You can now use '.all' (for example: mcmmo.perks.xp.customboost.all) to give an XP perk to all skills + Removed hardcore and vampirism commands, these commands are dangerous, just modify the config file if you want to use hardcore / vampirism + Fixed several errors in de locale (Thanks TheBusyBiscuit & w1tcherrr) + Fixed a bug where double smelt never succeeded if the furnace was empty (but worked normally afterwards) + Added some safety so that mcMMO automatic save interval is never more frequent than 1 minute + Removed a few silent exceptions for scoreboards & mcMMO + Added warning about UltraPermissions to mcMMO + Fixed a potential NPE in McMMOPlayerExperienceEvent + Added Sweet Berry Bush to config.yml bonus drops for Herbalism + + NOTES: + Sweet Berry Bushes won't give double drops for now, looking into an elegant solution + mcMMO will do a better job reporting if something went wrong with scoreboards, which may lead to improved plugin compatibility between mcMMO and other plugins touching scoreboards. + +Version 2.1.181 + mcMMO no longer pointlessly tries to check for missing UUIDs for FlatFile database + Removed the "name change detected" message as some plugins (such as Plan) invoke API calls which spams the console with this message + Refactored code related to loading player data from the database + (API) Added DatabaseManager::loadPlayerProfile(String) + (API) Removed DatabaseManager::loadPlayerProfile(String, UUID, boolean) + (API) Removed DatabaseManager::loadPlayerProfile(String, boolean) + +Version 2.1.180 + mcMMO will now automatically remove corrupted data from mcmmo.users instead of catastrophic failure + When using FlatFile database (the default) mcMMO will try its best to inform you which players had corrupted data when it does repairs + Various minor optimizations and tweaks to the FlatFile database + mcMMO is now much more verbose when things go wrong with the FlatFile database (removed some silent errors, added more error messages/warnings) + mcMMO now uses UTF-8 compliant encoding for SQL databases (utf8mb4) + Fixed a bug where mcMMO could in some circumstances fail to update SQL schema and mark it as successful + Renamed updates.yml to updates_overhaul.yml to avoid some potential issues when upgrading from classic + + NOTES: + This update was tested pretty thoroughly so it should be pretty safe, let me know if you have issues in the mcMMO discord or GitHub issues page for mcMMO! + +Version 2.1.179 + Fixed a bug for FlatFile databases where some players with changed nicknames would have their levels not loaded upon login (possibly wiping their data) + + NOTES: + Players affected by this bug (introduced in 2.1.177) may have their data lost, but this patch reverts the change which caused this bug. + I suspect their data isn't lost and may be restored after this patch is loaded up, however if it is lost mcMMO makes regular backups so you can load one of those (check /plugins/mcMMO/) or manually edit their levels via MMOEDIT as a solution of sorts. + +Version 2.1.178 + Item replacement in vanilla fishing override back to SALMON from AIR (see notes) + + NOTES: + Apparently can't set items to AIR, my bad. I'll look into another solution for fishing plugin compatibility soon. + +Version 2.1.177 + Environmentally aware will now protect Wolves from Magma blocks + Fixed a bug where mcMMO would fail to update a players name when it detected a name change + mcMMO will treat vanished players as if they are offline when using the inspect command on them now (see notes) + mcMMO now listens to PlayerFishEvent at HIGH event priority instead of HIGHEST + Changed how vanilla fishing treasures are overridden (AIR instead of SALMON) + (API) Added McMMOReplaceVanillaTreasureEvent -- see notes + + NOTES: + A few changes were made to the inspect command, it used to reject you when used on vanished players, now it will be processed as if they are offline. + Additionally if you do inspect a vanished player, it will not use their display name (consistent with offline players) as that would give them away for being online + McMMOReplaceVanillaTreasureEvent is an event which is fired when mcMMO replaces a vanilla treasure with AIR if the server config file is set to override vanilla treasures, this causes some issues for other fishing plugins so this event helps those plugins be more compatible + +Version 2.1.176 + Another fix for Double Smelt bringing item stack size to illegal values + +Version 2.1.175 + Fixed a bug where mcMMO would occasionally give a 65 item stack from a double smelt on a furnace + Fixed a bug where arrows could be duped when fired from a crossbow with piercing enchantment + Added setting to enable or disable Green Thumb automatically replanting crops per crop to config.yml under 'Green_Thumb_Replanting_Crops' section + Updated Adventure (our text dependency) fixes some errors when using color codes in party/admin chat (thanks TheBusyBiscuit) + Added some support for negative Y values in anticipation of 1.17 world height changes (thanks t00thpick1) + +Version 2.1.174 + Some legacy color codes in our locale file were swapped to &-code equivalents (thanks ViaSnake) + Updated hu_HU locale (thanks andris155) + Updated ru locale (thanks imDaniX) + Updated fr locale (thanks Elikill58) + (API) Added SubSkillBlockEvent for some SubSkill events that have a block (eg: Green Thumb Block events) + (API) Green Thumb (Block) now fires a SubSkillBlockEvent which is cancellable + (API) Green Thumb (Plant) now fires SubSkillBlockEvent which is cancellable + (API) Shroom Thumb now fires a SubSkillBlockEvent which is cancellable + + NOTE: A lot of sub-skills without random chance elements are missing events, this will be cleaned up in the near future. If you need something specific added sooner than that, post a GitHub issue for it and I'll patch it in. + I'm likely to separate Green Thumb into two distinct skills in an upcoming patch + Only Green Thumb/Shroom Thumb trigger the new SubSkillBlockEvent for now + +Version 2.1.173 + The experience orbs dropped by Knock on Wood rank 2 during Tree Feller are now much less frequent but provide more XP + mcMMO no longer damages fishing rods or drains a player's hunger when fishing + Fixed a visual bug where players who had lucky perk were shown incorrect odds when using skill commands (such as /axes) + Updated ja_JP locale (thanks ViaSnake) + Fixed a bug where scoreboards were torn down inappropriately when moving to or from blacklisted worlds (thanks steve4744) + Updated Kyori's adventure library to 4.4.0 (used by mcMMO to handle text components) + +Version 2.1.172 + Updated german locale (thanks TheBusyBiscuit) + Added 'mcmmo.broadcast.levelup' permission node, if a player lacks this node they will not have their level up milestones broadcast to chat, this is a default permission node + Power Levels are now included in level up broadcasts and they have their own settings (mirroring the existing settings for skill broadcasts) + Added 'General.Level_Up_Chat_Broadcasts.Broadcast_Powerlevels' to config.yml + Added 'General.Level_Up_Chat_Broadcasts.Broadcast_Powerlevels.Enabled' to config.yml + Added 'General.Level_Up_Chat_Broadcasts.Broadcast_Powerlevels.Milestone_Interval' to config.yml + Added 'General.Level_Up_Chat_Broadcasts.Broadcast_Powerlevels.Broadcast_Targets.Send_To_Console' to config.yml + Added 'General.Level_Up_Chat_Broadcasts.Broadcast_Powerlevels.Broadcast_Targets.Only_Party_Members' to config.yml + Added 'General.Level_Up_Chat_Broadcasts.Broadcast_Powerlevels.Broadcast_Targets.Only_Same_World' to config.yml + Added 'General.Level_Up_Chat_Broadcasts.Broadcast_Powerlevels.Broadcast_Targets.Distance_Restrictions.Restrict_Distance' to config.yml + Added 'General.Level_Up_Chat_Broadcasts.Broadcast_Powerlevels.Broadcast_Targets.Distance_Restrictions.Restricted_Radius' to config.yml + Added 'Broadcasts.PowerLevelUpMilestone' to locale + You can now disable the XP orbs from being dropped when Knock On Wood triggers during Tree Feller + Added 'Skills.Woodcutting.TreeFeller.Knock_On_Wood.Add_XP_Orbs_To_Drops' to advanced.yml + Changed Fists to not be capitalized (en_US) when lowering/readying berserk + SkillActivationPerkEvent can now be called in async threads (thanks electronicboy) + Removed a few never implemented settings from Skills.Woodcutting.TreeFeller in advanced.yml + Updated bStats (thanks TheBusyBiscuit) + Fixed some incorrect reporting to bStats (I'm so dyslexic...) + + NOTES: + The new 'mcmmo.broadcast.levelup' node is a default node included under the 'mcmmo.defaults' node umbrella, you shouldn't have to give this to your players unless they don't have access to 'mcmmo.defaults' + If you don't have a permission plugin you don't need to worry, players will have this node by default in that case + There are situations where level up broadcasts will be skipped, for example if you go from level 0 -> 101 via addlevels or mmmoedit, and your broadcast interval is 100, it will be skipped as 101 falls out of this interval, this kind of skip only applies to command based leveling. Players gaining levels naturally should never have their broadcasts skipped. I'll fix this particular interaction in the future so that command based leveling never skips over milestone broadcasts, but for now it does. + +Version 2.1.171 + Fixed a bug where arrows shot by infinite bow enchant would duplicate + Fixed a bug where Archery XP would calculate incorrectly + Axes can now replant cocoa plants (thanks Lyther) + Players who level up at certain milestones have their level ups broadcast to the server (very configurable and optional, see notes) + New locale string 'Broadcasts.LevelUpMilestone' + Added 'General.Level_Up_Chat_Broadcasts.Enabled' to config.yml + Added 'General.Level_Up_Chat_Broadcasts.Milestone_Interval' to config.yml + Added 'General.Level_Up_Chat_Broadcasts.Broadcast_Targets.Send_To_Console' to config.yml + Added 'General.Level_Up_Chat_Broadcasts.Broadcast_Targets.Only_Party_Members' to config.yml + Added 'General.Level_Up_Chat_Broadcasts.Broadcast_Targets.Only_Same_World' to config.yml + Added 'General.Level_Up_Chat_Broadcasts.Broadcast_Targets.Distance_Restrictions.Restrict_Distance' to config.yml + Added 'General.Level_Up_Chat_Broadcasts.Broadcast_Targets.Distance_Restrictions.Restricted_Radius' to config.yml + + NOTES: + The new broadcast system is very configurable, you could set the milestone interval to 1 if you want players to always be informed when someone levels up + With default settings, messages are broadcast to all players on all worlds and to the server console when a player hits a level up that is a 100 interval, for example level 100, 300, 600, 2200 would all qualify + You can change the settings to specify who receives these messages or turn the whole system off + The message is customizable via locale: https://mcmmo.org/wiki/Locale + There are comments in config.yml above each setting (as long as YAML doesn't move comments around chaotically...) that explain each setting + In case your comments are missing, here's what they look like by default: https://gist.github.com/nossr50/baf656477c75663e9e2f9284acee8d67 + + +Version 2.1.170 + Reverted a change that broke compatibility with the mcMMO papi ecloud thingy + +Version 2.1.169 + Fixed a few memory leaks involving arrows + Fixed mcMMO inappropriately assigning metadata to projectiles not fired from players + Fix mctop not working if locale was set to something other than en_US + mcMMO will now always emulate lure in order to stack it correctly and avoid vanilla bugs + +Version 2.1.168 + Fixed an IndexOutOfBoundsException error when trying to access UserBlockTracker from an invalid range (thanks t00thpick1) + (API) UserBlockTracker is now the interface by which our block-tracker will be known (thanks t00thpick1) + Optimized memory access for Acrobatics fall anti-exploit mechanics (thanks t00thpick1) + +Version 2.1.167 + Fixed a serious dupe bug + Add McMMOPlayerPreXpGainEvent event for plugins to modify given exp (thanks electronicboy) + Add SkillActivationPerkEvent (thanks electronicboy) + + NOTE: + This bug was introduced in 2.1.165, update immediately if you are on 2.1.165 or 2.1.166 + +Version 2.1.166 + Fixed a small memory leak in the new COTW tracker + Potentially fixed a ConcurrentModificationException involving the TransientEntityTracker (report this error if you encounter it) + Music discs removed from the default fishing_treasures.yml + Optimized how mcMMO saves player data (should improve timings on servers with bad disk speeds and or bad connectivity to their SQL server instance) + + NOTES: + No one likes fishing up music discs, if you want this change it is recommended you delete fishing_treasures.yml and let it regenerate + (You won't have this file if you haven't updated in a while, if so you don't need to do anything) + If any of you encounter a ConcurrentModificationException error that mentions TransientEntityTracker in its stack trace after this update let me know, I have another fix in mind for this if this update didn't fix it. + +Version 2.1.165 + Fixed a bug where Enchanted Books dropped by mcMMO (in Fishing) did not function correctly + The mcMMO system which tracks player placed blocks has had some major rewrites (thanks t00thpick1) + Optimized our ChunkUnloadEvent, this should improve timings in this area + How mcMMO tracks COTW entities has been rewritten + When COTW summons are killed players are now informed (from anything other than the time expiring). + mcMMO will now be compatible with changes to world height (1.17 compatibility) + mcMMO will ignore EntityPickupItemEvents from "Fake-Player" NPCs if it recognizes them as such, this will prevent some compatibility issues with some plugins + SuperBreaker will now always activate if the target blocks fastest tool is a Pickaxe (used to require the block giving XP or being considered an ore) + Master Angler mentions that it works better with a boat in its hover tip + Added missing cooldown locale message 'Commands.Database.Cooldown' + Added new locale message 'Taming.Summon.COTW.Removed' + Updated locale entry 'Fishing.SubSkill.MasterAngler.Description' + + NOTES: + Books dropped before this fix will not be usable and should just be chucked in lava, the broken books have blue names, the working books have yellow names. + t00thpick1 has taken time to rewrite our block meta tracking system to be more efficient, easier to maintain, and support upcoming features such as world height changes + This new system is compatible with the old one, it will convert old files to the new format as needed. You won't even know it is doing anything. + This update shouldn't break anything as the API is the same. + + Alright back to work on T&C unless some major bugs come out of this... + +Version 2.1.164 + mcMMO will now let players use vanilla blocks that have interactions (such as the vanilla Anvil) which are assigned as either Repair or Salvage blocks if a player is sneaking (see notes) + The Rarity known as Records has been renamed to Mythic + Fishing treasures have been moved from treasures.yml -> fishing_treasures.yml, copy over any custom entries you had from treasures.yml carefully as the config file has changed and you can't just copy paste your old entries without making a few edits + Added Enchanted Books to fishing_treasures.yml as Legendary rarity (can drop with any legal enchantment - see notes) + Added all Netherite gear to the Mythic rarity in fishing_treasures.yml + Added Name Tag to fishing_treasures.yml as Rare rarity + Added Netherite Scrap to fishing_treasures.yml as Legendary rarity + Added Nautilus Shell to fishing_treasures.yml as Legendary rarity + Music Disc rarity in fishing_tresures.yml has been broken up across tiers, they will be more common now. + Mythic rarity (formerly known as Records) now allows for Enchantments to be applied to drops (See Notes) + New exploit fix setting 'PreventPluginNPCInteraction' which defaults to true, when disabled it will allow combat interactions with "NPC" entities from plugins like Citizens + ExploitFix.PreventPluginNPCInteraction Added to experience.yml + Modified locale string 'Fishing.SubSkill.TreasureHunter.Stat.Extra' in existing locale files + You can now define a whitelist of enchants or a blacklist of enchants for an Enchanted_Book entries in fishing_treasures.yml, see notes for an example + + NOTES: + Before reading, Fishing/Excavation are getting a complete loot table rewrite in the future, everything changed in this patch is meant as a temporary quality of life fix until the bigger better change in the future. + There's no real reason to allow for vanilla treasures anymore, so if you were using the vanilla treasure override I suggest turning it off. + You can't add Enchanted_Book to any treasures outside of Fishing's treasure drops right now, I'll fix it in an upcoming patch. Well you can add it, but it won't work. + The rarity formerly known as 'Records' was odd to me, if you got the best possible drop it was always going to be a Music Record drop (using the default mcMMO treasure list), and by default the Records tier had only music records. It was treated differently in the code as well, for example Records drops never had enchantments applied to them. So you could add say NETHERITE_ARMOR to them in your user config and it would never put enchantments on it, that seemed very odd to me. + As a response to this, I've renamed Records as Mythic, I've moved the records into varying tiers, you'll start getting them much earlier now. I've also added Netherite and Enchanted Books to the Mythic tier. + Enchanted Books have been added to Fishing loot, this is a basic hacky work around until the config update comes. Enchanted books can have any legal enchant and you can specify which Enchants a book can spawn with. + Also the Enchantment chance to be applied to the book is completely equal across all enchantments, it does not follow the same logic as applying enchantments to fished up gear. + + Here is an example of using the whitelist or blacklist for an Enchanted_Book entry in fishing_treasures.yml + https://gist.github.com/nossr50/4e15b8ba6915b5a5f516eccfba2d7169 + If you can't load this image, at the address of your treasure for example, at Fishing.Enchanted_Book.Enchantments_Blacklist: you define a list (which must follow yaml spec, google yaml linter) of enchants to disallow, likewise at Fishing.Enchanted_Book.Enchantments_Whitelist you can setup a whitelist, if neither is defined then the book can spawn with all possible enchants, if both are defined the whitelist is used instead of the blacklist + Take care when moving any fishing entries you may have defined in treasures.yml over to fishing_treasures.yml, the config file has had a few things changed (as noted in these notes). + + When talking about NPCs in the below notes, I am referring to "Fake" Players used in plugins such as Citizens, not Villagers from Vanilla Minecraft or anything labeled NPC in another plugin which does not constitute a "Fake Player" + Historically mcMMO has checked an entity for being a Fake-Player-NPC and backed out of any interaction, this was originally done because of Fake-Player-NPCs that were meant to be invincible/etc and not give XP + However nowadays what a Fake-Player-NPC is used for is pretty loose, mcMMO only has definitions for some NPCs (such as from Citizens) it doesn't know about most Fake-Player-NPCs in most plugins unless they identify themselves in a similar way to the predefined parameters + Leave this new exploit fix setting on true unless you understand the implications + + If you only ran mcMMO on your server you'd have no way to use Enchanted Books if you set the repair anvil to the vanilla anvil, so now you can sneak to open up its menu. By the way, mcMMO has the vanilla anvil as repair's default anvil (instead of iron block which it had been historically). +Version 2.1.163 + Fixed the translate URL pointing to the wrong place (thanks chew) + Fixed a bug where FlatFile databases would always attempt a UUID conversion task every save operation (every 10 minutes) causing console spam + mcMMO will no longer throw errors when incoming XP is below 0 (it will just silently cancel the operation) + COTW Summoned entities are now removed when the chunk they are in is unloaded (prevents some exploits) + + NOTES: + Seems I skipped releasing 2.1.162, not a big deal though as you should be using this version instead! + I often test in SQL environments so I missed this bug, reminder to come bother me on discord if you find any annoying bugs! + Also work on T&C is going great lately, I feel great. Perhaps my depression is getting better! + +Version 2.1.162 + Fixed a bug where Alchemy brew events were processed after setting brew results (thanks Wolf2323) + +Version 2.1.161 + Fixed a bug where a bunch of text from mcMMO was never being sent and or being sent as blank messages + + NOTES: + Adventure (the chat library we use) had an update that required shading in another new module, but there were no errors thrown without running a jvm debug flag and testing it, which is why I missed it. I also missed it because I don't read update notes very closely +Version 2.1.160 + Fixed another 9+ year old exploit + Silenced a harmless "error" related to Rupture/Bleed often produced when using mcMMO and crazy enchantments together + +Version 2.1.159 + Fixed a memory leak involving renamed mobs + Updated Adventure library (used in our chat code) + +Version 2.1.158 + Fixed a bug where Lure level 4 and above would break fishing with the new Master Angler + URLs in party/admin chat work again (use https:// in front to make links clickable) + Updated nl locale (thanks xl3ehindTim) + * Added Crossbow to string repairables (Thanks Momshroom) + * Added Shield to wood repairables, with oak planks as material (Thanks Momshroom) + * Added Elytra and Trident to Other repairables, using phantom membrane and prismarine crystals respectively. (Thanks Momshroom) + + NOTES: + * You'll need to update repair.vanilla.yml yourself or delete the file and regenerate it (lazy easy way). + Links in party/admin chat might not be clickable without https:// added in front of the url + Added some stuff to Repair, a rework to Repair is coming in the future, this stuff will work for now as a placeholder. + Master Angler will emulate the effects of Lure if the level is higher than 3 instead of attempting to stack with it to avoid a vanilla Minecraft bug where fish are never caught + +Version 2.1.157 + Fixed a NPE that prevented mctop (Leaderboards) from working + +Version 2.1.156 + Added Woodcutting skill 'Knock on Wood' - This ability gives you goodies (saplings, xp orbs, apples, etc) when using Tree Feller + Tree Feller no longer gives non-wood items by default, it now requires Knock on Wood for additional loot + When you raise your axe you will now see information about any super abilities on CD + Fixed a bug where Green Thumb would replant blocks floating in the air + Fixed a bug where the admin and party chat toggles in chat.yml didn't function as intended + * Fixed a bug where Master Angler rank 1 level requirement was set too high (default configs) + Added some errors that trigger if a plugin hooking into mcMMO is grabbing leaderboards for child skills through our SQL/FlatFile class (which don't exist) + mcMMO will automatically fix some errors in logic for user settings in skillranks.yml + Corrected some logic errors when checking for oddities in skillranks.yml + Removed incorrect translations of Master Angler from various locales + Modified Master Angler stat lines in /fishing + Updated Green Thumb description to mention that it needs a hoe + 'Abilities.Limits.Tree_Feller_Threshold' in config.yml now defaults to 1000 instead of 500 (edit your config) + Added new permission node 'mcmmo.ability.woodcutting.knockonwood' + Added new locale line 'Woodcutting.SubSkill.KnockOnWood.Name' + Added new locale line 'Woodcutting.SubSkill.KnockOnWood.Stat' + Added new locale line 'Woodcutting.SubSkill.KnockOnWood.Description' + Added new locale line 'Woodcutting.SubSkill.KnockOnWood.Loot.Normal' + Added new locale line 'Woodcutting.SubSkill.KnockOnWood.Loot.Rank2' + + NOTES: + You don't need to touch your config files unless you want to get the new tree feller threshold (1000 instead of 500), you could also delete config.yml and regenerate it, for all the other config changes in this update, they are handled automagically. + * - If you haven't manually edited your Master Angler entries in skillranks.yml then the previous mcMMO update has rank 1 for Master Angler too high, this update automatically fixes it. + You may have noticed sometimes config file entries are in a strange jumbled order, yeah that's "normal". We'll be moving to HOCON for the config update and wont' have to deal with this crap for much longer. + I'll probably be doing a bunch of tweaks to mcMMO UI in the near future, I don't know, or I'll work on T&C + +Version 2.1.155 + Master Angler now has 8 ranks + Master Angler is now supported by the latest builds of Spigot on 1.16.4 + Wolves will now earn a lot more XP from combat than before (Wolves are going to be tweaked a lot in the near future) + Fixed a bug where Spectral Arrow awarded too much XP + Fixed a bug where party members other than the party leader had names that weren't properly hex colored + Added 'Skills.Fishing.MasterAngler.Tick_Reduction_Per_Rank.Min_Wait' to advanced.yml + Added 'Skills.Fishing.MasterAngler.Tick_Reduction_Per_Rank.Max_Wait' to advanced.yml + Added 'Skills.Fishing.MasterAngler.Boat_Tick_Reduction.Max_Wait' to advanced.yml + Added 'Skills.Fishing.MasterAngler.Boat_Tick_Reduction.Min_Wait' to advanced.yml + Added 'Skills.Fishing.MasterAngler.Tick_Reduction_Caps.Min_Wait' to advanced.yml + Added 'Skills.Fishing.MasterAngler.Tick_Reduction_Caps.Max_Wait' to advanced.yml + Removed Skills.Fishing.MasterAngler.BoatModifier from advanced.yml + Removed Skills.Fishing.MasterAngler.BoatModifier from advanced.yml + Optimized party/admin chat a bit + Added some misc safeguards against possible NPEs + Added some debug output when fishing if mmodebug is on + (API) Removed AbstractPlayerAuthor#getComponentDisplayName + (API) Removed AbstractPlayerAuthor#getComponentUserName + (API) Removed Author#getAuthoredComponentName + + NOTES: + Master Angler won't work if you aren't on 1.16.4, the truth is it hasn't worked for a very long time (Since before 1.13.2) + The Spigot API related to it has been broken since years and years ago, and they finally updated the API but it is only in the newest builds of Spigot. + If you are on something that doesn't support the new Master Angler that skill will be missing when you type /fishing + The boat bonus for master angler is static and doesn't improve when leveling master angler. + All the new master angler stuff is configurable and can be found in advanced.yml + The configurable reduction tick stuff for master angler is multiplied by the rank level when determining the final bonus (use /mmodebug when fishing to see some details) + Master Angler stacks with the Lure enchant + Removed some unnecessary API, we aren't a chat plugin so these things shouldn't be here. + Slowly adding Nullability annotations to the codebase + +Version 2.1.154 + Hex colors are now supported in Party & Admin chat + Added support for &#RRGGBB color codes (hex colors) in chat and nicknames for party and admin chat + Added hex colored nickname support to admin/party chat + Fixed a bug where Tree Feller was not dropping some items like saplings + Fixed a bug where using admin chat would in some circumstances throw a NPE + (API) Author class has been reworked + (API) McMMOChatEvent::getSender removed (use getDisplayName() instead) + (API) McMMMOChatEvent::setDisplayName() removed + (API) Removed Author::setName use Player::SetDisplayName instead + (API) Modified Author::getAuthoredName signature to -> Author::getAuthoredName(ChatChannel) + (API) Added Author::getAuthoredComponentName(ChatChannel) + (API) PartyAuthor and AdminAuthor removed, replaced by PlayerAuthor + (API) Probably some more undocumented changes that I'm forgetting... + +Notes: + For example '/p &#ccFF33hi guys' will send a message colored in hex colors + You'll see ~§x in console when hex color codes are used, this is a quirk of how the 'adventure' library we are using is handling some bungee component related things, so it's outside of my hands for now + +Version 2.1.153 + Fixed a bug where most sub-skills were not being displayed when using a skills command (for example /taming) + Fixed a bug where some URL links were not being colored + Updated fr locale (thanks Vlammar) + +Version 2.1.152 + Fixed a bug where Tree Feller would sometimes double drop blocks inappropriately + Fixed a bug with bleed damage calculations and player armor + Added some code to prevent a possible NPE when spawning items in a world that got unloaded + Added the missing 'pc' alias for party chat + Added the missing 'ac' alias for admin chat + (API) New ENUM ItemSpawnReason which gives context for why mcMMO is dropping an item + (API) McMMOItemSpawnEvent::getItemSpawnReason() was added + (API) Many instances of spawning items that didn't used to create and call an McMMOItemSpawnEvent now do + Updated hu_HU locale (thanks andris) + + NOTES: + I really should stop letting my OCD compel me to rewrite code all the time. + Bleed was meant to do reduced damage to players wearing 4 pieces of armor or more, it was incorrectly counting everyone as wearing 4 pieces even when they weren't. + This means Bleed was doing a bit less damage than was intended against players without a full set of armor equipped. + +Version 2.1.151 + Added new config for chat options named 'chat.yml' + Added 'Chat.Channels.Party.Spies.Automatically_Enable_Spying' to chat.yml which when enabled will start users who have the chat spy permission in chat spying mode + All chat settings that used to be in 'config.yml' are now in 'chat.yml' + The list of party members shown when using the party command has been simplified, this will change again in the T&C update + Fixed a bug where players could use the party chat command without the party chat permission + Party Leaders now use a different style when chatting than normal party members (can be customized) + Added 'Chat.Style.Party.Leader' to the locale, party leaders use this as their chat style + + NOTES: + I greatly disliked the old party member list but was avoiding rewriting it until later, someone pointed out how ugly it was and my OCD triggered and now it is rewritten. I will rewrite it again in Tridents & Crossbows. + The new config file lets you disable the chat system (you can disable all of it, or just party chat, and or just admin chat) without permission nodes. + If you disable the party/admin chat, then the party/admin chat command never gets registered and attempting to use the command will result in a whole lot of nothing, so if you want users to have a permission denied message then just stick to negating permission nodes. + I'll probably be tweaking mcMMO visually a lot in the near future, probably after Tridents & Crossbows goes out. + I hate adding more config files using the old .yml system, but the config update is a ways out and this works for now. + Reminder that the look/feel of party/admin chat is now determined by locale entries + https://mcmmo.org/wiki/Locale can help you understand how to change the locale + +Version 2.1.150 + Fixed an ArrayIndexOutOfBounds exception when using /skillreset + You can now add "-s" at the end of mmoedit, addlevels, or addxp to silence the command. Which will prevent the target of the command from being informed that the command was executed. + mcMMO should now be compatible with 1.16.4's new social features (affects Party/Admin chat) + mcMMO Party & Admin Chat have had a complete rewrite + Players & Console can now use color codes (including stuff like &a or [[GREEN]]) in party or admin chat + Added new permission node 'mcmmo.chat.colors' which allows players to use color codes, negate to disallow this + The style and look of admin/party chat is now determined by locale file instead of options in config.yml + The default style of admin/party chat has been updated, and it may be updated again in the future + Improved messages players receive when they toggle on or off admin or party chat + All locale files have had 99.9% of their [[]] color codes replaced by & color codes, you can still use [[GOLD]] and stuff if you want + Added new locale entry 'Commands.Usage.3.XP' + Added new locale entry 'Chat.Identity.Console' + Added new locale entry 'Chat.Style.Admin' + Added new locale entry 'Chat.Style.Party' + Added new locale entry 'Chat.Spy.Party' + Added new locale entry 'Chat.Channel.On' + Added new locale entry 'Chat.Channel.Off' + (API) ChatAPI::getPartyChatManager() has been removed + (API) ChatAPI::sendPartyChat has been removed (similar functionality can be found in the new ChatManager class) + (API) ChatAPI::sendAdminChat has been removed (similar functionality can be found in the new ChatManager class) + (API) Fake events in mcMMO now implement 'FakeEvent' (thanks TheBusyBiscuit) + (API) Updated Adventure Library to 4.1.1 + (API) McMMOChatEvent has been reworked, plugins dependent on this event should review this class and make appropriate changes + + NOTES: + The yet to be released Tridents & Crossbows update will also feature some new features related to party chat, so expect more tweaks to those features in the future. + I actually spent a little over a week on this, the old code for party/admin chat was absolutely horrid and when porting in the new 1.16.4 features I couldn't stand the sight of it so I burned everything to the ground and rewrote all of it. + The mcMMO chat events now make use of adventure library by Kyori, you can override the message payload with a TextComponent, which allows for some fancy stuff potentially. + I'll put in some of my own fancy stuff for party and admin chat in a future update. + +Version 2.1.149 + Added a new config file 'persistent_data.yml' + Almost all persistent mob data is now off by default and needs to be turned on in persistent_data.yml (new config file) for performance concerns + +NOTES: +There are some performance issues with how Spigot/MC saves NBT when you start adding NBT to mobs, because of this I have decided that the new persistent data from 2.1.148 is now opt-in. + +Not every server will suffer a TPS hit when using the persistent data options, but there is a significant IO cost which can affect TPS if you have them on + +I am therefore making many persistent options (the problematic ones involving mobs) opt-in so only those aware of the performance risk will be using the feature. + +Persistent data on mobs was a new feature that was introduced in 2.1.148, it was not in mcMMO for the last 10 years and most of you probably didn't even know that it was missing + +An example of persistent data would be, normally mcMMO would give 0 XP for a mob from a mob spawner, in the last 10 years if the server rebooted then those existing mobs would give XP again. But with the persistent data option turned on in persistentdata.yml they will be saved to disk, and mcMMO will not forget about them upon reboot. + +For now it is not recommended to use persistent data without monitoring performance of ticks afterwards to make sure it was something your server could handle. + +I have a solution in mind to make persistent data not so expensive, but writing the code for that will take some time. This will serve as an interim fix. + +I am going to focus on Tridents & Crossbows instead of that alternative solution, so don't expect it anytime soon. Use persistent data only if you understand the potential performance cost risk. +@ +Version 2.1.148 + Fixed a memory leak involving entity metadata + Alchemy progression is now more reasonable (delete skillranks.yml or edit it yourself to receive the change, see notes) + Made some optimizations to combat processing + New experience multiplier labeled 'Eggs' in experience.yml with a default value of 0 (previously mobs from eggs were using the Mobspawner experience multiplier) + New experience multiplier labeled 'Nether_Portal' in experience.yml with a default value of 0 + New experience multiplier labeled 'Player_Tamed' in experience.yml with a default value of 0 + New advanced.yml config setting 'Skills.Mining.SuperBreaker.AllowTripleDrops' defaults to true + + Fixed a bug where mobs from eggs were only tracked if it was dispensed (egg tracking now tracks from egg items as well) + Fixed a bug where egg spawned mobs were sometimes not marked as being from an egg (used in experience multipliers) + Fixed a bug where entities transformed by a single event (such as lightning) weren't tracked properly if there was more than one entity involved + mmodebug now prints out some information about final damage when attacking an entity in certain circumstances + + (1.14+ required) + Mobs spawned from mob spawners are tracked persistently and are no longer forgotten about after a restart + Tamed mobs are tracked persistently and are no longer forgotten about after a restart + Egg spawned mobs are tracked persistently and are no longer forgotten about after a restart + Nether Portal spawned mobs are tracked persistently and are no longer forgotten about after a restart + Endermen who target endermite are tracked persistently and are no longer forgotten about after a restart + COTW spawned mobs are tracked persistently and are no longer forgotten about after a restart + Player bred mobs are tracked persistently and are no longer forgotten about after a restart + Player tamed mobs are tracked persistently and are no longer forgotten about after a restart + + NOTES: + Egg mobs & Nether portal pigs being assigned to the mobspawner xp multiplier didn't make sense to me, so it has been changed. They have their own XP multipliers now. + While working on making data persistent I stumbled upon some alarming memory leak candidates, one of them was 7 years old. Sigh. + Alchemy now progresses much smoother, with rank 2 no longer unlocking right away. Thanks to Momshroom for pointing out this oddity. Delete skillranks.yml or edit it yourself to recieve this change. + https://gist.github.com/nossr50/4c8efc980314781a960a3bdd7bb34f0d This link shows the new Alchemy progression in skillranks.yml feel free to copy paste (or just delete the file and regenerate it) + There's no persistent API for entities in Spigot for 1.13.2, but in the future I'll wire up NMS and write it to NBT myself. + This means the new persistence stuff requires 1.14.0 or higher, if you're still on 1.13.2 for now that stuff will behave like it always did + +Version 2.1.147 + Fixed a bug where players below the level threshold on a hardcore mode enabled server would gain levels on death in certain circumstances + +Version 2.1.146 + A bug where players would disconnect from mcMMO messages has been fixed (thanks kashike / read notes) + It should be noted this was NOT an mcMMO bug, but a bug within Spigot since Spigot 1.16 + A dupe exploit has been fixed + Improvements were made to tracking player placed blocks in mcMMO + Players no longer lose levels below the level threshold in hardcore mode + Hardcore now only applies penalties to levels above threshold + + NOTES: + Shout out to Kashike + Kashike is a developer on the mcMMO team, however after I recruited him had a lot of life stuff come at him and has./tn't had a chance to contribute until now! + + JSON is used by Minecraft for a lot of stuff, in this case the JSON mcMMO made use of was related to displaying text in chat or displaying text on the clients screen in other places such as the action bar, there's been a bad bug in Spigot since 1.16 that would disconnect players some of the time when sending JSON components. + mcMMO makes heavy use of these components, so since spigot has yet to fix the bug I decided we needed a work around for the time being. + The library named 'adventure' is developed by the Kyori organization, which is Kashike's baby. + Kashike is a very talented and skilled developer and he did the work on this patch to solve this issue. + + This is a link to an bug report I did on this bug on Spigot's issue tracker, it is my understanding they have yet to find a way to reliably reproduce this bug. + If you have any information please post about it in this thread. + + https://hub.spigotmc.org/jira/browse/SPIGOT-6056 + Although mcMMO solved this issue by switching to Kyori's Adventure library for sending JSON Components, most Spigot plugins have not implemented a work around like this and will continue to make players disconnect until it is solved within Spigot. + + Hardcore changes + If you set a level threshold of 100 and player with 150 levels dies, they should never lose more than 50 levels as the first 100 are considered part of the threshold. + Prior to this change in this exact same scenario a player could be penalized and be put below the threshold. + + Shout out to HexedHero for reporting the dupe exploit and providing a demonstration of how to replicate it + + Tridents & Crossbows update + It is still being worked on but it won't make a September release. + October is the new target release but I am terrible with estimates so take it with a grain of salt! + + +Version 2.1.145 + Reverted 'Changed one of the PlayerInteractEvent listeners to ignore cancelled events' from 2.1.144 + + +Version 2.1.144 + Steel Arm Style damage is now customizable in advanced.yml (make sure to set override to true) + Fixed a bug where Deflect worked against non-arrow projectiles + Fixed a bug where Deflect was checked twice, resulting in two chances to deflect effectively + Fixed a bug where Roll wouldn't award XP when fall height was over a certain amount + Lowered the XP ceiling of Roll + Fixed a NPE that would happen involving taming in combat processing + Updated hu_HU locale (thanks andris155) + Fixed a bug where mcMMO could erase item data on Wheat Seeds when using Green Thumb on a block + Changed one of the PlayerInteractEvent listeners to ignore cancelled events (should improve plugin compatibility) + mmodebug mode now prints some information when fuel efficiency is applied to a furnace + + NOTES: + I seem to consistently find old bugs in mcMMO, this deflect bug where it was checked twice, who knows how many years its been in mcMMO, I didn't check but its probably between 5-7. + I was waiting to make Steel Arm Customizable for the config update (due in the future), but enough people ask for it that I decided to do the extra work to put it into 2.1.XX + Tridents & Crossbows is likely going to be in development continuing into September, I am taking my time to make it feature packed and I hope you guys will appreciate it. + +Version 2.1.143 + mcMMO now tracks super ability boosted items through persistent metadata + mcMMO no longer relies on lore to tell if an item has been modified by a super ability + Slight buff to Rupture (1 more tick duration across all ranks) + Lore no longer gets added to items being buffed by mcMMO./ + + NOTES: + The item tracking is persistent for MC versions 1.13-1.16.2 (and beyond). However the code handling the persistence for 1.13.2 differs from the other versions. It shouldn't result in any problems. + Any items that currently have the old "mcMMO Ability Tool" lore on them will have that lore stripped off them and will have any dig speed enchants removed. This should only affect glitched items that never properly got their buffs removed. + +Version 2.1.142 + Iron Arm Style renamed to Steel Arm Style + Steel Arm Style now scales over 20 ranks instead of 5 + Added 'mcmmo.ability.unarmed.steelarmstyle' permission node + Removed 'mcmmo.ability.unarmed.ironarmstyle' permission node + Added locale entry 'Unarmed.SubSkill.SteelArmStyle.Name' + Added locale entry 'Unarmed.SubSkill.SteelArmStyle.Description' + Updated locale entry 'Unarmed.Ability.Bonus.0' + +Version 2.1.141 + Added some missing values for 1.16.2 compatibility modes + +Version 2.1.140 + Fixed a few potential issues with scoreboards + Updated polish locale + + NOTES: + Scoreboards code in mcMMO is pretty messy and poorly designed, I am going to rewrite it in a future update. The fixes applied in this patch should solve some problems some users were having for now. + +Version 2.1.139 + Code used to fetch UUIDs was reworked to avoid a scenario where it failed (thanks t00thpick1) + Added 'Netherite_Gold_Ore' to Smelting XP tables (thanks Quavelen) + Added 'Gilded_Blackstone' and 'Nether_Gold_Ore' to code used to determine what can activate Super Breaker in certain situations (thanks Quavelen) + MMOinfo for Roll was corrected (thanks emanondev) + +Version 2.1.138 + Fixed a bug where Netherite weapons/tools/armor weren't applying correct values in some skill calculations + +Version 2.1.137 + Added some code to avoid NPE errors when checking armor on entities + +Version 2.1.136 + Furnace ownership is no longer lost when the furnace stops doing a job + Furnaces remember owners between restarts (requires MC 1.14 or higher) + + NOTES: + I'm making use of a Spigot API for persistent data for versions of MC 1.14 and above, for versions below the data will be temporary as it has been up until this point. + In the future I'll wire up NMS to make use of NBT and all versions will have persistent data support. + +Version 2.1.135 + Furnaces no longer simulate block break checks when assigning ownership as it caused some unwanted plugin conflicts + Fixed an issue where Fishing would break if exploit protection was turned off for Fishing (Thanks Ineusia) + Fixed Super abilities not being translated on scoreboards (Thanks Ineusia) + Added option in advanced.yml to squelch ability activation messages being sent to other players via action bar (Thanks Ineusia) + +Version 2.1.134 + Furnaces now change ownership to the last player who clicks in their inventory and is legally allowed to break the furnace + Smelting now has a Bonus Drops section in config.yml + Smelting now only doubles smelting results for items which have bonus drop entries in config.yml + Smelting XP can now be gained offline, but all other benefits from Smelting don't happen unless you're online + Fix brewing stand not consuming items (thanks Durburz) + Changed the UUID updater task to not catastrophically fail when requests failed + Fixed a bug where players could set each other on fire when partied or when PVP was disabled + Fixed a NPE that could happen with thrown potions + Fixed a potential NPE when damaging player armor with Axes + Fixed a potential NPE when damaging a player with Blast Mining + Fixed a potential NPE when checking tools related to Super Abilities + Fixed a potential NPE when checking the Chimaera Wing + Fixed a potential NPE when creating party member lists + Fixed a potential NPE when fishing + Fixed a potential NPE when players right click blocks + Fixed a locale mistake in locale hu_HU + Fixed a locale mistake in locale ru + Minor code cleanup + + NOTES: + It used to be that Furnaces would assign an owner and that would be their owner until the server shutdown, now owners will change based on who last had their hands on the furnace. + You won't become the owner if you are not allowed to view the inventory of a furnace, or break the furnace, or interact with the contents of the furnace + +Version 2.1.133 + A fix for an 'array out of bounds' error related to players clicking outside the inventory windows has been fixed + French locale has been updated (thanks Elikill58) + Another fix has been deployed to prevent mobs from having hearts in player death messages (thanks FrankHeijden) + Players no longer ready their tool if they don't have access to the skill (thanks Draycia) + Unused NMS compatibility layers have been disabled for now (expect them to be used in the future for 1.12/1.8 support stuff) + +Version 2.1.132 + A fix is in place to prevent an exploit from working that is due to a yet to be patched Spigot server software bug + Fixed a NPE that could happen when players swapped items from their hotbar + + NOTE: The exploit was not described on purpose, please update. + I reported the bug to Spigot, so hopefully it will be patched in the near future. + +Version 2.1.131 + + New permission node 'mcmmo.ability.repair.netheriterepair' which is included in the mcmmo.defaults permission package + New permission node 'mcmmo.ability.salvage.netheritesalvage' which is included in the mcmmo.defaults permission package + Changed Salvage maximum quantity values to 4 for all Netherite armor + mcMMO will set the default salvage quantities for netherite armor to 4 once and then never again (see notes) + + Added Basalt to Bonus Drops for Mining in config.yml (see notes) + Added Polished Basalt to Bonus Drops for Mining in config.yml (see notes) + Added Blackstone to Bonus Drops for Mining in config.yml (see notes) + Added Chain to Bonus Drops for Mining in config.yml (see notes) + Added Nether Bricks to Bonus Drops for Mining in config.yml (see notes) + Added Red Nether Bricks to Bonus Drops for Mining in config.yml (see notes) + Added Cracked Nether Bricks to Bonus Drops for Mining in config.yml (see notes) + Added Chiseled Nether Bricks to Bonus Drops for Mining in config.yml (see notes) + Added Crying Obsidian to Bonus Drops for Mining in config.yml (see notes) + Added Gilded Blackstone to Bonus Drops for Mining in config.yml (see notes) + Added Warped Roots to Bonus Drops for Herbalism in config.yml (see notes) + Added Warped Stem to Bonus Drops for Herbalism in config.yml (see notes) + Added Crimson Roots to Bonus Drops for Herbalism in config.yml (see notes) + Added Crimson Stem to Bonus Drops for Herbalism in config.yml (see notes) + Added Shroomlight to Bonus Drops for Herbalism in config.yml (see notes) + Added Twisting Vines to Bonus Drops for Herbalism in config.yml (see notes) + Added Nether Wart Block to Bonus Drops for Herbalism in config.yml (see notes) + Added Warped Wart Block to Bonus Drops for Herbalism in config.yml (see notes) + Added Weeping Vines to Bonus Drops for Herbalism in config.yml (see notes) + Added Crimson Hyphae to Bonus Drops for Woodcutting in config.yml (see notes) + Added Stripped Crimson Hyphae to Bonus Drops for Woodcutting in config.yml (see notes) + Added Warped Hyphae to Bonus Drops for Woodcutting in config.yml (see notes) + Added Stripped Warped Hyphae to Bonus Drops for Woodcutting in config.yml (see notes) + + Added Red Nether Bricks to Experience tables for Mining in experience.yml (see notes) + Added Netherite to Experience tables for Repair in experience.yml (see notes) + Added Piglin Brute to Experience tables for all combat skills in experience.yml + + Netherite now requires 100 Salvage skill (by default configs) in order to salvage + Added the missing NMS wiring (it should be noted NMS isn't currently being used in mcMMO, but the framework is there. Working on a sideproject involving this...) + + NOTES: + + You should not need to edit your configs to receive any changes in this patch, simply starting your server is enough. + Default salvage quantities for netherite armor were above 4 in some cases which was not intended, mcMMO will run some code to correct this once and then it will not edit the file again. + Repair and Salvage are going to get some tweaks regarding Netherite gear really soon. + This update adds quite a few missing entries for bonus drops, without these entries double drops on these items/blocks will not happen. + + +Version 2.1.130 + Fixed a bug that prevented Repair from working on the new Netherite weapons/armors + Fixed a bug where Netherite gear used Gold Ingots to repair instead of Netherite Scraps (by default) + mcMMO will now run a script to fix a misspelling of netherite in repair/salvage configs (script only runs once and then never again) + mcMMO will produce a fake PlayerItemDamageEvent before damaging axes in Tree Feller execution + + + NOTES: + Early versions of 1.16 support had Netherite misspelled, the script I added executes before loading those config files to fix the spelling mistakes if it finds any + If you are still having issues with Repair/Salvage, delete the repair and salvage .yml files in /plugins/mcMMO and restart the server + +Version 2.1.129 + Added new subcommand /mmoxpbar disable - Hides all mcMMO XP bars + New locale string 'Commands.XPBar.DisableAll' + Added Blackstone to Mining experience tables + Added Chain to Mining experience tables + Added Bone Block to Mining experience tables + Added Cracked Nether Bricks to Mining experience tables + Added Chiseled Nether Bricks to Mining experience tables + Added Crying Obsidian to Mining experience tables + Added Gilded Blackstone to Mining experience tables + Added Crimson Hyphae to Woodcutting experience tables + Added Stripped Crimson Hyphae to Woodcutting experience tables + Added Warped Hyphae to Woodcutting experience tables + Added Stripped Warped Hyphae to Woodcutting experience tables + Added Shroomlight to Herbalism experience tables + Added Zoglin to combat experience tables + Added Redstone Dust to bonus drops for Mining ( edit config.yml ) + Lodestone will now be ignored for activating abilities + Respawn Anchor will now be ignored for activating abilities + Soul Campfire will now be ignored for activating abilities + + Edit your experience.yml or delete it to generate a new one + Edit config.yml and add Redstone_Dust under bonus drops for Mining, you could delete it to generate a new one but MySQL data is stored here + + Default experience.yml looks like this now: https://raw.githubusercontent.com/mcMMO-Dev/mcMMO/master/src/main/resources/experience.yml + +Version 2.1.128 + The first rank of Iron Arm for Unarmed now only gives 1.5 bonus damage instead of 4 (other ranks are the same as before) + Blast Mining nerf reverted + Fixed a bug where debris were not reduced from Blast Mining skills + Fixed a bug where certain types of ore did not receive bonuses from Blast Mining + Fixed a few locale errors with commands + (API) Added ExperienceAPI::addCombatXP for adding combat XP to players, signature may change so its deprecated for now + mcMMO now logs whether or not its using FlatFile or SQL database on load + (1.16) Strider added to combat experience with a value of 1.2 + + NOTES: A more thorough look at Unarmed balance will happen in the future, the intention of this nerf is to make Unarmed less rewarding until it is leveled quite a bit. + I do plan to add saving XP bar settings to an upcoming version of mcMMO, but I'm working on another thing for mcMMO atm. + +Version 2.1.127 + Child Skills now have XP bars, they are hidden by default + Updated hu_HU locale (thanks andris155) + Updated korean locale (thanks GownHeeJun) + Fixed a potential resource leak (thanks f1xme) + Fixed some potential chunk bugs (thanks f1xme) + + + NOTES: + You can enable the child skill bars with the command /mmoxpbar show + Version 2.1.126 mcMMO now relies on NMS for some of its features, if NMS cannot properly be wired up when initializing mcMMO behaviours relying on NMS will either be partially supported or disabled mcMMO now has a compatibility mode, any features that require specific versions of Minecraft for full functionality will be disabled if your server is not running a compatible version, mcMMO will still function in compatibility mode, but either the feature will be modified or disabled depending on the version of the server software New command /mmocompat - Shows information about whether or not mcMMO is fully functional or if some features are disabled due to the server software not being fully supported. Can be used by players or console. + New command /mmoxpbar (alias /xpbarsettings) - Players can choose to always show XP bars or to never show XP bars on a per skill basis + XPBars now last for 3 seconds before hiding instead of 2 seconds Fixed an exploit involving fishing rods + mcMMO is now less verbose about unsupported materials found in configs + + New locale strings + Commands.Description.mmoxpbar + Commands.Description.mmocompat + Commands.XPBar.Reset + Commands.XPBar.SettingChanged + Compatibility.Layer.Unsupported + Compatibility.Layer.PartialSupport + Notes: There are no features that rely on NMS in this version, it took a lot of work to write the NMS framework and I'm going to delay implementation for future versions. + /mmoxpbar (or /xpbarsettings) example usages + /mmoxpbar show archery - Always show archery XP bar + /mmoxpbar hide acrobatics - Never show acrobatics XP bar + /mmoxpbar reset - Reset all settings related to XP bars (hide/show) Version 2.1.125 *Fixed a bug where you could not place blocks on top of certain repair/salvage anvils @@ -14,7 +1175,7 @@ Version 2.1.125 Version 2.1.124 Repair/Salvage can now be set to use vanilla blocks that already do something and that vanilla functionality will be disabled by mcMMO (you could use vanilla-anvils instead of iron_blocks for repair now) - Added Gold_Nugget to Mining's Bonus_Drops in config.yml (edit your config)g + Added Gold_Nugget to Mining's Bonus_Drops in config.yml (edit your config) Added Piglin to experience.yml combat XP tables with a value of 2.0 (edit your config) Added Hoglin to experience.yml combat XP tables with a value of 4.0 (edit your config) Added Zombified_Piglin & Zombie_Pigman to experience.yml combat XP tables with a value of 3.0 (edit your config) diff --git a/extras/mods/1.6.x/extrabiomesxl.blocks.yml b/extras/mods/1.6.x/extrabiomesxl.blocks.yml index a17898063..b689b254a 100755 --- a/extras/mods/1.6.x/extrabiomesxl.blocks.yml +++ b/extras/mods/1.6.x/extrabiomesxl.blocks.yml @@ -99,10 +99,6 @@ Woodcutting: Double_Drops_Enabled: true Is_Log: true # Fir Quarters - X2209|1: - XP_Gain: 80 - Double_Drops_Enabled: true - Is_Log: true X2211|1: XP_Gain: 100 Double_Drops_Enabled: true @@ -116,10 +112,6 @@ Woodcutting: Double_Drops_Enabled: true Is_Log: true # Oak Quarters - X2209|2: - XP_Gain: 70 - Double_Drops_Enabled: true - Is_Log: true X2211|2: XP_Gain: 100 Double_Drops_Enabled: true @@ -133,15 +125,7 @@ Woodcutting: Double_Drops_Enabled: true Is_Log: true # Acacia - X2209|1: - XP_Gain: 80 - Double_Drops_Enabled: true - Is_Log: true - # Cypress - X2209|2: - XP_Gain: 90 - Double_Drops_Enabled: true - Is_Log: true + # Cypress # Bald Cypress Quarter X2225|0: XP_Gain: 90 diff --git a/extras/mods/1.6.x/metallurgy3.tools.yml b/extras/mods/1.6.x/metallurgy3.tools.yml index 9a4938917..2e827d221 100644 --- a/extras/mods/1.6.x/metallurgy3.tools.yml +++ b/extras/mods/1.6.x/metallurgy3.tools.yml @@ -366,25 +366,7 @@ Axes: ### Bows: #Bow_1 - X999: - XP_Modifer: 1.0 - Ability_Enabled: true - Tier: 1 - Repairable: true - Repair_Material: X99 - Repair_Material_Data_Value: 0 - Repair_Material_Quantity: 9 - Durability: 9999 #Bow_2 - X999: - XP_Modifer: 1.0 - Ability_Enabled: true - Tier: 1 - Repairable: true - Repair_Material: X99 - Repair_Material_Data_Value: 0 - Repair_Material_Quantity: 9 - Durability: 9999 # # Settings for Hoes diff --git a/extras/mods/1.6.x/twilightforest.armor.yml b/extras/mods/1.6.x/twilightforest.armor.yml index 51f4b219d..18dd80cd2 100755 --- a/extras/mods/1.6.x/twilightforest.armor.yml +++ b/extras/mods/1.6.x/twilightforest.armor.yml @@ -68,17 +68,7 @@ Chestplates: Repair_Material_Quantity: 8 Durability: 320 # Knightmetal - X28035: - Repairable: true - Repair_Material: X28032 - Repair_Material_Pretty_Name: "Knightmetal Ingot" - Repair_Material_Data_Value: 0 - Repair_Material_Quantity: 8 - Durability: 320 # Phantom - X28035: - Repairable: false - Durability: 480 Helmets: # Ironwood @@ -106,17 +96,7 @@ Helmets: Repair_Material_Quantity: 5 Durability: 220 # Knightmetal - X28034: - Repairable: true - Repair_Material: X28032 - Repair_Material_Pretty_Name: "Knightmetal Ingot" - Repair_Material_Data_Value: 0 - Repair_Material_Quantity: 5 - Durability: 220 # Phantom - X28034: - Repairable: false - Durability: 330 Leggings: # Ironwood diff --git a/pom.xml b/pom.xml index 4b55d2149..1484101cc 100755 --- a/pom.xml +++ b/pom.xml @@ -2,7 +2,7 @@ 4.0.0 com.gmail.nossr50.mcMMO mcMMO - 2.1.126-SNAPSHOT + 2.1.210-SNAPSHOT mcMMO https://github.com/mcMMO-Dev/mcMMO @@ -11,11 +11,29 @@ scm:git:git@github.com:mcMMO-Dev/mcMMO.git HEAD + + + UTF-8 + 16 + 16 + 16 + + https://github.com/mcMMO-Dev/mcMMO/issues GitHub jar + + + neetgames + https://nexus.neetgames.com/repository/maven-releases/ + + + neetgames + https://nexus.neetgames.com/repository/maven-snapshots/ + + ${project.artifactId} ${basedir}/src/main/java @@ -55,6 +73,25 @@ + + maven-surefire-plugin + 3.0.0-M5 + + + org.junit.jupiter:junit-jupiter + false + + + + maven-failsafe-plugin + 3.0.0-M5 + + + org.junit.jupiter:junit-jupiter + false + + + org.apache.maven.plugins maven-release-plugin @@ -63,10 +100,12 @@ org.apache.maven.plugins maven-compiler-plugin - 2.3.2 + 3.8.1 - 1.8 - 1.8 + 16 + + -parameters + @@ -91,32 +130,64 @@ org.apache.maven.plugins maven-shade-plugin - 3.1.1 + 3.3.0-SNAPSHOT commons-logging:commons-logging org.apache.tomcat:tomcat-jdbc org.apache.tomcat:tomcat-juli + org.bstats:bstats-base org.bstats:bstats-bukkit + net.kyori:adventure-api + net.kyori:adventure-text-serializer-gson + net.kyori:adventure-platform-bukkit + net.kyori:adventure-platform-api + net.kyori:adventure-platform-viaversion + net.kyori:adventure-platform-facet + net.kyori:adventure-nbt + net.kyori:adventure-key + net.kyori:examination-api + net.kyori:examination-string + net.kyori:adventure-text-serializer-legacy + net.kyori:adventure-text-serializer-bungeecord + net.kyori:adventure-text-serializer-craftbukkit + net.kyori:adventure-text-serializer-gson-legacy-impl + co.aikar:acf-bukkit + + net.kyori.examination + com.gmail.nossr50.mcmmo.kyori.examination + + + net.kyori.adventure + com.gmail.nossr50.mcmmo.kyori.adventure + + + co.aikar.commands + com.gmail.nossr50.mcmmo.acf + + + co.aikar.locales + com.gmail.nossr50.mcmmo.locales + org.apache.commons.logging - com.gmail.nossr50.commons.logging + com.gmail.nossr50.mcmmo.commons.logging org.apache.juli - com.gmail.nossr50.database.tomcat.juli + com.gmail.nossr50.mcmmo.database.tomcat.juli org.apache.tomcat - com.gmail.nossr50.database.tomcat + com.gmail.nossr50.mcmmo.database.tomcat org.bstats - com.gmail.nossr50.metrics.bstat + com.gmail.nossr50.mcmmo.metrics.bstats @@ -138,6 +209,13 @@ + + + maven-snapshots + https://repository.apache.org/content/repositories/snapshots/ + + + spigot-repo @@ -149,31 +227,90 @@ sk89q-repo - http://maven.sk89q.com/repo/ + https://maven.sk89q.com/repo/ + + sonatype-oss + https://oss.sonatype.org/content/repositories/snapshots/ + + + aikar + https://repo.aikar.co/content/groups/aikar/ + + + + + co.aikar + acf-bukkit + 0.5.0-SNAPSHOT + + + + net.kyori + adventure-text-serializer-gson + 4.9.3 + + + net.kyori + adventure-api + 4.9.3 + + + net.kyori + adventure-nbt + 4.9.3 + + + net.kyori + adventure-key + 4.9.3 + + + net.kyori + adventure-text-serializer-gson-legacy-impl + 4.9.3 + + + net.kyori + adventure-platform-bukkit + 4.0.1 + + + net.kyori + adventure-platform-api + 4.0.1 + org.apache.maven.scm maven-scm-provider-gitexe - 1.8.1 + 1.12.0 org.bstats bstats-bukkit - 1.4 + 2.2.1 compile org.spigotmc spigot-api - 1.15.2-R0.1-SNAPSHOT + 1.18.1-R0.1-SNAPSHOT provided com.sk89q.worldguard worldguard-core - 7.0.1-SNAPSHOT + 7.0.4 + + + + + com.google.code.findbugs + jsr305 + + com.sk89q.worldguard @@ -187,24 +324,39 @@ - junit - junit-dep - 4.10 + org.junit.jupiter + junit-jupiter + 5.8.2 + test + + + org.mockito + mockito-core + 4.2.0 + test + + + org.mockito + mockito-inline + 4.2.0 test org.apache.tomcat tomcat-jdbc - 7.0.52 + 10.0.14 compile org.jetbrains annotations - 19.0.0 + 22.0.0 + + + com.google.guava + guava + 31.0.1-jre + compile - - UTF-8 - diff --git a/src/main/java/com/gmail/nossr50/api/AbilityAPI.java b/src/main/java/com/gmail/nossr50/api/AbilityAPI.java index 5922ecbe6..3ad6d43e7 100644 --- a/src/main/java/com/gmail/nossr50/api/AbilityAPI.java +++ b/src/main/java/com/gmail/nossr50/api/AbilityAPI.java @@ -2,7 +2,7 @@ package com.gmail.nossr50.api; import com.gmail.nossr50.datatypes.player.McMMOPlayer; import com.gmail.nossr50.datatypes.skills.SuperAbilityType; -import com.gmail.nossr50.runnables.skills.BleedTimerTask; +import com.gmail.nossr50.util.MetadataConstants; import com.gmail.nossr50.util.player.UserManager; import org.bukkit.entity.LivingEntity; import org.bukkit.entity.Player; @@ -83,6 +83,12 @@ public final class AbilityAPI { } public static boolean isBleeding(LivingEntity entity) { - return BleedTimerTask.isBleeding(entity); + if(entity.isValid()) { + if(entity.hasMetadata(MetadataConstants.METADATA_KEY_RUPTURE)) { + return true; + } + } + + return false; } } diff --git a/src/main/java/com/gmail/nossr50/api/ChatAPI.java b/src/main/java/com/gmail/nossr50/api/ChatAPI.java index 7e4434316..e4d61957a 100644 --- a/src/main/java/com/gmail/nossr50/api/ChatAPI.java +++ b/src/main/java/com/gmail/nossr50/api/ChatAPI.java @@ -1,72 +1,68 @@ package com.gmail.nossr50.api; -import com.gmail.nossr50.chat.ChatManager; -import com.gmail.nossr50.chat.ChatManagerFactory; -import com.gmail.nossr50.chat.PartyChatManager; -import com.gmail.nossr50.datatypes.chat.ChatMode; -import com.gmail.nossr50.party.PartyManager; +import com.gmail.nossr50.datatypes.chat.ChatChannel; +import com.gmail.nossr50.mcMMO; import com.gmail.nossr50.util.player.UserManager; import org.bukkit.entity.Player; -import org.bukkit.plugin.Plugin; public final class ChatAPI { private ChatAPI() {} - /** - * Send a message to all members of a party - *
- * This function is designed for API usage. - * - * @param plugin The plugin sending the message - * @param sender The name of the sender - * @param displayName The display name of the sender - * @param party The name of the party to send to - * @param message The message to send - */ - public static void sendPartyChat(Plugin plugin, String sender, String displayName, String party, String message) { - getPartyChatManager(plugin, party).handleChat(sender, displayName, message); - } - - /** - * Send a message to all members of a party - *
- * This function is designed for API usage. - * - * @param plugin The plugin sending the message - * @param sender The name of the sender to display in the chat - * @param party The name of the party to send to - * @param message The message to send - */ - public static void sendPartyChat(Plugin plugin, String sender, String party, String message) { - getPartyChatManager(plugin, party).handleChat(sender, message); - } - - /** - * Send a message to administrators - *
- * This function is designed for API usage. - * - * @param plugin The plugin sending the message - * @param sender The name of the sender - * @param displayName The display name of the sender - * @param message The message to send - */ - public static void sendAdminChat(Plugin plugin, String sender, String displayName, String message) { - ChatManagerFactory.getChatManager(plugin, ChatMode.ADMIN).handleChat(sender, displayName, message); - } - - /** - * Send a message to administrators - *
- * This function is designed for API usage. - * - * @param plugin The plugin sending the message - * @param sender The name of the sender to display in the chat - * @param message The message to send - */ - public static void sendAdminChat(Plugin plugin, String sender, String message) { - ChatManagerFactory.getChatManager(plugin, ChatMode.ADMIN).handleChat(sender, message); - } +// /** +// * Send a message to all members of a party +// *
+// * This function is designed for API usage. +// * +// * @param plugin The plugin sending the message +// * @param sender The name of the sender +// * @param displayName The display name of the sender +// * @param party The name of the party to send to +// * @param message The message to send +// */ +// public static void sendPartyChat(Plugin plugin, String sender, String displayName, String party, String message) { +// getPartyChatManager(plugin, party).handleChat(sender, displayName, message); +// } +// +// /** +// * Send a message to all members of a party +// *
+// * This function is designed for API usage. +// * +// * @param plugin The plugin sending the message +// * @param sender The name of the sender to display in the chat +// * @param party The name of the party to send to +// * @param message The message to send +// */ +// public static void sendPartyChat(Plugin plugin, String sender, String party, String message) { +// getPartyChatManager(plugin, party).handleChat(sender, message); +// } +// +// /** +// * Send a message to administrators +// *
+// * This function is designed for API usage. +// * +// * @param plugin The plugin sending the message +// * @param sender The name of the sender +// * @param displayName The display name of the sender +// * @param message The message to send +// */ +// public static void sendAdminChat(Plugin plugin, String sender, String displayName, String message) { +// ChatManagerFactory.getChatManager(plugin, ChatChannel.ADMIN).handleChat(sender, displayName, message); +// } +// +// /** +// * Send a message to administrators +// *
+// * This function is designed for API usage. +// * +// * @param plugin The plugin sending the message +// * @param sender The name of the sender to display in the chat +// * @param message The message to send +// */ +// public static void sendAdminChat(Plugin plugin, String sender, String message) { +// ChatManagerFactory.getChatManager(plugin, ChatChannel.ADMIN).handleChat(sender, message); +// } /** * Check if a player is currently talking in party chat. @@ -75,7 +71,7 @@ public final class ChatAPI { * @return true if the player is using party chat, false otherwise */ public static boolean isUsingPartyChat(Player player) { - return UserManager.getPlayer(player).isChatEnabled(ChatMode.PARTY); + return UserManager.getPlayer(player).getChatChannel() == ChatChannel.PARTY; } /** @@ -85,7 +81,7 @@ public final class ChatAPI { * @return true if the player is using party chat, false otherwise */ public static boolean isUsingPartyChat(String playerName) { - return UserManager.getPlayer(playerName).isChatEnabled(ChatMode.PARTY); + return UserManager.getPlayer(playerName).getChatChannel() == ChatChannel.PARTY; } /** @@ -95,7 +91,7 @@ public final class ChatAPI { * @return true if the player is using admin chat, false otherwise */ public static boolean isUsingAdminChat(Player player) { - return UserManager.getPlayer(player).isChatEnabled(ChatMode.ADMIN); + return UserManager.getPlayer(player).getChatChannel() == ChatChannel.ADMIN; } /** @@ -105,7 +101,7 @@ public final class ChatAPI { * @return true if the player is using admin chat, false otherwise */ public static boolean isUsingAdminChat(String playerName) { - return UserManager.getPlayer(playerName).isChatEnabled(ChatMode.ADMIN); + return UserManager.getPlayer(playerName).getChatChannel() == ChatChannel.ADMIN; } /** @@ -114,7 +110,7 @@ public final class ChatAPI { * @param player The player to toggle party chat on. */ public static void togglePartyChat(Player player) { - UserManager.getPlayer(player).toggleChat(ChatMode.PARTY); + mcMMO.p.getChatManager().setOrToggleChatChannel(UserManager.getPlayer(player), ChatChannel.PARTY); } /** @@ -123,7 +119,7 @@ public final class ChatAPI { * @param playerName The name of the player to toggle party chat on. */ public static void togglePartyChat(String playerName) { - UserManager.getPlayer(playerName).toggleChat(ChatMode.PARTY); + mcMMO.p.getChatManager().setOrToggleChatChannel(UserManager.getPlayer(playerName), ChatChannel.PARTY); } /** @@ -132,7 +128,7 @@ public final class ChatAPI { * @param player The player to toggle admin chat on. */ public static void toggleAdminChat(Player player) { - UserManager.getPlayer(player).toggleChat(ChatMode.ADMIN); + mcMMO.p.getChatManager().setOrToggleChatChannel(UserManager.getPlayer(player), ChatChannel.ADMIN); } /** @@ -141,13 +137,6 @@ public final class ChatAPI { * @param playerName The name of the player to toggle party chat on. */ public static void toggleAdminChat(String playerName) { - UserManager.getPlayer(playerName).toggleChat(ChatMode.ADMIN); - } - - private static ChatManager getPartyChatManager(Plugin plugin, String party) { - ChatManager chatManager = ChatManagerFactory.getChatManager(plugin, ChatMode.PARTY); - ((PartyChatManager) chatManager).setParty(PartyManager.getParty(party)); - - return chatManager; + mcMMO.p.getChatManager().setOrToggleChatChannel(UserManager.getPlayer(playerName), ChatChannel.ADMIN); } } diff --git a/src/main/java/com/gmail/nossr50/api/DatabaseAPI.java b/src/main/java/com/gmail/nossr50/api/DatabaseAPI.java index 544a23124..55f682377 100644 --- a/src/main/java/com/gmail/nossr50/api/DatabaseAPI.java +++ b/src/main/java/com/gmail/nossr50/api/DatabaseAPI.java @@ -2,6 +2,8 @@ package com.gmail.nossr50.api; import com.gmail.nossr50.datatypes.player.PlayerProfile; import com.gmail.nossr50.mcMMO; +import org.bukkit.OfflinePlayer; +import org.jetbrains.annotations.NotNull; import java.util.UUID; @@ -9,20 +11,38 @@ public class DatabaseAPI { /** * Checks if a player exists in the mcMMO Database - * @param uuid player UUID + * @param offlinePlayer target player * @return true if the player exists in the DB, false if they do not */ - public boolean doesPlayerExistInDB(String uuid) { - return doesPlayerExistInDB(UUID.fromString(uuid)); + public boolean doesPlayerExistInDB(@NotNull OfflinePlayer offlinePlayer) { + PlayerProfile playerProfile = mcMMO.getDatabaseManager().loadPlayerProfile(offlinePlayer); + + return playerProfile.isLoaded(); } /** * Checks if a player exists in the mcMMO Database - * @param uuid player UUID + * @param uuid target player * @return true if the player exists in the DB, false if they do not */ - public boolean doesPlayerExistInDB(UUID uuid) { - PlayerProfile playerProfile = mcMMO.getDatabaseManager().loadPlayerProfile(uuid); + public boolean doesPlayerExistInDB(@NotNull UUID uuid) { + PlayerProfile playerProfile = null; + try { + playerProfile = mcMMO.getDatabaseManager().loadPlayerProfile(uuid); + } catch (Exception e) { + return false; + } + + return playerProfile.isLoaded(); + } + + /** + * Checks if a player exists in the mcMMO Database + * @param playerName target player + * @return true if the player exists in the DB, false if they do not + */ + public boolean doesPlayerExistInDB(@NotNull String playerName) { + PlayerProfile playerProfile = mcMMO.getDatabaseManager().loadPlayerProfile(playerName); return playerProfile.isLoaded(); } diff --git a/src/main/java/com/gmail/nossr50/api/ExperienceAPI.java b/src/main/java/com/gmail/nossr50/api/ExperienceAPI.java index 6a800fb23..678f1346b 100644 --- a/src/main/java/com/gmail/nossr50/api/ExperienceAPI.java +++ b/src/main/java/com/gmail/nossr50/api/ExperienceAPI.java @@ -1,7 +1,6 @@ package com.gmail.nossr50.api; import com.gmail.nossr50.api.exceptions.*; -import com.gmail.nossr50.config.Config; import com.gmail.nossr50.config.experience.ExperienceConfig; import com.gmail.nossr50.datatypes.experience.FormulaType; import com.gmail.nossr50.datatypes.experience.XPGainReason; @@ -12,8 +11,13 @@ import com.gmail.nossr50.datatypes.skills.PrimarySkillType; import com.gmail.nossr50.mcMMO; import com.gmail.nossr50.skills.child.FamilyTree; import com.gmail.nossr50.util.player.UserManager; +import com.gmail.nossr50.util.skills.CombatUtils; +import com.gmail.nossr50.util.skills.SkillTools; +import org.bukkit.OfflinePlayer; import org.bukkit.block.BlockState; +import org.bukkit.entity.LivingEntity; import org.bukkit.entity.Player; +import org.jetbrains.annotations.NotNull; import java.util.ArrayList; import java.util.Set; @@ -32,7 +36,36 @@ public final class ExperienceAPI { * @return true if this is a valid mcMMO skill */ public static boolean isValidSkillType(String skillType) { - return PrimarySkillType.getSkill(skillType) != null; + return mcMMO.p.getSkillTools().matchSkill(skillType) != null; + } + + /** + * Start the task that gives combat XP. + * Processes combat XP like mcMMO normally would, so mcMMO will check whether or not the entity should reward XP when giving out the XP + * + * @param mcMMOPlayer The attacking player + * @param target The defending entity + * @param primarySkillType The skill being used + * @param multiplier final XP result will be multiplied by this + * @deprecated Draft API + */ + @Deprecated + public static void addCombatXP(McMMOPlayer mcMMOPlayer, LivingEntity target, PrimarySkillType primarySkillType, double multiplier) { + CombatUtils.processCombatXP(mcMMOPlayer, target, primarySkillType, multiplier); + } + + /** + * Start the task that gives combat XP. + * Processes combat XP like mcMMO normally would, so mcMMO will check whether or not the entity should reward XP when giving out the XP + * + * @param mcMMOPlayer The attacking player + * @param target The defending entity + * @param primarySkillType The skill being used + * @deprecated Draft API + */ + @Deprecated + public static void addCombatXP(McMMOPlayer mcMMOPlayer, LivingEntity target, PrimarySkillType primarySkillType) { + CombatUtils.processCombatXP(mcMMOPlayer, target, primarySkillType); } /** @@ -46,9 +79,9 @@ public final class ExperienceAPI { * @return true if this is a valid, non-child mcMMO skill */ public static boolean isNonChildSkill(String skillType) { - PrimarySkillType skill = PrimarySkillType.getSkill(skillType); + PrimarySkillType skill = mcMMO.p.getSkillTools().matchSkill(skillType); - return skill != null && !skill.isChildSkill(); + return skill != null && !SkillTools.isChildSkill(skill); } @Deprecated @@ -262,11 +295,12 @@ public final class ExperienceAPI { PrimarySkillType skill = getSkillType(skillType); if (isUnshared) { - getPlayer(player).beginUnsharedXpGain(skill, (int) (XP / skill.getXpModifier() * ExperienceConfig.getInstance().getExperienceGainsGlobalMultiplier()), getXPGainReason(xpGainReason), XPGainSource.CUSTOM); + getPlayer(player).beginUnsharedXpGain(skill, + (int) (XP / ExperienceConfig.getInstance().getFormulaSkillModifier(skill) * ExperienceConfig.getInstance().getExperienceGainsGlobalMultiplier()), getXPGainReason(xpGainReason), XPGainSource.CUSTOM); return; } - getPlayer(player).applyXpGain(skill, (int) (XP / skill.getXpModifier() * ExperienceConfig.getInstance().getExperienceGainsGlobalMultiplier()), getXPGainReason(xpGainReason), XPGainSource.CUSTOM); + getPlayer(player).applyXpGain(skill, (int) (XP / ExperienceConfig.getInstance().getFormulaSkillModifier(skill) * ExperienceConfig.getInstance().getExperienceGainsGlobalMultiplier()), getXPGainReason(xpGainReason), XPGainSource.CUSTOM); } /** @@ -285,7 +319,7 @@ public final class ExperienceAPI { public static void addModifiedXPOffline(String playerName, String skillType, int XP) { PrimarySkillType skill = getSkillType(skillType); - addOfflineXP(playerName, skill, (int) (XP / skill.getXpModifier() * ExperienceConfig.getInstance().getExperienceGainsGlobalMultiplier())); + addOfflineXP(playerName, skill, (int) (XP / ExperienceConfig.getInstance().getFormulaSkillModifier(skill) * ExperienceConfig.getInstance().getExperienceGainsGlobalMultiplier())); } /** @@ -398,6 +432,23 @@ public final class ExperienceAPI { return getOfflineProfile(uuid).getSkillXpLevel(getNonChildSkillType(skillType)); } + /** + * Get the amount of XP an offline player has in a specific skill. + *
+ * This function is designed for API usage. + * + * @param offlinePlayer The player to get XP for + * @param skillType The skill to get XP for + * @return the amount of XP in a given skill + * + * @throws InvalidSkillException if the given skill is not valid + * @throws InvalidPlayerException if the given player does not exist in the database + * @throws UnsupportedOperationException if the given skill is a child skill + */ + public static int getOfflineXP(@NotNull OfflinePlayer offlinePlayer, @NotNull String skillType) throws InvalidPlayerException { + return getOfflineProfile(offlinePlayer).getSkillXpLevel(getNonChildSkillType(skillType)); + } + /** * Get the raw amount of XP a player has in a specific skill. *
@@ -449,6 +500,30 @@ public final class ExperienceAPI { return getOfflineProfile(uuid).getSkillXpLevelRaw(getNonChildSkillType(skillType)); } + /** + * Get the raw amount of XP an offline player has in a specific skill. + *
+ * This function is designed for API usage. + * + * @param offlinePlayer The player to get XP for + * @param skillType The skill to get XP for + * @return the amount of XP in a given skill + * + * @throws InvalidSkillException if the given skill is not valid + * @throws InvalidPlayerException if the given player does not exist in the database + * @throws UnsupportedOperationException if the given skill is a child skill + */ + public static float getOfflineXPRaw(@NotNull OfflinePlayer offlinePlayer, @NotNull String skillType) throws InvalidPlayerException, UnsupportedOperationException, InvalidSkillException { + return getOfflineProfile(offlinePlayer).getSkillXpLevelRaw(getNonChildSkillType(skillType)); + } + + public static float getOfflineXPRaw(@NotNull OfflinePlayer offlinePlayer, @NotNull PrimarySkillType skillType) throws InvalidPlayerException, UnsupportedOperationException { + if(SkillTools.isChildSkill(skillType)) + throw new UnsupportedOperationException(); + + return getOfflineProfile(offlinePlayer).getSkillXpLevelRaw(skillType); + } + /** * Get the total amount of XP needed to reach the next level. *
@@ -496,10 +571,27 @@ public final class ExperienceAPI { * @throws InvalidPlayerException if the given player does not exist in the database * @throws UnsupportedOperationException if the given skill is a child skill */ - public static int getOfflineXPToNextLevel(UUID uuid, String skillType) { + public static int getOfflineXPToNextLevel(@NotNull UUID uuid, @NotNull String skillType) { return getOfflineProfile(uuid).getXpToLevel(getNonChildSkillType(skillType)); } + /** + * Get the total amount of XP an offline player needs to reach the next level. + *
+ * This function is designed for API usage. + * + * @param offlinePlayer The player to get XP for + * @param skillType The skill to get XP for + * @return the total amount of XP needed to reach the next level + * + * @throws InvalidSkillException if the given skill is not valid + * @throws InvalidPlayerException if the given player does not exist in the database + * @throws UnsupportedOperationException if the given skill is a child skill + */ + public static int getOfflineXPToNextLevel(@NotNull OfflinePlayer offlinePlayer, @NotNull String skillType) throws UnsupportedOperationException, InvalidSkillException, InvalidPlayerException { + return getOfflineProfile(offlinePlayer).getXpToLevel(getNonChildSkillType(skillType)); + } + /** * Get the amount of XP remaining until the next level. *
@@ -561,6 +653,26 @@ public final class ExperienceAPI { return profile.getXpToLevel(skill) - profile.getSkillXpLevelRaw(skill); } + /** + * Get the amount of XP an offline player has left before leveling up. + *
+ * This function is designed for API usage. + * + * @param offlinePlayer The player to get XP for + * @param skillType The skill to get XP for + * @return the amount of XP needed to reach the next level + * + * @throws InvalidSkillException if the given skill is not valid + * @throws InvalidPlayerException if the given player does not exist in the database + * @throws UnsupportedOperationException if the given skill is a child skill + */ + public static float getOfflineXPRemaining(OfflinePlayer offlinePlayer, String skillType) throws InvalidSkillException, InvalidPlayerException, UnsupportedOperationException { + PrimarySkillType skill = getNonChildSkillType(skillType); + PlayerProfile profile = getOfflineProfile(offlinePlayer); + + return profile.getXpToLevel(skill) - profile.getSkillXpLevelRaw(skill); + } + /** * Add levels to a skill. *
@@ -593,7 +705,7 @@ public final class ExperienceAPI { PlayerProfile profile = getOfflineProfile(playerName); PrimarySkillType skill = getSkillType(skillType); - if (skill.isChildSkill()) { + if (SkillTools.isChildSkill(skill)) { Set parentSkills = FamilyTree.getParents(skill); for (PrimarySkillType parentSkill : parentSkills) { @@ -624,7 +736,7 @@ public final class ExperienceAPI { PlayerProfile profile = getOfflineProfile(uuid); PrimarySkillType skill = getSkillType(skillType); - if (skill.isChildSkill()) { + if (SkillTools.isChildSkill(skill)) { Set parentSkills = FamilyTree.getParents(skill); for (PrimarySkillType parentSkill : parentSkills) { @@ -683,7 +795,6 @@ public final class ExperienceAPI { * @throws InvalidSkillException if the given skill is not valid * @throws InvalidPlayerException if the given player does not exist in the database */ - @Deprecated public static int getLevelOffline(String playerName, String skillType) { return getOfflineProfile(playerName).getSkillLevel(getSkillType(skillType)); } @@ -731,7 +842,7 @@ public final class ExperienceAPI { int powerLevel = 0; PlayerProfile profile = getOfflineProfile(playerName); - for (PrimarySkillType type : PrimarySkillType.NON_CHILD_SKILLS) { + for (PrimarySkillType type : SkillTools.NON_CHILD_SKILLS) { powerLevel += profile.getSkillLevel(type); } @@ -752,7 +863,7 @@ public final class ExperienceAPI { int powerLevel = 0; PlayerProfile profile = getOfflineProfile(uuid); - for (PrimarySkillType type : PrimarySkillType.NON_CHILD_SKILLS) { + for (PrimarySkillType type : SkillTools.NON_CHILD_SKILLS) { powerLevel += profile.getSkillLevel(type); } @@ -770,7 +881,7 @@ public final class ExperienceAPI { * @throws InvalidSkillException if the given skill is not valid */ public static int getLevelCap(String skillType) { - return Config.getInstance().getLevelCap(getSkillType(skillType)); + return mcMMO.p.getSkillTools().getLevelCap(getSkillType(skillType)); } /** @@ -781,7 +892,7 @@ public final class ExperienceAPI { * @return the overall power level cap */ public static int getPowerLevelCap() { - return Config.getInstance().getPowerLevelCap(); + return mcMMO.p.getGeneralConfig().getPowerLevelCap(); } /** @@ -1095,25 +1206,22 @@ public final class ExperienceAPI { } } - - // Utility methods follow. - private static void addOfflineXP(UUID playerUniqueId, PrimarySkillType skill, int XP) { + private static void addOfflineXP(@NotNull UUID playerUniqueId, @NotNull PrimarySkillType skill, int XP) { PlayerProfile profile = getOfflineProfile(playerUniqueId); profile.addXp(skill, XP); profile.save(true); } - @Deprecated - private static void addOfflineXP(String playerName, PrimarySkillType skill, int XP) { + private static void addOfflineXP(@NotNull String playerName, @NotNull PrimarySkillType skill, int XP) { PlayerProfile profile = getOfflineProfile(playerName); profile.addXp(skill, XP); profile.scheduleAsyncSave(); } - private static PlayerProfile getOfflineProfile(UUID uuid) { + private static @NotNull PlayerProfile getOfflineProfile(@NotNull UUID uuid) throws InvalidPlayerException { PlayerProfile profile = mcMMO.getDatabaseManager().loadPlayerProfile(uuid); if (!profile.isLoaded()) { @@ -1123,10 +1231,18 @@ public final class ExperienceAPI { return profile; } - @Deprecated - private static PlayerProfile getOfflineProfile(String playerName) { - UUID uuid = mcMMO.p.getServer().getOfflinePlayer(playerName).getUniqueId(); - PlayerProfile profile = mcMMO.getDatabaseManager().loadPlayerProfile(uuid); + private static @NotNull PlayerProfile getOfflineProfile(@NotNull OfflinePlayer offlinePlayer) throws InvalidPlayerException { + PlayerProfile profile = mcMMO.getDatabaseManager().loadPlayerProfile(offlinePlayer); + + if (!profile.isLoaded()) { + throw new InvalidPlayerException(); + } + + return profile; + } + + private static @NotNull PlayerProfile getOfflineProfile(@NotNull String playerName) throws InvalidPlayerException { + PlayerProfile profile = mcMMO.getDatabaseManager().loadPlayerProfile(playerName); if (!profile.isLoaded()) { throw new InvalidPlayerException(); @@ -1136,7 +1252,7 @@ public final class ExperienceAPI { } private static PrimarySkillType getSkillType(String skillType) throws InvalidSkillException { - PrimarySkillType skill = PrimarySkillType.getSkill(skillType); + PrimarySkillType skill = mcMMO.p.getSkillTools().matchSkill(skillType); if (skill == null) { throw new InvalidSkillException(); @@ -1148,7 +1264,7 @@ public final class ExperienceAPI { private static PrimarySkillType getNonChildSkillType(String skillType) throws InvalidSkillException, UnsupportedOperationException { PrimarySkillType skill = getSkillType(skillType); - if (skill.isChildSkill()) { + if (SkillTools.isChildSkill(skill)) { throw new UnsupportedOperationException("Child skills do not have XP"); } diff --git a/src/main/java/com/gmail/nossr50/api/ItemSpawnReason.java b/src/main/java/com/gmail/nossr50/api/ItemSpawnReason.java new file mode 100644 index 000000000..29fdc1d29 --- /dev/null +++ b/src/main/java/com/gmail/nossr50/api/ItemSpawnReason.java @@ -0,0 +1,17 @@ +package com.gmail.nossr50.api; + +public enum ItemSpawnReason { + ARROW_RETRIEVAL_ACTIVATED, //Players sometimes can retrieve arrows instead of losing them when hitting a mob + EXCAVATION_TREASURE, //Any drops when excavation treasures activate fall under this + FISHING_EXTRA_FISH, //A config setting allows more fish to be found when fishing, the extra fish are part of this + FISHING_SHAKE_TREASURE, //When using a fishing rod on a mob and finding a treasure via Shake + HYLIAN_LUCK_TREASURE, //When finding a treasure in grass via hylian luck + BLAST_MINING_DEBRIS_NON_ORES, //The non-ore debris that are dropped from blast mining + BLAST_MINING_ORES, //The ore(s) which may include player placed ores being dropped from blast mining + BLAST_MINING_ORES_BONUS_DROP, //Any bonus ores that drop from a result of a players Mining skills + UNARMED_DISARMED_ITEM, //When you disarm an opponent and they drop their weapon + SALVAGE_ENCHANTMENT_BOOK, //When you salvage an enchanted item and get the enchantment back in book form + SALVAGE_MATERIALS, //When you salvage an item and get materials back + TREE_FELLER_DISPLACED_BLOCK, + BONUS_DROPS, //Can be from Mining, Woodcutting, Herbalism, etc +} diff --git a/src/main/java/com/gmail/nossr50/api/PartyAPI.java b/src/main/java/com/gmail/nossr50/api/PartyAPI.java index eaea5027b..7592df5e6 100644 --- a/src/main/java/com/gmail/nossr50/api/PartyAPI.java +++ b/src/main/java/com/gmail/nossr50/api/PartyAPI.java @@ -1,6 +1,5 @@ package com.gmail.nossr50.api; -import com.gmail.nossr50.config.Config; import com.gmail.nossr50.datatypes.interactions.NotificationType; import com.gmail.nossr50.datatypes.party.Party; import com.gmail.nossr50.datatypes.party.PartyLeader; @@ -108,7 +107,7 @@ public final class PartyAPI { */ public static int getMaxPartySize() { - return Config.getInstance().getPartyMaxSize(); + return mcMMO.p.getGeneralConfig().getPartyMaxSize(); } /** @@ -185,7 +184,7 @@ public final class PartyAPI { */ @Deprecated public static List getOnlineAndOfflineMembers(Player player) { - List members = new ArrayList(); + List members = new ArrayList<>(); for (UUID memberUniqueId : PartyManager.getAllMembers(player).keySet()) { OfflinePlayer member = mcMMO.p.getServer().getOfflinePlayer(memberUniqueId); diff --git a/src/main/java/com/gmail/nossr50/api/SkillAPI.java b/src/main/java/com/gmail/nossr50/api/SkillAPI.java index ee230bc72..be8315a28 100644 --- a/src/main/java/com/gmail/nossr50/api/SkillAPI.java +++ b/src/main/java/com/gmail/nossr50/api/SkillAPI.java @@ -1,6 +1,8 @@ package com.gmail.nossr50.api; import com.gmail.nossr50.datatypes.skills.PrimarySkillType; +import com.gmail.nossr50.mcMMO; +import com.gmail.nossr50.util.skills.SkillTools; import java.util.ArrayList; import java.util.Arrays; @@ -30,7 +32,7 @@ public final class SkillAPI { * @return a list of strings with valid skill names */ public static List getNonChildSkills() { - return getListFromEnum(PrimarySkillType.NON_CHILD_SKILLS); + return getListFromEnum(SkillTools.NON_CHILD_SKILLS); } /** @@ -42,7 +44,7 @@ public final class SkillAPI { * @return a list of strings with valid skill names */ public static List getChildSkills() { - return getListFromEnum(PrimarySkillType.CHILD_SKILLS); + return getListFromEnum(mcMMO.p.getSkillTools().CHILD_SKILLS); } /** @@ -54,7 +56,7 @@ public final class SkillAPI { * @return a list of strings with valid skill names */ public static List getCombatSkills() { - return getListFromEnum(PrimarySkillType.COMBAT_SKILLS); + return getListFromEnum(mcMMO.p.getSkillTools().COMBAT_SKILLS); } /** @@ -66,7 +68,7 @@ public final class SkillAPI { * @return a list of strings with valid skill names */ public static List getGatheringSkills() { - return getListFromEnum(PrimarySkillType.GATHERING_SKILLS); + return getListFromEnum(mcMMO.p.getSkillTools().GATHERING_SKILLS); } /** @@ -78,11 +80,11 @@ public final class SkillAPI { * @return a list of strings with valid skill names */ public static List getMiscSkills() { - return getListFromEnum(PrimarySkillType.MISC_SKILLS); + return getListFromEnum(mcMMO.p.getSkillTools().MISC_SKILLS); } private static List getListFromEnum(List skillsTypes) { - List skills = new ArrayList(); + List skills = new ArrayList<>(); for (PrimarySkillType primarySkillType : skillsTypes) { skills.add(primarySkillType.name()); diff --git a/src/main/java/com/gmail/nossr50/api/exceptions/IncompleteNamespacedKeyRegister.java b/src/main/java/com/gmail/nossr50/api/exceptions/IncompleteNamespacedKeyRegister.java new file mode 100644 index 000000000..5bc8b5c9f --- /dev/null +++ b/src/main/java/com/gmail/nossr50/api/exceptions/IncompleteNamespacedKeyRegister.java @@ -0,0 +1,11 @@ +package com.gmail.nossr50.api.exceptions; + +import org.jetbrains.annotations.NotNull; + +public class IncompleteNamespacedKeyRegister extends RuntimeException { + private static final long serialVersionUID = -6905157273569301219L; + + public IncompleteNamespacedKeyRegister(@NotNull String message) { + super(message); + } +} diff --git a/src/main/java/com/gmail/nossr50/api/exceptions/InvalidSkillException.java b/src/main/java/com/gmail/nossr50/api/exceptions/InvalidSkillException.java index f94207a41..de0f847db 100644 --- a/src/main/java/com/gmail/nossr50/api/exceptions/InvalidSkillException.java +++ b/src/main/java/com/gmail/nossr50/api/exceptions/InvalidSkillException.java @@ -6,4 +6,8 @@ public class InvalidSkillException extends RuntimeException { public InvalidSkillException() { super("That is not a valid skill."); } + + public InvalidSkillException(String msg) { + super(msg); + } } diff --git a/src/main/java/com/gmail/nossr50/api/exceptions/McMMOPlayerNotFoundException.java b/src/main/java/com/gmail/nossr50/api/exceptions/McMMOPlayerNotFoundException.java index b0b0f0087..374c04a9a 100644 --- a/src/main/java/com/gmail/nossr50/api/exceptions/McMMOPlayerNotFoundException.java +++ b/src/main/java/com/gmail/nossr50/api/exceptions/McMMOPlayerNotFoundException.java @@ -1,11 +1,12 @@ package com.gmail.nossr50.api.exceptions; import org.bukkit.entity.Player; +import org.jetbrains.annotations.NotNull; public class McMMOPlayerNotFoundException extends RuntimeException { private static final long serialVersionUID = 761917904993202836L; - public McMMOPlayerNotFoundException(Player player) { - super("McMMOPlayer object was not found for [NOTE: This can mean the profile is not loaded yet!] : " + player.getName() + " " + player.getUniqueId()); + public McMMOPlayerNotFoundException(@NotNull Player player) { + super("McMMOPlayer object was not found for [NOTE: This can mean the profile is not loaded yet! : " + player.getName() + " " + player.getUniqueId()); } } diff --git a/src/main/java/com/gmail/nossr50/chat/AdminChatManager.java b/src/main/java/com/gmail/nossr50/chat/AdminChatManager.java deleted file mode 100644 index 2c9d6ce56..000000000 --- a/src/main/java/com/gmail/nossr50/chat/AdminChatManager.java +++ /dev/null @@ -1,21 +0,0 @@ -package com.gmail.nossr50.chat; - -import com.gmail.nossr50.config.Config; -import com.gmail.nossr50.events.chat.McMMOAdminChatEvent; -import org.bukkit.plugin.Plugin; - -public class AdminChatManager extends ChatManager { - protected AdminChatManager(Plugin plugin) { - super(plugin, Config.getInstance().getAdminDisplayNames(), Config.getInstance().getAdminChatPrefix()); - } - - @Override - public void handleChat(String senderName, String displayName, String message, boolean isAsync) { - handleChat(new McMMOAdminChatEvent(plugin, senderName, displayName, message, isAsync)); - } - - @Override - protected void sendMessage() { - plugin.getServer().broadcast(message, "mcmmo.chat.adminchat"); - } -} diff --git a/src/main/java/com/gmail/nossr50/chat/ChatManager.java b/src/main/java/com/gmail/nossr50/chat/ChatManager.java index d91d5885e..a0a1e6f30 100644 --- a/src/main/java/com/gmail/nossr50/chat/ChatManager.java +++ b/src/main/java/com/gmail/nossr50/chat/ChatManager.java @@ -1,88 +1,225 @@ package com.gmail.nossr50.chat; +import com.gmail.nossr50.chat.author.Author; +import com.gmail.nossr50.chat.author.ConsoleAuthor; +import com.gmail.nossr50.chat.mailer.AdminChatMailer; +import com.gmail.nossr50.chat.mailer.PartyChatMailer; +import com.gmail.nossr50.config.ChatConfig; +import com.gmail.nossr50.datatypes.chat.ChatChannel; import com.gmail.nossr50.datatypes.party.Party; import com.gmail.nossr50.datatypes.player.McMMOPlayer; -import com.gmail.nossr50.events.chat.McMMOChatEvent; -import com.gmail.nossr50.events.chat.McMMOPartyChatEvent; import com.gmail.nossr50.locale.LocaleLoader; -import com.gmail.nossr50.util.player.UserManager; -import org.bukkit.entity.Player; -import org.bukkit.plugin.Plugin; +import com.gmail.nossr50.mcMMO; +import com.gmail.nossr50.util.Misc; +import com.gmail.nossr50.util.Permissions; +import com.gmail.nossr50.util.text.StringUtils; +import net.kyori.adventure.audience.Audience; +import net.kyori.adventure.text.TextComponent; +import org.bukkit.command.ConsoleCommandSender; +import org.jetbrains.annotations.NotNull; -public abstract class ChatManager { - protected Plugin plugin; - protected boolean useDisplayNames; - protected String chatPrefix; +//TODO: Micro optimization - Cache audiences and update cache when needed +public class ChatManager { - protected String senderName; - protected String displayName; - protected String message; + private final @NotNull AdminChatMailer adminChatMailer; + private final @NotNull PartyChatMailer partyChatMailer; - protected ChatManager(Plugin plugin, boolean useDisplayNames, String chatPrefix) { - this.plugin = plugin; - this.useDisplayNames = useDisplayNames; - this.chatPrefix = chatPrefix; + private final @NotNull ConsoleAuthor consoleAuthor; + private final @NotNull Audience consoleAudience; + + private final boolean isChatEnabled; + + public ChatManager(@NotNull mcMMO pluginRef) { + adminChatMailer = new AdminChatMailer(pluginRef); + partyChatMailer = new PartyChatMailer(pluginRef); + + this.consoleAuthor = new ConsoleAuthor(LocaleLoader.getString("Chat.Identity.Console")); + this.consoleAudience = mcMMO.getAudiences().filter((cs) -> cs instanceof ConsoleCommandSender); + this.isChatEnabled = ChatConfig.getInstance().isChatEnabled(); } - protected void handleChat(McMMOChatEvent event) { - plugin.getServer().getPluginManager().callEvent(event); + /** + * Handles player messaging when they are either in party chat or admin chat modes + * + * @param mmoPlayer target player + * @param rawMessage the raw message from the player as it was typed + * @param isAsync whether or not this is getting processed via async + */ + public void processPlayerMessage(@NotNull McMMOPlayer mmoPlayer, @NotNull String rawMessage, boolean isAsync) { + processPlayerMessage(mmoPlayer, mmoPlayer.getChatChannel(), rawMessage, isAsync); + } - if (event.isCancelled()) { - return; + /** + * Handles player messaging for a specific chat channel + * + * @param mmoPlayer target player + * @param args the raw command arguments from the player + * @param chatChannel target channel + */ + public void processPlayerMessage(@NotNull McMMOPlayer mmoPlayer, @NotNull String[] args, @NotNull ChatChannel chatChannel) { + String chatMessageWithoutCommand = buildChatMessage(args); + + //Commands are never async + processPlayerMessage(mmoPlayer, chatChannel, chatMessageWithoutCommand, false); + } + + /** + * Handles player messaging for a specific chat channel + * + * @param mmoPlayer target player + * @param chatChannel target chat channel + * @param rawMessage raw chat message as it was typed + * @param isAsync whether or not this is getting processed via async + */ + private void processPlayerMessage(@NotNull McMMOPlayer mmoPlayer, @NotNull ChatChannel chatChannel, @NotNull String rawMessage, boolean isAsync) { + switch (chatChannel) { + case ADMIN: + adminChatMailer.processChatMessage(mmoPlayer.getPlayerAuthor(), rawMessage, isAsync, Permissions.colorChat(mmoPlayer.getPlayer())); + break; + case PARTY: + partyChatMailer.processChatMessage(mmoPlayer.getPlayerAuthor(), rawMessage, mmoPlayer.getParty(), isAsync, Permissions.colorChat(mmoPlayer.getPlayer()), Misc.isPartyLeader(mmoPlayer)); + break; + case PARTY_OFFICER: + case NONE: + break; + } + } + + /** + * Handles console messaging to admins + * @param rawMessage raw message from the console + */ + public void processConsoleMessage(@NotNull String rawMessage) { + adminChatMailer.processChatMessage(getConsoleAuthor(), rawMessage, false, true); + } + + /** + * Handles console messaging to admins + * @param args raw command args from the console + */ + public void processConsoleMessage(@NotNull String[] args) { + processConsoleMessage(buildChatMessage(args)); + } + + /** + * Handles console messaging to a specific party + * @param rawMessage raw message from the console + * @param party target party + */ + public void processConsoleMessage(@NotNull String rawMessage, @NotNull Party party) { + partyChatMailer.processChatMessage(getConsoleAuthor(), rawMessage, party, false, true, false); + } + + /** + * Gets a console author + * @return a {@link ConsoleAuthor} + */ + private @NotNull Author getConsoleAuthor() { + return consoleAuthor; + } + + /** + * Change the chat channel of a {@link McMMOPlayer} + * Targeting the channel a player is already in will remove that player from the chat channel + * @param mmoPlayer target player + * @param targetChatChannel target chat channel + */ + public void setOrToggleChatChannel(@NotNull McMMOPlayer mmoPlayer, @NotNull ChatChannel targetChatChannel) { + if(targetChatChannel == mmoPlayer.getChatChannel()) { + //Disabled message + mmoPlayer.getPlayer().sendMessage(LocaleLoader.getString("Chat.Channel.Off", StringUtils.getCapitalized(targetChatChannel.toString()))); + mmoPlayer.setChatMode(ChatChannel.NONE); + } else { + mmoPlayer.setChatMode(targetChatChannel); + mmoPlayer.getPlayer().sendMessage(LocaleLoader.getString("Chat.Channel.On", StringUtils.getCapitalized(targetChatChannel.toString()))); + } + } + + /** + * Create a chat message from an array of {@link String} + * @param args array of {@link String} + * @return a String built from the array + */ + private @NotNull String buildChatMessage(@NotNull String[] args) { + StringBuilder stringBuilder = new StringBuilder(); + + for(int i = 0; i < args.length; i++) { + if(i + 1 >= args.length) { + stringBuilder.append(args[i]); + } else { + stringBuilder.append(args[i]).append(" "); + } } - senderName = event.getSender(); - displayName = useDisplayNames ? event.getDisplayName() : senderName; - message = LocaleLoader.formatString(chatPrefix, displayName) + " " + event.getMessage(); + return stringBuilder.toString(); + } - 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(McMMOPlayer mcMMOPlayer : UserManager.getPlayers()) - { - Player player = mcMMOPlayer.getPlayer(); - - //Check for toggled players - if(mcMMOPlayer.isPartyChatSpying()) - { - Party adminParty = mcMMOPlayer.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)); - } + /** + * Whether or not the player is allowed to send a message to the chat channel they are targeting + * @param mmoPlayer target player + * @return true if the player can send messages to that chat channel + */ + public boolean isMessageAllowed(@NotNull McMMOPlayer mmoPlayer) { + switch (mmoPlayer.getChatChannel()) { + case ADMIN: + if(mmoPlayer.getPlayer().isOp() || Permissions.adminChat(mmoPlayer.getPlayer())) { + return true; } + break; + case PARTY: + if(mmoPlayer.getParty() != null && Permissions.partyChat(mmoPlayer.getPlayer())) { + return true; + } + break; + case PARTY_OFFICER: + case NONE: + return false; + } + + return false; + } + + /** + * Sends just the console a message + * @param author author of the message + * @param message message contents in component form + */ + public void sendConsoleMessage(@NotNull Author author, @NotNull TextComponent message) { + consoleAudience.sendMessage(author, message); + } + + /** + * Whether the mcMMO chat system which handles party and admin chat is enabled or disabled + * @return true if mcMMO chat processing (for party/admin chat) is enabled + */ + public boolean isChatEnabled() { + return isChatEnabled; + } + + /** + * Whether or not a specific chat channel is enabled + * ChatChannels are enabled/disabled via user config + * + * If chat is disabled, this always returns false + * If NONE is passed as a {@link ChatChannel} it will return true + * @param chatChannel target chat channel + * @return true if the chat channel is enabled + */ + public boolean isChatChannelEnabled(@NotNull ChatChannel chatChannel) { + if(!isChatEnabled) { + return false; + } else { + switch(chatChannel) { + case ADMIN: + case PARTY: + case PARTY_OFFICER: + return ChatConfig.getInstance().isChatChannelEnabled(chatChannel); + case NONE: + return true; + default: + return false; } } } - 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(); -} +} \ No newline at end of file diff --git a/src/main/java/com/gmail/nossr50/chat/ChatManagerFactory.java b/src/main/java/com/gmail/nossr50/chat/ChatManagerFactory.java deleted file mode 100644 index 308e736df..000000000 --- a/src/main/java/com/gmail/nossr50/chat/ChatManagerFactory.java +++ /dev/null @@ -1,30 +0,0 @@ -package com.gmail.nossr50.chat; - -import com.gmail.nossr50.datatypes.chat.ChatMode; -import org.bukkit.plugin.Plugin; - -import java.util.HashMap; - -public class ChatManagerFactory { - private static final HashMap adminChatManagers = new HashMap(); - private static final HashMap partyChatManagers = new HashMap(); - - public static ChatManager getChatManager(Plugin plugin, ChatMode mode) { - switch (mode) { - case ADMIN: - if (!adminChatManagers.containsKey(plugin)) { - adminChatManagers.put(plugin, new AdminChatManager(plugin)); - } - - return adminChatManagers.get(plugin); - case PARTY: - if (!partyChatManagers.containsKey(plugin)) { - partyChatManagers.put(plugin, new PartyChatManager(plugin)); - } - - return partyChatManagers.get(plugin); - default: - return null; - } - } -} diff --git a/src/main/java/com/gmail/nossr50/chat/PartyChatManager.java b/src/main/java/com/gmail/nossr50/chat/PartyChatManager.java deleted file mode 100644 index ac4a32065..000000000 --- a/src/main/java/com/gmail/nossr50/chat/PartyChatManager.java +++ /dev/null @@ -1,29 +0,0 @@ -package com.gmail.nossr50.chat; - -import com.gmail.nossr50.config.Config; -import com.gmail.nossr50.datatypes.party.Party; -import com.gmail.nossr50.events.chat.McMMOPartyChatEvent; -import com.gmail.nossr50.runnables.party.PartyChatTask; -import org.bukkit.plugin.Plugin; - -public class PartyChatManager extends ChatManager { - private Party party; - - protected PartyChatManager(Plugin plugin) { - super(plugin, Config.getInstance().getPartyDisplayNames(), Config.getInstance().getPartyChatPrefix()); - } - - public void setParty(Party party) { - this.party = party; - } - - @Override - public void handleChat(String senderName, String displayName, String message, boolean isAsync) { - handleChat(new McMMOPartyChatEvent(plugin, senderName, displayName, party.getName(), message, isAsync)); - } - - @Override - protected void sendMessage() { - new PartyChatTask(plugin, party, senderName, displayName, message).runTask(plugin); - } -} diff --git a/src/main/java/com/gmail/nossr50/chat/SamePartyPredicate.java b/src/main/java/com/gmail/nossr50/chat/SamePartyPredicate.java new file mode 100644 index 000000000..6d4636d6c --- /dev/null +++ b/src/main/java/com/gmail/nossr50/chat/SamePartyPredicate.java @@ -0,0 +1,36 @@ +package com.gmail.nossr50.chat; + +import com.gmail.nossr50.datatypes.party.Party; +import com.gmail.nossr50.datatypes.player.McMMOPlayer; +import com.gmail.nossr50.util.player.UserManager; +import org.bukkit.command.CommandSender; +import org.bukkit.command.ConsoleCommandSender; +import org.bukkit.entity.Player; + +import java.util.function.Predicate; + +public class SamePartyPredicate implements Predicate { + + final Party party; + + public SamePartyPredicate(Party party) { + this.party = party; + } + + @Override + public boolean test(T t) { + //Include the console in the audience + if(t instanceof ConsoleCommandSender) { + return false; //Party audiences are special, we exclude console from them to avoid double messaging since we send a more verbose version to consoles + } else { + if(t instanceof Player) { + Player player = (Player) t; + McMMOPlayer mcMMOPlayer = UserManager.getPlayer(player); + if(mcMMOPlayer != null) { + return mcMMOPlayer.getParty() == party; + } + } + } + return false; + } +} diff --git a/src/main/java/com/gmail/nossr50/chat/author/AbstractPlayerAuthor.java b/src/main/java/com/gmail/nossr50/chat/author/AbstractPlayerAuthor.java new file mode 100644 index 000000000..e2bb7c7e0 --- /dev/null +++ b/src/main/java/com/gmail/nossr50/chat/author/AbstractPlayerAuthor.java @@ -0,0 +1,120 @@ +package com.gmail.nossr50.chat.author; + +import com.gmail.nossr50.datatypes.chat.ChatChannel; +import com.gmail.nossr50.util.text.TextUtils; +import com.google.common.base.Objects; +import org.bukkit.entity.Player; +import org.checkerframework.checker.nullness.qual.NonNull; +import org.jetbrains.annotations.NotNull; + +import java.util.HashMap; +import java.util.UUID; + +public abstract class AbstractPlayerAuthor implements Author { + private final @NotNull Player player; + private @NotNull String lastKnownDisplayName; + private final @NotNull HashMap sanitizedNameCache; + + public AbstractPlayerAuthor(@NotNull Player player) { + this.player = player; + this.lastKnownDisplayName = player.getDisplayName(); + this.sanitizedNameCache = new HashMap<>(); + } + + /** + * Returns true if a players display name has changed + * + * @return true if the players display name has changed + */ + private boolean hasPlayerDisplayNameChanged() { + return !player.getDisplayName().equals(lastKnownDisplayName); + } + + /** + * Player display names can change and this method will update the last known display name of this player + */ + private void updateLastKnownDisplayName() { + lastKnownDisplayName = player.getDisplayName(); + } + + /** + * Gets a sanitized name for a channel + * Sanitized names are names that are friendly to the {@link net.kyori.adventure.text.serializer.legacy.LegacyComponentSerializer} + * Sanitized names for authors are cached by channel and are only created as needed + * Sanitized names will update if a players display name has updated + * + * @param chatChannel target chat channel + * @return the sanitized name for a player + */ + protected @NotNull String getSanitizedName(@NotNull ChatChannel chatChannel, boolean useDisplayName) { + //Already in cache + if(sanitizedNameCache.containsKey(chatChannel)) { + //Update cache + if(useDisplayName && hasPlayerDisplayNameChanged()) { + updateLastKnownDisplayName(); + updateSanitizedNameCache(chatChannel, true); + } + } else { + //Update last known display name + if(useDisplayName && hasPlayerDisplayNameChanged()) { + updateLastKnownDisplayName(); + } + + //Add cache entry + updateSanitizedNameCache(chatChannel, useDisplayName); + } + + return sanitizedNameCache.get(chatChannel); + } + + /** + * Update the sanitized name cache + * This will add entries if one didn't exit + * Sanitized names are associated with a {@link ChatChannel} as different chat channels have different chat name settings + * + * @param chatChannel target chat channel + * @param useDisplayName whether or not to use this authors display name + */ + private void updateSanitizedNameCache(@NotNull ChatChannel chatChannel, boolean useDisplayName) { + if(useDisplayName) { + sanitizedNameCache.put(chatChannel, TextUtils.sanitizeForSerializer(player.getDisplayName())); + } else { + //No need to sanitize a basic String + sanitizedNameCache.put(chatChannel, player.getName()); + } + } + + @Override + public boolean isConsole() { + return false; + } + + @Override + public boolean isPlayer() { + return true; + } + + public @NotNull Player getPlayer() { + return player; + } + + @Override + public @NonNull UUID uuid() { + return player.getUniqueId(); + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + AbstractPlayerAuthor that = (AbstractPlayerAuthor) o; + return Objects.equal(player, that.player) && + Objects.equal(lastKnownDisplayName, that.lastKnownDisplayName) && + Objects.equal(sanitizedNameCache, that.sanitizedNameCache); + } + + @Override + public int hashCode() { + return Objects.hashCode(player, lastKnownDisplayName, sanitizedNameCache); + } +} diff --git a/src/main/java/com/gmail/nossr50/chat/author/Author.java b/src/main/java/com/gmail/nossr50/chat/author/Author.java new file mode 100644 index 000000000..6f45a21b7 --- /dev/null +++ b/src/main/java/com/gmail/nossr50/chat/author/Author.java @@ -0,0 +1,31 @@ +package com.gmail.nossr50.chat.author; + +import com.gmail.nossr50.datatypes.chat.ChatChannel; +import net.kyori.adventure.identity.Identity; +import org.jetbrains.annotations.NotNull; + +public interface Author extends Identity { + + /** + * The name of this author as used in mcMMO chat + * This is the {@link String} representation of the users current chat username + * This can either be the player's display name or the player's official registered nickname with Mojang it depends on the servers chat settings for mcMMO + * + * @param chatChannel which chat channel this is going to + * @return The name of this author as used in mcMMO chat + */ + @NotNull String getAuthoredName(@NotNull ChatChannel chatChannel); + + /** + * Whether or not this author is a {@link org.bukkit.command.ConsoleCommandSender} + * + * @return true if this author is the console + */ + boolean isConsole(); + + /** + * Whether or not this author is a {@link org.bukkit.entity.Player} + * @return true if this author is a player + */ + boolean isPlayer(); +} diff --git a/src/main/java/com/gmail/nossr50/chat/author/ConsoleAuthor.java b/src/main/java/com/gmail/nossr50/chat/author/ConsoleAuthor.java new file mode 100644 index 000000000..3c6452d32 --- /dev/null +++ b/src/main/java/com/gmail/nossr50/chat/author/ConsoleAuthor.java @@ -0,0 +1,39 @@ +package com.gmail.nossr50.chat.author; + +import com.gmail.nossr50.datatypes.chat.ChatChannel; +import com.gmail.nossr50.util.text.TextUtils; +import org.checkerframework.checker.nullness.qual.NonNull; +import org.jetbrains.annotations.NotNull; + +import java.util.UUID; + +public class ConsoleAuthor implements Author { + private final UUID uuid; + private final @NotNull String name; + + public ConsoleAuthor(@NotNull String name) { + this.uuid = new UUID(0, 0); + this.name = TextUtils.sanitizeForSerializer(name); + } + + //TODO: Think of a less clunky solution later + @Override + public @NotNull String getAuthoredName(@NotNull ChatChannel chatChannel) { + return name; + } + + @Override + public boolean isConsole() { + return true; + } + + @Override + public boolean isPlayer() { + return false; + } + + @Override + public @NonNull UUID uuid() { + return uuid; + } +} diff --git a/src/main/java/com/gmail/nossr50/chat/author/PlayerAuthor.java b/src/main/java/com/gmail/nossr50/chat/author/PlayerAuthor.java new file mode 100644 index 000000000..72383e96e --- /dev/null +++ b/src/main/java/com/gmail/nossr50/chat/author/PlayerAuthor.java @@ -0,0 +1,19 @@ +package com.gmail.nossr50.chat.author; + +import com.gmail.nossr50.config.ChatConfig; +import com.gmail.nossr50.datatypes.chat.ChatChannel; +import org.bukkit.entity.Player; +import org.jetbrains.annotations.NotNull; + +public class PlayerAuthor extends AbstractPlayerAuthor { + + public PlayerAuthor(@NotNull Player player) { + super(player); + } + + @Override + public @NotNull String getAuthoredName(@NotNull ChatChannel chatChannel) { + return getSanitizedName(chatChannel, ChatConfig.getInstance().useDisplayNames(chatChannel)); + } + +} diff --git a/src/main/java/com/gmail/nossr50/chat/mailer/AbstractChatMailer.java b/src/main/java/com/gmail/nossr50/chat/mailer/AbstractChatMailer.java new file mode 100644 index 000000000..6e6896f69 --- /dev/null +++ b/src/main/java/com/gmail/nossr50/chat/mailer/AbstractChatMailer.java @@ -0,0 +1,13 @@ +package com.gmail.nossr50.chat.mailer; + +import org.bukkit.plugin.Plugin; +import org.jetbrains.annotations.NotNull; + + +public abstract class AbstractChatMailer implements ChatMailer { + protected final @NotNull Plugin pluginRef; + + public AbstractChatMailer(@NotNull Plugin pluginRef) { + this.pluginRef = pluginRef; + } +} diff --git a/src/main/java/com/gmail/nossr50/chat/mailer/AdminChatMailer.java b/src/main/java/com/gmail/nossr50/chat/mailer/AdminChatMailer.java new file mode 100644 index 000000000..de922e56a --- /dev/null +++ b/src/main/java/com/gmail/nossr50/chat/mailer/AdminChatMailer.java @@ -0,0 +1,91 @@ +package com.gmail.nossr50.chat.mailer; + +import com.gmail.nossr50.chat.author.Author; +import com.gmail.nossr50.chat.message.AdminChatMessage; +import com.gmail.nossr50.chat.message.ChatMessage; +import com.gmail.nossr50.datatypes.chat.ChatChannel; +import com.gmail.nossr50.events.chat.McMMOAdminChatEvent; +import com.gmail.nossr50.events.chat.McMMOChatEvent; +import com.gmail.nossr50.locale.LocaleLoader; +import com.gmail.nossr50.mcMMO; +import com.gmail.nossr50.util.text.TextUtils; +import net.kyori.adventure.audience.Audience; +import net.kyori.adventure.text.TextComponent; +import org.bukkit.Bukkit; +import org.bukkit.command.CommandSender; +import org.bukkit.command.ConsoleCommandSender; +import org.bukkit.plugin.Plugin; +import org.jetbrains.annotations.NotNull; + +import java.util.function.Predicate; + +public class AdminChatMailer extends AbstractChatMailer { + + public AdminChatMailer(Plugin pluginRef) { + super(pluginRef); + } + + public static final @NotNull String MCMMO_CHAT_ADMINCHAT_PERMISSION = "mcmmo.chat.adminchat"; + + /** + * Constructs an audience of admins + * + * @return an audience of admins + */ + public @NotNull Audience constructAudience() { + return mcMMO.getAudiences().filter(predicate()); + } + + /** + * Predicate used to filter the audience + * + * @return admin chat audience predicate + */ + public @NotNull Predicate predicate() { + return (commandSender) -> commandSender.isOp() + || commandSender.hasPermission(MCMMO_CHAT_ADMINCHAT_PERMISSION) + || commandSender instanceof ConsoleCommandSender; + } + + /** + * Styles a string using a locale entry + * + * @param author message author + * @param message message contents + * @param canColor whether to replace colors codes with colors in the raw message + * @return the styled string, based on a locale entry + */ + public @NotNull TextComponent addStyle(@NotNull Author author, @NotNull String message, boolean canColor) { + if(canColor) { + return LocaleLoader.getTextComponent("Chat.Style.Admin", author.getAuthoredName(ChatChannel.ADMIN), message); + } else { + return TextUtils.ofLegacyTextRaw(LocaleLoader.getString("Chat.Style.Admin", author.getAuthoredName(ChatChannel.ADMIN), message)); + } + } + + @Override + public void sendMail(@NotNull ChatMessage chatMessage) { + chatMessage.sendMessage(); + } + + /** + * Processes a chat message from an author to an audience of admins + * + * @param author the author + * @param rawString the raw message as the author typed it before any styling + * @param isAsync whether or not this is being processed asynchronously + * @param canColor whether or not the author can use colors in chat + */ + public void processChatMessage(@NotNull Author author, @NotNull String rawString, boolean isAsync, boolean canColor) { + AdminChatMessage chatMessage = new AdminChatMessage(pluginRef, author, constructAudience(), rawString, addStyle(author, rawString, canColor)); + + McMMOChatEvent chatEvent = new McMMOAdminChatEvent(pluginRef, chatMessage, isAsync); + Bukkit.getPluginManager().callEvent(chatEvent); + + if(!chatEvent.isCancelled()) { + sendMail(chatMessage); + } + } + + +} \ No newline at end of file diff --git a/src/main/java/com/gmail/nossr50/chat/mailer/ChatMailer.java b/src/main/java/com/gmail/nossr50/chat/mailer/ChatMailer.java new file mode 100644 index 000000000..77d456b6f --- /dev/null +++ b/src/main/java/com/gmail/nossr50/chat/mailer/ChatMailer.java @@ -0,0 +1,12 @@ +package com.gmail.nossr50.chat.mailer; + +import com.gmail.nossr50.chat.message.ChatMessage; +import org.jetbrains.annotations.NotNull; + +public interface ChatMailer { + /** + * Send out a chat message + * @param chatMessage the {@link ChatMessage} + */ + void sendMail(@NotNull ChatMessage chatMessage); +} \ No newline at end of file diff --git a/src/main/java/com/gmail/nossr50/chat/mailer/PartyChatMailer.java b/src/main/java/com/gmail/nossr50/chat/mailer/PartyChatMailer.java new file mode 100644 index 000000000..6158ad826 --- /dev/null +++ b/src/main/java/com/gmail/nossr50/chat/mailer/PartyChatMailer.java @@ -0,0 +1,82 @@ +package com.gmail.nossr50.chat.mailer; + +import com.gmail.nossr50.chat.author.Author; +import com.gmail.nossr50.chat.message.ChatMessage; +import com.gmail.nossr50.chat.message.PartyChatMessage; +import com.gmail.nossr50.datatypes.chat.ChatChannel; +import com.gmail.nossr50.datatypes.party.Party; +import com.gmail.nossr50.events.chat.McMMOChatEvent; +import com.gmail.nossr50.events.chat.McMMOPartyChatEvent; +import com.gmail.nossr50.locale.LocaleLoader; +import com.gmail.nossr50.mcMMO; +import com.gmail.nossr50.util.text.TextUtils; +import net.kyori.adventure.audience.Audience; +import net.kyori.adventure.text.TextComponent; +import org.bukkit.Bukkit; +import org.bukkit.plugin.Plugin; +import org.jetbrains.annotations.NotNull; + +public class PartyChatMailer extends AbstractChatMailer { + + public PartyChatMailer(@NotNull Plugin pluginRef) { + super(pluginRef); + } + + /** + * Processes a chat message from an author to an audience of party members + * + * @param author the author + * @param rawString the raw message as the author typed it before any styling + * @param isAsync whether or not this is being processed asynchronously + * @param canColor whether or not the author can use colors in chat + */ + public void processChatMessage(@NotNull Author author, @NotNull String rawString, @NotNull Party party, boolean isAsync, boolean canColor, boolean isLeader) { + PartyChatMessage chatMessage = new PartyChatMessage(pluginRef, author, constructPartyAudience(party), rawString, addStyle(author, rawString, canColor, isLeader), party); + + McMMOChatEvent chatEvent = new McMMOPartyChatEvent(pluginRef, chatMessage, party, isAsync); + Bukkit.getPluginManager().callEvent(chatEvent); + + if(!chatEvent.isCancelled()) { + sendMail(chatMessage); + } + } + + /** + * Constructs an {@link Audience} of party members + * + * @param party target party + * @return an {@link Audience} of party members + */ + public @NotNull Audience constructPartyAudience(@NotNull Party party) { + return mcMMO.getAudiences().filter(party.getSamePartyPredicate()); + } + + /** + * Styles a string using a locale entry + * + * @param author message author + * @param message message contents + * @param canColor whether to replace colors codes with colors in the raw message + * @return the styled string, based on a locale entry + */ + public @NotNull TextComponent addStyle(@NotNull Author author, @NotNull String message, boolean canColor, boolean isLeader) { + if(canColor) { + if(isLeader) { + return LocaleLoader.getTextComponent("Chat.Style.Party.Leader", author.getAuthoredName(ChatChannel.PARTY), message); + } else { + return LocaleLoader.getTextComponent("Chat.Style.Party", author.getAuthoredName(ChatChannel.PARTY), message); + } + } else { + if(isLeader) { + return TextUtils.ofLegacyTextRaw(LocaleLoader.getString("Chat.Style.Party.Leader", author.getAuthoredName(ChatChannel.PARTY), message)); + } else { + return TextUtils.ofLegacyTextRaw(LocaleLoader.getString("Chat.Style.Party", author.getAuthoredName(ChatChannel.PARTY), message)); + } + } + } + + @Override + public void sendMail(@NotNull ChatMessage chatMessage) { + chatMessage.sendMessage(); + } +} diff --git a/src/main/java/com/gmail/nossr50/chat/message/AbstractChatMessage.java b/src/main/java/com/gmail/nossr50/chat/message/AbstractChatMessage.java new file mode 100644 index 000000000..5eeb889e4 --- /dev/null +++ b/src/main/java/com/gmail/nossr50/chat/message/AbstractChatMessage.java @@ -0,0 +1,72 @@ +package com.gmail.nossr50.chat.message; + +import com.gmail.nossr50.chat.author.Author; +import com.google.common.base.Objects; +import net.kyori.adventure.audience.Audience; +import net.kyori.adventure.text.TextComponent; +import org.bukkit.plugin.Plugin; +import org.jetbrains.annotations.NotNull; + +public abstract class AbstractChatMessage implements ChatMessage { + + protected final @NotNull Plugin pluginRef; + protected final @NotNull Author author; + protected final @NotNull String rawMessage; + protected @NotNull TextComponent componentMessage; + protected @NotNull Audience audience; + + public AbstractChatMessage(@NotNull Plugin pluginRef, @NotNull Author author, @NotNull Audience audience, @NotNull String rawMessage, @NotNull TextComponent componentMessage) { + this.pluginRef = pluginRef; + this.author = author; + this.audience = audience; + this.rawMessage = rawMessage; + this.componentMessage = componentMessage; + } + + @Override + public @NotNull String rawMessage() { + return rawMessage; + } + + @Override + public @NotNull Author getAuthor() { + return author; + } + + @Override + public @NotNull Audience getAudience() { + return audience; + } + + @Override + public @NotNull TextComponent getChatMessage() { + return componentMessage; + } + + @Override + public void setChatMessage(@NotNull TextComponent textComponent) { + this.componentMessage = textComponent; + } + + @Override + public void setAudience(@NotNull Audience newAudience) { + audience = newAudience; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + AbstractChatMessage that = (AbstractChatMessage) o; + return Objects.equal(pluginRef, that.pluginRef) && + Objects.equal(author, that.author) && + Objects.equal(rawMessage, that.rawMessage) && + Objects.equal(componentMessage, that.componentMessage) && + Objects.equal(audience, that.audience); + } + + @Override + public int hashCode() { + return Objects.hashCode(pluginRef, author, rawMessage, componentMessage, audience); + } +} diff --git a/src/main/java/com/gmail/nossr50/chat/message/AdminChatMessage.java b/src/main/java/com/gmail/nossr50/chat/message/AdminChatMessage.java new file mode 100644 index 000000000..973c0f0c7 --- /dev/null +++ b/src/main/java/com/gmail/nossr50/chat/message/AdminChatMessage.java @@ -0,0 +1,24 @@ +package com.gmail.nossr50.chat.message; + +import com.gmail.nossr50.chat.author.Author; +import com.gmail.nossr50.datatypes.chat.ChatChannel; +import net.kyori.adventure.audience.Audience; +import net.kyori.adventure.text.TextComponent; +import org.bukkit.plugin.Plugin; +import org.jetbrains.annotations.NotNull; + +public class AdminChatMessage extends AbstractChatMessage { + public AdminChatMessage(@NotNull Plugin pluginRef, @NotNull Author author, @NotNull Audience audience, @NotNull String rawMessage, @NotNull TextComponent componentMessage) { + super(pluginRef, author, audience, rawMessage, componentMessage); + } + + @Override + public void sendMessage() { + audience.sendMessage(author, componentMessage); + } + + @Override + public @NotNull String getAuthorDisplayName() { + return author.getAuthoredName(ChatChannel.ADMIN); + } +} diff --git a/src/main/java/com/gmail/nossr50/chat/message/ChatMessage.java b/src/main/java/com/gmail/nossr50/chat/message/ChatMessage.java new file mode 100644 index 000000000..45bc1ac18 --- /dev/null +++ b/src/main/java/com/gmail/nossr50/chat/message/ChatMessage.java @@ -0,0 +1,73 @@ +package com.gmail.nossr50.chat.message; + +import com.gmail.nossr50.chat.author.Author; +import net.kyori.adventure.audience.Audience; +import net.kyori.adventure.text.TextComponent; +import org.jetbrains.annotations.NotNull; + +public interface ChatMessage { + /** + * The original message from the {@link Author} + * This is formatted and styled before being sent out to players by mcMMO + * + * @return the original message without any formatting or alterations + * @see #getChatMessage() + */ + @NotNull String rawMessage(); + + /** + * The {@link Author} from which this payload originated + * + * @see #getChatMessage() + * @return the source of the chat message + */ + @NotNull Author getAuthor(); + + /** + * The authors display name which is used in the initial creation of the message payload, it is provided for convenience. + * + * This is a name generated by mcMMO during the creation of the {@link ChatMessage} + * + * This is used by mcMMO when generating the message payload + * + * This method provides the display name for the convenience of plugins constructing their own {@link TextComponent payloads} + * + * @see #getChatMessage() + * @return the author display name as generated by mcMMO + */ + @NotNull String getAuthorDisplayName(); + + /** + * The target audience of this chat message + * Unless modified, this will include the {@link Author} + * + * @return target audience + */ + @NotNull Audience getAudience(); + + /** + * The {@link TextComponent message} being sent to the audience + * + * @return the {@link TextComponent message} that will be sent to the audience + */ + @NotNull TextComponent getChatMessage(); + + /** + * Change the value of the {@link TextComponent message} + * + * @param textComponent new message value + */ + void setChatMessage(@NotNull TextComponent textComponent); + + /** + * Changes the audience + * + * @param newAudience the replacement audience + */ + void setAudience(@NotNull Audience newAudience); + + /** + * Deliver the message to the audience + */ + void sendMessage(); +} diff --git a/src/main/java/com/gmail/nossr50/chat/message/PartyChatMessage.java b/src/main/java/com/gmail/nossr50/chat/message/PartyChatMessage.java new file mode 100644 index 000000000..4c143ec69 --- /dev/null +++ b/src/main/java/com/gmail/nossr50/chat/message/PartyChatMessage.java @@ -0,0 +1,94 @@ +package com.gmail.nossr50.chat.message; + +import com.gmail.nossr50.chat.author.Author; +import com.gmail.nossr50.datatypes.chat.ChatChannel; +import com.gmail.nossr50.datatypes.party.Party; +import com.gmail.nossr50.datatypes.player.McMMOPlayer; +import com.gmail.nossr50.locale.LocaleLoader; +import com.gmail.nossr50.mcMMO; +import com.gmail.nossr50.util.player.UserManager; +import com.google.common.base.Objects; +import net.kyori.adventure.audience.Audience; +import net.kyori.adventure.text.TextComponent; +import org.bukkit.entity.Player; +import org.bukkit.plugin.Plugin; +import org.jetbrains.annotations.NotNull; + +public class PartyChatMessage extends AbstractChatMessage { + + private final @NotNull Party party; + + public PartyChatMessage(@NotNull Plugin pluginRef, @NotNull Author author, @NotNull Audience audience, @NotNull String rawMessage, @NotNull TextComponent componentMessage, @NotNull Party party) { + super(pluginRef, author, audience, rawMessage, componentMessage); + this.party = party; + } + + /** + * The party that this chat message was intended for + * @return the party that this message was intended for + */ + public @NotNull Party getParty() { + return party; + } + + @Override + public @NotNull String getAuthorDisplayName() { + return author.getAuthoredName(ChatChannel.PARTY); + } + + @Override + public void sendMessage() { + /* + * It should be noted that Party messages don't include console as part of the audience to avoid double messaging + * The console gets a message that has the party name included, player parties do not + */ + + //Sends to everyone but console + audience.sendMessage(author, componentMessage); + TextComponent spyMessage = LocaleLoader.getTextComponent("Chat.Spy.Party", author.getAuthoredName(ChatChannel.PARTY), rawMessage, party.getName()); + + //Relay to spies + messagePartyChatSpies(spyMessage); + + //Console message + mcMMO.p.getChatManager().sendConsoleMessage(author, spyMessage); + } + + /** + * Console and Party Chat Spies get a more verbose version of the message + * Party Chat Spies will get a copy of the message as well + * @param spyMessage the message to copy to spies + */ + private void messagePartyChatSpies(@NotNull TextComponent spyMessage) { + //Find the people with permissions + for(McMMOPlayer mcMMOPlayer : UserManager.getPlayers()) { + Player player = mcMMOPlayer.getPlayer(); + + //Check for toggled players + if(mcMMOPlayer.isPartyChatSpying()) { + Party adminParty = mcMMOPlayer.getParty(); + + //Only message admins not part of this party + if(adminParty == null || adminParty != getParty()) { + //TODO: Hacky, rewrite later + Audience audience = mcMMO.getAudiences().player(player); + audience.sendMessage(spyMessage); + } + } + } + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + if (!super.equals(o)) return false; + PartyChatMessage that = (PartyChatMessage) o; + return Objects.equal(party, that.party); + } + + @Override + public int hashCode() { + return Objects.hashCode(super.hashCode(), party); + } +} diff --git a/src/main/java/com/gmail/nossr50/commands/CommandManager.java b/src/main/java/com/gmail/nossr50/commands/CommandManager.java new file mode 100644 index 000000000..ea72fc2f9 --- /dev/null +++ b/src/main/java/com/gmail/nossr50/commands/CommandManager.java @@ -0,0 +1,116 @@ +package com.gmail.nossr50.commands; + +import co.aikar.commands.BukkitCommandIssuer; +import co.aikar.commands.BukkitCommandManager; +import co.aikar.commands.ConditionFailedException; +import com.gmail.nossr50.commands.chat.AdminChatCommand; +import com.gmail.nossr50.commands.chat.PartyChatCommand; +import com.gmail.nossr50.config.ChatConfig; +import com.gmail.nossr50.datatypes.chat.ChatChannel; +import com.gmail.nossr50.datatypes.player.McMMOPlayer; +import com.gmail.nossr50.locale.LocaleLoader; +import com.gmail.nossr50.mcMMO; +import com.gmail.nossr50.util.Permissions; +import com.gmail.nossr50.util.player.UserManager; +import org.bukkit.entity.Player; +import org.bukkit.permissions.Permissible; +import org.jetbrains.annotations.NotNull; + +/* + * For now this class will only handle ACF converted commands, all other commands will be handled elsewhere + */ +public class CommandManager { + public static final @NotNull String ADMIN_CONDITION = "adminCondition"; + public static final @NotNull String PARTY_CONDITION = "partyCondition"; + public static final @NotNull String MMO_DATA_LOADED = "mmoDataLoaded"; + + private final @NotNull mcMMO pluginRef; + private final @NotNull BukkitCommandManager bukkitCommandManager; + + public CommandManager(@NotNull mcMMO pluginRef) { + this.pluginRef = pluginRef; + bukkitCommandManager = new BukkitCommandManager(pluginRef); + + registerConditions(); + registerCommands(); + } + + private void registerCommands() { + registerChatCommands(); + } + + /** + * Registers chat commands if the chat system is enabled + */ + private void registerChatCommands() { + if(ChatConfig.getInstance().isChatEnabled()) { + if(ChatConfig.getInstance().isChatChannelEnabled(ChatChannel.ADMIN)) { + bukkitCommandManager.registerCommand(new AdminChatCommand(pluginRef)); + } + if(ChatConfig.getInstance().isChatChannelEnabled(ChatChannel.PARTY)) { + bukkitCommandManager.registerCommand(new PartyChatCommand(pluginRef)); + } + } + } + + public void registerConditions() { + // Method or Class based - Can only be used on methods + bukkitCommandManager.getCommandConditions().addCondition(ADMIN_CONDITION, (context) -> { + BukkitCommandIssuer issuer = context.getIssuer(); + + if(issuer.getIssuer() instanceof Player) { + validateLoadedData(issuer.getPlayer()); + validateAdmin(issuer.getPlayer()); + } + }); + + bukkitCommandManager.getCommandConditions().addCondition(MMO_DATA_LOADED, (context) -> { + BukkitCommandIssuer bukkitCommandIssuer = context.getIssuer(); + + if(bukkitCommandIssuer.getIssuer() instanceof Player) { + validateLoadedData(bukkitCommandIssuer.getPlayer()); + } + }); + + bukkitCommandManager.getCommandConditions().addCondition(PARTY_CONDITION, (context) -> { + BukkitCommandIssuer bukkitCommandIssuer = context.getIssuer(); + + if(bukkitCommandIssuer.getIssuer() instanceof Player) { + validateLoadedData(bukkitCommandIssuer.getPlayer()); + validatePlayerParty(bukkitCommandIssuer.getPlayer()); + validatePermission("mcmmo.chat.partychat", bukkitCommandIssuer.getPlayer()); + } + }); + } + + private void validatePermission(@NotNull String permissionNode, @NotNull Permissible permissible) { + if(!permissible.hasPermission(permissionNode)) { + throw new ConditionFailedException(LocaleLoader.getString("mcMMO.NoPermission")); + } + } + + + public void validateAdmin(@NotNull Player player) { + if(!player.isOp() && !Permissions.adminChat(player)) { + throw new ConditionFailedException("You are lacking the correct permissions to use this command."); + } + } + + public void validateLoadedData(@NotNull Player player) { + if(UserManager.getPlayer(player) == null) { + throw new ConditionFailedException(LocaleLoader.getString("Profile.PendingLoad")); + } + } + + public void validatePlayerParty(@NotNull Player player) { + McMMOPlayer mmoPlayer = UserManager.getPlayer(player); + + if(mmoPlayer.getParty() == null) { + throw new ConditionFailedException(LocaleLoader.getString("Commands.Party.None")); + } + } + + public @NotNull BukkitCommandManager getBukkitCommandManager() { + return bukkitCommandManager; + } +} diff --git a/src/main/java/com/gmail/nossr50/commands/MHDCommand.java b/src/main/java/com/gmail/nossr50/commands/MHDCommand.java deleted file mode 100644 index 3d8c2d445..000000000 --- a/src/main/java/com/gmail/nossr50/commands/MHDCommand.java +++ /dev/null @@ -1,45 +0,0 @@ -package com.gmail.nossr50.commands; - -import com.gmail.nossr50.config.Config; -import com.gmail.nossr50.database.FlatfileDatabaseManager; -import com.gmail.nossr50.database.SQLDatabaseManager; -import com.gmail.nossr50.datatypes.player.McMMOPlayer; -import com.gmail.nossr50.mcMMO; -import com.gmail.nossr50.util.player.UserManager; -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(Config.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(Config.getInstance().getMobHealthbarDefault()); - } - sender.sendMessage("Mob health reset"); - return true; - } - return false; - } - - @Override - public List onTabComplete(CommandSender sender, Command command, String alias, String[] args) { - return ImmutableList.of(); - } -} diff --git a/src/main/java/com/gmail/nossr50/commands/McImportCommand.java b/src/main/java/com/gmail/nossr50/commands/McImportCommand.java index 7c953a88a..ce43f9675 100644 --- a/src/main/java/com/gmail/nossr50/commands/McImportCommand.java +++ b/src/main/java/com/gmail/nossr50/commands/McImportCommand.java @@ -7,6 +7,7 @@ import org.bukkit.Material; import org.bukkit.command.Command; import org.bukkit.command.CommandExecutor; import org.bukkit.command.CommandSender; +import org.jetbrains.annotations.NotNull; import java.io.*; import java.util.ArrayList; @@ -17,15 +18,12 @@ public class McImportCommand implements CommandExecutor { int fileAmount; @Override - public boolean onCommand(CommandSender sender, Command command, String label, String[] args) { - switch (args.length) { - case 0: - importModConfig(); - return true; - - default: - return false; + public boolean onCommand(@NotNull CommandSender sender, @NotNull Command command, @NotNull String label, String[] args) { + if (args.length == 0) { + importModConfig(); + return true; } + return false; } public boolean importModConfig() { @@ -34,7 +32,7 @@ public class McImportCommand implements CommandExecutor { mcMMO.p.getLogger().info("Starting import of mod materials..."); fileAmount = 0; - HashMap> materialNames = new HashMap>(); + HashMap> materialNames = new HashMap<>(); BufferedReader in = null; @@ -66,11 +64,10 @@ public class McImportCommand implements CommandExecutor { ModConfigType type = ModConfigType.getModConfigType(materialName); if (!materialNames.containsKey(type)) { - materialNames.put(type, new ArrayList()); + materialNames.put(type, new ArrayList<>()); } materialNames.get(type).add(materialName); - continue; } } catch (FileNotFoundException e) { @@ -94,13 +91,13 @@ public class McImportCommand implements CommandExecutor { private void createOutput(HashMap> materialNames) { for (ModConfigType modConfigType : materialNames.keySet()) { - HashMap> materialNamesType = new HashMap>(); + HashMap> materialNamesType = new HashMap<>(); for (String materialName : materialNames.get(modConfigType)) { String modName = Misc.getModName(materialName); if (!materialNamesType.containsKey(modName)) { - materialNamesType.put(modName, new ArrayList()); + materialNamesType.put(modName, new ArrayList<>()); } materialNamesType.get(modName).add(materialName); @@ -170,16 +167,10 @@ public class McImportCommand implements CommandExecutor { out = new FileWriter(outputFile); out.write(writer.toString()); - } - catch (IOException e) { + } catch (Exception e) { e.printStackTrace(); return; - } - catch (Exception e) { - e.printStackTrace(); - return; - } - finally { + } finally { tryClose(out); fileAmount++; } @@ -202,7 +193,7 @@ public class McImportCommand implements CommandExecutor { } private HashMap> getConfigSectionsBlocks(String modName, HashMap> materialNames) { - HashMap> configSections = new HashMap>(); + HashMap> configSections = new HashMap<>(); // Go through all the materials and categorise them under a skill for (String materialName : materialNames.get(modName)) { @@ -221,7 +212,7 @@ public class McImportCommand implements CommandExecutor { } if (!configSections.containsKey(skillName)) { - configSections.put(skillName, new ArrayList()); + configSections.put(skillName, new ArrayList<>()); } ArrayList skillContents = configSections.get(skillName); @@ -241,7 +232,7 @@ public class McImportCommand implements CommandExecutor { } private HashMap> getConfigSectionsTools(String modName, HashMap> materialNames) { - HashMap> configSections = new HashMap>(); + HashMap> configSections = new HashMap<>(); // Go through all the materials and categorise them under a tool type for (String materialName : materialNames.get(modName)) { @@ -266,7 +257,7 @@ public class McImportCommand implements CommandExecutor { } if (!configSections.containsKey(toolType)) { - configSections.put(toolType, new ArrayList()); + configSections.put(toolType, new ArrayList<>()); } ArrayList skillContents = configSections.get(toolType); @@ -281,7 +272,7 @@ public class McImportCommand implements CommandExecutor { } private HashMap> getConfigSectionsArmor(String modName, HashMap> materialNames) { - HashMap> configSections = new HashMap>(); + HashMap> configSections = new HashMap<>(); // Go through all the materials and categorise them under an armor type for (String materialName : materialNames.get(modName)) { @@ -300,7 +291,7 @@ public class McImportCommand implements CommandExecutor { } if (!configSections.containsKey(toolType)) { - configSections.put(toolType, new ArrayList()); + configSections.put(toolType, new ArrayList<>()); } ArrayList skillContents = configSections.get(toolType); @@ -326,14 +317,14 @@ public class McImportCommand implements CommandExecutor { } private HashMap> getConfigSectionsUnknown(String modName, HashMap> materialNames) { - HashMap> configSections = new HashMap>(); + HashMap> configSections = new HashMap<>(); // Go through all the materials and print them for (String materialName : materialNames.get(modName)) { String configKey = "UNIDENTIFIED"; if (!configSections.containsKey(configKey)) { - configSections.put(configKey, new ArrayList()); + configSections.put(configKey, new ArrayList<>()); } ArrayList skillContents = configSections.get(configKey); diff --git a/src/main/java/com/gmail/nossr50/commands/McconvertCommand.java b/src/main/java/com/gmail/nossr50/commands/McconvertCommand.java index e104b61d2..e00510078 100644 --- a/src/main/java/com/gmail/nossr50/commands/McconvertCommand.java +++ b/src/main/java/com/gmail/nossr50/commands/McconvertCommand.java @@ -12,6 +12,7 @@ import org.bukkit.command.CommandExecutor; import org.bukkit.command.CommandSender; import org.bukkit.command.TabExecutor; import org.bukkit.util.StringUtil; +import org.jetbrains.annotations.NotNull; import java.util.ArrayList; import java.util.Collections; @@ -22,12 +23,12 @@ public class McconvertCommand implements TabExecutor { private static final List DATABASE_TYPES; private static final List SUBCOMMANDS = ImmutableList.of("database", "experience"); - private CommandExecutor databaseConvertCommand = new ConvertDatabaseCommand(); - private CommandExecutor experienceConvertCommand = new ConvertExperienceCommand(); + private final CommandExecutor databaseConvertCommand = new ConvertDatabaseCommand(); + private final CommandExecutor experienceConvertCommand = new ConvertExperienceCommand(); static { - ArrayList formulaTypes = new ArrayList(); - ArrayList databaseTypes = new ArrayList(); + ArrayList formulaTypes = new ArrayList<>(); + ArrayList databaseTypes = new ArrayList<>(); for (FormulaType type : FormulaType.values()) { formulaTypes.add(type.toString()); @@ -53,34 +54,31 @@ public class McconvertCommand implements TabExecutor { } @Override - public boolean onCommand(CommandSender sender, Command command, String label, String[] args) { - switch (args.length) { - case 2: - if (args[0].equalsIgnoreCase("database") || args[0].equalsIgnoreCase("db")) { - return databaseConvertCommand.onCommand(sender, command, label, args); - } - else if (args[0].equalsIgnoreCase("experience") || args[0].equalsIgnoreCase("xp") || args[1].equalsIgnoreCase("exp")) { - return experienceConvertCommand.onCommand(sender, command, label, args); - } + public boolean onCommand(@NotNull CommandSender sender, @NotNull Command command, @NotNull String label, String[] args) { + if (args.length == 2) { + if (args[0].equalsIgnoreCase("database") || args[0].equalsIgnoreCase("db")) { + return databaseConvertCommand.onCommand(sender, command, label, args); + } else if (args[0].equalsIgnoreCase("experience") || args[0].equalsIgnoreCase("xp") || args[1].equalsIgnoreCase("exp")) { + return experienceConvertCommand.onCommand(sender, command, label, args); + } - return false; - default: - return false; + return false; } + return false; } @Override - public List onTabComplete(CommandSender sender, Command command, String alias, String[] args) { + public List onTabComplete(@NotNull CommandSender sender, @NotNull Command command, @NotNull String alias, String[] args) { switch (args.length) { case 1: - return StringUtil.copyPartialMatches(args[0], SUBCOMMANDS, new ArrayList(SUBCOMMANDS.size())); + return StringUtil.copyPartialMatches(args[0], SUBCOMMANDS, new ArrayList<>(SUBCOMMANDS.size())); case 2: if (args[0].equalsIgnoreCase("database") || args[0].equalsIgnoreCase("db")) { - return StringUtil.copyPartialMatches(args[0], DATABASE_TYPES, new ArrayList(DATABASE_TYPES.size())); + return StringUtil.copyPartialMatches(args[0], DATABASE_TYPES, new ArrayList<>(DATABASE_TYPES.size())); } if (args[0].equalsIgnoreCase("experience") || args[0].equalsIgnoreCase("xp") || args[0].equalsIgnoreCase("exp")) { - return StringUtil.copyPartialMatches(args[0], FORMULA_TYPES, new ArrayList(FORMULA_TYPES.size())); + return StringUtil.copyPartialMatches(args[0], FORMULA_TYPES, new ArrayList<>(FORMULA_TYPES.size())); } return ImmutableList.of(); diff --git a/src/main/java/com/gmail/nossr50/commands/McmmoCommand.java b/src/main/java/com/gmail/nossr50/commands/McmmoCommand.java index 16280c9d0..838722131 100644 --- a/src/main/java/com/gmail/nossr50/commands/McmmoCommand.java +++ b/src/main/java/com/gmail/nossr50/commands/McmmoCommand.java @@ -1,7 +1,6 @@ package com.gmail.nossr50.commands; import com.gmail.nossr50.commands.party.PartySubcommandType; -import com.gmail.nossr50.config.Config; import com.gmail.nossr50.locale.LocaleLoader; import com.gmail.nossr50.mcMMO; import com.gmail.nossr50.util.Permissions; @@ -9,10 +8,11 @@ import org.bukkit.ChatColor; import org.bukkit.command.Command; import org.bukkit.command.CommandExecutor; import org.bukkit.command.CommandSender; +import org.jetbrains.annotations.NotNull; public class McmmoCommand implements CommandExecutor { @Override - public boolean onCommand(CommandSender sender, Command command, String label, String[] args) { + public boolean onCommand(@NotNull CommandSender sender, @NotNull Command command, @NotNull String label, String[] args) { switch (args.length) { case 0: if (!Permissions.mcmmoDescription(sender)) { @@ -25,7 +25,7 @@ public class McmmoCommand implements CommandExecutor { sender.sendMessage(mcSplit); sender.sendMessage(LocaleLoader.getString("mcMMO.Description.FormerDevs")); - if (Config.getInstance().getDonateMessageEnabled()) { + if (mcMMO.p.getGeneralConfig().getDonateMessageEnabled()) { sender.sendMessage(LocaleLoader.getString("MOTD.Donate")); sender.sendMessage(ChatColor.GOLD + " - " + ChatColor.GREEN + "nossr50@gmail.com" + ChatColor.GOLD + " Paypal"); } @@ -34,7 +34,7 @@ public class McmmoCommand implements CommandExecutor { sender.sendMessage(LocaleLoader.getString("MOTD.Version", mcMMO.p.getDescription().getVersion())); } - mcMMO.getHolidayManager().anniversaryCheck(sender); +// mcMMO.getHolidayManager().anniversaryCheck(sender); return true; case 1: diff --git a/src/main/java/com/gmail/nossr50/commands/McnotifyCommand.java b/src/main/java/com/gmail/nossr50/commands/McnotifyCommand.java index ac90ce9ab..2ffb16910 100644 --- a/src/main/java/com/gmail/nossr50/commands/McnotifyCommand.java +++ b/src/main/java/com/gmail/nossr50/commands/McnotifyCommand.java @@ -9,35 +9,33 @@ import org.bukkit.command.Command; import org.bukkit.command.CommandSender; import org.bukkit.command.TabExecutor; import org.bukkit.entity.Player; +import org.jetbrains.annotations.NotNull; import java.util.List; public class McnotifyCommand implements TabExecutor { @Override - public boolean onCommand(CommandSender sender, Command command, String label, String[] args) { + public boolean onCommand(@NotNull CommandSender sender, @NotNull Command command, @NotNull String label, String[] args) { if (CommandUtils.noConsoleUsage(sender)) { return true; } - switch (args.length) { - case 0: - McMMOPlayer mcMMOPlayer = UserManager.getPlayer((Player) sender); + if (args.length == 0) { + McMMOPlayer mcMMOPlayer = UserManager.getPlayer((Player) sender); - //Not Loaded yet - if(mcMMOPlayer == null) - sender.sendMessage(LocaleLoader.getString("Profile.PendingLoad")); + //Not Loaded yet + if (mcMMOPlayer == null) + sender.sendMessage(LocaleLoader.getString("Profile.PendingLoad")); - sender.sendMessage(LocaleLoader.getString("Commands.Notifications." + (mcMMOPlayer.useChatNotifications() ? "Off" : "On"))); - mcMMOPlayer.toggleChatNotifications(); - return true; - - default: - return false; + sender.sendMessage(LocaleLoader.getString("Commands.Notifications." + (mcMMOPlayer.useChatNotifications() ? "Off" : "On"))); + mcMMOPlayer.toggleChatNotifications(); + return true; } + return false; } @Override - public List onTabComplete(CommandSender sender, Command command, String alias, String[] args) { + public List onTabComplete(@NotNull CommandSender sender, @NotNull Command command, @NotNull String alias, String[] args) { return ImmutableList.of(); } } diff --git a/src/main/java/com/gmail/nossr50/commands/McscoreboardCommand.java b/src/main/java/com/gmail/nossr50/commands/McscoreboardCommand.java index 305aae98e..ff5b4ab2d 100644 --- a/src/main/java/com/gmail/nossr50/commands/McscoreboardCommand.java +++ b/src/main/java/com/gmail/nossr50/commands/McscoreboardCommand.java @@ -1,7 +1,7 @@ package com.gmail.nossr50.commands; -import com.gmail.nossr50.config.Config; import com.gmail.nossr50.locale.LocaleLoader; +import com.gmail.nossr50.mcMMO; import com.gmail.nossr50.util.commands.CommandUtils; import com.gmail.nossr50.util.scoreboards.ScoreboardManager; import com.google.common.collect.ImmutableList; @@ -9,6 +9,7 @@ import org.bukkit.command.Command; import org.bukkit.command.CommandSender; import org.bukkit.command.TabExecutor; import org.bukkit.util.StringUtil; +import org.jetbrains.annotations.NotNull; import java.util.ArrayList; import java.util.List; @@ -17,11 +18,21 @@ public class McscoreboardCommand implements TabExecutor { private static final List FIRST_ARGS = ImmutableList.of("keep", "time", "clear"); @Override - public boolean onCommand(CommandSender sender, Command command, String label, String[] args) { + public boolean onCommand(@NotNull CommandSender sender, @NotNull Command command, @NotNull String label, String[] args) { if (CommandUtils.noConsoleUsage(sender)) { return true; } + if(!mcMMO.p.getGeneralConfig().getScoreboardsEnabled()) { + sender.sendMessage(LocaleLoader.getString("Scoreboard.Disabled")); + return true; + } + + if(!ScoreboardManager.isPlayerBoardSetup(sender.getName())) { + sender.sendMessage(LocaleLoader.getString("Scoreboard.NotSetupYet")); + return true; + } + switch (args.length) { case 1: if (args[0].equalsIgnoreCase("clear") || args[0].equalsIgnoreCase("reset")) { @@ -31,7 +42,7 @@ public class McscoreboardCommand implements TabExecutor { } if (args[0].equalsIgnoreCase("keep")) { - if (!Config.getInstance().getAllowKeepBoard() || !Config.getInstance().getScoreboardsEnabled()) { + if (!mcMMO.p.getGeneralConfig().getAllowKeepBoard() || !mcMMO.p.getGeneralConfig().getScoreboardsEnabled()) { sender.sendMessage(LocaleLoader.getString("Commands.Disabled")); return true; } @@ -69,13 +80,11 @@ public class McscoreboardCommand implements TabExecutor { } @Override - public List onTabComplete(CommandSender sender, Command command, String alias, String[] args) { - switch (args.length) { - case 1: - return StringUtil.copyPartialMatches(args[0], FIRST_ARGS, new ArrayList(FIRST_ARGS.size())); - default: - return ImmutableList.of(); + public List onTabComplete(@NotNull CommandSender sender, @NotNull Command command, @NotNull String alias, String[] args) { + if (args.length == 1) { + return StringUtil.copyPartialMatches(args[0], FIRST_ARGS, new ArrayList<>(FIRST_ARGS.size())); } + return ImmutableList.of(); } private boolean help(CommandSender sender) { diff --git a/src/main/java/com/gmail/nossr50/commands/ToggleCommand.java b/src/main/java/com/gmail/nossr50/commands/ToggleCommand.java index 11256ecbd..fea470d0e 100644 --- a/src/main/java/com/gmail/nossr50/commands/ToggleCommand.java +++ b/src/main/java/com/gmail/nossr50/commands/ToggleCommand.java @@ -8,13 +8,14 @@ import org.bukkit.command.Command; import org.bukkit.command.CommandSender; import org.bukkit.command.TabExecutor; import org.bukkit.util.StringUtil; +import org.jetbrains.annotations.NotNull; import java.util.ArrayList; import java.util.List; public abstract class ToggleCommand implements TabExecutor { @Override - public boolean onCommand(CommandSender sender, Command command, String label, String[] args) { + public boolean onCommand(@NotNull CommandSender sender, @NotNull Command command, @NotNull String label, String[] args) { switch (args.length) { case 0: if (CommandUtils.noConsoleUsage(sender)) { @@ -60,14 +61,12 @@ public abstract class ToggleCommand implements TabExecutor { } @Override - public List onTabComplete(CommandSender sender, Command command, String alias, String[] args) { - switch (args.length) { - case 1: - List playerNames = CommandUtils.getOnlinePlayerNames(sender); - return StringUtil.copyPartialMatches(args[0], playerNames, new ArrayList(playerNames.size())); - default: - return ImmutableList.of(); + public List onTabComplete(@NotNull CommandSender sender, @NotNull Command command, @NotNull String alias, String[] args) { + if (args.length == 1) { + List playerNames = CommandUtils.getOnlinePlayerNames(sender); + return StringUtil.copyPartialMatches(args[0], playerNames, new ArrayList<>(playerNames.size())); } + return ImmutableList.of(); } protected abstract boolean hasOtherPermission(CommandSender sender); diff --git a/src/main/java/com/gmail/nossr50/commands/XprateCommand.java b/src/main/java/com/gmail/nossr50/commands/XprateCommand.java index 58e9d9993..f5ad2641c 100644 --- a/src/main/java/com/gmail/nossr50/commands/XprateCommand.java +++ b/src/main/java/com/gmail/nossr50/commands/XprateCommand.java @@ -1,21 +1,20 @@ package com.gmail.nossr50.commands; -import com.gmail.nossr50.config.AdvancedConfig; -import com.gmail.nossr50.config.Config; import com.gmail.nossr50.config.experience.ExperienceConfig; import com.gmail.nossr50.datatypes.notifications.SensitiveCommandType; import com.gmail.nossr50.locale.LocaleLoader; import com.gmail.nossr50.mcMMO; import com.gmail.nossr50.util.Permissions; -import com.gmail.nossr50.util.StringUtils; import com.gmail.nossr50.util.commands.CommandUtils; import com.gmail.nossr50.util.player.NotificationManager; +import com.gmail.nossr50.util.text.StringUtils; import com.google.common.collect.ImmutableList; import org.bukkit.ChatColor; import org.bukkit.command.Command; import org.bukkit.command.CommandSender; import org.bukkit.command.TabExecutor; import org.bukkit.util.StringUtil; +import org.jetbrains.annotations.NotNull; import java.util.ArrayList; import java.util.List; @@ -24,7 +23,7 @@ public class XprateCommand implements TabExecutor { private final double ORIGINAL_XP_RATE = ExperienceConfig.getInstance().getExperienceGainsGlobalMultiplier(); @Override - public boolean onCommand(CommandSender sender, Command command, String label, String[] args) { + public boolean onCommand(@NotNull CommandSender sender, @NotNull Command command, @NotNull String label, String[] args) { switch (args.length) { case 1: if (!args[0].equalsIgnoreCase("reset") && !args[0].equalsIgnoreCase("clear")) { @@ -38,7 +37,7 @@ public class XprateCommand implements TabExecutor { if (mcMMO.p.isXPEventEnabled()) { - if(AdvancedConfig.getInstance().useTitlesForXPEvent()) + if(mcMMO.p.getAdvancedConfig().useTitlesForXPEvent()) { NotificationManager.broadcastTitle(mcMMO.p.getServer(), LocaleLoader.getString("Commands.Event.Stop"), @@ -46,7 +45,7 @@ public class XprateCommand implements TabExecutor { 10, 10*20, 20); } - if(Config.getInstance().broadcastEventMessages()) + if(mcMMO.p.getGeneralConfig().broadcastEventMessages()) { mcMMO.p.getServer().broadcastMessage(LocaleLoader.getString("Commands.Event.Stop")); mcMMO.p.getServer().broadcastMessage(LocaleLoader.getString("Commands.Event.Stop.Subtitle")); @@ -91,7 +90,7 @@ public class XprateCommand implements TabExecutor { ExperienceConfig.getInstance().setExperienceGainsGlobalMultiplier(newXpRate); - if(AdvancedConfig.getInstance().useTitlesForXPEvent()) + if(mcMMO.p.getAdvancedConfig().useTitlesForXPEvent()) { NotificationManager.broadcastTitle(mcMMO.p.getServer(), LocaleLoader.getString("Commands.Event.Start"), @@ -99,7 +98,7 @@ public class XprateCommand implements TabExecutor { 10, 10*20, 20); } - if(Config.getInstance().broadcastEventMessages()) + if(mcMMO.p.getGeneralConfig().broadcastEventMessages()) { mcMMO.p.getServer().broadcastMessage(LocaleLoader.getString("Commands.Event.Start")); mcMMO.p.getServer().broadcastMessage(LocaleLoader.getString("Commands.Event.XP", newXpRate)); @@ -116,16 +115,16 @@ public class XprateCommand implements TabExecutor { } @Override - public List onTabComplete(CommandSender sender, Command command, String alias, String[] args) { + public List onTabComplete(@NotNull CommandSender sender, @NotNull Command command, @NotNull String alias, String[] args) { switch (args.length) { case 1: if (StringUtils.isInt(args[0])) { return ImmutableList.of(); } - return StringUtil.copyPartialMatches(args[0], CommandUtils.RESET_OPTIONS, new ArrayList(CommandUtils.RESET_OPTIONS.size())); + return StringUtil.copyPartialMatches(args[0], CommandUtils.RESET_OPTIONS, new ArrayList<>(CommandUtils.RESET_OPTIONS.size())); case 2: - return StringUtil.copyPartialMatches(args[1], CommandUtils.TRUE_FALSE_OPTIONS, new ArrayList(CommandUtils.TRUE_FALSE_OPTIONS.size())); + return StringUtil.copyPartialMatches(args[1], CommandUtils.TRUE_FALSE_OPTIONS, new ArrayList<>(CommandUtils.TRUE_FALSE_OPTIONS.size())); default: return ImmutableList.of(); } diff --git a/src/main/java/com/gmail/nossr50/commands/admin/DropTreasureCommand.java b/src/main/java/com/gmail/nossr50/commands/admin/DropTreasureCommand.java new file mode 100644 index 000000000..5a60d9bee --- /dev/null +++ b/src/main/java/com/gmail/nossr50/commands/admin/DropTreasureCommand.java @@ -0,0 +1,57 @@ +//package com.gmail.nossr50.commands.admin; +// +//import com.gmail.nossr50.config.treasure.FishingTreasureConfig; +//import com.gmail.nossr50.datatypes.player.McMMOPlayer; +//import com.gmail.nossr50.datatypes.treasure.FishingTreasure; +//import com.gmail.nossr50.datatypes.treasure.Rarity; +//import com.gmail.nossr50.mcMMO; +//import com.gmail.nossr50.skills.fishing.FishingManager; +//import com.gmail.nossr50.util.player.UserManager; +//import org.bukkit.Location; +//import org.bukkit.command.Command; +//import org.bukkit.command.CommandExecutor; +//import org.bukkit.command.CommandSender; +//import org.bukkit.entity.Player; +//import org.jetbrains.annotations.NotNull; +// +//public class DropTreasureCommand implements CommandExecutor { +// @Override +// public boolean onCommand(@NotNull CommandSender sender, @NotNull Command command, @NotNull String label, @NotNull String[] args) { +// if(sender instanceof Player) { +// if(!sender.isOp()) { +// sender.sendMessage("This command is for Operators only"); +// return false; +// } +// +// Player player = (Player) sender; +// Location location = player.getLocation(); +// McMMOPlayer mmoPlayer = UserManager.getPlayer(player); +// +// if(mmoPlayer == null) { +// //TODO: Localize +// player.sendMessage("Your player data is not loaded yet"); +// return false; +// } +// +// if(args.length == 0) { +// mcMMO.p.getLogger().info(player.toString() +" is dropping all mcMMO treasures via admin command at location "+location.toString()); +// for(Rarity rarity : FishingTreasureConfig.getInstance().fishingRewards.keySet()) { +// for(FishingTreasure fishingTreasure : FishingTreasureConfig.getInstance().fishingRewards.get(rarity)) { +// FishingManager fishingManager = mmoPlayer.getFishingManager(); +// } +// } +// //TODO: impl +// } else { +// String targetTreasure = args[1]; +// +// //Drop all treasures matching the name +// //TODO: impl +// } +// +// return true; +// } else { +// sender.sendMessage("No console support for this command"); +// return false; +// } +// } +//} diff --git a/src/main/java/com/gmail/nossr50/commands/admin/McmmoReloadLocaleCommand.java b/src/main/java/com/gmail/nossr50/commands/admin/McmmoReloadLocaleCommand.java index da15b8297..b5a5e22a8 100644 --- a/src/main/java/com/gmail/nossr50/commands/admin/McmmoReloadLocaleCommand.java +++ b/src/main/java/com/gmail/nossr50/commands/admin/McmmoReloadLocaleCommand.java @@ -5,26 +5,25 @@ import com.gmail.nossr50.util.Permissions; import org.bukkit.command.Command; import org.bukkit.command.CommandExecutor; import org.bukkit.command.CommandSender; +import org.jetbrains.annotations.NotNull; /** * @author Mark Vainomaa */ public final class McmmoReloadLocaleCommand implements CommandExecutor { @Override - public boolean onCommand(CommandSender sender, Command command, String label, String[] args) { - switch (args.length) { - case 0: - if (!Permissions.reloadlocale(sender)) { - sender.sendMessage(command.getPermissionMessage()); - return true; - } - - LocaleLoader.reloadLocale(); - sender.sendMessage(LocaleLoader.getString("Locale.Reloaded")); - + public boolean onCommand(@NotNull CommandSender sender, @NotNull Command command, @NotNull String label, String[] args) { + if (args.length == 0) { + if (!Permissions.reloadlocale(sender)) { + sender.sendMessage(command.getPermissionMessage()); return true; - default: - return false; + } + + LocaleLoader.reloadLocale(); + sender.sendMessage(LocaleLoader.getString("Locale.Reloaded")); + + return true; } + return false; } } diff --git a/src/main/java/com/gmail/nossr50/commands/admin/PlayerDebugCommand.java b/src/main/java/com/gmail/nossr50/commands/admin/PlayerDebugCommand.java index aa2726311..25a87ceb3 100644 --- a/src/main/java/com/gmail/nossr50/commands/admin/PlayerDebugCommand.java +++ b/src/main/java/com/gmail/nossr50/commands/admin/PlayerDebugCommand.java @@ -7,11 +7,12 @@ import org.bukkit.command.Command; import org.bukkit.command.CommandExecutor; import org.bukkit.command.CommandSender; import org.bukkit.entity.Player; +import org.jetbrains.annotations.NotNull; public class PlayerDebugCommand implements CommandExecutor { @Override - public boolean onCommand(CommandSender sender, Command command, String label, String[] args) { + public boolean onCommand(@NotNull CommandSender sender, @NotNull Command command, @NotNull String label, String[] args) { if(sender instanceof Player) { McMMOPlayer mcMMOPlayer = UserManager.getPlayer((Player) sender); mcMMOPlayer.toggleDebugMode(); //Toggle debug mode diff --git a/src/main/java/com/gmail/nossr50/commands/chat/AdminChatCommand.java b/src/main/java/com/gmail/nossr50/commands/chat/AdminChatCommand.java index 41f3746b5..3c6f93d11 100644 --- a/src/main/java/com/gmail/nossr50/commands/chat/AdminChatCommand.java +++ b/src/main/java/com/gmail/nossr50/commands/chat/AdminChatCommand.java @@ -1,15 +1,52 @@ package com.gmail.nossr50.commands.chat; -import com.gmail.nossr50.datatypes.chat.ChatMode; -import org.bukkit.command.CommandSender; +import co.aikar.commands.BaseCommand; +import co.aikar.commands.BukkitCommandIssuer; +import co.aikar.commands.annotation.CommandAlias; +import co.aikar.commands.annotation.CommandPermission; +import co.aikar.commands.annotation.Conditions; +import co.aikar.commands.annotation.Default; +import com.gmail.nossr50.commands.CommandManager; +import com.gmail.nossr50.datatypes.chat.ChatChannel; +import com.gmail.nossr50.datatypes.player.McMMOPlayer; +import com.gmail.nossr50.mcMMO; +import com.gmail.nossr50.util.player.UserManager; +import org.jetbrains.annotations.NotNull; -public class AdminChatCommand extends ChatCommand { - public AdminChatCommand() { - super(ChatMode.ADMIN); +@CommandPermission("mcmmo.chat.adminchat") +@CommandAlias("ac|a|adminchat|achat") //Kept for historical reasons +public class AdminChatCommand extends BaseCommand { + private final @NotNull mcMMO pluginRef; + + public AdminChatCommand(@NotNull mcMMO pluginRef) { + this.pluginRef = pluginRef; } - @Override - protected void handleChatSending(CommandSender sender, String[] args) { - chatManager.handleChat(sender.getName(), getDisplayName(sender), buildChatMessage(args, 0)); + @Default @Conditions(CommandManager.ADMIN_CONDITION) + public void processCommand(String[] args) { + BukkitCommandIssuer bukkitCommandIssuer = (BukkitCommandIssuer) getCurrentCommandIssuer(); + if(args == null || args.length == 0) { + //Process with no arguments + if(bukkitCommandIssuer.isPlayer()) { + McMMOPlayer mmoPlayer = UserManager.getPlayer(bukkitCommandIssuer.getPlayer()); + pluginRef.getChatManager().setOrToggleChatChannel(mmoPlayer, ChatChannel.ADMIN); + } else { + //Not support for console + mcMMO.p.getLogger().info("You cannot switch chat channels as console, please provide full arguments."); + } + } else { + if(bukkitCommandIssuer.isPlayer()) { + McMMOPlayer mmoPlayer = UserManager.getPlayer(bukkitCommandIssuer.getPlayer()); + + if(mmoPlayer == null) + return; + + //Message contains the original command so it needs to be passed to this method to trim it + pluginRef.getChatManager().processPlayerMessage(mmoPlayer, args, ChatChannel.ADMIN); + } else { + pluginRef.getChatManager().processConsoleMessage(args); + } + //Arguments are greater than 0, therefore directly send message and skip toggles + } } } diff --git a/src/main/java/com/gmail/nossr50/commands/chat/ChatCommand.java b/src/main/java/com/gmail/nossr50/commands/chat/ChatCommand.java deleted file mode 100644 index b1d93685a..000000000 --- a/src/main/java/com/gmail/nossr50/commands/chat/ChatCommand.java +++ /dev/null @@ -1,142 +0,0 @@ -package com.gmail.nossr50.commands.chat; - -import com.gmail.nossr50.chat.ChatManager; -import com.gmail.nossr50.chat.ChatManagerFactory; -import com.gmail.nossr50.config.Config; -import com.gmail.nossr50.datatypes.chat.ChatMode; -import com.gmail.nossr50.datatypes.party.PartyFeature; -import com.gmail.nossr50.datatypes.player.McMMOPlayer; -import com.gmail.nossr50.locale.LocaleLoader; -import com.gmail.nossr50.mcMMO; -import com.gmail.nossr50.util.commands.CommandUtils; -import com.gmail.nossr50.util.player.UserManager; -import com.google.common.collect.ImmutableList; -import org.bukkit.command.Command; -import org.bukkit.command.CommandSender; -import org.bukkit.command.TabExecutor; -import org.bukkit.entity.Player; -import org.bukkit.util.StringUtil; - -import java.util.ArrayList; -import java.util.List; - -public abstract class ChatCommand implements TabExecutor { - private ChatMode chatMode; - protected ChatManager chatManager; - - public ChatCommand(ChatMode chatMode) { - this.chatMode = chatMode; - this.chatManager = ChatManagerFactory.getChatManager(mcMMO.p, chatMode); - } - - @Override - public boolean onCommand(CommandSender sender, Command command, String label, String[] args) { - McMMOPlayer mcMMOPlayer; - - switch (args.length) { - case 0: - if (CommandUtils.noConsoleUsage(sender)) { - return true; - } - - if (!CommandUtils.hasPlayerDataKey(sender)) { - return true; - } - - mcMMOPlayer = UserManager.getPlayer(sender.getName()); - - if (mcMMOPlayer.isChatEnabled(chatMode)) { - disableChatMode(mcMMOPlayer, sender); - } - else { - enableChatMode(mcMMOPlayer, sender); - } - - return true; - - case 1: - if (CommandUtils.shouldEnableToggle(args[0])) { - if (CommandUtils.noConsoleUsage(sender)) { - return true; - } - if (!CommandUtils.hasPlayerDataKey(sender)) { - return true; - } - - enableChatMode(UserManager.getPlayer(sender.getName()), sender); - return true; - } - - if (CommandUtils.shouldDisableToggle(args[0])) { - if (CommandUtils.noConsoleUsage(sender)) { - return true; - } - if (!CommandUtils.hasPlayerDataKey(sender)) { - return true; - } - - disableChatMode(UserManager.getPlayer(sender.getName()), sender); - return true; - } - - // Fallthrough - - default: - handleChatSending(sender, args); - return true; - } - } - - @Override - public List onTabComplete(CommandSender sender, Command command, String alias, String[] args) { - switch (args.length) { - case 1: - return StringUtil.copyPartialMatches(args[0], CommandUtils.TRUE_FALSE_OPTIONS, new ArrayList(CommandUtils.TRUE_FALSE_OPTIONS.size())); - default: - return ImmutableList.of(); - } - } - - protected String buildChatMessage(String[] args, int index) { - StringBuilder builder = new StringBuilder(); - builder.append(args[index]); - - for (int i = index + 1; i < args.length; i++) { - builder.append(" "); - builder.append(args[i]); - } - - return builder.toString(); - } - - protected String getDisplayName(CommandSender sender) { - return (sender instanceof Player) ? ((Player) sender).getDisplayName() : LocaleLoader.getString("Commands.Chat.Console"); - } - - protected abstract void handleChatSending(CommandSender sender, String[] args); - - private void enableChatMode(McMMOPlayer mcMMOPlayer, CommandSender sender) { - if (chatMode == ChatMode.PARTY && mcMMOPlayer.getParty() == null) { - sender.sendMessage(LocaleLoader.getString("Commands.Party.None")); - return; - } - - if (chatMode == ChatMode.PARTY && (mcMMOPlayer.getParty().getLevel() < Config.getInstance().getPartyFeatureUnlockLevel(PartyFeature.CHAT))) { - sender.sendMessage(LocaleLoader.getString("Party.Feature.Disabled.1")); - return; - } - - mcMMOPlayer.enableChat(chatMode); - sender.sendMessage(chatMode.getEnabledMessage()); - } - - private void disableChatMode(McMMOPlayer mcMMOPlayer, CommandSender sender) { - if (chatMode == ChatMode.PARTY && mcMMOPlayer.getParty() == null) { - sender.sendMessage(LocaleLoader.getString("Commands.Party.None")); - return; - } - - mcMMOPlayer.disableChat(chatMode); - sender.sendMessage(chatMode.getDisabledMessage()); - } -} diff --git a/src/main/java/com/gmail/nossr50/commands/chat/PartyChatCommand.java b/src/main/java/com/gmail/nossr50/commands/chat/PartyChatCommand.java index 8cb3a488e..9e420e901 100644 --- a/src/main/java/com/gmail/nossr50/commands/chat/PartyChatCommand.java +++ b/src/main/java/com/gmail/nossr50/commands/chat/PartyChatCommand.java @@ -1,62 +1,90 @@ package com.gmail.nossr50.commands.chat; -import com.gmail.nossr50.chat.PartyChatManager; -import com.gmail.nossr50.config.Config; -import com.gmail.nossr50.datatypes.chat.ChatMode; +import co.aikar.commands.BaseCommand; +import co.aikar.commands.BukkitCommandIssuer; +import co.aikar.commands.annotation.CommandAlias; +import co.aikar.commands.annotation.CommandPermission; +import co.aikar.commands.annotation.Conditions; +import co.aikar.commands.annotation.Default; +import com.gmail.nossr50.commands.CommandManager; +import com.gmail.nossr50.datatypes.chat.ChatChannel; import com.gmail.nossr50.datatypes.party.Party; -import com.gmail.nossr50.datatypes.party.PartyFeature; -import com.gmail.nossr50.locale.LocaleLoader; +import com.gmail.nossr50.datatypes.player.McMMOPlayer; +import com.gmail.nossr50.mcMMO; import com.gmail.nossr50.party.PartyManager; import com.gmail.nossr50.util.player.UserManager; -import org.bukkit.command.CommandSender; +import com.gmail.nossr50.util.text.StringUtils; import org.bukkit.entity.Player; +import org.jetbrains.annotations.NotNull; -public class PartyChatCommand extends ChatCommand { - public PartyChatCommand() { - super(ChatMode.PARTY); +@CommandPermission("mcmmo.chat.partychat") +@CommandAlias("pc|p|partychat|pchat") //Kept for historical reasons +public class PartyChatCommand extends BaseCommand { + private final @NotNull mcMMO pluginRef; + + public PartyChatCommand(@NotNull mcMMO pluginRef) { + this.pluginRef = pluginRef; } - @Override - protected void handleChatSending(CommandSender sender, String[] args) { - Party party; - String message; + @Default + @Conditions(CommandManager.PARTY_CONDITION) + public void processCommand(String[] args) { + BukkitCommandIssuer bukkitCommandIssuer = (BukkitCommandIssuer) getCurrentCommandIssuer(); - if (sender instanceof Player) { - //Check if player profile is loaded - if(UserManager.getPlayer((Player) sender) == null) - return; - - party = UserManager.getPlayer((Player) sender).getParty(); - - if (party == null) { - sender.sendMessage(LocaleLoader.getString("Commands.Party.None")); - return; + if(args == null || args.length == 0) { + //Process with no arguments + if(bukkitCommandIssuer.isPlayer()) { + McMMOPlayer mmoPlayer = UserManager.getPlayer(bukkitCommandIssuer.getPlayer()); + pluginRef.getChatManager().setOrToggleChatChannel(mmoPlayer, ChatChannel.PARTY); + } else { + //Not support for console + mcMMO.p.getLogger().info("You cannot switch chat channels as console, please provide full arguments."); } + } else { + //Here we split the logic, consoles need to target a party name and players do not - if (party.getLevel() < Config.getInstance().getPartyFeatureUnlockLevel(PartyFeature.CHAT)) { - sender.sendMessage(LocaleLoader.getString("Party.Feature.Disabled.1")); - return; + /* + * Player Logic + */ + if(bukkitCommandIssuer.getIssuer() instanceof Player) { + McMMOPlayer mmoPlayer = UserManager.getPlayer(bukkitCommandIssuer.getPlayer()); + processCommandArgsPlayer(mmoPlayer, args); + /* + * Console Logic + */ + } else { + processCommandArgsConsole(args); } - - message = buildChatMessage(args, 0); } - else { - if (args.length < 2) { - sender.sendMessage(LocaleLoader.getString("Party.Specify")); - return; + } + + /** + * Processes the command with arguments for a {@link McMMOPlayer} + * @param mmoPlayer target player + * @param args command arguments + */ + private void processCommandArgsPlayer(@NotNull McMMOPlayer mmoPlayer, @NotNull String[] args) { + //Player is not toggling and is chatting directly to party + pluginRef.getChatManager().processPlayerMessage(mmoPlayer, args, ChatChannel.PARTY); + } + + /** + * Processes the command with arguments for a {@link com.gmail.nossr50.chat.author.ConsoleAuthor} + * @param args command arguments + */ + private void processCommandArgsConsole(@NotNull String[] args) { + if(args.length <= 1) { + //Only specific a party and not the message + mcMMO.p.getLogger().severe("You need to specify a party name and then write a message afterwards."); + } else { + //Grab party + Party targetParty = PartyManager.getParty(args[0]); + + if(targetParty != null) { + pluginRef.getChatManager().processConsoleMessage(StringUtils.buildStringAfterNthElement(args, 1), targetParty); + } else { + mcMMO.p.getLogger().severe("A party with that name doesn't exist!"); } - - party = PartyManager.getParty(args[0]); - - if (party == null) { - sender.sendMessage(LocaleLoader.getString("Party.InvalidName")); - return; - } - - message = buildChatMessage(args, 1); } - - ((PartyChatManager) chatManager).setParty(party); - chatManager.handleChat(sender.getName(), getDisplayName(sender), message); } } diff --git a/src/main/java/com/gmail/nossr50/commands/database/ConvertDatabaseCommand.java b/src/main/java/com/gmail/nossr50/commands/database/ConvertDatabaseCommand.java index a7834ee03..8642bc922 100644 --- a/src/main/java/com/gmail/nossr50/commands/database/ConvertDatabaseCommand.java +++ b/src/main/java/com/gmail/nossr50/commands/database/ConvertDatabaseCommand.java @@ -13,62 +13,63 @@ import org.bukkit.command.Command; import org.bukkit.command.CommandExecutor; import org.bukkit.command.CommandSender; import org.bukkit.entity.Player; +import org.jetbrains.annotations.NotNull; public class ConvertDatabaseCommand implements CommandExecutor { @Override - public boolean onCommand(CommandSender sender, Command command, String label, String[] args) { - switch (args.length) { - case 2: - DatabaseType previousType = DatabaseType.getDatabaseType(args[1]); - DatabaseType newType = mcMMO.getDatabaseManager().getDatabaseType(); + public boolean onCommand(@NotNull CommandSender sender, @NotNull Command command, @NotNull String label, String[] args) { + if (args.length == 2) { + DatabaseType previousType = DatabaseType.getDatabaseType(args[1]); + DatabaseType newType = mcMMO.getDatabaseManager().getDatabaseType(); - if (previousType == newType || (newType == DatabaseType.CUSTOM && DatabaseManagerFactory.getCustomDatabaseManagerClass().getSimpleName().equalsIgnoreCase(args[1]))) { - sender.sendMessage(LocaleLoader.getString("Commands.mcconvert.Database.Same", newType.toString())); - return true; - } + if (previousType == newType || (newType == DatabaseType.CUSTOM && DatabaseManagerFactory.getCustomDatabaseManagerClass().getSimpleName().equalsIgnoreCase(args[1]))) { + sender.sendMessage(LocaleLoader.getString("Commands.mcconvert.Database.Same", newType.toString())); + return true; + } - DatabaseManager oldDatabase = DatabaseManagerFactory.createDatabaseManager(previousType); + DatabaseManager oldDatabase = DatabaseManagerFactory.createDatabaseManager(previousType, mcMMO.getUsersFilePath(), mcMMO.p.getLogger(), mcMMO.p.getPurgeTime(), mcMMO.p.getAdvancedConfig().getStartingLevel()); + if(oldDatabase == null) { + sender.sendMessage("Unable to load the old database! Check your log for errors."); + return true; + } - if (previousType == DatabaseType.CUSTOM) { - Class clazz; + if (previousType == DatabaseType.CUSTOM) { + Class clazz; - try { - clazz = Class.forName(args[1]); + try { + clazz = Class.forName(args[1]); - if (!DatabaseManager.class.isAssignableFrom(clazz)) { - sender.sendMessage(LocaleLoader.getString("Commands.mcconvert.Database.InvalidType", args[1])); - return true; - } - - oldDatabase = DatabaseManagerFactory.createCustomDatabaseManager((Class) clazz); - } - catch (Throwable e) { - e.printStackTrace(); + if (!DatabaseManager.class.isAssignableFrom(clazz)) { sender.sendMessage(LocaleLoader.getString("Commands.mcconvert.Database.InvalidType", args[1])); return true; } + + oldDatabase = DatabaseManagerFactory.createCustomDatabaseManager((Class) clazz); + } catch (Throwable e) { + e.printStackTrace(); + sender.sendMessage(LocaleLoader.getString("Commands.mcconvert.Database.InvalidType", args[1])); + return true; + } + } + + sender.sendMessage(LocaleLoader.getString("Commands.mcconvert.Database.Start", previousType.toString(), newType.toString())); + + UserManager.saveAll(); + UserManager.clearAll(); + + for (Player player : mcMMO.p.getServer().getOnlinePlayers()) { + PlayerProfile profile = oldDatabase.loadPlayerProfile(player); + + if (profile.isLoaded()) { + mcMMO.getDatabaseManager().saveUser(profile); } - sender.sendMessage(LocaleLoader.getString("Commands.mcconvert.Database.Start", previousType.toString(), newType.toString())); + new PlayerProfileLoadingTask(player).runTaskLaterAsynchronously(mcMMO.p, 1); // 1 Tick delay to ensure the player is marked as online before we begin loading + } - UserManager.saveAll(); - UserManager.clearAll(); - - for (Player player : mcMMO.p.getServer().getOnlinePlayers()) { - PlayerProfile profile = oldDatabase.loadPlayerProfile(player.getUniqueId()); - - if (profile.isLoaded()) { - mcMMO.getDatabaseManager().saveUser(profile); - } - - new PlayerProfileLoadingTask(player).runTaskLaterAsynchronously(mcMMO.p, 1); // 1 Tick delay to ensure the player is marked as online before we begin loading - } - - new DatabaseConversionTask(oldDatabase, sender, previousType.toString(), newType.toString()).runTaskAsynchronously(mcMMO.p); - return true; - - default: - return false; + new DatabaseConversionTask(oldDatabase, sender, previousType.toString(), newType.toString()).runTaskAsynchronously(mcMMO.p); + return true; } + return false; } } diff --git a/src/main/java/com/gmail/nossr50/commands/database/McpurgeCommand.java b/src/main/java/com/gmail/nossr50/commands/database/McpurgeCommand.java index 3e53140e1..6f192510f 100644 --- a/src/main/java/com/gmail/nossr50/commands/database/McpurgeCommand.java +++ b/src/main/java/com/gmail/nossr50/commands/database/McpurgeCommand.java @@ -1,36 +1,33 @@ package com.gmail.nossr50.commands.database; -import com.gmail.nossr50.config.Config; import com.gmail.nossr50.locale.LocaleLoader; import com.gmail.nossr50.mcMMO; import com.google.common.collect.ImmutableList; import org.bukkit.command.Command; import org.bukkit.command.CommandSender; import org.bukkit.command.TabExecutor; +import org.jetbrains.annotations.NotNull; import java.util.List; public class McpurgeCommand implements TabExecutor { @Override - public boolean onCommand(CommandSender sender, Command command, String label, String[] args) { - switch (args.length) { - case 0: - mcMMO.getDatabaseManager().purgePowerlessUsers(); + public boolean onCommand(@NotNull CommandSender sender, @NotNull Command command, @NotNull String label, String[] args) { + if (args.length == 0) { + mcMMO.getDatabaseManager().purgePowerlessUsers(); - if (Config.getInstance().getOldUsersCutoff() != -1) { - mcMMO.getDatabaseManager().purgeOldUsers(); - } + if (mcMMO.p.getGeneralConfig().getOldUsersCutoff() != -1) { + mcMMO.getDatabaseManager().purgeOldUsers(); + } - sender.sendMessage(LocaleLoader.getString("Commands.mcpurge.Success")); - return true; - - default: - return false; + sender.sendMessage(LocaleLoader.getString("Commands.mcpurge.Success")); + return true; } + return false; } @Override - public List onTabComplete(CommandSender sender, Command command, String alias, String[] args) { + public List onTabComplete(@NotNull CommandSender sender, @NotNull Command command, @NotNull String alias, String[] args) { return ImmutableList.of(); } } diff --git a/src/main/java/com/gmail/nossr50/commands/database/McremoveCommand.java b/src/main/java/com/gmail/nossr50/commands/database/McremoveCommand.java index ba02d762c..56b817337 100644 --- a/src/main/java/com/gmail/nossr50/commands/database/McremoveCommand.java +++ b/src/main/java/com/gmail/nossr50/commands/database/McremoveCommand.java @@ -10,6 +10,7 @@ import org.bukkit.command.Command; import org.bukkit.command.CommandSender; import org.bukkit.command.TabExecutor; import org.bukkit.util.StringUtil; +import org.jetbrains.annotations.NotNull; import java.util.ArrayList; import java.util.List; @@ -17,43 +18,37 @@ import java.util.UUID; public class McremoveCommand implements TabExecutor { @Override - public boolean onCommand(CommandSender sender, Command command, String label, String[] args) { - switch (args.length) { - case 1: - String playerName = CommandUtils.getMatchedPlayerName(args[0]); - - if (UserManager.getOfflinePlayer(playerName) == null && CommandUtils.unloadedProfile(sender, mcMMO.getDatabaseManager().loadPlayerProfile(playerName, false))) { - return true; - } - - UUID uuid = null; - - if(Bukkit.getPlayer(playerName) != null) { - uuid = Bukkit.getPlayer(playerName).getUniqueId(); - } - - if (mcMMO.getDatabaseManager().removeUser(playerName, uuid)) { - sender.sendMessage(LocaleLoader.getString("Commands.mcremove.Success", playerName)); - } - else { - sender.sendMessage(playerName + " could not be removed from the database."); // Pretty sure this should NEVER happen. - } + public boolean onCommand(@NotNull CommandSender sender, @NotNull Command command, @NotNull String label, String[] args) { + if (args.length == 1) { + String playerName = CommandUtils.getMatchedPlayerName(args[0]); + if (UserManager.getOfflinePlayer(playerName) == null && CommandUtils.unloadedProfile(sender, mcMMO.getDatabaseManager().loadPlayerProfile(playerName))) { return true; + } - default: - return false; + UUID uuid = null; + + if (Bukkit.getPlayer(playerName) != null) { + uuid = Bukkit.getPlayer(playerName).getUniqueId(); + } + + if (mcMMO.getDatabaseManager().removeUser(playerName, uuid)) { + sender.sendMessage(LocaleLoader.getString("Commands.mcremove.Success", playerName)); + } else { + sender.sendMessage(playerName + " could not be removed from the database."); // Pretty sure this should NEVER happen. + } + + return true; } + return false; } @Override - public List onTabComplete(CommandSender sender, Command command, String alias, String[] args) { - switch (args.length) { - case 1: - List playerNames = CommandUtils.getOnlinePlayerNames(sender); - return StringUtil.copyPartialMatches(args[0], playerNames, new ArrayList(playerNames.size())); - default: - return ImmutableList.of(); + public List onTabComplete(@NotNull CommandSender sender, @NotNull Command command, @NotNull String alias, String[] args) { + if (args.length == 1) { + List playerNames = CommandUtils.getOnlinePlayerNames(sender); + return StringUtil.copyPartialMatches(args[0], playerNames, new ArrayList<>(playerNames.size())); } + return ImmutableList.of(); } } diff --git a/src/main/java/com/gmail/nossr50/commands/database/MmoshowdbCommand.java b/src/main/java/com/gmail/nossr50/commands/database/MmoshowdbCommand.java index 2b4ca7d76..bcb07312d 100644 --- a/src/main/java/com/gmail/nossr50/commands/database/MmoshowdbCommand.java +++ b/src/main/java/com/gmail/nossr50/commands/database/MmoshowdbCommand.java @@ -1,37 +1,35 @@ package com.gmail.nossr50.commands.database; -import com.gmail.nossr50.config.Config; import com.gmail.nossr50.database.DatabaseManagerFactory; import com.gmail.nossr50.locale.LocaleLoader; +import com.gmail.nossr50.mcMMO; import com.google.common.collect.ImmutableList; import org.bukkit.command.Command; import org.bukkit.command.CommandSender; import org.bukkit.command.TabExecutor; +import org.jetbrains.annotations.NotNull; import java.util.List; public class MmoshowdbCommand implements TabExecutor { @Override - public boolean onCommand(CommandSender sender, Command command, String label, String[] args) { - switch (args.length) { - case 0: - Class clazz = DatabaseManagerFactory.getCustomDatabaseManagerClass(); + public boolean onCommand(@NotNull CommandSender sender, @NotNull Command command, @NotNull String label, String[] args) { + if (args.length == 0) { + Class clazz = DatabaseManagerFactory.getCustomDatabaseManagerClass(); - if (clazz != null) { - sender.sendMessage(LocaleLoader.getString("Commands.mmoshowdb", clazz.getName())); - return true; - } - - sender.sendMessage(LocaleLoader.getString("Commands.mmoshowdb", (Config.getInstance().getUseMySQL() ? "sql" : "flatfile"))); + if (clazz != null) { + sender.sendMessage(LocaleLoader.getString("Commands.mmoshowdb", clazz.getName())); return true; + } - default: - return false; + sender.sendMessage(LocaleLoader.getString("Commands.mmoshowdb", (mcMMO.p.getGeneralConfig().getUseMySQL() ? "sql" : "flatfile"))); + return true; } + return false; } @Override - public List onTabComplete(CommandSender sender, Command command, String alias, String[] args) { + public List onTabComplete(@NotNull CommandSender sender, @NotNull Command command, @NotNull String alias, String[] args) { return ImmutableList.of(); } } diff --git a/src/main/java/com/gmail/nossr50/commands/experience/AddlevelsCommand.java b/src/main/java/com/gmail/nossr50/commands/experience/AddlevelsCommand.java index e4edefd74..ca54d293a 100644 --- a/src/main/java/com/gmail/nossr50/commands/experience/AddlevelsCommand.java +++ b/src/main/java/com/gmail/nossr50/commands/experience/AddlevelsCommand.java @@ -1,11 +1,14 @@ package com.gmail.nossr50.commands.experience; import com.gmail.nossr50.datatypes.experience.XPGainReason; +import com.gmail.nossr50.datatypes.player.McMMOPlayer; import com.gmail.nossr50.datatypes.player.PlayerProfile; import com.gmail.nossr50.datatypes.skills.PrimarySkillType; import com.gmail.nossr50.locale.LocaleLoader; +import com.gmail.nossr50.mcMMO; import com.gmail.nossr50.util.EventUtils; import com.gmail.nossr50.util.Permissions; +import com.gmail.nossr50.util.player.UserManager; import org.bukkit.command.CommandSender; import org.bukkit.entity.Player; @@ -30,16 +33,29 @@ public class AddlevelsCommand extends ExperienceCommand { return; } - EventUtils.tryLevelChangeEvent(player, skill, value, xpRemoved, true, XPGainReason.COMMAND); + McMMOPlayer mmoPlayer = UserManager.getPlayer(player); + + if(mmoPlayer == null) { + EventUtils.tryLevelChangeEvent(player, skill, value, xpRemoved, true, XPGainReason.COMMAND); + } else { + EventUtils.tryLevelChangeEvent(mmoPlayer, skill, value, xpRemoved, true, XPGainReason.COMMAND); + } + } @Override - protected void handlePlayerMessageAll(Player player, int value) { + protected void handlePlayerMessageAll(Player player, int value, boolean isSilent) { + if(isSilent) + return; + player.sendMessage(LocaleLoader.getString("Commands.addlevels.AwardAll.1", value)); } @Override - protected void handlePlayerMessageSkill(Player player, int value, PrimarySkillType skill) { - player.sendMessage(LocaleLoader.getString("Commands.addlevels.AwardSkill.1", value, skill.getName())); + protected void handlePlayerMessageSkill(Player player, int value, PrimarySkillType skill, boolean isSilent) { + if(isSilent) + return; + + player.sendMessage(LocaleLoader.getString("Commands.addlevels.AwardSkill.1", value, mcMMO.p.getSkillTools().getLocalizedSkillName(skill))); } } diff --git a/src/main/java/com/gmail/nossr50/commands/experience/AddxpCommand.java b/src/main/java/com/gmail/nossr50/commands/experience/AddxpCommand.java index f2f3a5370..25d77e5c0 100644 --- a/src/main/java/com/gmail/nossr50/commands/experience/AddxpCommand.java +++ b/src/main/java/com/gmail/nossr50/commands/experience/AddxpCommand.java @@ -5,6 +5,7 @@ import com.gmail.nossr50.datatypes.experience.XPGainSource; import com.gmail.nossr50.datatypes.player.PlayerProfile; import com.gmail.nossr50.datatypes.skills.PrimarySkillType; import com.gmail.nossr50.locale.LocaleLoader; +import com.gmail.nossr50.mcMMO; import com.gmail.nossr50.util.Permissions; import com.gmail.nossr50.util.player.UserManager; import org.bukkit.command.CommandSender; @@ -37,12 +38,18 @@ public class AddxpCommand extends ExperienceCommand { } @Override - protected void handlePlayerMessageAll(Player player, int value) { + protected void handlePlayerMessageAll(Player player, int value, boolean isSilent) { + if(isSilent) + return; + player.sendMessage(LocaleLoader.getString("Commands.addxp.AwardAll", value)); } @Override - protected void handlePlayerMessageSkill(Player player, int value, PrimarySkillType skill) { - player.sendMessage(LocaleLoader.getString("Commands.addxp.AwardSkill", value, skill.getName())); + protected void handlePlayerMessageSkill(Player player, int value, PrimarySkillType skill, boolean isSilent) { + if(isSilent) + return; + + player.sendMessage(LocaleLoader.getString("Commands.addxp.AwardSkill", value, mcMMO.p.getSkillTools().getLocalizedSkillName(skill))); } } diff --git a/src/main/java/com/gmail/nossr50/commands/experience/ConvertExperienceCommand.java b/src/main/java/com/gmail/nossr50/commands/experience/ConvertExperienceCommand.java index 147212bd0..e15063ebf 100644 --- a/src/main/java/com/gmail/nossr50/commands/experience/ConvertExperienceCommand.java +++ b/src/main/java/com/gmail/nossr50/commands/experience/ConvertExperienceCommand.java @@ -10,42 +10,40 @@ import org.bukkit.command.Command; import org.bukkit.command.CommandExecutor; import org.bukkit.command.CommandSender; import org.bukkit.entity.Player; +import org.jetbrains.annotations.NotNull; import java.util.Locale; public class ConvertExperienceCommand implements CommandExecutor { @Override - public boolean onCommand(CommandSender sender, Command command, String label, String[] args) { - switch (args.length) { - case 2: - FormulaType previousType = mcMMO.getFormulaManager().getPreviousFormulaType(); - FormulaType newType = FormulaType.getFormulaType(args[1].toUpperCase(Locale.ENGLISH)); - - if (newType == FormulaType.UNKNOWN) { - sender.sendMessage(LocaleLoader.getString("Commands.mcconvert.Experience.Invalid")); - return true; - } - - if (previousType == newType) { - sender.sendMessage(LocaleLoader.getString("Commands.mcconvert.Experience.Same", newType.toString())); - return true; - } - - sender.sendMessage(LocaleLoader.getString("Commands.mcconvert.Experience.Start", previousType.toString(), newType.toString())); - - UserManager.saveAll(); - UserManager.clearAll(); - - new FormulaConversionTask(sender, newType).runTaskLater(mcMMO.p, 1); - - for (Player player : mcMMO.p.getServer().getOnlinePlayers()) { - new PlayerProfileLoadingTask(player).runTaskLaterAsynchronously(mcMMO.p, 1); // 1 Tick delay to ensure the player is marked as online before we begin loading - } + public boolean onCommand(@NotNull CommandSender sender, @NotNull Command command, @NotNull String label, String[] args) { + if (args.length == 2) { + FormulaType previousType = mcMMO.getFormulaManager().getPreviousFormulaType(); + FormulaType newType = FormulaType.getFormulaType(args[1].toUpperCase(Locale.ENGLISH)); + if (newType == FormulaType.UNKNOWN) { + sender.sendMessage(LocaleLoader.getString("Commands.mcconvert.Experience.Invalid")); return true; + } - default: - return false; + if (previousType == newType) { + sender.sendMessage(LocaleLoader.getString("Commands.mcconvert.Experience.Same", newType.toString())); + return true; + } + + sender.sendMessage(LocaleLoader.getString("Commands.mcconvert.Experience.Start", previousType.toString(), newType.toString())); + + UserManager.saveAll(); + UserManager.clearAll(); + + new FormulaConversionTask(sender, newType).runTaskLater(mcMMO.p, 1); + + for (Player player : mcMMO.p.getServer().getOnlinePlayers()) { + new PlayerProfileLoadingTask(player).runTaskLaterAsynchronously(mcMMO.p, 1); // 1 Tick delay to ensure the player is marked as online before we begin loading + } + + return true; } + return false; } } diff --git a/src/main/java/com/gmail/nossr50/commands/experience/ExperienceCommand.java b/src/main/java/com/gmail/nossr50/commands/experience/ExperienceCommand.java index 139cd9fb5..4bd6b4eeb 100644 --- a/src/main/java/com/gmail/nossr50/commands/experience/ExperienceCommand.java +++ b/src/main/java/com/gmail/nossr50/commands/experience/ExperienceCommand.java @@ -7,31 +7,35 @@ import com.gmail.nossr50.locale.LocaleLoader; import com.gmail.nossr50.mcMMO; import com.gmail.nossr50.util.commands.CommandUtils; import com.gmail.nossr50.util.player.UserManager; +import com.gmail.nossr50.util.skills.SkillTools; import com.google.common.collect.ImmutableList; -import org.bukkit.OfflinePlayer; 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 org.jetbrains.annotations.NotNull; import java.util.ArrayList; import java.util.List; -import java.util.UUID; public abstract class ExperienceCommand implements TabExecutor { @Override - public boolean onCommand(CommandSender sender, Command command, String label, String[] args) { + public boolean onCommand(@NotNull CommandSender sender, @NotNull Command command, @NotNull String label, String[] args) { PrimarySkillType skill; - switch (args.length) { - case 2: + if(args.length < 2) { + return false; + } else { + if(args.length == 2 && !isSilent(args) || args.length == 3 && isSilent(args)) { if (CommandUtils.noConsoleUsage(sender)) { return true; } if (!permissionsCheckSelf(sender)) { - sender.sendMessage(command.getPermissionMessage()); + if(command.getPermissionMessage() != null) + sender.sendMessage(command.getPermissionMessage()); + sender.sendMessage("(mcMMO) No permission!"); return true; } @@ -39,13 +43,13 @@ public abstract class ExperienceCommand implements TabExecutor { return true; } - skill = PrimarySkillType.getSkill(args[0]); + skill = mcMMO.p.getSkillTools().matchSkill(args[0]); if (args[1].equalsIgnoreCase("all")) { skill = null; } - if (skill != null && skill.isChildSkill()) + if (skill != null && SkillTools.isChildSkill(skill)) { sender.sendMessage(LocaleLoader.getString("Commands.Skill.ChildSkill")); return true; @@ -59,10 +63,10 @@ public abstract class ExperienceCommand implements TabExecutor { } - editValues((Player) sender, UserManager.getPlayer(sender.getName()).getProfile(), skill, Integer.parseInt(args[1])); + editValues((Player) sender, UserManager.getPlayer(sender.getName()).getProfile(), skill, Integer.parseInt(args[1]), isSilent(args)); return true; - - case 3: + } else if((args.length == 3 && !isSilent(args)) + || (args.length == 4 && isSilent(args))) { if (!permissionsCheckOthers(sender)) { sender.sendMessage(command.getPermissionMessage()); return true; @@ -72,13 +76,13 @@ public abstract class ExperienceCommand implements TabExecutor { return true; } - skill = PrimarySkillType.getSkill(args[1]); + skill = mcMMO.p.getSkillTools().matchSkill(args[1]); if (args[1].equalsIgnoreCase("all")) { skill = null; } - if (skill != null && skill.isChildSkill()) + if (skill != null && SkillTools.isChildSkill(skill)) { sender.sendMessage(LocaleLoader.getString("Commands.Skill.ChildSkill")); return true; @@ -91,39 +95,52 @@ public abstract class ExperienceCommand implements TabExecutor { // If the mcMMOPlayer doesn't exist, create a temporary profile and check if it's present in the database. If it's not, abort the process. if (mcMMOPlayer == null) { - UUID uuid = null; - OfflinePlayer player = mcMMO.p.getServer().getOfflinePlayer(playerName); - if (player != null) { - uuid = player.getUniqueId(); - } - PlayerProfile profile = mcMMO.getDatabaseManager().loadPlayerProfile(playerName, uuid, false); + PlayerProfile profile; + profile = mcMMO.getDatabaseManager().loadPlayerProfile(playerName); + + //Check loading by UUID if (CommandUtils.unloadedProfile(sender, profile)) { - return true; + //Check loading by name + profile = mcMMO.getDatabaseManager().loadPlayerProfile(playerName); + + if(CommandUtils.unloadedProfile(sender, profile)) { + return true; + } } - editValues(null, profile, skill, value); + editValues(null, profile, skill, value, isSilent(args)); } else { - editValues(mcMMOPlayer.getPlayer(), mcMMOPlayer.getProfile(), skill, value); + editValues(mcMMOPlayer.getPlayer(), mcMMOPlayer.getProfile(), skill, value, isSilent(args)); } handleSenderMessage(sender, playerName, skill); return true; - - default: + } else { return false; + } } } + private boolean isSilent(String[] args) { + int length = args.length; + + if(length == 0) + return false; + + return args[length-1].equalsIgnoreCase("-s"); + } + + @Override - public List onTabComplete(CommandSender sender, Command command, String alias, String[] args) { + public List onTabComplete(@NotNull CommandSender sender, @NotNull Command command, @NotNull String alias, String[] args) { switch (args.length) { case 1: List playerNames = CommandUtils.getOnlinePlayerNames(sender); - return StringUtil.copyPartialMatches(args[0], playerNames, new ArrayList(playerNames.size())); + return StringUtil.copyPartialMatches(args[0], playerNames, new ArrayList<>(playerNames.size())); case 2: - return StringUtil.copyPartialMatches(args[1], PrimarySkillType.SKILL_NAMES, new ArrayList(PrimarySkillType.SKILL_NAMES.size())); + return StringUtil.copyPartialMatches(args[1], mcMMO.p.getSkillTools().LOCALIZED_SKILL_NAMES, new ArrayList<>(mcMMO.p.getSkillTools().LOCALIZED_SKILL_NAMES.size())); default: return ImmutableList.of(); } @@ -132,8 +149,8 @@ public abstract class ExperienceCommand implements TabExecutor { protected abstract boolean permissionsCheckSelf(CommandSender sender); protected abstract boolean permissionsCheckOthers(CommandSender sender); protected abstract void handleCommand(Player player, PlayerProfile profile, PrimarySkillType skill, int value); - protected abstract void handlePlayerMessageAll(Player player, int value); - protected abstract void handlePlayerMessageSkill(Player player, int value, PrimarySkillType skill); + protected abstract void handlePlayerMessageAll(Player player, int value, boolean isSilent); + protected abstract void handlePlayerMessageSkill(Player player, int value, PrimarySkillType skill, boolean isSilent); private boolean validateArguments(CommandSender sender, String skillName, String value) { return !(CommandUtils.isInvalidInteger(sender, value) || (!skillName.equalsIgnoreCase("all") && CommandUtils.isInvalidSkill(sender, skillName))); @@ -144,25 +161,25 @@ public abstract class ExperienceCommand implements TabExecutor { sender.sendMessage(LocaleLoader.getString("Commands.addlevels.AwardAll.2", playerName)); } else { - sender.sendMessage(LocaleLoader.getString("Commands.addlevels.AwardSkill.2", skill.getName(), playerName)); + sender.sendMessage(LocaleLoader.getString("Commands.addlevels.AwardSkill.2", mcMMO.p.getSkillTools().getLocalizedSkillName(skill), playerName)); } } - protected void editValues(Player player, PlayerProfile profile, PrimarySkillType skill, int value) { + protected void editValues(Player player, PlayerProfile profile, PrimarySkillType skill, int value, boolean isSilent) { if (skill == null) { - for (PrimarySkillType primarySkillType : PrimarySkillType.NON_CHILD_SKILLS) { + for (PrimarySkillType primarySkillType : SkillTools.NON_CHILD_SKILLS) { handleCommand(player, profile, primarySkillType, value); } if (player != null) { - handlePlayerMessageAll(player, value); + handlePlayerMessageAll(player, value, isSilent); } } else { handleCommand(player, profile, skill, value); if (player != null) { - handlePlayerMessageSkill(player, value, skill); + handlePlayerMessageSkill(player, value, skill, isSilent); } } } diff --git a/src/main/java/com/gmail/nossr50/commands/experience/MmoeditCommand.java b/src/main/java/com/gmail/nossr50/commands/experience/MmoeditCommand.java index 4e483dc6a..93089ac69 100644 --- a/src/main/java/com/gmail/nossr50/commands/experience/MmoeditCommand.java +++ b/src/main/java/com/gmail/nossr50/commands/experience/MmoeditCommand.java @@ -1,11 +1,14 @@ package com.gmail.nossr50.commands.experience; import com.gmail.nossr50.datatypes.experience.XPGainReason; +import com.gmail.nossr50.datatypes.player.McMMOPlayer; import com.gmail.nossr50.datatypes.player.PlayerProfile; import com.gmail.nossr50.datatypes.skills.PrimarySkillType; import com.gmail.nossr50.locale.LocaleLoader; +import com.gmail.nossr50.mcMMO; import com.gmail.nossr50.util.EventUtils; import com.gmail.nossr50.util.Permissions; +import com.gmail.nossr50.util.player.UserManager; import org.bukkit.command.CommandSender; import org.bukkit.entity.Player; @@ -36,16 +39,29 @@ public class MmoeditCommand extends ExperienceCommand { return; } - EventUtils.tryLevelEditEvent(player, skill, value, xpRemoved, value > skillLevel, XPGainReason.COMMAND, skillLevel); + McMMOPlayer mmoPlayer = UserManager.getPlayer(player); + + if(mmoPlayer != null) { + EventUtils.tryLevelEditEvent(mmoPlayer, skill, value, xpRemoved, value > skillLevel, XPGainReason.COMMAND, skillLevel); + } else { + EventUtils.tryLevelEditEvent(player, skill, value, xpRemoved, value > skillLevel, XPGainReason.COMMAND, skillLevel); + } + } @Override - protected void handlePlayerMessageAll(Player player, int value) { + protected void handlePlayerMessageAll(Player player, int value, boolean isSilent) { + if(isSilent) + return; + player.sendMessage(LocaleLoader.getString("Commands.mmoedit.AllSkills.1", value)); } @Override - protected void handlePlayerMessageSkill(Player player, int value, PrimarySkillType skill) { - player.sendMessage(LocaleLoader.getString("Commands.mmoedit.Modified.1", skill.getName(), value)); + protected void handlePlayerMessageSkill(Player player, int value, PrimarySkillType skill, boolean isSilent) { + if(isSilent) + return; + + player.sendMessage(LocaleLoader.getString("Commands.mmoedit.Modified.1", mcMMO.p.getSkillTools().getLocalizedSkillName(skill), value)); } } diff --git a/src/main/java/com/gmail/nossr50/commands/experience/SkillresetCommand.java b/src/main/java/com/gmail/nossr50/commands/experience/SkillresetCommand.java index 553ecee49..edc99e2ad 100644 --- a/src/main/java/com/gmail/nossr50/commands/experience/SkillresetCommand.java +++ b/src/main/java/com/gmail/nossr50/commands/experience/SkillresetCommand.java @@ -10,6 +10,7 @@ import com.gmail.nossr50.util.EventUtils; import com.gmail.nossr50.util.Permissions; import com.gmail.nossr50.util.commands.CommandUtils; import com.gmail.nossr50.util.player.UserManager; +import com.gmail.nossr50.util.skills.SkillTools; import com.google.common.collect.ImmutableList; import org.bukkit.OfflinePlayer; import org.bukkit.command.Command; @@ -17,10 +18,10 @@ import org.bukkit.command.CommandSender; import org.bukkit.command.TabExecutor; import org.bukkit.entity.Player; import org.bukkit.util.StringUtil; +import org.jetbrains.annotations.NotNull; import java.util.ArrayList; import java.util.List; -import java.util.UUID; /** * This class mirrors the structure of ExperienceCommand, except the @@ -28,7 +29,7 @@ import java.util.UUID; */ public class SkillresetCommand implements TabExecutor { @Override - public boolean onCommand(CommandSender sender, Command command, String label, String[] args) { + public boolean onCommand(@NotNull CommandSender sender, @NotNull Command command, @NotNull String label, String[] args) { PrimarySkillType skill; switch (args.length) { case 1: @@ -49,7 +50,7 @@ public class SkillresetCommand implements TabExecutor { skill = null; } else { - skill = PrimarySkillType.getSkill(args[1]); + skill = mcMMO.p.getSkillTools().matchSkill(args[0]); } editValues((Player) sender, UserManager.getPlayer(sender.getName()).getProfile(), skill); @@ -69,7 +70,7 @@ public class SkillresetCommand implements TabExecutor { skill = null; } else { - skill = PrimarySkillType.getSkill(args[1]); + skill = mcMMO.p.getSkillTools().matchSkill(args[1]); } String playerName = CommandUtils.getMatchedPlayerName(args[0]); @@ -77,15 +78,18 @@ public class SkillresetCommand implements TabExecutor { // If the mcMMOPlayer doesn't exist, create a temporary profile and check if it's present in the database. If it's not, abort the process. if (mcMMOPlayer == null) { - UUID uuid = null; - OfflinePlayer player = mcMMO.p.getServer().getOfflinePlayer(playerName); - if (player != null) { - uuid = player.getUniqueId(); - } - PlayerProfile profile = mcMMO.getDatabaseManager().loadPlayerProfile(playerName, uuid, false); + OfflinePlayer offlinePlayer = mcMMO.p.getServer().getOfflinePlayer(playerName); + PlayerProfile profile = mcMMO.getDatabaseManager().loadPlayerProfile(offlinePlayer); + //Check loading by UUID if (CommandUtils.unloadedProfile(sender, profile)) { - return true; + //Didn't find it by UUID so try to find it by name + profile = mcMMO.getDatabaseManager().loadPlayerProfile(playerName); + + //Check if it was present in DB + if(CommandUtils.unloadedProfile(sender, profile)) { + return true; + } } editValues(null, profile, skill); @@ -103,13 +107,13 @@ public class SkillresetCommand implements TabExecutor { } @Override - public List onTabComplete(CommandSender sender, Command command, String alias, String[] args) { + public List onTabComplete(@NotNull CommandSender sender, @NotNull Command command, @NotNull String alias, String[] args) { switch (args.length) { case 1: List playerNames = CommandUtils.getOnlinePlayerNames(sender); - return StringUtil.copyPartialMatches(args[0], playerNames, new ArrayList(playerNames.size())); + return StringUtil.copyPartialMatches(args[0], playerNames, new ArrayList<>(playerNames.size())); case 2: - return StringUtil.copyPartialMatches(args[1], PrimarySkillType.SKILL_NAMES, new ArrayList(PrimarySkillType.SKILL_NAMES.size())); + return StringUtil.copyPartialMatches(args[1], mcMMO.p.getSkillTools().LOCALIZED_SKILL_NAMES, new ArrayList<>(mcMMO.p.getSkillTools().LOCALIZED_SKILL_NAMES.size())); default: return ImmutableList.of(); } @@ -142,7 +146,7 @@ public class SkillresetCommand implements TabExecutor { } protected void handlePlayerMessageSkill(Player player, PrimarySkillType skill) { - player.sendMessage(LocaleLoader.getString("Commands.Reset.Single", skill.getName())); + player.sendMessage(LocaleLoader.getString("Commands.Reset.Single", mcMMO.p.getSkillTools().getLocalizedSkillName(skill))); } private boolean validateArguments(CommandSender sender, String skillName) { @@ -154,13 +158,13 @@ public class SkillresetCommand implements TabExecutor { sender.sendMessage(LocaleLoader.getString("Commands.addlevels.AwardAll.2", playerName)); } else { - sender.sendMessage(LocaleLoader.getString("Commands.addlevels.AwardSkill.2", skill.getName(), playerName)); + sender.sendMessage(LocaleLoader.getString("Commands.addlevels.AwardSkill.2", mcMMO.p.getSkillTools().getLocalizedSkillName(skill), playerName)); } } protected void editValues(Player player, PlayerProfile profile, PrimarySkillType skill) { if (skill == null) { - for (PrimarySkillType primarySkillType : PrimarySkillType.NON_CHILD_SKILLS) { + for (PrimarySkillType primarySkillType : SkillTools.NON_CHILD_SKILLS) { handleCommand(player, profile, primarySkillType); } diff --git a/src/main/java/com/gmail/nossr50/commands/hardcore/HardcoreCommand.java b/src/main/java/com/gmail/nossr50/commands/hardcore/HardcoreCommand.java index 6375265b2..4a8656e37 100644 --- a/src/main/java/com/gmail/nossr50/commands/hardcore/HardcoreCommand.java +++ b/src/main/java/com/gmail/nossr50/commands/hardcore/HardcoreCommand.java @@ -1,64 +1,64 @@ -package com.gmail.nossr50.commands.hardcore; - -import com.gmail.nossr50.config.Config; -import com.gmail.nossr50.datatypes.skills.PrimarySkillType; -import com.gmail.nossr50.locale.LocaleLoader; -import com.gmail.nossr50.mcMMO; -import com.gmail.nossr50.util.Permissions; -import org.bukkit.command.CommandSender; - -public class HardcoreCommand extends HardcoreModeCommand { - @Override - protected boolean checkTogglePermissions(CommandSender sender) { - return Permissions.hardcoreToggle(sender); - } - - @Override - protected boolean checkModifyPermissions(CommandSender sender) { - return Permissions.hardcoreModify(sender); - } - - @Override - protected boolean checkEnabled(PrimarySkillType skill) { - if (skill == null) { - for (PrimarySkillType primarySkillType : PrimarySkillType.values()) { - if (!primarySkillType.getHardcoreStatLossEnabled()) { - return false; - } - } - - return true; - } - - return skill.getHardcoreStatLossEnabled(); - } - - @Override - protected void enable(PrimarySkillType skill) { - toggle(true, skill); - } - - @Override - protected void disable(PrimarySkillType skill) { - toggle(false, skill); - } - - @Override - protected void modify(CommandSender sender, double newPercentage) { - Config.getInstance().setHardcoreDeathStatPenaltyPercentage(newPercentage); - sender.sendMessage(LocaleLoader.getString("Hardcore.DeathStatLoss.PercentageChanged", percent.format(newPercentage / 100.0D))); - } - - private void toggle(boolean enable, PrimarySkillType skill) { - if (skill == null) { - for (PrimarySkillType primarySkillType : PrimarySkillType.NON_CHILD_SKILLS) { - primarySkillType.setHardcoreStatLossEnabled(enable); - } - } - else { - skill.setHardcoreStatLossEnabled(enable); - } - - mcMMO.p.getServer().broadcastMessage(LocaleLoader.getString("Hardcore.Mode." + (enable ? "Enabled" : "Disabled"), LocaleLoader.getString("Hardcore.DeathStatLoss.Name"), (skill == null ? "all skills" : skill.getName()))); - } -} \ No newline at end of file +//package com.gmail.nossr50.commands.hardcore; +// +//import com.gmail.nossr50.config.Config; +//import com.gmail.nossr50.datatypes.skills.PrimarySkillType; +//import com.gmail.nossr50.locale.LocaleLoader; +//import com.gmail.nossr50.mcMMO; +//import com.gmail.nossr50.util.Permissions; +//import org.bukkit.command.CommandSender; +// +//public class HardcoreCommand extends HardcoreModeCommand { +// @Override +// protected boolean checkTogglePermissions(CommandSender sender) { +// return Permissions.hardcoreToggle(sender); +// } +// +// @Override +// protected boolean checkModifyPermissions(CommandSender sender) { +// return Permissions.hardcoreModify(sender); +// } +// +// @Override +// protected boolean checkEnabled(PrimarySkillType skill) { +// if (skill == null) { +// for (PrimarySkillType primarySkillType : PrimarySkillType.values()) { +// if (!primarySkillType.getHardcoreStatLossEnabled()) { +// return false; +// } +// } +// +// return true; +// } +// +// return skill.getHardcoreStatLossEnabled(); +// } +// +// @Override +// protected void enable(PrimarySkillType skill) { +// toggle(true, skill); +// } +// +// @Override +// protected void disable(PrimarySkillType skill) { +// toggle(false, skill); +// } +// +// @Override +// protected void modify(CommandSender sender, double newPercentage) { +// Config.getInstance().setHardcoreDeathStatPenaltyPercentage(newPercentage); +// sender.sendMessage(LocaleLoader.getString("Hardcore.DeathStatLoss.PercentageChanged", percent.format(newPercentage / 100.0D))); +// } +// +// private void toggle(boolean enable, PrimarySkillType skill) { +// if (skill == null) { +// for (PrimarySkillType primarySkillType : SkillTools.NON_CHILD_SKILLS) { +// primarySkillType.setHardcoreStatLossEnabled(enable); +// } +// } +// else { +// skill.setHardcoreStatLossEnabled(enable); +// } +// +// mcMMO.p.getServer().broadcastMessage(LocaleLoader.getString("Hardcore.Mode." + (enable ? "Enabled" : "Disabled"), LocaleLoader.getString("Hardcore.DeathStatLoss.Name"), (skill == null ? "all skills" : mcMMO.p.getSkillTools().getLocalizedSkillName(skill)))); +// } +//} \ No newline at end of file diff --git a/src/main/java/com/gmail/nossr50/commands/hardcore/HardcoreModeCommand.java b/src/main/java/com/gmail/nossr50/commands/hardcore/HardcoreModeCommand.java index 2a59a45b4..1bffa7a65 100644 --- a/src/main/java/com/gmail/nossr50/commands/hardcore/HardcoreModeCommand.java +++ b/src/main/java/com/gmail/nossr50/commands/hardcore/HardcoreModeCommand.java @@ -1,130 +1,129 @@ -package com.gmail.nossr50.commands.hardcore; - -import com.gmail.nossr50.datatypes.skills.PrimarySkillType; -import com.gmail.nossr50.util.Permissions; -import com.gmail.nossr50.util.StringUtils; -import com.gmail.nossr50.util.commands.CommandUtils; -import com.google.common.collect.ImmutableList; -import org.bukkit.command.Command; -import org.bukkit.command.CommandSender; -import org.bukkit.command.TabExecutor; -import org.bukkit.util.StringUtil; - -import java.text.DecimalFormat; -import java.util.ArrayList; -import java.util.List; - -public abstract class HardcoreModeCommand implements TabExecutor { - protected final DecimalFormat percent = new DecimalFormat("##0.00%"); - - @Override - public boolean onCommand(CommandSender sender, Command command, String label, String[] args) { - switch (args.length) { - case 0: - if (!checkTogglePermissions(sender)) { - sender.sendMessage(command.getPermissionMessage()); - return true; - } - - if (checkEnabled(null)) { - disable(null); - } - else { - enable(null); - } - - return true; - - case 1: - if (CommandUtils.shouldEnableToggle(args[0])) { - if (!Permissions.hardcoreToggle(sender)) { - sender.sendMessage(command.getPermissionMessage()); - return true; - } - - enable(null); - return true; - } - - if (CommandUtils.shouldDisableToggle(args[0])) { - if (!Permissions.hardcoreToggle(sender)) { - sender.sendMessage(command.getPermissionMessage()); - return true; - } - - disable(null); - return true; - } - - if (CommandUtils.isInvalidDouble(sender, args[0])) { - return true; - } - - if (!Permissions.hardcoreModify(sender)) { - sender.sendMessage(command.getPermissionMessage()); - return true; - } - - modify(sender, Double.parseDouble(args[0])); - return true; - - - case 2: - if (CommandUtils.isInvalidSkill(sender, args[0])) { - return true; - } - - PrimarySkillType skill = PrimarySkillType.getSkill(args[0]); - - if (!CommandUtils.isChildSkill(sender, skill)) { - return true; - } - - if (CommandUtils.shouldEnableToggle(args[1])) { - if (!Permissions.hardcoreToggle(sender)) { - sender.sendMessage(command.getPermissionMessage()); - return true; - } - - enable(skill); - return true; - } - - if (CommandUtils.shouldDisableToggle(args[1])) { - if (!Permissions.hardcoreToggle(sender)) { - sender.sendMessage(command.getPermissionMessage()); - return true; - } - - enable(skill); - return true; - } - - return true; - - default: - return false; - } - } - - @Override - public List onTabComplete(CommandSender sender, Command command, String alias, String[] args) { - switch (args.length) { - case 1: - if (StringUtils.isDouble(args[0])) { - return ImmutableList.of(); - } - - return StringUtil.copyPartialMatches(args[0], CommandUtils.TRUE_FALSE_OPTIONS, new ArrayList(CommandUtils.TRUE_FALSE_OPTIONS.size())); - default: - return ImmutableList.of(); - } - } - - protected abstract boolean checkTogglePermissions(CommandSender sender); - protected abstract boolean checkModifyPermissions(CommandSender sender); - protected abstract boolean checkEnabled(PrimarySkillType skill); - protected abstract void enable(PrimarySkillType skill); - protected abstract void disable(PrimarySkillType skill); - protected abstract void modify(CommandSender sender, double newPercentage); -} +//package com.gmail.nossr50.commands.hardcore; +// +//import com.gmail.nossr50.datatypes.skills.PrimarySkillType; +//import com.gmail.nossr50.util.Permissions; +//import com.gmail.nossr50.util.commands.CommandUtils; +//import com.gmail.nossr50.util.text.StringUtils; +//import com.google.common.collect.ImmutableList; +//import org.bukkit.command.Command; +//import org.bukkit.command.CommandSender; +//import org.bukkit.command.TabExecutor; +//import org.bukkit.util.StringUtil; +//import org.jetbrains.annotations.NotNull; +// +//import java.text.DecimalFormat; +//import java.util.ArrayList; +//import java.util.List; +// +//public abstract class HardcoreModeCommand implements TabExecutor { +// protected final DecimalFormat percent = new DecimalFormat("##0.00%"); +// +// @Override +// public boolean onCommand(@NotNull CommandSender sender, @NotNull Command command, @NotNull String label, String[] args) { +// switch (args.length) { +// case 0: +// if (!checkTogglePermissions(sender)) { +// sender.sendMessage(command.getPermissionMessage()); +// return true; +// } +// +// if (checkEnabled(null)) { +// disable(null); +// } +// else { +// enable(null); +// } +// +// return true; +// +// case 1: +// if (CommandUtils.shouldEnableToggle(args[0])) { +// if (!Permissions.hardcoreToggle(sender)) { +// sender.sendMessage(command.getPermissionMessage()); +// return true; +// } +// +// enable(null); +// return true; +// } +// +// if (CommandUtils.shouldDisableToggle(args[0])) { +// if (!Permissions.hardcoreToggle(sender)) { +// sender.sendMessage(command.getPermissionMessage()); +// return true; +// } +// +// disable(null); +// return true; +// } +// +// if (CommandUtils.isInvalidDouble(sender, args[0])) { +// return true; +// } +// +// if (!Permissions.hardcoreModify(sender)) { +// sender.sendMessage(command.getPermissionMessage()); +// return true; +// } +// +// modify(sender, Double.parseDouble(args[0])); +// return true; +// +// +// case 2: +// if (CommandUtils.isInvalidSkill(sender, args[0])) { +// return true; +// } +// +// PrimarySkillType skill = PrimarySkillType.getSkill(args[0]); +// +// if (!CommandUtils.isChildSkill(sender, skill)) { +// return true; +// } +// +// if (CommandUtils.shouldEnableToggle(args[1])) { +// if (!Permissions.hardcoreToggle(sender)) { +// sender.sendMessage(command.getPermissionMessage()); +// return true; +// } +// +// enable(skill); +// return true; +// } +// +// if (CommandUtils.shouldDisableToggle(args[1])) { +// if (!Permissions.hardcoreToggle(sender)) { +// sender.sendMessage(command.getPermissionMessage()); +// return true; +// } +// +// enable(skill); +// return true; +// } +// +// return true; +// +// default: +// return false; +// } +// } +// +// @Override +// public List onTabComplete(@NotNull CommandSender sender, @NotNull Command command, @NotNull String alias, String[] args) { +// if (args.length == 1) { +// if (StringUtils.isDouble(args[0])) { +// return ImmutableList.of(); +// } +// +// return StringUtil.copyPartialMatches(args[0], CommandUtils.TRUE_FALSE_OPTIONS, new ArrayList<>(CommandUtils.TRUE_FALSE_OPTIONS.size())); +// } +// return ImmutableList.of(); +// } +// +// protected abstract boolean checkTogglePermissions(CommandSender sender); +// protected abstract boolean checkModifyPermissions(CommandSender sender); +// protected abstract boolean checkEnabled(PrimarySkillType skill); +// protected abstract void enable(PrimarySkillType skill); +// protected abstract void disable(PrimarySkillType skill); +// protected abstract void modify(CommandSender sender, double newPercentage); +//} diff --git a/src/main/java/com/gmail/nossr50/commands/hardcore/VampirismCommand.java b/src/main/java/com/gmail/nossr50/commands/hardcore/VampirismCommand.java index 854871e05..037c34e11 100644 --- a/src/main/java/com/gmail/nossr50/commands/hardcore/VampirismCommand.java +++ b/src/main/java/com/gmail/nossr50/commands/hardcore/VampirismCommand.java @@ -1,64 +1,64 @@ -package com.gmail.nossr50.commands.hardcore; - -import com.gmail.nossr50.config.Config; -import com.gmail.nossr50.datatypes.skills.PrimarySkillType; -import com.gmail.nossr50.locale.LocaleLoader; -import com.gmail.nossr50.mcMMO; -import com.gmail.nossr50.util.Permissions; -import org.bukkit.command.CommandSender; - -public class VampirismCommand extends HardcoreModeCommand { - @Override - protected boolean checkTogglePermissions(CommandSender sender) { - return Permissions.vampirismToggle(sender); - } - - @Override - protected boolean checkModifyPermissions(CommandSender sender) { - return Permissions.vampirismModify(sender); - } - - @Override - protected boolean checkEnabled(PrimarySkillType skill) { - if (skill == null) { - for (PrimarySkillType primarySkillType : PrimarySkillType.values()) { - if (!primarySkillType.getHardcoreVampirismEnabled()) { - return false; - } - } - - return true; - } - - return skill.getHardcoreVampirismEnabled(); - } - - @Override - protected void enable(PrimarySkillType skill) { - toggle(true, skill); - } - - @Override - protected void disable(PrimarySkillType skill) { - toggle(false, skill); - } - - @Override - protected void modify(CommandSender sender, double newPercentage) { - Config.getInstance().setHardcoreVampirismStatLeechPercentage(newPercentage); - sender.sendMessage(LocaleLoader.getString("Hardcore.Vampirism.PercentageChanged", percent.format(newPercentage / 100.0D))); - } - - private void toggle(boolean enable, PrimarySkillType skill) { - if (skill == null) { - for (PrimarySkillType primarySkillType : PrimarySkillType.NON_CHILD_SKILLS) { - primarySkillType.setHardcoreVampirismEnabled(enable); - } - } - else { - skill.setHardcoreVampirismEnabled(enable); - } - - mcMMO.p.getServer().broadcastMessage(LocaleLoader.getString("Hardcore.Mode." + (enable ? "Enabled" : "Disabled"), LocaleLoader.getString("Hardcore.Vampirism.Name"), (skill == null ? "all skills" : skill))); - } -} \ No newline at end of file +//package com.gmail.nossr50.commands.hardcore; +// +//import com.gmail.nossr50.config.Config; +//import com.gmail.nossr50.datatypes.skills.PrimarySkillType; +//import com.gmail.nossr50.locale.LocaleLoader; +//import com.gmail.nossr50.mcMMO; +//import com.gmail.nossr50.util.Permissions; +//import org.bukkit.command.CommandSender; +// +//public class VampirismCommand extends HardcoreModeCommand { +// @Override +// protected boolean checkTogglePermissions(CommandSender sender) { +// return Permissions.vampirismToggle(sender); +// } +// +// @Override +// protected boolean checkModifyPermissions(CommandSender sender) { +// return Permissions.vampirismModify(sender); +// } +// +// @Override +// protected boolean checkEnabled(PrimarySkillType skill) { +// if (skill == null) { +// for (PrimarySkillType primarySkillType : PrimarySkillType.values()) { +// if (!primarySkillType.getHardcoreVampirismEnabled()) { +// return false; +// } +// } +// +// return true; +// } +// +// return skill.getHardcoreVampirismEnabled(); +// } +// +// @Override +// protected void enable(PrimarySkillType skill) { +// toggle(true, skill); +// } +// +// @Override +// protected void disable(PrimarySkillType skill) { +// toggle(false, skill); +// } +// +// @Override +// protected void modify(CommandSender sender, double newPercentage) { +// Config.getInstance().setHardcoreVampirismStatLeechPercentage(newPercentage); +// sender.sendMessage(LocaleLoader.getString("Hardcore.Vampirism.PercentageChanged", percent.format(newPercentage / 100.0D))); +// } +// +// private void toggle(boolean enable, PrimarySkillType skill) { +// if (skill == null) { +// for (PrimarySkillType primarySkillType : SkillTools.NON_CHILD_SKILLS) { +// primarySkillType.setHardcoreVampirismEnabled(enable); +// } +// } +// else { +// skill.setHardcoreVampirismEnabled(enable); +// } +// +// mcMMO.p.getServer().broadcastMessage(LocaleLoader.getString("Hardcore.Mode." + (enable ? "Enabled" : "Disabled"), LocaleLoader.getString("Hardcore.Vampirism.Name"), (skill == null ? "all skills" : skill))); +// } +//} \ No newline at end of file diff --git a/src/main/java/com/gmail/nossr50/commands/party/PartyAcceptCommand.java b/src/main/java/com/gmail/nossr50/commands/party/PartyAcceptCommand.java index d60868dd9..09cb1165e 100644 --- a/src/main/java/com/gmail/nossr50/commands/party/PartyAcceptCommand.java +++ b/src/main/java/com/gmail/nossr50/commands/party/PartyAcceptCommand.java @@ -8,40 +8,37 @@ import org.bukkit.command.Command; import org.bukkit.command.CommandExecutor; import org.bukkit.command.CommandSender; import org.bukkit.entity.Player; +import org.jetbrains.annotations.NotNull; public class PartyAcceptCommand implements CommandExecutor { @Override - public boolean onCommand(CommandSender sender, Command command, String label, String[] args) { - switch (args.length) { - case 1: - Player player = (Player) sender; + public boolean onCommand(@NotNull CommandSender sender, @NotNull Command command, @NotNull String label, String[] args) { + if (args.length == 1) { + Player player = (Player) sender; - //Check if player profile is loaded - if(UserManager.getPlayer(player) == null) - { - sender.sendMessage(LocaleLoader.getString("Profile.PendingLoad")); - return true; - } - - McMMOPlayer mcMMOPlayer = UserManager.getPlayer(player); - - - if (!mcMMOPlayer.hasPartyInvite()) { - sender.sendMessage(LocaleLoader.getString("mcMMO.NoInvites")); - return true; - } - - // Changing parties - if (!PartyManager.changeOrJoinParty(mcMMOPlayer, mcMMOPlayer.getPartyInvite().getName())) { - return true; - } - - PartyManager.joinInvitedParty(mcMMOPlayer); + //Check if player profile is loaded + if (UserManager.getPlayer(player) == null) { + sender.sendMessage(LocaleLoader.getString("Profile.PendingLoad")); return true; + } - default: - sender.sendMessage(LocaleLoader.getString("Commands.Usage.1", "party", "accept")); + McMMOPlayer mcMMOPlayer = UserManager.getPlayer(player); + + + if (!mcMMOPlayer.hasPartyInvite()) { + sender.sendMessage(LocaleLoader.getString("mcMMO.NoInvites")); return true; + } + + // Changing parties + if (!PartyManager.changeOrJoinParty(mcMMOPlayer, mcMMOPlayer.getPartyInvite().getName())) { + return true; + } + + PartyManager.joinInvitedParty(mcMMOPlayer); + return true; } + sender.sendMessage(LocaleLoader.getString("Commands.Usage.1", "party", "accept")); + return true; } } diff --git a/src/main/java/com/gmail/nossr50/commands/party/PartyChangeOwnerCommand.java b/src/main/java/com/gmail/nossr50/commands/party/PartyChangeOwnerCommand.java index ef711fbef..a918a3ce9 100644 --- a/src/main/java/com/gmail/nossr50/commands/party/PartyChangeOwnerCommand.java +++ b/src/main/java/com/gmail/nossr50/commands/party/PartyChangeOwnerCommand.java @@ -11,34 +11,30 @@ import org.bukkit.command.Command; import org.bukkit.command.CommandExecutor; import org.bukkit.command.CommandSender; import org.bukkit.entity.Player; +import org.jetbrains.annotations.NotNull; public class PartyChangeOwnerCommand implements CommandExecutor { @Override - public boolean onCommand(CommandSender sender, Command command, String label, String[] args) { - switch (args.length) { - case 2: - //Check if player profile is loaded - if(UserManager.getPlayer((Player) sender) == null) - { - sender.sendMessage(LocaleLoader.getString("Profile.PendingLoad")); - return true; - } - - Party playerParty = UserManager.getPlayer((Player) sender).getParty(); - String targetName = CommandUtils.getMatchedPlayerName(args[1]); - OfflinePlayer target = mcMMO.p.getServer().getOfflinePlayer(targetName); - - if (!playerParty.hasMember(target.getUniqueId())) { - sender.sendMessage(LocaleLoader.getString("Party.NotInYourParty", targetName)); - return true; - } - - PartyManager.setPartyLeader(target.getUniqueId(), playerParty); + public boolean onCommand(@NotNull CommandSender sender, @NotNull Command command, @NotNull String label, String[] args) { + if (args.length == 2) {//Check if player profile is loaded + if (UserManager.getPlayer((Player) sender) == null) { + sender.sendMessage(LocaleLoader.getString("Profile.PendingLoad")); return true; + } - default: - sender.sendMessage(LocaleLoader.getString("Commands.Usage.2", "party", "owner", "<" + LocaleLoader.getString("Commands.Usage.Player") + ">")); + Party playerParty = UserManager.getPlayer((Player) sender).getParty(); + String targetName = CommandUtils.getMatchedPlayerName(args[1]); + OfflinePlayer target = mcMMO.p.getServer().getOfflinePlayer(targetName); + + if (!playerParty.hasMember(target.getUniqueId())) { + sender.sendMessage(LocaleLoader.getString("Party.NotInYourParty", targetName)); return true; + } + + PartyManager.setPartyLeader(target.getUniqueId(), playerParty); + return true; } + sender.sendMessage(LocaleLoader.getString("Commands.Usage.2", "party", "owner", "<" + LocaleLoader.getString("Commands.Usage.Player") + ">")); + return true; } } diff --git a/src/main/java/com/gmail/nossr50/commands/party/PartyChangePasswordCommand.java b/src/main/java/com/gmail/nossr50/commands/party/PartyChangePasswordCommand.java index dc641789b..b8d835ef3 100644 --- a/src/main/java/com/gmail/nossr50/commands/party/PartyChangePasswordCommand.java +++ b/src/main/java/com/gmail/nossr50/commands/party/PartyChangePasswordCommand.java @@ -7,10 +7,11 @@ import org.bukkit.command.Command; import org.bukkit.command.CommandExecutor; import org.bukkit.command.CommandSender; import org.bukkit.entity.Player; +import org.jetbrains.annotations.NotNull; public class PartyChangePasswordCommand implements CommandExecutor { @Override - public boolean onCommand(CommandSender sender, Command command, String label, String[] args) { + public boolean onCommand(@NotNull CommandSender sender, @NotNull Command command, @NotNull String label, String[] args) { if(UserManager.getPlayer((Player) sender) == null) { sender.sendMessage(LocaleLoader.getString("Profile.PendingLoad")); diff --git a/src/main/java/com/gmail/nossr50/commands/party/PartyCommand.java b/src/main/java/com/gmail/nossr50/commands/party/PartyCommand.java index b1471d9a0..f3523445c 100644 --- a/src/main/java/com/gmail/nossr50/commands/party/PartyCommand.java +++ b/src/main/java/com/gmail/nossr50/commands/party/PartyCommand.java @@ -1,6 +1,5 @@ package com.gmail.nossr50.commands.party; -import com.gmail.nossr50.commands.chat.PartyChatCommand; import com.gmail.nossr50.commands.party.alliance.PartyAllianceCommand; import com.gmail.nossr50.commands.party.teleport.PtpCommand; import com.gmail.nossr50.datatypes.party.Party; @@ -16,6 +15,7 @@ import org.bukkit.command.CommandSender; import org.bukkit.command.TabExecutor; import org.bukkit.entity.Player; import org.bukkit.util.StringUtil; +import org.jetbrains.annotations.NotNull; import java.util.ArrayList; import java.util.Arrays; @@ -28,7 +28,7 @@ public class PartyCommand implements TabExecutor { private static final List ITEMSHARE_COMPLETIONS = ImmutableList.of("none", "equal", "random", "loot", "mining", "herbalism", "woodcutting", "misc"); static { - ArrayList subcommands = new ArrayList(); + ArrayList subcommands = new ArrayList<>(); for (PartySubcommandType subcommand : PartySubcommandType.values()) { subcommands.add(subcommand.toString()); @@ -38,27 +38,26 @@ public class PartyCommand implements TabExecutor { PARTY_SUBCOMMANDS = ImmutableList.copyOf(subcommands); } - private CommandExecutor partyJoinCommand = new PartyJoinCommand(); - private CommandExecutor partyAcceptCommand = new PartyAcceptCommand(); - private CommandExecutor partyCreateCommand = new PartyCreateCommand(); - private CommandExecutor partyQuitCommand = new PartyQuitCommand(); - private CommandExecutor partyXpShareCommand = new PartyXpShareCommand(); - private CommandExecutor partyItemShareCommand = new PartyItemShareCommand(); - private CommandExecutor partyInviteCommand = new PartyInviteCommand(); - private CommandExecutor partyKickCommand = new PartyKickCommand(); - private CommandExecutor partyDisbandCommand = new PartyDisbandCommand(); - private CommandExecutor partyChangeOwnerCommand = new PartyChangeOwnerCommand(); - private CommandExecutor partyLockCommand = new PartyLockCommand(); - private CommandExecutor partyChangePasswordCommand = new PartyChangePasswordCommand(); - private CommandExecutor partyRenameCommand = new PartyRenameCommand(); - private CommandExecutor partyInfoCommand = new PartyInfoCommand(); - private CommandExecutor partyHelpCommand = new PartyHelpCommand(); - private CommandExecutor partyTeleportCommand = new PtpCommand(); - private CommandExecutor partyChatCommand = new PartyChatCommand(); - private CommandExecutor partyAllianceCommand = new PartyAllianceCommand(); + private final CommandExecutor partyJoinCommand = new PartyJoinCommand(); + private final CommandExecutor partyAcceptCommand = new PartyAcceptCommand(); + private final CommandExecutor partyCreateCommand = new PartyCreateCommand(); + private final CommandExecutor partyQuitCommand = new PartyQuitCommand(); + private final CommandExecutor partyXpShareCommand = new PartyXpShareCommand(); + private final CommandExecutor partyItemShareCommand = new PartyItemShareCommand(); + private final CommandExecutor partyInviteCommand = new PartyInviteCommand(); + private final CommandExecutor partyKickCommand = new PartyKickCommand(); + private final CommandExecutor partyDisbandCommand = new PartyDisbandCommand(); + private final CommandExecutor partyChangeOwnerCommand = new PartyChangeOwnerCommand(); + private final CommandExecutor partyLockCommand = new PartyLockCommand(); + private final CommandExecutor partyChangePasswordCommand = new PartyChangePasswordCommand(); + private final CommandExecutor partyRenameCommand = new PartyRenameCommand(); + private final CommandExecutor partyInfoCommand = new PartyInfoCommand(); + private final CommandExecutor partyHelpCommand = new PartyHelpCommand(); + private final CommandExecutor partyTeleportCommand = new PtpCommand(); + private final CommandExecutor partyAllianceCommand = new PartyAllianceCommand(); @Override - public boolean onCommand(CommandSender sender, Command command, String label, String[] args) { + public boolean onCommand(@NotNull CommandSender sender, @NotNull Command command, @NotNull String label, String[] args) { if (CommandUtils.noConsoleUsage(sender)) { return true; } @@ -131,8 +130,6 @@ public class PartyCommand implements TabExecutor { return partyInviteCommand.onCommand(sender, command, label, args); case TELEPORT: return partyTeleportCommand.onCommand(sender, command, label, extractArgs(args)); - case CHAT: - return partyChatCommand.onCommand(sender, command, label, extractArgs(args)); default: break; } @@ -171,10 +168,10 @@ public class PartyCommand implements TabExecutor { } @Override - public List onTabComplete(CommandSender sender, Command command, String alias, String[] args) { + public List onTabComplete(@NotNull CommandSender sender, @NotNull Command command, @NotNull String alias, String[] args) { switch (args.length) { case 1: - return StringUtil.copyPartialMatches(args[0], PARTY_SUBCOMMANDS, new ArrayList(PARTY_SUBCOMMANDS.size())); + return StringUtil.copyPartialMatches(args[0], PARTY_SUBCOMMANDS, new ArrayList<>(PARTY_SUBCOMMANDS.size())); case 2: PartySubcommandType subcommand = PartySubcommandType.getSubcommand(args[0]); @@ -188,18 +185,18 @@ public class PartyCommand implements TabExecutor { case KICK: case OWNER: List playerNames = CommandUtils.getOnlinePlayerNames(sender); - return StringUtil.copyPartialMatches(args[1], playerNames, new ArrayList(playerNames.size())); + return StringUtil.copyPartialMatches(args[1], playerNames, new ArrayList<>(playerNames.size())); case XPSHARE: - return StringUtil.copyPartialMatches(args[1], XPSHARE_COMPLETIONS, new ArrayList(XPSHARE_COMPLETIONS.size())); + return StringUtil.copyPartialMatches(args[1], XPSHARE_COMPLETIONS, new ArrayList<>(XPSHARE_COMPLETIONS.size())); case ITEMSHARE: - return StringUtil.copyPartialMatches(args[1], ITEMSHARE_COMPLETIONS, new ArrayList(ITEMSHARE_COMPLETIONS.size())); + return StringUtil.copyPartialMatches(args[1], ITEMSHARE_COMPLETIONS, new ArrayList<>(ITEMSHARE_COMPLETIONS.size())); case LOCK: case CHAT: - return StringUtil.copyPartialMatches(args[1], CommandUtils.TRUE_FALSE_OPTIONS, new ArrayList(CommandUtils.TRUE_FALSE_OPTIONS.size())); + return StringUtil.copyPartialMatches(args[1], CommandUtils.TRUE_FALSE_OPTIONS, new ArrayList<>(CommandUtils.TRUE_FALSE_OPTIONS.size())); case PASSWORD: - return StringUtil.copyPartialMatches(args[1], CommandUtils.RESET_OPTIONS, new ArrayList(CommandUtils.RESET_OPTIONS.size())); + return StringUtil.copyPartialMatches(args[1], CommandUtils.RESET_OPTIONS, new ArrayList<>(CommandUtils.RESET_OPTIONS.size())); case TELEPORT: - List matches = StringUtil.copyPartialMatches(args[1], PtpCommand.TELEPORT_SUBCOMMANDS, new ArrayList(PtpCommand.TELEPORT_SUBCOMMANDS.size())); + List matches = StringUtil.copyPartialMatches(args[1], PtpCommand.TELEPORT_SUBCOMMANDS, new ArrayList<>(PtpCommand.TELEPORT_SUBCOMMANDS.size())); if (matches.size() == 0) { Player player = (Player) sender; @@ -214,7 +211,7 @@ public class PartyCommand implements TabExecutor { Party party = UserManager.getPlayer(player).getParty(); playerNames = party.getOnlinePlayerNames(player); - return StringUtil.copyPartialMatches(args[1], playerNames, new ArrayList(playerNames.size())); + return StringUtil.copyPartialMatches(args[1], playerNames, new ArrayList<>(playerNames.size())); } return matches; @@ -223,7 +220,7 @@ public class PartyCommand implements TabExecutor { } case 3: if (PartySubcommandType.getSubcommand(args[0]) == PartySubcommandType.ITEMSHARE && isItemShareCategory(args[1])) { - return StringUtil.copyPartialMatches(args[2], CommandUtils.TRUE_FALSE_OPTIONS, new ArrayList(CommandUtils.TRUE_FALSE_OPTIONS.size())); + return StringUtil.copyPartialMatches(args[2], CommandUtils.TRUE_FALSE_OPTIONS, new ArrayList<>(CommandUtils.TRUE_FALSE_OPTIONS.size())); } return ImmutableList.of(); diff --git a/src/main/java/com/gmail/nossr50/commands/party/PartyCreateCommand.java b/src/main/java/com/gmail/nossr50/commands/party/PartyCreateCommand.java index ed5b95b72..34daed151 100644 --- a/src/main/java/com/gmail/nossr50/commands/party/PartyCreateCommand.java +++ b/src/main/java/com/gmail/nossr50/commands/party/PartyCreateCommand.java @@ -8,10 +8,11 @@ import org.bukkit.command.Command; import org.bukkit.command.CommandExecutor; import org.bukkit.command.CommandSender; import org.bukkit.entity.Player; +import org.jetbrains.annotations.NotNull; public class PartyCreateCommand implements CommandExecutor { @Override - public boolean onCommand(CommandSender sender, Command command, String label, String[] args) { + public boolean onCommand(@NotNull CommandSender sender, @NotNull Command command, @NotNull String label, String[] args) { switch (args.length) { case 2: case 3: diff --git a/src/main/java/com/gmail/nossr50/commands/party/PartyDisbandCommand.java b/src/main/java/com/gmail/nossr50/commands/party/PartyDisbandCommand.java index 8e10e1719..e21776370 100644 --- a/src/main/java/com/gmail/nossr50/commands/party/PartyDisbandCommand.java +++ b/src/main/java/com/gmail/nossr50/commands/party/PartyDisbandCommand.java @@ -1,6 +1,7 @@ package com.gmail.nossr50.commands.party; import com.gmail.nossr50.datatypes.party.Party; +import com.gmail.nossr50.datatypes.player.McMMOPlayer; import com.gmail.nossr50.events.party.McMMOPartyChangeEvent.EventReason; import com.gmail.nossr50.locale.LocaleLoader; import com.gmail.nossr50.party.PartyManager; @@ -9,35 +10,33 @@ import org.bukkit.command.Command; import org.bukkit.command.CommandExecutor; import org.bukkit.command.CommandSender; import org.bukkit.entity.Player; +import org.jetbrains.annotations.NotNull; public class PartyDisbandCommand implements CommandExecutor { @Override - public boolean onCommand(CommandSender sender, Command command, String label, String[] args) { - switch (args.length) { - case 1: - if(UserManager.getPlayer((Player) sender) == null) - { - sender.sendMessage(LocaleLoader.getString("Profile.PendingLoad")); + public boolean onCommand(@NotNull CommandSender sender, @NotNull Command command, @NotNull String label, String[] args) { + if (args.length == 1) { + final McMMOPlayer mcMMOPlayer = UserManager.getPlayer((Player) sender); + if (mcMMOPlayer == null) { + sender.sendMessage(LocaleLoader.getString("Profile.PendingLoad")); + return true; + } + + final Party playerParty = mcMMOPlayer.getParty(); + final String partyName = playerParty.getName(); + + for (Player member : playerParty.getOnlineMembers()) { + if (!PartyManager.handlePartyChangeEvent(member, partyName, null, EventReason.KICKED_FROM_PARTY)) { return true; } - Party playerParty = UserManager.getPlayer((Player) sender).getParty(); - String partyName = playerParty.getName(); + member.sendMessage(LocaleLoader.getString("Party.Disband")); + } - for (Player member : playerParty.getOnlineMembers()) { - if (!PartyManager.handlePartyChangeEvent(member, partyName, null, EventReason.KICKED_FROM_PARTY)) { - return true; - } - - member.sendMessage(LocaleLoader.getString("Party.Disband")); - } - - PartyManager.disbandParty(playerParty); - return true; - - default: - sender.sendMessage(LocaleLoader.getString("Commands.Usage.1", "party", "disband")); - return true; + PartyManager.disbandParty(mcMMOPlayer, playerParty); + return true; } + sender.sendMessage(LocaleLoader.getString("Commands.Usage.1", "party", "disband")); + return true; } } diff --git a/src/main/java/com/gmail/nossr50/commands/party/PartyHelpCommand.java b/src/main/java/com/gmail/nossr50/commands/party/PartyHelpCommand.java index fcf4908c0..bbf906a06 100644 --- a/src/main/java/com/gmail/nossr50/commands/party/PartyHelpCommand.java +++ b/src/main/java/com/gmail/nossr50/commands/party/PartyHelpCommand.java @@ -4,27 +4,25 @@ import com.gmail.nossr50.locale.LocaleLoader; import org.bukkit.command.Command; import org.bukkit.command.CommandExecutor; import org.bukkit.command.CommandSender; +import org.jetbrains.annotations.NotNull; public class PartyHelpCommand implements CommandExecutor { @Override - public boolean onCommand(CommandSender sender, Command command, String label, String[] args) { - switch (args.length) { - case 1: - sender.sendMessage(LocaleLoader.getString("Party.Help.3", "/party join", "/party quit")); - sender.sendMessage(LocaleLoader.getString("Party.Help.1", "/party create")); - sender.sendMessage(LocaleLoader.getString("Party.Help.4", "/party ")); - sender.sendMessage(LocaleLoader.getString("Party.Help.5", "/party password")); - sender.sendMessage(LocaleLoader.getString("Party.Help.6", "/party kick")); - sender.sendMessage(LocaleLoader.getString("Party.Help.7", "/party leader")); - sender.sendMessage(LocaleLoader.getString("Party.Help.8", "/party disband")); - sender.sendMessage(LocaleLoader.getString("Party.Help.9", "/party itemshare")); - sender.sendMessage(LocaleLoader.getString("Party.Help.10", "/party xpshare")); - return true; - - default: - sender.sendMessage(LocaleLoader.getString("Commands.Usage.1", "party", "help")); - return true; + public boolean onCommand(@NotNull CommandSender sender, @NotNull Command command, @NotNull String label, String[] args) { + if (args.length == 1) { + sender.sendMessage(LocaleLoader.getString("Party.Help.3", "/party join", "/party quit")); + sender.sendMessage(LocaleLoader.getString("Party.Help.1", "/party create")); + sender.sendMessage(LocaleLoader.getString("Party.Help.4", "/party ")); + sender.sendMessage(LocaleLoader.getString("Party.Help.5", "/party password")); + sender.sendMessage(LocaleLoader.getString("Party.Help.6", "/party kick")); + sender.sendMessage(LocaleLoader.getString("Party.Help.7", "/party leader")); + sender.sendMessage(LocaleLoader.getString("Party.Help.8", "/party disband")); + sender.sendMessage(LocaleLoader.getString("Party.Help.9", "/party itemshare")); + sender.sendMessage(LocaleLoader.getString("Party.Help.10", "/party xpshare")); + return true; } + sender.sendMessage(LocaleLoader.getString("Commands.Usage.1", "party", "help")); + return true; } } diff --git a/src/main/java/com/gmail/nossr50/commands/party/PartyInfoCommand.java b/src/main/java/com/gmail/nossr50/commands/party/PartyInfoCommand.java index 0a8ddda48..ab46f14de 100644 --- a/src/main/java/com/gmail/nossr50/commands/party/PartyInfoCommand.java +++ b/src/main/java/com/gmail/nossr50/commands/party/PartyInfoCommand.java @@ -1,11 +1,11 @@ package com.gmail.nossr50.commands.party; -import com.gmail.nossr50.config.Config; import com.gmail.nossr50.datatypes.party.Party; import com.gmail.nossr50.datatypes.party.PartyFeature; import com.gmail.nossr50.datatypes.party.ShareMode; import com.gmail.nossr50.datatypes.player.McMMOPlayer; import com.gmail.nossr50.locale.LocaleLoader; +import com.gmail.nossr50.mcMMO; import com.gmail.nossr50.party.PartyManager; import com.gmail.nossr50.util.player.UserManager; import org.bukkit.ChatColor; @@ -13,13 +13,14 @@ import org.bukkit.command.Command; import org.bukkit.command.CommandExecutor; import org.bukkit.command.CommandSender; import org.bukkit.entity.Player; +import org.jetbrains.annotations.NotNull; import java.util.ArrayList; import java.util.List; public class PartyInfoCommand implements CommandExecutor { @Override - public boolean onCommand(CommandSender sender, Command command, String label, String[] args) { + public boolean onCommand(@NotNull CommandSender sender, @NotNull Command command, @NotNull String label, String[] args) { switch (args.length) { case 0: case 1: @@ -60,8 +61,8 @@ public class PartyInfoCommand implements CommandExecutor { private void displayPartyFeatures(Player player, Party party) { player.sendMessage(LocaleLoader.getString("Commands.Party.Features.Header")); - List unlockedPartyFeatures = new ArrayList(); - List lockedPartyFeatures = new ArrayList(); + List unlockedPartyFeatures = new ArrayList<>(); + List lockedPartyFeatures = new ArrayList<>(); for (PartyFeature partyFeature : PartyFeature.values()) { if (!partyFeature.hasPermission(player)) { @@ -84,7 +85,7 @@ public class PartyInfoCommand implements CommandExecutor { } private boolean isUnlockedFeature(Party party, PartyFeature partyFeature) { - return party.getLevel() >= Config.getInstance().getPartyFeatureUnlockLevel(partyFeature); + return party.getLevel() >= mcMMO.p.getGeneralConfig().getPartyFeatureUnlockLevel(partyFeature); } private void displayShareModeInfo(Player player, Party party) { diff --git a/src/main/java/com/gmail/nossr50/commands/party/PartyInviteCommand.java b/src/main/java/com/gmail/nossr50/commands/party/PartyInviteCommand.java index 588feb3d7..7a24a4936 100644 --- a/src/main/java/com/gmail/nossr50/commands/party/PartyInviteCommand.java +++ b/src/main/java/com/gmail/nossr50/commands/party/PartyInviteCommand.java @@ -1,9 +1,9 @@ package com.gmail.nossr50.commands.party; -import com.gmail.nossr50.config.Config; import com.gmail.nossr50.datatypes.party.Party; import com.gmail.nossr50.datatypes.player.McMMOPlayer; import com.gmail.nossr50.locale.LocaleLoader; +import com.gmail.nossr50.mcMMO; import com.gmail.nossr50.party.PartyManager; import com.gmail.nossr50.util.commands.CommandUtils; import com.gmail.nossr50.util.player.UserManager; @@ -11,64 +11,60 @@ import org.bukkit.command.Command; import org.bukkit.command.CommandExecutor; import org.bukkit.command.CommandSender; import org.bukkit.entity.Player; +import org.jetbrains.annotations.NotNull; public class PartyInviteCommand implements CommandExecutor { @Override - public boolean onCommand(CommandSender sender, Command command, String label, String[] args) { - switch (args.length) { - case 2: - String targetName = CommandUtils.getMatchedPlayerName(args[1]); - McMMOPlayer mcMMOTarget = UserManager.getOfflinePlayer(targetName); + public boolean onCommand(@NotNull CommandSender sender, @NotNull Command command, @NotNull String label, String[] args) { + if (args.length == 2) { + String targetName = CommandUtils.getMatchedPlayerName(args[1]); + McMMOPlayer mcMMOTarget = UserManager.getOfflinePlayer(targetName); - if (!CommandUtils.checkPlayerExistence(sender, targetName, mcMMOTarget)) { - return false; - } + if (!CommandUtils.checkPlayerExistence(sender, targetName, mcMMOTarget)) { + return false; + } - Player target = mcMMOTarget.getPlayer(); + Player target = mcMMOTarget.getPlayer(); - if(UserManager.getPlayer((Player) sender) == null) - { - sender.sendMessage(LocaleLoader.getString("Profile.PendingLoad")); - return true; - } - - Player player = (Player) sender; - McMMOPlayer mcMMOPlayer = UserManager.getPlayer(player); - String playerName = player.getName(); - - if (player.equals(target)) { - sender.sendMessage(LocaleLoader.getString("Party.Invite.Self")); - return true; - } - - if (PartyManager.inSameParty(player, target)) { - sender.sendMessage(LocaleLoader.getString("Party.Player.InSameParty", targetName)); - return true; - } - - if (!PartyManager.canInvite(mcMMOPlayer)) { - player.sendMessage(LocaleLoader.getString("Party.Locked")); - return true; - } - - Party playerParty = mcMMOPlayer.getParty(); - - if(PartyManager.isPartyFull(target, playerParty)) - { - player.sendMessage(LocaleLoader.getString("Commands.Party.PartyFull.Invite", target.getName(), playerParty.toString(), Config.getInstance().getPartyMaxSize())); - return true; - } - - mcMMOTarget.setPartyInvite(playerParty); - - sender.sendMessage(LocaleLoader.getString("Commands.Invite.Success")); - target.sendMessage(LocaleLoader.getString("Commands.Party.Invite.0", playerParty.getName(), playerName)); - target.sendMessage(LocaleLoader.getString("Commands.Party.Invite.1")); + if (UserManager.getPlayer((Player) sender) == null) { + sender.sendMessage(LocaleLoader.getString("Profile.PendingLoad")); return true; + } - default: - sender.sendMessage(LocaleLoader.getString("Commands.Usage.2", "party", "invite", "<" + LocaleLoader.getString("Commands.Usage.Player") + ">")); + Player player = (Player) sender; + McMMOPlayer mcMMOPlayer = UserManager.getPlayer(player); + String playerName = player.getName(); + + if (player.equals(target)) { + sender.sendMessage(LocaleLoader.getString("Party.Invite.Self")); return true; + } + + if (PartyManager.inSameParty(player, target)) { + sender.sendMessage(LocaleLoader.getString("Party.Player.InSameParty", targetName)); + return true; + } + + if (!PartyManager.canInvite(mcMMOPlayer)) { + player.sendMessage(LocaleLoader.getString("Party.Locked")); + return true; + } + + Party playerParty = mcMMOPlayer.getParty(); + + if (PartyManager.isPartyFull(target, playerParty)) { + player.sendMessage(LocaleLoader.getString("Commands.Party.PartyFull.Invite", target.getName(), playerParty.toString(), mcMMO.p.getGeneralConfig().getPartyMaxSize())); + return true; + } + + mcMMOTarget.setPartyInvite(playerParty); + + sender.sendMessage(LocaleLoader.getString("Commands.Invite.Success")); + target.sendMessage(LocaleLoader.getString("Commands.Party.Invite.0", playerParty.getName(), playerName)); + target.sendMessage(LocaleLoader.getString("Commands.Party.Invite.1")); + return true; } + sender.sendMessage(LocaleLoader.getString("Commands.Usage.2", "party", "invite", "<" + LocaleLoader.getString("Commands.Usage.Player") + ">")); + return true; } } diff --git a/src/main/java/com/gmail/nossr50/commands/party/PartyItemShareCommand.java b/src/main/java/com/gmail/nossr50/commands/party/PartyItemShareCommand.java index 15f18bf73..44822d82f 100644 --- a/src/main/java/com/gmail/nossr50/commands/party/PartyItemShareCommand.java +++ b/src/main/java/com/gmail/nossr50/commands/party/PartyItemShareCommand.java @@ -1,24 +1,25 @@ package com.gmail.nossr50.commands.party; -import com.gmail.nossr50.config.Config; import com.gmail.nossr50.datatypes.party.ItemShareType; import com.gmail.nossr50.datatypes.party.Party; import com.gmail.nossr50.datatypes.party.PartyFeature; import com.gmail.nossr50.datatypes.party.ShareMode; import com.gmail.nossr50.locale.LocaleLoader; -import com.gmail.nossr50.util.StringUtils; +import com.gmail.nossr50.mcMMO; import com.gmail.nossr50.util.commands.CommandUtils; import com.gmail.nossr50.util.player.UserManager; +import com.gmail.nossr50.util.text.StringUtils; import org.bukkit.command.Command; import org.bukkit.command.CommandExecutor; import org.bukkit.command.CommandSender; import org.bukkit.entity.Player; +import org.jetbrains.annotations.NotNull; import java.util.Locale; public class PartyItemShareCommand implements CommandExecutor { @Override - public boolean onCommand(CommandSender sender, Command command, String label, String[] args) { + public boolean onCommand(@NotNull CommandSender sender, @NotNull Command command, @NotNull String label, String[] args) { if(UserManager.getPlayer((Player) sender) == null) { sender.sendMessage(LocaleLoader.getString("Profile.PendingLoad")); @@ -27,7 +28,7 @@ public class PartyItemShareCommand implements CommandExecutor { Party party = UserManager.getPlayer((Player) sender).getParty(); - if (party.getLevel() < Config.getInstance().getPartyFeatureUnlockLevel(PartyFeature.ITEM_SHARE)) { + if (party.getLevel() < mcMMO.p.getGeneralConfig().getPartyFeatureUnlockLevel(PartyFeature.ITEM_SHARE)) { sender.sendMessage(LocaleLoader.getString("Party.Feature.Disabled.4")); return true; } diff --git a/src/main/java/com/gmail/nossr50/commands/party/PartyJoinCommand.java b/src/main/java/com/gmail/nossr50/commands/party/PartyJoinCommand.java index b3d7e6afb..8971fc0ed 100644 --- a/src/main/java/com/gmail/nossr50/commands/party/PartyJoinCommand.java +++ b/src/main/java/com/gmail/nossr50/commands/party/PartyJoinCommand.java @@ -10,10 +10,11 @@ import org.bukkit.command.Command; import org.bukkit.command.CommandExecutor; import org.bukkit.command.CommandSender; import org.bukkit.entity.Player; +import org.jetbrains.annotations.NotNull; public class PartyJoinCommand implements CommandExecutor { @Override - public boolean onCommand(CommandSender sender, Command command, String label, String[] args) { + public boolean onCommand(@NotNull CommandSender sender, @NotNull Command command, @NotNull String label, String[] args) { switch (args.length) { case 2: case 3: diff --git a/src/main/java/com/gmail/nossr50/commands/party/PartyKickCommand.java b/src/main/java/com/gmail/nossr50/commands/party/PartyKickCommand.java index ed0adde76..fd6b3e495 100644 --- a/src/main/java/com/gmail/nossr50/commands/party/PartyKickCommand.java +++ b/src/main/java/com/gmail/nossr50/commands/party/PartyKickCommand.java @@ -12,46 +12,43 @@ import org.bukkit.command.Command; import org.bukkit.command.CommandExecutor; import org.bukkit.command.CommandSender; import org.bukkit.entity.Player; +import org.jetbrains.annotations.NotNull; public class PartyKickCommand implements CommandExecutor { @Override - public boolean onCommand(CommandSender sender, Command command, String label, String[] args) { - switch (args.length) { - case 2: - if(UserManager.getPlayer((Player) sender) == null) - { - sender.sendMessage(LocaleLoader.getString("Profile.PendingLoad")); + public boolean onCommand(@NotNull CommandSender sender, @NotNull Command command, @NotNull String label, String[] args) { + if (args.length == 2) { + if (UserManager.getPlayer((Player) sender) == null) { + sender.sendMessage(LocaleLoader.getString("Profile.PendingLoad")); + return true; + } + + Party playerParty = UserManager.getPlayer((Player) sender).getParty(); + String targetName = CommandUtils.getMatchedPlayerName(args[1]); + + if (!playerParty.hasMember(targetName)) { + sender.sendMessage(LocaleLoader.getString("Party.NotInYourParty", targetName)); + return true; + } + + OfflinePlayer target = mcMMO.p.getServer().getOfflinePlayer(targetName); + + if (target.isOnline()) { + Player onlineTarget = target.getPlayer(); + String partyName = playerParty.getName(); + + if (!PartyManager.handlePartyChangeEvent(onlineTarget, partyName, null, EventReason.KICKED_FROM_PARTY)) { return true; } - Party playerParty = UserManager.getPlayer((Player) sender).getParty(); - String targetName = CommandUtils.getMatchedPlayerName(args[1]); + PartyManager.processPartyLeaving(UserManager.getPlayer(onlineTarget)); + onlineTarget.sendMessage(LocaleLoader.getString("Commands.Party.Kick", partyName)); + } - if (!playerParty.hasMember(targetName)) { - sender.sendMessage(LocaleLoader.getString("Party.NotInYourParty", targetName)); - return true; - } - - OfflinePlayer target = mcMMO.p.getServer().getOfflinePlayer(targetName); - - if (target.isOnline()) { - Player onlineTarget = target.getPlayer(); - String partyName = playerParty.getName(); - - if (!PartyManager.handlePartyChangeEvent(onlineTarget, partyName, null, EventReason.KICKED_FROM_PARTY)) { - return true; - } - - PartyManager.processPartyLeaving(UserManager.getPlayer(onlineTarget)); - onlineTarget.sendMessage(LocaleLoader.getString("Commands.Party.Kick", partyName)); - } - - PartyManager.removeFromParty(target, playerParty); - return true; - - default: - sender.sendMessage(LocaleLoader.getString("Commands.Usage.2", "party", "kick", "<" + LocaleLoader.getString("Commands.Usage.Player") + ">")); - return true; + PartyManager.removeFromParty(target, playerParty); + return true; } + sender.sendMessage(LocaleLoader.getString("Commands.Usage.2", "party", "kick", "<" + LocaleLoader.getString("Commands.Usage.Player") + ">")); + return true; } } diff --git a/src/main/java/com/gmail/nossr50/commands/party/PartyLockCommand.java b/src/main/java/com/gmail/nossr50/commands/party/PartyLockCommand.java index fdf02ee23..eb87e0843 100644 --- a/src/main/java/com/gmail/nossr50/commands/party/PartyLockCommand.java +++ b/src/main/java/com/gmail/nossr50/commands/party/PartyLockCommand.java @@ -9,10 +9,11 @@ import org.bukkit.command.Command; import org.bukkit.command.CommandExecutor; import org.bukkit.command.CommandSender; import org.bukkit.entity.Player; +import org.jetbrains.annotations.NotNull; public class PartyLockCommand implements CommandExecutor { @Override - public boolean onCommand(CommandSender sender, Command command, String label, String[] args) { + public boolean onCommand(@NotNull CommandSender sender, @NotNull Command command, @NotNull String label, String[] args) { switch (args.length) { case 1: if (args[0].equalsIgnoreCase("lock")) { @@ -67,7 +68,7 @@ public class PartyLockCommand implements CommandExecutor { return; } - if (lock ? party.isLocked() : !party.isLocked()) { + if (lock == party.isLocked()) { sender.sendMessage(LocaleLoader.getString("Party." + (lock ? "IsLocked" : "IsntLocked"))); return; } diff --git a/src/main/java/com/gmail/nossr50/commands/party/PartyQuitCommand.java b/src/main/java/com/gmail/nossr50/commands/party/PartyQuitCommand.java index c8cd07fbf..c450a0757 100644 --- a/src/main/java/com/gmail/nossr50/commands/party/PartyQuitCommand.java +++ b/src/main/java/com/gmail/nossr50/commands/party/PartyQuitCommand.java @@ -10,34 +10,31 @@ import org.bukkit.command.Command; import org.bukkit.command.CommandExecutor; import org.bukkit.command.CommandSender; import org.bukkit.entity.Player; +import org.jetbrains.annotations.NotNull; public class PartyQuitCommand implements CommandExecutor { @Override - public boolean onCommand(CommandSender sender, Command command, String label, String[] args) { - switch (args.length) { - case 1: - Player player = (Player) sender; + public boolean onCommand(@NotNull CommandSender sender, @NotNull Command command, @NotNull String label, String[] args) { + if (args.length == 1) { + Player player = (Player) sender; - if(UserManager.getPlayer((Player) sender) == null) - { - sender.sendMessage(LocaleLoader.getString("Profile.PendingLoad")); - return true; - } - - McMMOPlayer mcMMOPlayer = UserManager.getPlayer(player); - Party playerParty = mcMMOPlayer.getParty(); - - if (!PartyManager.handlePartyChangeEvent(player, playerParty.getName(), null, EventReason.LEFT_PARTY)) { - return true; - } - - PartyManager.removeFromParty(mcMMOPlayer); - sender.sendMessage(LocaleLoader.getString("Commands.Party.Leave")); + if (UserManager.getPlayer((Player) sender) == null) { + sender.sendMessage(LocaleLoader.getString("Profile.PendingLoad")); return true; + } - default: - sender.sendMessage(LocaleLoader.getString("Commands.Usage.1", "party", "quit")); + McMMOPlayer mcMMOPlayer = UserManager.getPlayer(player); + Party playerParty = mcMMOPlayer.getParty(); + + if (!PartyManager.handlePartyChangeEvent(player, playerParty.getName(), null, EventReason.LEFT_PARTY)) { return true; + } + + PartyManager.removeFromParty(mcMMOPlayer); + sender.sendMessage(LocaleLoader.getString("Commands.Party.Leave")); + return true; } + sender.sendMessage(LocaleLoader.getString("Commands.Usage.1", "party", "quit")); + return true; } } diff --git a/src/main/java/com/gmail/nossr50/commands/party/PartyRenameCommand.java b/src/main/java/com/gmail/nossr50/commands/party/PartyRenameCommand.java index 592ac4ca7..2ab6f0621 100644 --- a/src/main/java/com/gmail/nossr50/commands/party/PartyRenameCommand.java +++ b/src/main/java/com/gmail/nossr50/commands/party/PartyRenameCommand.java @@ -10,57 +10,54 @@ import org.bukkit.command.Command; import org.bukkit.command.CommandExecutor; import org.bukkit.command.CommandSender; import org.bukkit.entity.Player; +import org.jetbrains.annotations.NotNull; public class PartyRenameCommand implements CommandExecutor { @Override - public boolean onCommand(CommandSender sender, Command command, String label, String[] args) { - switch (args.length) { - case 2: - if(UserManager.getPlayer((Player) sender) == null) - { - sender.sendMessage(LocaleLoader.getString("Profile.PendingLoad")); - return true; - } - - McMMOPlayer mcMMOPlayer = UserManager.getPlayer((Player) sender); - Party playerParty = mcMMOPlayer.getParty(); - - String oldPartyName = playerParty.getName(); - String newPartyName = args[1]; - - // This is to prevent party leaders from spamming other players with the rename message - if (oldPartyName.equalsIgnoreCase(newPartyName)) { - sender.sendMessage(LocaleLoader.getString("Party.Rename.Same")); - return true; - } - - Player player = mcMMOPlayer.getPlayer(); - - // Check to see if the party exists, and if it does cancel renaming the party - if (PartyManager.checkPartyExistence(player, newPartyName)) { - return true; - } - - String leaderName = playerParty.getLeader().getPlayerName(); - - for (Player member : playerParty.getOnlineMembers()) { - if (!PartyManager.handlePartyChangeEvent(member, oldPartyName, newPartyName, EventReason.CHANGED_PARTIES)) { - return true; - } - - if (!member.getName().equalsIgnoreCase(leaderName)) { - member.sendMessage(LocaleLoader.getString("Party.InformedOnNameChange", leaderName, newPartyName)); - } - } - - playerParty.setName(newPartyName); - - sender.sendMessage(LocaleLoader.getString("Commands.Party.Rename", newPartyName)); + public boolean onCommand(@NotNull CommandSender sender, @NotNull Command command, @NotNull String label, String[] args) { + if (args.length == 2) { + if (UserManager.getPlayer((Player) sender) == null) { + sender.sendMessage(LocaleLoader.getString("Profile.PendingLoad")); return true; + } - default: - sender.sendMessage(LocaleLoader.getString("Commands.Usage.2", "party", "rename", "<" + LocaleLoader.getString("Commands.Usage.PartyName") + ">")); + McMMOPlayer mcMMOPlayer = UserManager.getPlayer((Player) sender); + Party playerParty = mcMMOPlayer.getParty(); + + String oldPartyName = playerParty.getName(); + String newPartyName = args[1]; + + // This is to prevent party leaders from spamming other players with the rename message + if (oldPartyName.equalsIgnoreCase(newPartyName)) { + sender.sendMessage(LocaleLoader.getString("Party.Rename.Same")); return true; + } + + Player player = mcMMOPlayer.getPlayer(); + + // Check to see if the party exists, and if it does cancel renaming the party + if (PartyManager.checkPartyExistence(player, newPartyName)) { + return true; + } + + String leaderName = playerParty.getLeader().getPlayerName(); + + for (Player member : playerParty.getOnlineMembers()) { + if (!PartyManager.handlePartyChangeEvent(member, oldPartyName, newPartyName, EventReason.CHANGED_PARTIES)) { + return true; + } + + if (!member.getName().equalsIgnoreCase(leaderName)) { + member.sendMessage(LocaleLoader.getString("Party.InformedOnNameChange", leaderName, newPartyName)); + } + } + + playerParty.setName(newPartyName); + + sender.sendMessage(LocaleLoader.getString("Commands.Party.Rename", newPartyName)); + return true; } + sender.sendMessage(LocaleLoader.getString("Commands.Usage.2", "party", "rename", "<" + LocaleLoader.getString("Commands.Usage.PartyName") + ">")); + return true; } } diff --git a/src/main/java/com/gmail/nossr50/commands/party/PartyXpShareCommand.java b/src/main/java/com/gmail/nossr50/commands/party/PartyXpShareCommand.java index 26b0922da..8322beecf 100644 --- a/src/main/java/com/gmail/nossr50/commands/party/PartyXpShareCommand.java +++ b/src/main/java/com/gmail/nossr50/commands/party/PartyXpShareCommand.java @@ -1,21 +1,22 @@ package com.gmail.nossr50.commands.party; -import com.gmail.nossr50.config.Config; import com.gmail.nossr50.datatypes.party.Party; import com.gmail.nossr50.datatypes.party.PartyFeature; import com.gmail.nossr50.datatypes.party.ShareMode; import com.gmail.nossr50.locale.LocaleLoader; -import com.gmail.nossr50.util.StringUtils; +import com.gmail.nossr50.mcMMO; import com.gmail.nossr50.util.commands.CommandUtils; import com.gmail.nossr50.util.player.UserManager; +import com.gmail.nossr50.util.text.StringUtils; import org.bukkit.command.Command; import org.bukkit.command.CommandExecutor; import org.bukkit.command.CommandSender; import org.bukkit.entity.Player; +import org.jetbrains.annotations.NotNull; public class PartyXpShareCommand implements CommandExecutor { @Override - public boolean onCommand(CommandSender sender, Command command, String label, String[] args) { + public boolean onCommand(@NotNull CommandSender sender, @NotNull Command command, @NotNull String label, String[] args) { if(UserManager.getPlayer((Player) sender) == null) { sender.sendMessage(LocaleLoader.getString("Profile.PendingLoad")); @@ -24,29 +25,24 @@ public class PartyXpShareCommand implements CommandExecutor { Party party = UserManager.getPlayer((Player) sender).getParty(); - if (party.getLevel() < Config.getInstance().getPartyFeatureUnlockLevel(PartyFeature.XP_SHARE)) { + if (party.getLevel() < mcMMO.p.getGeneralConfig().getPartyFeatureUnlockLevel(PartyFeature.XP_SHARE)) { sender.sendMessage(LocaleLoader.getString("Party.Feature.Disabled.5")); return true; } - switch (args.length) { - case 2: - if (args[1].equalsIgnoreCase("none") || CommandUtils.shouldDisableToggle(args[1])) { - handleChangingShareMode(party, ShareMode.NONE); - } - else if (args[1].equalsIgnoreCase("equal") || args[1].equalsIgnoreCase("even") || CommandUtils.shouldEnableToggle(args[1])) { - handleChangingShareMode(party, ShareMode.EQUAL); - } - else { - sender.sendMessage(LocaleLoader.getString("Commands.Usage.2", "party", "xpshare", "")); - } - - return true; - - default: + if (args.length == 2) { + if (args[1].equalsIgnoreCase("none") || CommandUtils.shouldDisableToggle(args[1])) { + handleChangingShareMode(party, ShareMode.NONE); + } else if (args[1].equalsIgnoreCase("equal") || args[1].equalsIgnoreCase("even") || CommandUtils.shouldEnableToggle(args[1])) { + handleChangingShareMode(party, ShareMode.EQUAL); + } else { sender.sendMessage(LocaleLoader.getString("Commands.Usage.2", "party", "xpshare", "")); - return true; + } + + return true; } + sender.sendMessage(LocaleLoader.getString("Commands.Usage.2", "party", "xpshare", "")); + return true; } private void handleChangingShareMode(Party party, ShareMode mode) { diff --git a/src/main/java/com/gmail/nossr50/commands/party/alliance/PartyAllianceAcceptCommand.java b/src/main/java/com/gmail/nossr50/commands/party/alliance/PartyAllianceAcceptCommand.java index e4854a0cc..1977ad67b 100644 --- a/src/main/java/com/gmail/nossr50/commands/party/alliance/PartyAllianceAcceptCommand.java +++ b/src/main/java/com/gmail/nossr50/commands/party/alliance/PartyAllianceAcceptCommand.java @@ -8,36 +8,33 @@ import org.bukkit.command.Command; import org.bukkit.command.CommandExecutor; import org.bukkit.command.CommandSender; import org.bukkit.entity.Player; +import org.jetbrains.annotations.NotNull; public class PartyAllianceAcceptCommand implements CommandExecutor { @Override - public boolean onCommand(CommandSender sender, Command command, String label, String[] args) { - switch (args.length) { - case 2: - if(UserManager.getPlayer((Player) sender) == null) - { - sender.sendMessage(LocaleLoader.getString("Profile.PendingLoad")); - return true; - } - Player player = (Player) sender; - McMMOPlayer mcMMOPlayer = UserManager.getPlayer(player); - - if (!mcMMOPlayer.hasPartyAllianceInvite()) { - sender.sendMessage(LocaleLoader.getString("mcMMO.NoInvites")); - return true; - } - - if (mcMMOPlayer.getParty().getAlly() != null) { - player.sendMessage(LocaleLoader.getString("Commands.Party.Alliance.AlreadyAllies")); - return true; - } - - PartyManager.acceptAllianceInvite(mcMMOPlayer); + public boolean onCommand(@NotNull CommandSender sender, @NotNull Command command, @NotNull String label, String[] args) { + if (args.length == 2) { + if (UserManager.getPlayer((Player) sender) == null) { + sender.sendMessage(LocaleLoader.getString("Profile.PendingLoad")); return true; + } + Player player = (Player) sender; + McMMOPlayer mcMMOPlayer = UserManager.getPlayer(player); - default: - sender.sendMessage(LocaleLoader.getString("Commands.Usage.2", "party", "alliance", "accept")); + if (!mcMMOPlayer.hasPartyAllianceInvite()) { + sender.sendMessage(LocaleLoader.getString("mcMMO.NoInvites")); return true; + } + + if (mcMMOPlayer.getParty().getAlly() != null) { + player.sendMessage(LocaleLoader.getString("Commands.Party.Alliance.AlreadyAllies")); + return true; + } + + PartyManager.acceptAllianceInvite(mcMMOPlayer); + return true; } + sender.sendMessage(LocaleLoader.getString("Commands.Usage.2", "party", "alliance", "accept")); + return true; } } diff --git a/src/main/java/com/gmail/nossr50/commands/party/alliance/PartyAllianceCommand.java b/src/main/java/com/gmail/nossr50/commands/party/alliance/PartyAllianceCommand.java index 7741115fd..27f6e4d21 100644 --- a/src/main/java/com/gmail/nossr50/commands/party/alliance/PartyAllianceCommand.java +++ b/src/main/java/com/gmail/nossr50/commands/party/alliance/PartyAllianceCommand.java @@ -1,10 +1,10 @@ package com.gmail.nossr50.commands.party.alliance; -import com.gmail.nossr50.config.Config; import com.gmail.nossr50.datatypes.party.Party; import com.gmail.nossr50.datatypes.party.PartyFeature; import com.gmail.nossr50.datatypes.player.McMMOPlayer; import com.gmail.nossr50.locale.LocaleLoader; +import com.gmail.nossr50.mcMMO; import com.gmail.nossr50.party.PartyManager; import com.gmail.nossr50.util.commands.CommandUtils; import com.gmail.nossr50.util.player.UserManager; @@ -16,6 +16,7 @@ import org.bukkit.command.CommandSender; import org.bukkit.command.TabExecutor; import org.bukkit.entity.Player; import org.bukkit.util.StringUtil; +import org.jetbrains.annotations.NotNull; import java.util.ArrayList; import java.util.List; @@ -27,12 +28,12 @@ public class PartyAllianceCommand implements TabExecutor { public static final List ALLIANCE_SUBCOMMANDS = ImmutableList.of("invite", "accept", "disband"); - private CommandExecutor partyAllianceInviteCommand = new PartyAllianceInviteCommand(); - private CommandExecutor partyAllianceAcceptCommand = new PartyAllianceAcceptCommand(); - private CommandExecutor partyAllianceDisbandCommand = new PartyAllianceDisbandCommand(); + private final CommandExecutor partyAllianceInviteCommand = new PartyAllianceInviteCommand(); + private final CommandExecutor partyAllianceAcceptCommand = new PartyAllianceAcceptCommand(); + private final CommandExecutor partyAllianceDisbandCommand = new PartyAllianceDisbandCommand(); @Override - public boolean onCommand(CommandSender sender, Command command, String label, String[] args) { + public boolean onCommand(@NotNull CommandSender sender, @NotNull Command command, @NotNull String label, String[] args) { if (CommandUtils.noConsoleUsage(sender)) { return true; } @@ -50,7 +51,7 @@ public class PartyAllianceCommand implements TabExecutor { switch (args.length) { case 1: - if (playerParty.getLevel() < Config.getInstance().getPartyFeatureUnlockLevel(PartyFeature.ALLIANCE)) { + if (playerParty.getLevel() < mcMMO.p.getGeneralConfig().getPartyFeatureUnlockLevel(PartyFeature.ALLIANCE)) { sender.sendMessage(LocaleLoader.getString("Party.Feature.Disabled.3")); return true; } @@ -68,7 +69,7 @@ public class PartyAllianceCommand implements TabExecutor { case 2: case 3: - if (playerParty.getLevel() < Config.getInstance().getPartyFeatureUnlockLevel(PartyFeature.ALLIANCE)) { + if (playerParty.getLevel() < mcMMO.p.getGeneralConfig().getPartyFeatureUnlockLevel(PartyFeature.ALLIANCE)) { sender.sendMessage(LocaleLoader.getString("Party.Feature.Disabled.3")); return true; } @@ -108,20 +109,18 @@ public class PartyAllianceCommand implements TabExecutor { } @Override - public List onTabComplete(CommandSender commandSender, Command command, String label, String[] args) { - switch (args.length) { - case 1: - List matches = StringUtil.copyPartialMatches(args[0], ALLIANCE_SUBCOMMANDS, new ArrayList(ALLIANCE_SUBCOMMANDS.size())); + public List onTabComplete(@NotNull CommandSender commandSender, @NotNull Command command, @NotNull String label, String[] args) { + if (args.length == 1) { + List matches = StringUtil.copyPartialMatches(args[0], ALLIANCE_SUBCOMMANDS, new ArrayList<>(ALLIANCE_SUBCOMMANDS.size())); - if (matches.size() == 0) { - List playerNames = CommandUtils.getOnlinePlayerNames(commandSender); - return StringUtil.copyPartialMatches(args[0], playerNames, new ArrayList(playerNames.size())); - } + if (matches.size() == 0) { + List playerNames = CommandUtils.getOnlinePlayerNames(commandSender); + return StringUtil.copyPartialMatches(args[0], playerNames, new ArrayList<>(playerNames.size())); + } - return matches; - default: - return ImmutableList.of(); + return matches; } + return ImmutableList.of(); } private void displayPartyHeader() { diff --git a/src/main/java/com/gmail/nossr50/commands/party/alliance/PartyAllianceDisbandCommand.java b/src/main/java/com/gmail/nossr50/commands/party/alliance/PartyAllianceDisbandCommand.java index 44829d4c8..c2cfa666c 100644 --- a/src/main/java/com/gmail/nossr50/commands/party/alliance/PartyAllianceDisbandCommand.java +++ b/src/main/java/com/gmail/nossr50/commands/party/alliance/PartyAllianceDisbandCommand.java @@ -9,32 +9,29 @@ import org.bukkit.command.Command; import org.bukkit.command.CommandExecutor; import org.bukkit.command.CommandSender; import org.bukkit.entity.Player; +import org.jetbrains.annotations.NotNull; public class PartyAllianceDisbandCommand implements CommandExecutor { @Override - public boolean onCommand(CommandSender sender, Command command, String label, String[] args) { - switch (args.length) { - case 2: - if(UserManager.getPlayer((Player) sender) == null) - { - sender.sendMessage(LocaleLoader.getString("Profile.PendingLoad")); - return true; - } - Player player = (Player) sender; - McMMOPlayer mcMMOPlayer = UserManager.getPlayer(player); - Party party = mcMMOPlayer.getParty(); - - if (party.getAlly() == null) { - sender.sendMessage(LocaleLoader.getString("Commands.Party.Alliance.None")); - return true; - } - - PartyManager.disbandAlliance(player, party, party.getAlly()); + public boolean onCommand(@NotNull CommandSender sender, @NotNull Command command, @NotNull String label, String[] args) { + if (args.length == 2) { + if (UserManager.getPlayer((Player) sender) == null) { + sender.sendMessage(LocaleLoader.getString("Profile.PendingLoad")); return true; + } + Player player = (Player) sender; + McMMOPlayer mcMMOPlayer = UserManager.getPlayer(player); + Party party = mcMMOPlayer.getParty(); - default: - sender.sendMessage(LocaleLoader.getString("Commands.Usage.2", "party", "alliance", "disband")); + if (party.getAlly() == null) { + sender.sendMessage(LocaleLoader.getString("Commands.Party.Alliance.None")); return true; + } + + PartyManager.disbandAlliance(player, party, party.getAlly()); + return true; } + sender.sendMessage(LocaleLoader.getString("Commands.Usage.2", "party", "alliance", "disband")); + return true; } } diff --git a/src/main/java/com/gmail/nossr50/commands/party/alliance/PartyAllianceInviteCommand.java b/src/main/java/com/gmail/nossr50/commands/party/alliance/PartyAllianceInviteCommand.java index 97461021a..408c6136a 100644 --- a/src/main/java/com/gmail/nossr50/commands/party/alliance/PartyAllianceInviteCommand.java +++ b/src/main/java/com/gmail/nossr50/commands/party/alliance/PartyAllianceInviteCommand.java @@ -10,68 +10,65 @@ import org.bukkit.command.Command; import org.bukkit.command.CommandExecutor; import org.bukkit.command.CommandSender; import org.bukkit.entity.Player; +import org.jetbrains.annotations.NotNull; public class PartyAllianceInviteCommand implements CommandExecutor { @Override - public boolean onCommand(CommandSender sender, Command command, String label, String[] args) { - switch (args.length) { - case 3: - String targetName = CommandUtils.getMatchedPlayerName(args[2]); - McMMOPlayer mcMMOTarget = UserManager.getOfflinePlayer(targetName); + public boolean onCommand(@NotNull CommandSender sender, @NotNull Command command, @NotNull String label, String[] args) { + if (args.length == 3) { + String targetName = CommandUtils.getMatchedPlayerName(args[2]); + McMMOPlayer mcMMOTarget = UserManager.getOfflinePlayer(targetName); - if (!CommandUtils.checkPlayerExistence(sender, targetName, mcMMOTarget)) { - return false; - } + if (!CommandUtils.checkPlayerExistence(sender, targetName, mcMMOTarget)) { + return false; + } - Player target = mcMMOTarget.getPlayer(); + Player target = mcMMOTarget.getPlayer(); - if(UserManager.getPlayer((Player) sender) == null) - { - sender.sendMessage(LocaleLoader.getString("Profile.PendingLoad")); - return true; - } - - Player player = (Player) sender; - McMMOPlayer mcMMOPlayer = UserManager.getPlayer(player); - String playerName = player.getName(); - - if (player.equals(target)) { - sender.sendMessage(LocaleLoader.getString("Party.Invite.Self")); - return true; - } - - if (!mcMMOTarget.inParty()) { - player.sendMessage(LocaleLoader.getString("Party.PlayerNotInParty", targetName)); - return true; - } - - if (PartyManager.inSameParty(player, target)) { - sender.sendMessage(LocaleLoader.getString("Party.Player.InSameParty", targetName)); - return true; - } - - if (!mcMMOTarget.getParty().getLeader().getUniqueId().equals(target.getUniqueId())) { - player.sendMessage(LocaleLoader.getString("Party.Target.NotOwner", targetName)); - return true; - } - - Party playerParty = mcMMOPlayer.getParty(); - - if (playerParty.getAlly() != null) { - player.sendMessage(LocaleLoader.getString("Commands.Party.Alliance.AlreadyAllies")); - return true; - } - - mcMMOTarget.setPartyAllianceInvite(playerParty); - - sender.sendMessage(LocaleLoader.getString("Commands.Invite.Success")); - target.sendMessage(LocaleLoader.getString("Commands.Party.Alliance.Invite.0", playerParty.getName(), playerName)); - target.sendMessage(LocaleLoader.getString("Commands.Party.Alliance.Invite.1")); + if (UserManager.getPlayer((Player) sender) == null) { + sender.sendMessage(LocaleLoader.getString("Profile.PendingLoad")); return true; + } - default: - sender.sendMessage(LocaleLoader.getString("Commands.Usage.3", "party", "alliance", "invite", "<" + LocaleLoader.getString("Commands.Usage.Player") + ">")); + Player player = (Player) sender; + McMMOPlayer mcMMOPlayer = UserManager.getPlayer(player); + String playerName = player.getName(); + + if (player.equals(target)) { + sender.sendMessage(LocaleLoader.getString("Party.Invite.Self")); return true; + } + + if (!mcMMOTarget.inParty()) { + player.sendMessage(LocaleLoader.getString("Party.PlayerNotInParty", targetName)); + return true; + } + + if (PartyManager.inSameParty(player, target)) { + sender.sendMessage(LocaleLoader.getString("Party.Player.InSameParty", targetName)); + return true; + } + + if (!mcMMOTarget.getParty().getLeader().getUniqueId().equals(target.getUniqueId())) { + player.sendMessage(LocaleLoader.getString("Party.Target.NotOwner", targetName)); + return true; + } + + Party playerParty = mcMMOPlayer.getParty(); + + if (playerParty.getAlly() != null) { + player.sendMessage(LocaleLoader.getString("Commands.Party.Alliance.AlreadyAllies")); + return true; + } + + mcMMOTarget.setPartyAllianceInvite(playerParty); + + sender.sendMessage(LocaleLoader.getString("Commands.Invite.Success")); + target.sendMessage(LocaleLoader.getString("Commands.Party.Alliance.Invite.0", playerParty.getName(), playerName)); + target.sendMessage(LocaleLoader.getString("Commands.Party.Alliance.Invite.1")); + return true; } + sender.sendMessage(LocaleLoader.getString("Commands.Usage.3", "party", "alliance", "invite", "<" + LocaleLoader.getString("Commands.Usage.Player") + ">")); + return true; } } diff --git a/src/main/java/com/gmail/nossr50/commands/party/teleport/PtpAcceptAnyCommand.java b/src/main/java/com/gmail/nossr50/commands/party/teleport/PtpAcceptAnyCommand.java index a58044f26..9822860f6 100644 --- a/src/main/java/com/gmail/nossr50/commands/party/teleport/PtpAcceptAnyCommand.java +++ b/src/main/java/com/gmail/nossr50/commands/party/teleport/PtpAcceptAnyCommand.java @@ -7,10 +7,11 @@ import com.gmail.nossr50.util.player.UserManager; import org.bukkit.command.Command; import org.bukkit.command.CommandExecutor; import org.bukkit.command.CommandSender; +import org.jetbrains.annotations.NotNull; public class PtpAcceptAnyCommand implements CommandExecutor { @Override - public boolean onCommand(CommandSender sender, Command command, String label, String[] args) { + public boolean onCommand(@NotNull CommandSender sender, @NotNull Command command, @NotNull String label, String[] args) { if (!Permissions.partyTeleportAcceptAll(sender)) { sender.sendMessage(command.getPermissionMessage()); return true; diff --git a/src/main/java/com/gmail/nossr50/commands/party/teleport/PtpAcceptCommand.java b/src/main/java/com/gmail/nossr50/commands/party/teleport/PtpAcceptCommand.java index a22200d23..19c98ad6a 100644 --- a/src/main/java/com/gmail/nossr50/commands/party/teleport/PtpAcceptCommand.java +++ b/src/main/java/com/gmail/nossr50/commands/party/teleport/PtpAcceptCommand.java @@ -1,8 +1,8 @@ package com.gmail.nossr50.commands.party.teleport; -import com.gmail.nossr50.config.Config; import com.gmail.nossr50.datatypes.party.PartyTeleportRecord; import com.gmail.nossr50.locale.LocaleLoader; +import com.gmail.nossr50.mcMMO; import com.gmail.nossr50.util.Permissions; import com.gmail.nossr50.util.player.UserManager; import com.gmail.nossr50.util.skills.SkillUtils; @@ -11,10 +11,11 @@ import org.bukkit.command.Command; import org.bukkit.command.CommandExecutor; import org.bukkit.command.CommandSender; import org.bukkit.entity.Player; +import org.jetbrains.annotations.NotNull; public class PtpAcceptCommand implements CommandExecutor { @Override - public boolean onCommand(CommandSender sender, Command command, String label, String[] args) { + public boolean onCommand(@NotNull CommandSender sender, @NotNull Command command, @NotNull String label, String[] args) { if (!Permissions.partyTeleportAccept(sender)) { sender.sendMessage(command.getPermissionMessage()); return true; @@ -34,7 +35,7 @@ public class PtpAcceptCommand implements CommandExecutor { return true; } - if (SkillUtils.cooldownExpired(ptpRecord.getTimeout(), Config.getInstance().getPTPCommandTimeout())) { + if (SkillUtils.cooldownExpired(ptpRecord.getTimeout(), mcMMO.p.getGeneralConfig().getPTPCommandTimeout())) { ptpRecord.removeRequest(); player.sendMessage(LocaleLoader.getString("Commands.ptp.RequestExpired")); return true; @@ -47,7 +48,7 @@ public class PtpAcceptCommand implements CommandExecutor { return true; } - if (Config.getInstance().getPTPCommandWorldPermissions()) { + if (mcMMO.p.getGeneralConfig().getPTPCommandWorldPermissions()) { World targetWorld = target.getWorld(); World playerWorld = player.getWorld(); diff --git a/src/main/java/com/gmail/nossr50/commands/party/teleport/PtpCommand.java b/src/main/java/com/gmail/nossr50/commands/party/teleport/PtpCommand.java index 8d046c8fb..c892fa7e0 100644 --- a/src/main/java/com/gmail/nossr50/commands/party/teleport/PtpCommand.java +++ b/src/main/java/com/gmail/nossr50/commands/party/teleport/PtpCommand.java @@ -1,6 +1,5 @@ package com.gmail.nossr50.commands.party.teleport; -import com.gmail.nossr50.config.Config; import com.gmail.nossr50.config.WorldBlacklist; import com.gmail.nossr50.datatypes.party.Party; import com.gmail.nossr50.datatypes.party.PartyFeature; @@ -26,6 +25,7 @@ import org.bukkit.command.CommandSender; import org.bukkit.command.TabExecutor; import org.bukkit.entity.Player; import org.bukkit.util.StringUtil; +import org.jetbrains.annotations.NotNull; import java.util.ArrayList; import java.util.List; @@ -33,12 +33,12 @@ import java.util.List; public class PtpCommand implements TabExecutor { public static final List TELEPORT_SUBCOMMANDS = ImmutableList.of("toggle", "accept", "acceptany", "acceptall"); - private CommandExecutor ptpToggleCommand = new PtpToggleCommand(); - private CommandExecutor ptpAcceptAnyCommand = new PtpAcceptAnyCommand(); - private CommandExecutor ptpAcceptCommand = new PtpAcceptCommand(); + private final CommandExecutor ptpToggleCommand = new PtpToggleCommand(); + private final CommandExecutor ptpAcceptAnyCommand = new PtpAcceptAnyCommand(); + private final CommandExecutor ptpAcceptCommand = new PtpAcceptCommand(); @Override - public boolean onCommand(CommandSender sender, Command command, String label, String[] args) { + public boolean onCommand(@NotNull CommandSender sender, @NotNull Command command, @NotNull String label, String[] args) { if (CommandUtils.noConsoleUsage(sender)) { return true; } @@ -75,90 +75,84 @@ public class PtpCommand implements TabExecutor { Party party = mcMMOPlayer.getParty(); - if (party.getLevel() < Config.getInstance().getPartyFeatureUnlockLevel(PartyFeature.TELEPORT)) { + if (party.getLevel() < mcMMO.p.getGeneralConfig().getPartyFeatureUnlockLevel(PartyFeature.TELEPORT)) { sender.sendMessage(LocaleLoader.getString("Party.Feature.Disabled.2")); return true; } - switch (args.length) { - case 1: - if (args[0].equalsIgnoreCase("toggle")) { - return ptpToggleCommand.onCommand(sender, command, label, args); - } + if (args.length == 1) { + if (args[0].equalsIgnoreCase("toggle")) { + return ptpToggleCommand.onCommand(sender, command, label, args); + } - if (args[0].equalsIgnoreCase("acceptany") || args[0].equalsIgnoreCase("acceptall")) { - return ptpAcceptAnyCommand.onCommand(sender, command, label, args); - } + if (args[0].equalsIgnoreCase("acceptany") || args[0].equalsIgnoreCase("acceptall")) { + return ptpAcceptAnyCommand.onCommand(sender, command, label, args); + } - long recentlyHurt = mcMMOPlayer.getRecentlyHurt(); - int hurtCooldown = Config.getInstance().getPTPCommandRecentlyHurtCooldown(); + long recentlyHurt = mcMMOPlayer.getRecentlyHurt(); + int hurtCooldown = mcMMO.p.getGeneralConfig().getPTPCommandRecentlyHurtCooldown(); - if (hurtCooldown > 0) { - int timeRemaining = SkillUtils.calculateTimeLeft(recentlyHurt * Misc.TIME_CONVERSION_FACTOR, hurtCooldown, player); + if (hurtCooldown > 0) { + int timeRemaining = SkillUtils.calculateTimeLeft(recentlyHurt * Misc.TIME_CONVERSION_FACTOR, hurtCooldown, player); - if (timeRemaining > 0) { - player.sendMessage(LocaleLoader.getString("Item.Injured.Wait", timeRemaining)); - return true; - } - } - - if (args[0].equalsIgnoreCase("accept")) { - return ptpAcceptCommand.onCommand(sender, command, label, args); - } - - if (!Permissions.partyTeleportSend(sender)) { - sender.sendMessage(command.getPermissionMessage()); + if (timeRemaining > 0) { + player.sendMessage(LocaleLoader.getString("Item.Injured.Wait", timeRemaining)); return true; } + } - int ptpCooldown = Config.getInstance().getPTPCommandCooldown(); - long ptpLastUse = mcMMOPlayer.getPartyTeleportRecord().getLastUse(); + if (args[0].equalsIgnoreCase("accept")) { + return ptpAcceptCommand.onCommand(sender, command, label, args); + } - if (ptpCooldown > 0) { - int timeRemaining = SkillUtils.calculateTimeLeft(ptpLastUse * Misc.TIME_CONVERSION_FACTOR, ptpCooldown, player); - - if (timeRemaining > 0) { - player.sendMessage(LocaleLoader.getString("Item.Generic.Wait", timeRemaining)); - return true; - } - } - - sendTeleportRequest(sender, player, CommandUtils.getMatchedPlayerName(args[0])); + if (!Permissions.partyTeleportSend(sender)) { + sender.sendMessage(command.getPermissionMessage()); return true; + } - default: - return false; + int ptpCooldown = mcMMO.p.getGeneralConfig().getPTPCommandCooldown(); + long ptpLastUse = mcMMOPlayer.getPartyTeleportRecord().getLastUse(); + + if (ptpCooldown > 0) { + int timeRemaining = SkillUtils.calculateTimeLeft(ptpLastUse * Misc.TIME_CONVERSION_FACTOR, ptpCooldown, player); + + if (timeRemaining > 0) { + player.sendMessage(LocaleLoader.getString("Item.Generic.Wait", timeRemaining)); + return true; + } + } + + sendTeleportRequest(sender, player, CommandUtils.getMatchedPlayerName(args[0])); + return true; } + return false; } @Override - public List onTabComplete(CommandSender sender, Command command, String alias, String[] args) { - switch (args.length) { - case 1: - List matches = StringUtil.copyPartialMatches(args[0], TELEPORT_SUBCOMMANDS, new ArrayList(TELEPORT_SUBCOMMANDS.size())); + public List onTabComplete(@NotNull CommandSender sender, @NotNull Command command, @NotNull String alias, String[] args) { + if (args.length == 1) { + List matches = StringUtil.copyPartialMatches(args[0], TELEPORT_SUBCOMMANDS, new ArrayList<>(TELEPORT_SUBCOMMANDS.size())); - if (matches.size() == 0) { - if(UserManager.getPlayer((Player) sender) == null) - { - sender.sendMessage(LocaleLoader.getString("Profile.PendingLoad")); - return ImmutableList.of(); - } - - Player player = (Player) sender; - McMMOPlayer mcMMOPlayer = UserManager.getPlayer(player); - - if (!mcMMOPlayer.inParty()) { - return ImmutableList.of(); - } - - List playerNames = mcMMOPlayer.getParty().getOnlinePlayerNames(player); - return StringUtil.copyPartialMatches(args[0], playerNames, new ArrayList(playerNames.size())); + if (matches.size() == 0) { + if (UserManager.getPlayer((Player) sender) == null) { + sender.sendMessage(LocaleLoader.getString("Profile.PendingLoad")); + return ImmutableList.of(); } - return matches; - default: - return ImmutableList.of(); + Player player = (Player) sender; + McMMOPlayer mcMMOPlayer = UserManager.getPlayer(player); + + if (!mcMMOPlayer.inParty()) { + return ImmutableList.of(); + } + + List playerNames = mcMMOPlayer.getParty().getOnlinePlayerNames(player); + return StringUtil.copyPartialMatches(args[0], playerNames, new ArrayList<>(playerNames.size())); + } + + return matches; } + return ImmutableList.of(); } private void sendTeleportRequest(CommandSender sender, Player player, String targetName) { @@ -170,7 +164,7 @@ public class PtpCommand implements TabExecutor { Player target = mcMMOTarget.getPlayer(); - if (Config.getInstance().getPTPCommandWorldPermissions()) { + if (mcMMO.p.getGeneralConfig().getPTPCommandWorldPermissions()) { World targetWorld = target.getWorld(); World playerWorld = player.getWorld(); @@ -199,7 +193,7 @@ public class PtpCommand implements TabExecutor { player.sendMessage(LocaleLoader.getString("Commands.Invite.Success")); target.sendMessage(LocaleLoader.getString("Commands.ptp.Request1", player.getName())); - target.sendMessage(LocaleLoader.getString("Commands.ptp.Request2", Config.getInstance().getPTPCommandTimeout())); + target.sendMessage(LocaleLoader.getString("Commands.ptp.Request2", mcMMO.p.getGeneralConfig().getPTPCommandTimeout())); } protected static boolean canTeleport(CommandSender sender, Player player, String targetName) { @@ -250,7 +244,7 @@ public class PtpCommand implements TabExecutor { McMMOPlayer mcMMOPlayer = UserManager.getPlayer(teleportingPlayer); McMMOPlayer mcMMOTarget = UserManager.getPlayer(targetPlayer); - long warmup = Config.getInstance().getPTPCommandWarmup(); + long warmup = mcMMO.p.getGeneralConfig().getPTPCommandWarmup(); mcMMOPlayer.actualizeTeleportCommenceLocation(teleportingPlayer); diff --git a/src/main/java/com/gmail/nossr50/commands/party/teleport/PtpToggleCommand.java b/src/main/java/com/gmail/nossr50/commands/party/teleport/PtpToggleCommand.java index 1a669cb5c..aad4df9b9 100644 --- a/src/main/java/com/gmail/nossr50/commands/party/teleport/PtpToggleCommand.java +++ b/src/main/java/com/gmail/nossr50/commands/party/teleport/PtpToggleCommand.java @@ -7,10 +7,11 @@ import com.gmail.nossr50.util.player.UserManager; import org.bukkit.command.Command; import org.bukkit.command.CommandExecutor; import org.bukkit.command.CommandSender; +import org.jetbrains.annotations.NotNull; public class PtpToggleCommand implements CommandExecutor { @Override - public boolean onCommand(CommandSender sender, Command command, String label, String[] args) { + public boolean onCommand(@NotNull CommandSender sender, @NotNull Command command, @NotNull String label, String[] args) { if (!Permissions.partyTeleportToggle(sender)) { sender.sendMessage(command.getPermissionMessage()); return true; diff --git a/src/main/java/com/gmail/nossr50/commands/player/InspectCommand.java b/src/main/java/com/gmail/nossr50/commands/player/InspectCommand.java index 89560bb0f..5779147ea 100644 --- a/src/main/java/com/gmail/nossr50/commands/player/InspectCommand.java +++ b/src/main/java/com/gmail/nossr50/commands/player/InspectCommand.java @@ -1,6 +1,5 @@ package com.gmail.nossr50.commands.player; -import com.gmail.nossr50.config.Config; import com.gmail.nossr50.datatypes.player.McMMOPlayer; import com.gmail.nossr50.datatypes.player.PlayerProfile; import com.gmail.nossr50.datatypes.skills.PrimarySkillType; @@ -16,93 +15,94 @@ import org.bukkit.command.CommandSender; import org.bukkit.command.TabExecutor; import org.bukkit.entity.Player; import org.bukkit.util.StringUtil; +import org.jetbrains.annotations.NotNull; import java.util.ArrayList; import java.util.List; public class InspectCommand implements TabExecutor { @Override - public boolean onCommand(CommandSender sender, Command command, String label, String[] args) { - switch (args.length) { - case 1: - String playerName = CommandUtils.getMatchedPlayerName(args[0]); - McMMOPlayer mcMMOPlayer = UserManager.getOfflinePlayer(playerName); + public boolean onCommand(@NotNull CommandSender sender, @NotNull Command command, @NotNull String label, String[] args) { + if (args.length == 1) { + String playerName = CommandUtils.getMatchedPlayerName(args[0]); + McMMOPlayer mcMMOPlayer = UserManager.getOfflinePlayer(playerName); - // If the mcMMOPlayer doesn't exist, create a temporary profile and check if it's present in the database. If it's not, abort the process. - if (mcMMOPlayer == null) { - PlayerProfile profile = mcMMO.getDatabaseManager().loadPlayerProfile(playerName, false); // Temporary Profile + // If the mcMMOPlayer doesn't exist, create a temporary profile and check if it's present in the database. If it's not, abort the process. + if (mcMMOPlayer == null) { + PlayerProfile profile = mcMMO.getDatabaseManager().loadPlayerProfile(playerName); // Temporary Profile - if (!CommandUtils.isLoaded(sender, profile)) { - return true; - } - - if (Config.getInstance().getScoreboardsEnabled() && sender instanceof Player && Config.getInstance().getInspectUseBoard()) { - ScoreboardManager.enablePlayerInspectScoreboard((Player) sender, profile); - - if (!Config.getInstance().getInspectUseChat()) { - return true; - } - } - - sender.sendMessage(LocaleLoader.getString("Inspect.OfflineStats", playerName)); - - sender.sendMessage(LocaleLoader.getString("Stats.Header.Gathering")); - for (PrimarySkillType skill : PrimarySkillType.GATHERING_SKILLS) { - sender.sendMessage(CommandUtils.displaySkill(profile, skill)); - } - - sender.sendMessage(LocaleLoader.getString("Stats.Header.Combat")); - for (PrimarySkillType skill : PrimarySkillType.COMBAT_SKILLS) { - sender.sendMessage(CommandUtils.displaySkill(profile, skill)); - } - - sender.sendMessage(LocaleLoader.getString("Stats.Header.Misc")); - for (PrimarySkillType skill : PrimarySkillType.MISC_SKILLS) { - sender.sendMessage(CommandUtils.displaySkill(profile, skill)); - } - - } - else { - Player target = mcMMOPlayer.getPlayer(); - - if (CommandUtils.hidden(sender, target, Permissions.inspectHidden(sender))) { - sender.sendMessage(LocaleLoader.getString("Inspect.Offline")); - return true; - } - else if (CommandUtils.tooFar(sender, target, Permissions.inspectFar(sender))) { - return true; - } - - if (Config.getInstance().getScoreboardsEnabled() && sender instanceof Player && Config.getInstance().getInspectUseBoard()) { - ScoreboardManager.enablePlayerInspectScoreboard((Player) sender, mcMMOPlayer.getProfile()); - - if (!Config.getInstance().getInspectUseChat()) { - return true; - } - } - - sender.sendMessage(LocaleLoader.getString("Inspect.Stats", target.getName())); - CommandUtils.printGatheringSkills(target, sender); - CommandUtils.printCombatSkills(target, sender); - CommandUtils.printMiscSkills(target, sender); - sender.sendMessage(LocaleLoader.getString("Commands.PowerLevel", mcMMOPlayer.getPowerLevel())); + if (!CommandUtils.isLoaded(sender, profile)) { + return true; } - return true; + if (mcMMO.p.getGeneralConfig().getScoreboardsEnabled() + && sender instanceof Player + && mcMMO.p.getGeneralConfig().getInspectUseBoard()) { + ScoreboardManager.enablePlayerInspectScoreboard((Player) sender, profile); - default: - return false; + if (!mcMMO.p.getGeneralConfig().getInspectUseChat()) { + return true; + } + } + + sender.sendMessage(LocaleLoader.getString("Inspect.OfflineStats", playerName)); + + sender.sendMessage(LocaleLoader.getString("Stats.Header.Gathering")); + for (PrimarySkillType skill : mcMMO.p.getSkillTools().GATHERING_SKILLS) { + sender.sendMessage(CommandUtils.displaySkill(profile, skill)); + } + + sender.sendMessage(LocaleLoader.getString("Stats.Header.Combat")); + for (PrimarySkillType skill : mcMMO.p.getSkillTools().COMBAT_SKILLS) { + sender.sendMessage(CommandUtils.displaySkill(profile, skill)); + } + + sender.sendMessage(LocaleLoader.getString("Stats.Header.Misc")); + for (PrimarySkillType skill : mcMMO.p.getSkillTools().MISC_SKILLS) { + sender.sendMessage(CommandUtils.displaySkill(profile, skill)); + } + + } else { + Player target = mcMMOPlayer.getPlayer(); + boolean isVanished = false; + + if (CommandUtils.hidden(sender, target, Permissions.inspectHidden(sender))) { + isVanished = true; + } + + //Only distance check players who are online and not vanished + if (!isVanished && CommandUtils.tooFar(sender, target, Permissions.inspectFar(sender))) { + return true; + } + + if (mcMMO.p.getGeneralConfig().getScoreboardsEnabled() + && sender instanceof Player + && mcMMO.p.getGeneralConfig().getInspectUseBoard()) { + ScoreboardManager.enablePlayerInspectScoreboard((Player) sender, mcMMOPlayer); + + if (!mcMMO.p.getGeneralConfig().getInspectUseChat()) { + return true; + } + } + + sender.sendMessage(LocaleLoader.getString("Inspect.Stats", target.getName())); + CommandUtils.printGatheringSkills(target, sender); + CommandUtils.printCombatSkills(target, sender); + CommandUtils.printMiscSkills(target, sender); + sender.sendMessage(LocaleLoader.getString("Commands.PowerLevel", mcMMOPlayer.getPowerLevel())); + } + + return true; } + return false; } @Override - public List onTabComplete(CommandSender sender, Command command, String alias, String[] args) { - switch (args.length) { - case 1: - List playerNames = CommandUtils.getOnlinePlayerNames(sender); - return StringUtil.copyPartialMatches(args[0], playerNames, new ArrayList(playerNames.size())); - default: - return ImmutableList.of(); + public List onTabComplete(@NotNull CommandSender sender, @NotNull Command command, @NotNull String alias, String[] args) { + if (args.length == 1) { + List playerNames = CommandUtils.getOnlinePlayerNames(sender); + return StringUtil.copyPartialMatches(args[0], playerNames, new ArrayList<>(playerNames.size())); } + return ImmutableList.of(); } } diff --git a/src/main/java/com/gmail/nossr50/commands/player/MccooldownCommand.java b/src/main/java/com/gmail/nossr50/commands/player/MccooldownCommand.java index 7a856f301..4475c984a 100644 --- a/src/main/java/com/gmail/nossr50/commands/player/MccooldownCommand.java +++ b/src/main/java/com/gmail/nossr50/commands/player/MccooldownCommand.java @@ -1,9 +1,9 @@ package com.gmail.nossr50.commands.player; -import com.gmail.nossr50.config.Config; import com.gmail.nossr50.datatypes.player.McMMOPlayer; import com.gmail.nossr50.datatypes.skills.SuperAbilityType; import com.gmail.nossr50.locale.LocaleLoader; +import com.gmail.nossr50.mcMMO; import com.gmail.nossr50.util.commands.CommandUtils; import com.gmail.nossr50.util.player.UserManager; import com.gmail.nossr50.util.scoreboards.ScoreboardManager; @@ -12,12 +12,13 @@ import org.bukkit.command.Command; import org.bukkit.command.CommandSender; import org.bukkit.command.TabExecutor; import org.bukkit.entity.Player; +import org.jetbrains.annotations.NotNull; import java.util.List; public class MccooldownCommand implements TabExecutor { @Override - public boolean onCommand(CommandSender sender, Command command, String label, String[] args) { + public boolean onCommand(@NotNull CommandSender sender, @NotNull Command command, @NotNull String label, String[] args) { if (CommandUtils.noConsoleUsage(sender)) { return true; } @@ -26,53 +27,48 @@ public class MccooldownCommand implements TabExecutor { return true; } - switch (args.length) { - case 0: - Player player = (Player) sender; + if (args.length == 0) { + Player player = (Player) sender; - if (Config.getInstance().getScoreboardsEnabled() && Config.getInstance().getCooldownUseBoard()) { - ScoreboardManager.enablePlayerCooldownScoreboard(player); + if (mcMMO.p.getGeneralConfig().getScoreboardsEnabled() && mcMMO.p.getGeneralConfig().getCooldownUseBoard()) { + ScoreboardManager.enablePlayerCooldownScoreboard(player); - if (!Config.getInstance().getCooldownUseChat()) { - return true; - } - } - - if(UserManager.getPlayer(player) == null) - { - player.sendMessage(LocaleLoader.getString("Profile.PendingLoad")); + if (!mcMMO.p.getGeneralConfig().getCooldownUseChat()) { return true; } + } - McMMOPlayer mcMMOPlayer = UserManager.getPlayer(player); + if (UserManager.getPlayer(player) == null) { + player.sendMessage(LocaleLoader.getString("Profile.PendingLoad")); + return true; + } - player.sendMessage(LocaleLoader.getString("Commands.Cooldowns.Header")); - player.sendMessage(LocaleLoader.getString("mcMMO.NoSkillNote")); + McMMOPlayer mcMMOPlayer = UserManager.getPlayer(player); - for (SuperAbilityType ability : SuperAbilityType.values()) { - if (!ability.getPermissions(player)) { - continue; - } + player.sendMessage(LocaleLoader.getString("Commands.Cooldowns.Header")); + player.sendMessage(LocaleLoader.getString("mcMMO.NoSkillNote")); - int seconds = mcMMOPlayer.calculateTimeRemaining(ability); - - if (seconds <= 0) { - player.sendMessage(LocaleLoader.getString("Commands.Cooldowns.Row.Y", ability.getName())); - } - else { - player.sendMessage(LocaleLoader.getString("Commands.Cooldowns.Row.N", ability.getName(), seconds)); - } + for (SuperAbilityType ability : SuperAbilityType.values()) { + if (!ability.getPermissions(player)) { + continue; } - return true; + int seconds = mcMMOPlayer.calculateTimeRemaining(ability); - default: - return false; + if (seconds <= 0) { + player.sendMessage(LocaleLoader.getString("Commands.Cooldowns.Row.Y", ability.getLocalizedName())); + } else { + player.sendMessage(LocaleLoader.getString("Commands.Cooldowns.Row.N", ability.getLocalizedName(), seconds)); + } + } + + return true; } + return false; } @Override - public List onTabComplete(CommandSender sender, Command command, String alias, String[] args) { + public List onTabComplete(@NotNull CommandSender sender, @NotNull Command command, @NotNull String alias, String[] args) { return ImmutableList.of(); } } diff --git a/src/main/java/com/gmail/nossr50/commands/player/McrankCommand.java b/src/main/java/com/gmail/nossr50/commands/player/McrankCommand.java index c973b0608..080be4e08 100644 --- a/src/main/java/com/gmail/nossr50/commands/player/McrankCommand.java +++ b/src/main/java/com/gmail/nossr50/commands/player/McrankCommand.java @@ -1,10 +1,10 @@ package com.gmail.nossr50.commands.player; -import com.gmail.nossr50.config.Config; import com.gmail.nossr50.datatypes.player.McMMOPlayer; import com.gmail.nossr50.locale.LocaleLoader; import com.gmail.nossr50.mcMMO; import com.gmail.nossr50.runnables.commands.McrankCommandAsyncTask; +import com.gmail.nossr50.util.MetadataConstants; import com.gmail.nossr50.util.Permissions; import com.gmail.nossr50.util.commands.CommandUtils; import com.gmail.nossr50.util.player.UserManager; @@ -15,13 +15,14 @@ import org.bukkit.command.TabExecutor; import org.bukkit.entity.Player; import org.bukkit.metadata.FixedMetadataValue; import org.bukkit.util.StringUtil; +import org.jetbrains.annotations.NotNull; import java.util.ArrayList; import java.util.List; public class McrankCommand implements TabExecutor { @Override - public boolean onCommand(CommandSender sender, Command command, String label, String[] args) { + public boolean onCommand(@NotNull CommandSender sender, @NotNull Command command, @NotNull String label, String[] args) { switch (args.length) { case 0: if (CommandUtils.noConsoleUsage(sender)) { @@ -72,14 +73,12 @@ public class McrankCommand implements TabExecutor { } @Override - public List onTabComplete(CommandSender sender, Command command, String alias, String[] args) { - switch (args.length) { - case 1: - List playerNames = CommandUtils.getOnlinePlayerNames(sender); - return StringUtil.copyPartialMatches(args[0], playerNames, new ArrayList(playerNames.size())); - default: - return ImmutableList.of(); + public List onTabComplete(@NotNull CommandSender sender, @NotNull Command command, @NotNull String alias, String[] args) { + if (args.length == 1) { + List playerNames = CommandUtils.getOnlinePlayerNames(sender); + return StringUtil.copyPartialMatches(args[0], playerNames, new ArrayList<>(playerNames.size())); } + return ImmutableList.of(); } private void display(CommandSender sender, String playerName) { @@ -92,25 +91,25 @@ public class McrankCommand implements TabExecutor { return; } - long cooldownMillis = Math.min(Config.getInstance().getDatabasePlayerCooldown(), 1750); + long cooldownMillis = Math.min(mcMMO.p.getGeneralConfig().getDatabasePlayerCooldown(), 1750); if (mcMMOPlayer.getDatabaseATS() + cooldownMillis > System.currentTimeMillis()) { sender.sendMessage(LocaleLoader.getString("Commands.Database.CooldownMS", getCDSeconds(mcMMOPlayer, cooldownMillis))); return; } - if (((Player) sender).hasMetadata(mcMMO.databaseCommandKey)) { + if (((Player) sender).hasMetadata(MetadataConstants.METADATA_KEY_DATABASE_COMMAND)) { sender.sendMessage(LocaleLoader.getString("Commands.Database.Processing")); return; } else { - ((Player) sender).setMetadata(mcMMO.databaseCommandKey, new FixedMetadataValue(mcMMO.p, null)); + ((Player) sender).setMetadata(MetadataConstants.METADATA_KEY_DATABASE_COMMAND, new FixedMetadataValue(mcMMO.p, null)); } mcMMOPlayer.actualizeDatabaseATS(); } - boolean useBoard = Config.getInstance().getScoreboardsEnabled() && (sender instanceof Player) && (Config.getInstance().getRankUseBoard()); - boolean useChat = !useBoard || Config.getInstance().getRankUseChat(); + boolean useBoard = mcMMO.p.getGeneralConfig().getScoreboardsEnabled() && (sender instanceof Player) && (mcMMO.p.getGeneralConfig().getRankUseBoard()); + boolean useChat = !useBoard || mcMMO.p.getGeneralConfig().getRankUseChat(); new McrankCommandAsyncTask(playerName, sender, useBoard, useChat).runTaskAsynchronously(mcMMO.p); } diff --git a/src/main/java/com/gmail/nossr50/commands/player/McstatsCommand.java b/src/main/java/com/gmail/nossr50/commands/player/McstatsCommand.java index 187d866eb..a9e8cf6e1 100644 --- a/src/main/java/com/gmail/nossr50/commands/player/McstatsCommand.java +++ b/src/main/java/com/gmail/nossr50/commands/player/McstatsCommand.java @@ -1,7 +1,7 @@ package com.gmail.nossr50.commands.player; -import com.gmail.nossr50.config.Config; import com.gmail.nossr50.locale.LocaleLoader; +import com.gmail.nossr50.mcMMO; import com.gmail.nossr50.util.commands.CommandUtils; import com.gmail.nossr50.util.player.UserManager; import com.gmail.nossr50.util.scoreboards.ScoreboardManager; @@ -10,12 +10,13 @@ import org.bukkit.command.Command; import org.bukkit.command.CommandSender; import org.bukkit.command.TabExecutor; import org.bukkit.entity.Player; +import org.jetbrains.annotations.NotNull; import java.util.List; public class McstatsCommand implements TabExecutor { @Override - public boolean onCommand(CommandSender sender, Command command, String label, String[] args) { + public boolean onCommand(@NotNull CommandSender sender, @NotNull Command command, @NotNull String label, String[] args) { if (CommandUtils.noConsoleUsage(sender)) { return true; } @@ -24,49 +25,44 @@ public class McstatsCommand implements TabExecutor { return true; } - switch (args.length) { - case 0: - if(UserManager.getPlayer((Player) sender) == null) - { - sender.sendMessage(LocaleLoader.getString("Profile.PendingLoad")); + if (args.length == 0) { + if (UserManager.getPlayer((Player) sender) == null) { + sender.sendMessage(LocaleLoader.getString("Profile.PendingLoad")); + return true; + } + + Player player = (Player) sender; + + if (mcMMO.p.getGeneralConfig().getStatsUseBoard() && mcMMO.p.getGeneralConfig().getScoreboardsEnabled()) { + ScoreboardManager.enablePlayerStatsScoreboard(player); + + if (!mcMMO.p.getGeneralConfig().getStatsUseChat()) { return true; } + } - Player player = (Player) sender; + player.sendMessage(LocaleLoader.getString("Stats.Own.Stats")); + player.sendMessage(LocaleLoader.getString("mcMMO.NoSkillNote")); - if (Config.getInstance().getStatsUseBoard() && Config.getInstance().getScoreboardsEnabled()) { - ScoreboardManager.enablePlayerStatsScoreboard(player); + CommandUtils.printGatheringSkills(player); + CommandUtils.printCombatSkills(player); + CommandUtils.printMiscSkills(player); - if (!Config.getInstance().getStatsUseChat()) { - return true; - } - } + int powerLevelCap = mcMMO.p.getGeneralConfig().getPowerLevelCap(); - player.sendMessage(LocaleLoader.getString("Stats.Own.Stats")); - player.sendMessage(LocaleLoader.getString("mcMMO.NoSkillNote")); + if (powerLevelCap != Integer.MAX_VALUE) { + player.sendMessage(LocaleLoader.getString("Commands.PowerLevel.Capped", UserManager.getPlayer(player).getPowerLevel(), powerLevelCap)); + } else { + player.sendMessage(LocaleLoader.getString("Commands.PowerLevel", UserManager.getPlayer(player).getPowerLevel())); + } - CommandUtils.printGatheringSkills(player); - CommandUtils.printCombatSkills(player); - CommandUtils.printMiscSkills(player); - - int powerLevelCap = Config.getInstance().getPowerLevelCap(); - - if (powerLevelCap != Integer.MAX_VALUE) { - player.sendMessage(LocaleLoader.getString("Commands.PowerLevel.Capped", UserManager.getPlayer(player).getPowerLevel(), powerLevelCap)); - } - else { - player.sendMessage(LocaleLoader.getString("Commands.PowerLevel", UserManager.getPlayer(player).getPowerLevel())); - } - - return true; - - default: - return false; + return true; } + return false; } @Override - public List onTabComplete(CommandSender sender, Command command, String alias, String[] args) { + public List onTabComplete(@NotNull CommandSender sender, @NotNull Command command, @NotNull String alias, String[] args) { return ImmutableList.of(); } } diff --git a/src/main/java/com/gmail/nossr50/commands/player/MctopCommand.java b/src/main/java/com/gmail/nossr50/commands/player/MctopCommand.java index dc9acb3b5..aaf660bc1 100644 --- a/src/main/java/com/gmail/nossr50/commands/player/MctopCommand.java +++ b/src/main/java/com/gmail/nossr50/commands/player/MctopCommand.java @@ -1,15 +1,15 @@ package com.gmail.nossr50.commands.player; -import com.gmail.nossr50.config.Config; import com.gmail.nossr50.datatypes.player.McMMOPlayer; import com.gmail.nossr50.datatypes.skills.PrimarySkillType; import com.gmail.nossr50.locale.LocaleLoader; import com.gmail.nossr50.mcMMO; import com.gmail.nossr50.runnables.commands.MctopCommandAsyncTask; +import com.gmail.nossr50.util.MetadataConstants; import com.gmail.nossr50.util.Permissions; -import com.gmail.nossr50.util.StringUtils; import com.gmail.nossr50.util.commands.CommandUtils; import com.gmail.nossr50.util.player.UserManager; +import com.gmail.nossr50.util.text.StringUtils; import com.google.common.collect.ImmutableList; import org.bukkit.command.Command; import org.bukkit.command.CommandSender; @@ -17,13 +17,14 @@ import org.bukkit.command.TabExecutor; import org.bukkit.entity.Player; import org.bukkit.metadata.FixedMetadataValue; import org.bukkit.util.StringUtil; +import org.jetbrains.annotations.NotNull; import java.util.ArrayList; import java.util.List; public class MctopCommand implements TabExecutor { @Override - public boolean onCommand(CommandSender sender, Command command, String label, String[] args) { + public boolean onCommand(@NotNull CommandSender sender, @NotNull Command command, @NotNull String label, String[] args) { PrimarySkillType skill = null; switch (args.length) { @@ -66,13 +67,11 @@ public class MctopCommand implements TabExecutor { } @Override - public List onTabComplete(CommandSender sender, Command command, String alias, String[] args) { - switch (args.length) { - case 1: - return StringUtil.copyPartialMatches(args[0], PrimarySkillType.SKILL_NAMES, new ArrayList(PrimarySkillType.SKILL_NAMES.size())); - default: - return ImmutableList.of(); + public List onTabComplete(@NotNull CommandSender sender, @NotNull Command command, @NotNull String alias, String[] args) { + if (args.length == 1) { + return StringUtil.copyPartialMatches(args[0], mcMMO.p.getSkillTools().LOCALIZED_SKILL_NAMES, new ArrayList<>(mcMMO.p.getSkillTools().LOCALIZED_SKILL_NAMES.size())); } + return ImmutableList.of(); } private void display(int page, PrimarySkillType skill, CommandSender sender, Command command) { @@ -87,10 +86,10 @@ public class MctopCommand implements TabExecutor { } McMMOPlayer mcMMOPlayer = UserManager.getPlayer(sender.getName()); - long cooldownMillis = Math.max(Config.getInstance().getDatabasePlayerCooldown(), 1750); + long cooldownMillis = Math.max(mcMMO.p.getGeneralConfig().getDatabasePlayerCooldown(), 1750); if (mcMMOPlayer.getDatabaseATS() + cooldownMillis > System.currentTimeMillis()) { - double seconds = ((mcMMOPlayer.getDatabaseATS() + cooldownMillis) - System.currentTimeMillis()) / 1000; + double seconds = ((mcMMOPlayer.getDatabaseATS() + cooldownMillis) - System.currentTimeMillis()) / 1000.0D; if (seconds < 1) { seconds = 1; } @@ -99,11 +98,11 @@ public class MctopCommand implements TabExecutor { return; } - if (((Player) sender).hasMetadata(mcMMO.databaseCommandKey)) { + if (((Player) sender).hasMetadata(MetadataConstants.METADATA_KEY_DATABASE_COMMAND)) { sender.sendMessage(LocaleLoader.getString("Commands.Database.Processing")); return; } else { - ((Player) sender).setMetadata(mcMMO.databaseCommandKey, new FixedMetadataValue(mcMMO.p, null)); + ((Player) sender).setMetadata(MetadataConstants.METADATA_KEY_DATABASE_COMMAND, new FixedMetadataValue(mcMMO.p, null)); } mcMMOPlayer.actualizeDatabaseATS(); @@ -113,8 +112,8 @@ public class MctopCommand implements TabExecutor { } private void display(int page, PrimarySkillType skill, CommandSender sender) { - boolean useBoard = (sender instanceof Player) && (Config.getInstance().getTopUseBoard()); - boolean useChat = !useBoard || Config.getInstance().getTopUseChat(); + boolean useBoard = (sender instanceof Player) && (mcMMO.p.getGeneralConfig().getTopUseBoard()); + boolean useChat = !useBoard || mcMMO.p.getGeneralConfig().getTopUseChat(); new MctopCommandAsyncTask(page, skill, sender, useBoard, useChat).runTaskAsynchronously(mcMMO.p); } @@ -124,7 +123,7 @@ public class MctopCommand implements TabExecutor { return null; } - PrimarySkillType skill = PrimarySkillType.getSkill(skillName); + PrimarySkillType skill = mcMMO.p.getSkillTools().matchSkill(skillName); if (CommandUtils.isChildSkill(sender, skill)) { return null; diff --git a/src/main/java/com/gmail/nossr50/commands/player/XPBarCommand.java b/src/main/java/com/gmail/nossr50/commands/player/XPBarCommand.java new file mode 100644 index 000000000..e780fa19d --- /dev/null +++ b/src/main/java/com/gmail/nossr50/commands/player/XPBarCommand.java @@ -0,0 +1,112 @@ +package com.gmail.nossr50.commands.player; + +import com.gmail.nossr50.datatypes.player.McMMOPlayer; +import com.gmail.nossr50.datatypes.skills.PrimarySkillType; +import com.gmail.nossr50.mcMMO; +import com.gmail.nossr50.util.experience.ExperienceBarManager; +import com.gmail.nossr50.util.player.NotificationManager; +import com.gmail.nossr50.util.player.UserManager; +import com.gmail.nossr50.util.skills.SkillUtils; +import com.gmail.nossr50.util.text.StringUtils; +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 org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +import java.util.ArrayList; +import java.util.List; + +public class XPBarCommand implements TabExecutor { + + @Override + public boolean onCommand(@NotNull CommandSender sender, @NotNull Command command, @NotNull String label, @NotNull String[] args) { + if(sender instanceof Player) { + McMMOPlayer mmoPlayer = UserManager.getPlayer((Player) sender); + if(mmoPlayer == null) { + NotificationManager.sendPlayerInformationChatOnlyPrefixed(mmoPlayer.getPlayer(), "Profile.PendingLoad"); + return false; + } + + if(args.length == 0) { + return false; + } else if(args.length < 2) { + String option = args[0]; + + if(option.equalsIgnoreCase(ExperienceBarManager.XPBarSettingTarget.RESET.toString())) { + mmoPlayer.getExperienceBarManager().xpBarSettingToggle(ExperienceBarManager.XPBarSettingTarget.RESET, null); + return true; + } else if(option.equalsIgnoreCase(ExperienceBarManager.XPBarSettingTarget.DISABLE.toString())) { + mmoPlayer.getExperienceBarManager().disableAllBars(); + return true; + } else { + return false; + } + + //Per skill Settings path + } else if (args.length == 2) { + String skillName = args[1]; + + if(SkillUtils.isSkill(skillName)) { + + PrimarySkillType targetSkill = mcMMO.p.getSkillTools().matchSkill(skillName); + + //Target setting + String option = args[0].toLowerCase(); + + ExperienceBarManager.XPBarSettingTarget settingTarget = getSettingTarget(option); + if(settingTarget != null && settingTarget != ExperienceBarManager.XPBarSettingTarget.RESET) { + //Change setting + mmoPlayer.getExperienceBarManager().xpBarSettingToggle(settingTarget, targetSkill); + return true; + } else { + return false; + } + } else { + return false; + } + } else { + return false; + } + } else { + return false; + } + } + + private @Nullable ExperienceBarManager.XPBarSettingTarget getSettingTarget(String string) { + switch (string.toLowerCase()) { + case "hide": + return ExperienceBarManager.XPBarSettingTarget.HIDE; + case "show": + return ExperienceBarManager.XPBarSettingTarget.SHOW; + case "reset": + return ExperienceBarManager.XPBarSettingTarget.RESET; + case "disable": + return ExperienceBarManager.XPBarSettingTarget.DISABLE; + } + + return null; + } + + @Override + public List onTabComplete(@NotNull CommandSender sender, @NotNull Command command, @NotNull String alias, String[] args) { + switch (args.length) { + case 1: + List options = new ArrayList<>(); + + for(ExperienceBarManager.XPBarSettingTarget settingTarget : ExperienceBarManager.XPBarSettingTarget.values()) { + options.add(StringUtils.getCapitalized(settingTarget.toString())); + } + + return StringUtil.copyPartialMatches(args[0], options, new ArrayList<>(ExperienceBarManager.XPBarSettingTarget.values().length)); + case 2: + if(!args[0].equalsIgnoreCase(ExperienceBarManager.XPBarSettingTarget.RESET.toString())) + return StringUtil.copyPartialMatches(args[1], mcMMO.p.getSkillTools().LOCALIZED_SKILL_NAMES, new ArrayList<>(mcMMO.p.getSkillTools().LOCALIZED_SKILL_NAMES.size())); + default: + return ImmutableList.of(); + } + } +} diff --git a/src/main/java/com/gmail/nossr50/commands/server/Mcmmoupgrade.java b/src/main/java/com/gmail/nossr50/commands/server/Mcmmoupgrade.java index 8fe4ef496..77b181e2a 100644 --- a/src/main/java/com/gmail/nossr50/commands/server/Mcmmoupgrade.java +++ b/src/main/java/com/gmail/nossr50/commands/server/Mcmmoupgrade.java @@ -3,13 +3,14 @@ package com.gmail.nossr50.commands.server; import org.bukkit.command.Command; import org.bukkit.command.CommandExecutor; import org.bukkit.command.CommandSender; +import org.jetbrains.annotations.NotNull; /** * 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) { + public boolean onCommand(@NotNull CommandSender sender, @NotNull Command command, @NotNull String label, String[] args) { return false; } } diff --git a/src/main/java/com/gmail/nossr50/commands/skills/AcrobaticsCommand.java b/src/main/java/com/gmail/nossr50/commands/skills/AcrobaticsCommand.java index 1588cbd77..bb963168f 100644 --- a/src/main/java/com/gmail/nossr50/commands/skills/AcrobaticsCommand.java +++ b/src/main/java/com/gmail/nossr50/commands/skills/AcrobaticsCommand.java @@ -5,11 +5,11 @@ import com.gmail.nossr50.datatypes.skills.SubSkillType; import com.gmail.nossr50.datatypes.skills.subskills.AbstractSubSkill; import com.gmail.nossr50.listeners.InteractionManager; import com.gmail.nossr50.locale.LocaleLoader; -import com.gmail.nossr50.util.TextComponentFactory; import com.gmail.nossr50.util.random.RandomChanceSkill; import com.gmail.nossr50.util.random.RandomChanceUtil; import com.gmail.nossr50.util.skills.SkillActivationType; -import net.md_5.bungee.api.chat.TextComponent; +import com.gmail.nossr50.util.text.TextComponentFactory; +import net.kyori.adventure.text.Component; import org.bukkit.entity.Player; import java.util.ArrayList; @@ -44,7 +44,7 @@ public class AcrobaticsCommand extends SkillCommand { @Override protected List statsDisplay(Player player, float skillValue, boolean hasEndurance, boolean isLucky) { - List messages = new ArrayList(); + List messages = new ArrayList<>(); if (canDodge) { messages.add(getStatMessage(SubSkillType.ACROBATICS_DODGE, dodgeChance) @@ -69,9 +69,9 @@ public class AcrobaticsCommand extends SkillCommand { //Chance Stat Calculations rollChance = RandomChanceUtil.getRandomChanceExecutionChance(roll_rcs); graceChance = RandomChanceUtil.getRandomChanceExecutionChance(grace_rcs); - //damageThreshold = AdvancedConfig.getInstance().getRollDamageThreshold(); + //damageThreshold = mcMMO.p.getAdvancedConfig().getRollDamageThreshold(); - String rollStrings[] = getAbilityDisplayValues(SkillActivationType.RANDOM_LINEAR_100_SCALE_WITH_CAP, player, SubSkillType.ACROBATICS_ROLL); + String[] rollStrings = getAbilityDisplayValues(SkillActivationType.RANDOM_LINEAR_100_SCALE_WITH_CAP, player, SubSkillType.ACROBATICS_ROLL); //Format double rollChanceLucky = rollChance * 1.333D; @@ -89,8 +89,8 @@ public class AcrobaticsCommand extends SkillCommand { } @Override - protected List getTextComponents(Player player) { - List textComponents = new ArrayList<>(); + protected List getTextComponents(Player player) { + List textComponents = new ArrayList<>(); TextComponentFactory.getSubSkillTextComponents(player, textComponents, PrimarySkillType.ACROBATICS); diff --git a/src/main/java/com/gmail/nossr50/commands/skills/AlchemyCommand.java b/src/main/java/com/gmail/nossr50/commands/skills/AlchemyCommand.java index 3c68c0af9..a8d5fcc8b 100644 --- a/src/main/java/com/gmail/nossr50/commands/skills/AlchemyCommand.java +++ b/src/main/java/com/gmail/nossr50/commands/skills/AlchemyCommand.java @@ -5,10 +5,10 @@ import com.gmail.nossr50.datatypes.skills.SubSkillType; import com.gmail.nossr50.locale.LocaleLoader; import com.gmail.nossr50.skills.alchemy.AlchemyManager; import com.gmail.nossr50.util.Permissions; -import com.gmail.nossr50.util.TextComponentFactory; import com.gmail.nossr50.util.player.UserManager; import com.gmail.nossr50.util.skills.RankUtils; -import net.md_5.bungee.api.chat.TextComponent; +import com.gmail.nossr50.util.text.TextComponentFactory; +import net.kyori.adventure.text.Component; import org.bukkit.entity.Player; import java.util.ArrayList; @@ -74,7 +74,7 @@ public class AlchemyCommand extends SkillCommand { @Override protected List statsDisplay(Player player, float skillValue, boolean hasEndurance, boolean isLucky) { - List messages = new ArrayList(); + List messages = new ArrayList<>(); if (canCatalysis) { messages.add(getStatMessage(SubSkillType.ALCHEMY_CATALYSIS, brewSpeed) @@ -93,8 +93,8 @@ public class AlchemyCommand extends SkillCommand { } @Override - protected List getTextComponents(Player player) { - List textComponents = new ArrayList<>(); + protected List getTextComponents(Player player) { + List textComponents = new ArrayList<>(); TextComponentFactory.getSubSkillTextComponents(player, textComponents, PrimarySkillType.ALCHEMY); diff --git a/src/main/java/com/gmail/nossr50/commands/skills/AprilCommand.java b/src/main/java/com/gmail/nossr50/commands/skills/AprilCommand.java index 294839b9e..5364918ff 100644 --- a/src/main/java/com/gmail/nossr50/commands/skills/AprilCommand.java +++ b/src/main/java/com/gmail/nossr50/commands/skills/AprilCommand.java @@ -1,203 +1,199 @@ -package com.gmail.nossr50.commands.skills; - -import com.gmail.nossr50.locale.LocaleLoader; -import com.gmail.nossr50.util.HolidayManager.FakeSkillType; -import com.gmail.nossr50.util.Misc; -import com.gmail.nossr50.util.StringUtils; -import com.gmail.nossr50.util.commands.CommandUtils; -import com.google.common.collect.ImmutableList; -import org.bukkit.command.Command; -import org.bukkit.command.CommandSender; -import org.bukkit.command.TabExecutor; -import org.bukkit.entity.Player; - -import java.text.DecimalFormat; -import java.util.ArrayList; -import java.util.List; - -public class AprilCommand implements TabExecutor { - private String skillName; - - protected DecimalFormat percent = new DecimalFormat("##0.00%"); - protected DecimalFormat decimal = new DecimalFormat("##0.00"); - - @Override - public boolean onCommand(CommandSender sender, Command command, String label, String[] args) { - if (CommandUtils.noConsoleUsage(sender)) { - return true; - } - - skillName = StringUtils.getCapitalized(label); - - switch (args.length) { - case 0: - Player player = (Player) sender; - FakeSkillType fakeSkillType = FakeSkillType.getByName(skillName); - - float skillValue = Misc.getRandom().nextInt(99); - - player.sendMessage(LocaleLoader.getString("Skills.Header", skillName)); - player.sendMessage(LocaleLoader.getString("Commands.XPGain", getXPGainString(fakeSkillType))); - player.sendMessage(LocaleLoader.getString("Effects.Level", (int) skillValue, Misc.getRandom().nextInt(1000), 1000 + Misc.getRandom().nextInt(1000))); - - - List effectMessages = effectsDisplay(fakeSkillType); - - if (!effectMessages.isEmpty()) { - player.sendMessage(LocaleLoader.getString("Skills.Header", LocaleLoader.getString("Effects.Effects"))); - - for (String message : effectMessages) { - player.sendMessage(message); - } - } - - List statsMessages = statsDisplay(fakeSkillType); - - if (!statsMessages.isEmpty()) { - player.sendMessage(LocaleLoader.getString("Skills.Header", LocaleLoader.getString("Commands.Stats.Self"))); - - for (String message : statsMessages) { - player.sendMessage(message); - } - } - - player.sendMessage(LocaleLoader.formatString("[[DARK_AQUA]]Guide for {0} available - type /APRIL FOOLS ! :D", skillName)); - return true; - - default: - return true; - } - } - - private String getXPGainString(FakeSkillType fakeSkillType) { - switch (fakeSkillType) { - case MACHO: - return "Get beaten up"; - case JUMPING: - return "Kris Kross will make ya Jump Jump"; - case THROWING: - return "Chuck your items on the floor"; - case WRECKING: - return "I'M GONNA WRECK IT!"; - case CRAFTING: - return "Craft apple pies"; - case WALKING: - return "Walk around the park"; - case SWIMMING: - return "Like a fish on a bicycle"; - case FALLING: - return "Faceplant the floor, headbutt the ground"; - case CLIMBING: - return "Climb the highest mountain"; - case FLYING: - return "I believe I can fly"; - case DIVING: - return "Scuba club 4000"; - case PIGGY: - return "OINK! OINK!"; - default: - return "Sit and wait?"; - } - } - - @Override - public List onTabComplete(CommandSender sender, Command command, String alias, String[] args) { - switch (args.length) { - case 1: - return ImmutableList.of("?"); - default: - return ImmutableList.of(); - } - } - - private List effectsDisplay(FakeSkillType fakeSkillType) { - List messages = new ArrayList(); - - switch (fakeSkillType) { - case MACHO: - messages.add(LocaleLoader.getString("Effects.Template", "Punching bag", "Absorb damage, like a bag of sand")); - break; - case JUMPING: - messages.add(LocaleLoader.getString("Effects.Template", "Jump", "PRESS SPACE TO JUMP")); - messages.add(LocaleLoader.getString("Effects.Template", "Jump Twice", "PRESS SPACE TWICE TO JUMP TWICE")); - break; - case THROWING: - messages.add(LocaleLoader.getString("Effects.Template", "Drop Item", "Randomly drop items, at random")); - break; - case WRECKING: - messages.add(LocaleLoader.getString("Effects.Template", "Ralphinator", "Smash windows with your fists")); - break; - case CRAFTING: - messages.add(LocaleLoader.getString("Effects.Template", "Crafting", "Chance of successful craft")); - break; - case WALKING: - messages.add(LocaleLoader.getString("Effects.Template", "Walk", "Traveling gracefully by foot")); - break; - case SWIMMING: - messages.add(LocaleLoader.getString("Effects.Template", "Swim", "Just keep swimming, swimming, swimming")); - break; - case FALLING: - messages.add(LocaleLoader.getString("Effects.Template", "Skydiving", "Go jump of a cliff. No, seriously.")); - break; - case CLIMBING: - messages.add(LocaleLoader.getString("Effects.Template", "Rock Climber", "Use string to climb mountains faster")); - break; - case FLYING: - messages.add(LocaleLoader.getString("Effects.Template", "Fly", "Throw yourself at the ground and miss")); - break; - case DIVING: - messages.add(LocaleLoader.getString("Effects.Template", "Hold Breath", "Press shift to hold your breath longer")); - break; - case PIGGY: - messages.add(LocaleLoader.getString("Effects.Template", "Carrot Turbo", "Supercharge your pigs with carrots")); - break; - } - - return messages; - } - - private List statsDisplay(FakeSkillType fakeSkillType) { - List messages = new ArrayList(); - - switch (fakeSkillType) { - case MACHO: - messages.add(LocaleLoader.formatString("[[RED]]Damage Taken: [[YELLOW]]{0}%", decimal.format(Misc.getRandom().nextInt(77)))); - break; - case JUMPING: - messages.add(LocaleLoader.formatString("[[RED]]Double Jump Chance: [[YELLOW]]{0}%", decimal.format(Misc.getRandom().nextInt(27)))); - break; - case THROWING: - messages.add(LocaleLoader.formatString("[[RED]]Drop Item Chance: [[YELLOW]]{0}%", decimal.format(Misc.getRandom().nextInt(87)))); - break; - case WRECKING: - messages.add(LocaleLoader.formatString("[[RED]]Wrecking Chance: [[YELLOW]]{0}%", decimal.format(Misc.getRandom().nextInt(14)))); - break; - case CRAFTING: - messages.add(LocaleLoader.formatString("[[RED]]Crafting Success: [[YELLOW]]{0}%", decimal.format(Misc.getRandom().nextInt(27)))); - break; - case WALKING: - messages.add(LocaleLoader.formatString("[[RED]]Walk Chance: [[YELLOW]]{0}%", decimal.format(Misc.getRandom().nextInt(27)))); - break; - case SWIMMING: - messages.add(LocaleLoader.formatString("[[RED]]Swim Chance: [[YELLOW]]{0}%", decimal.format(Misc.getRandom().nextInt(27)))); - break; - case FALLING: - messages.add(LocaleLoader.formatString("[[RED]]Skydiving Success: [[YELLOW]]{0}%", decimal.format(Misc.getRandom().nextInt(37)))); - break; - case CLIMBING: - messages.add(LocaleLoader.formatString("[[RED]]Rock Climber Chance: [[YELLOW]]{0}%", decimal.format(Misc.getRandom().nextInt(27)))); - break; - case FLYING: - messages.add(LocaleLoader.formatString("[[RED]]Fly Chance: [[YELLOW]]{0}%", decimal.format(Misc.getRandom().nextInt(27)))); - break; - case DIVING: - messages.add(LocaleLoader.formatString("[[RED]]Hold Breath Chance: [[YELLOW]]{0}%", decimal.format(Misc.getRandom().nextInt(27)))); - break; - case PIGGY: - messages.add(LocaleLoader.formatString("[[RED]]Carrot Turbo Boost: [[YELLOW]]{0}%", decimal.format(Misc.getRandom().nextInt(80)) + 10)); - break; - } - - return messages; - } -} +//package com.gmail.nossr50.commands.skills; +// +//import com.gmail.nossr50.locale.LocaleLoader; +//import com.gmail.nossr50.util.HolidayManager.FakeSkillType; +//import com.gmail.nossr50.util.Misc; +//import com.gmail.nossr50.util.commands.CommandUtils; +//import com.gmail.nossr50.util.text.StringUtils; +//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.jetbrains.annotations.NotNull; +// +//import java.text.DecimalFormat; +//import java.util.ArrayList; +//import java.util.List; +// +//public class AprilCommand implements TabExecutor { +// private String skillName; +// +// protected DecimalFormat percent = new DecimalFormat("##0.00%"); +// protected DecimalFormat decimal = new DecimalFormat("##0.00"); +// +// @Override +// public boolean onCommand(@NotNull CommandSender sender, @NotNull Command command, @NotNull String label, String[] args) { +// if (CommandUtils.noConsoleUsage(sender)) { +// return true; +// } +// +// skillName = StringUtils.getCapitalized(label); +// +// if (args.length == 0) { +// Player player = (Player) sender; +// FakeSkillType fakeSkillType = FakeSkillType.getByName(skillName); +// +// float skillValue = Misc.getRandom().nextInt(99); +// +// player.sendMessage(LocaleLoader.getString("Skills.Header", skillName)); +// player.sendMessage(LocaleLoader.getString("Commands.XPGain", getXPGainString(fakeSkillType))); +// player.sendMessage(LocaleLoader.getString("Effects.Level", (int) skillValue, Misc.getRandom().nextInt(1000), 1000 + Misc.getRandom().nextInt(1000))); +// +// +// List effectMessages = effectsDisplay(fakeSkillType); +// +// if (!effectMessages.isEmpty()) { +// player.sendMessage(LocaleLoader.getString("Skills.Header", LocaleLoader.getString("Effects.Effects"))); +// +// for (String message : effectMessages) { +// player.sendMessage(message); +// } +// } +// +// List statsMessages = statsDisplay(fakeSkillType); +// +// if (!statsMessages.isEmpty()) { +// player.sendMessage(LocaleLoader.getString("Skills.Header", LocaleLoader.getString("Commands.Stats.Self"))); +// +// for (String message : statsMessages) { +// player.sendMessage(message); +// } +// } +// +// player.sendMessage(LocaleLoader.formatString("[[DARK_AQUA]]Guide for {0} available - type /APRIL FOOLS ! :D", skillName)); +// return true; +// } +// return true; +// } +// +// private String getXPGainString(FakeSkillType fakeSkillType) { +// switch (fakeSkillType) { +// case MACHO: +// return "Get beaten up"; +// case JUMPING: +// return "Kris Kross will make ya Jump Jump"; +// case THROWING: +// return "Chuck your items on the floor"; +// case WRECKING: +// return "I'M GONNA WRECK IT!"; +// case CRAFTING: +// return "Craft apple pies"; +// case WALKING: +// return "Walk around the park"; +// case SWIMMING: +// return "Like a fish on a bicycle"; +// case FALLING: +// return "Faceplant the floor, headbutt the ground"; +// case CLIMBING: +// return "Climb the highest mountain"; +// case FLYING: +// return "I believe I can fly"; +// case DIVING: +// return "Scuba club 4000"; +// case PIGGY: +// return "OINK! OINK!"; +// default: +// return "Sit and wait?"; +// } +// } +// +// @Override +// public List onTabComplete(@NotNull CommandSender sender, @NotNull Command command, @NotNull String alias, String[] args) { +// if (args.length == 1) { +// return ImmutableList.of("?"); +// } +// return ImmutableList.of(); +// } +// +// private List effectsDisplay(FakeSkillType fakeSkillType) { +// List messages = new ArrayList<>(); +// +// switch (fakeSkillType) { +// case MACHO: +// messages.add(LocaleLoader.getString("Effects.Template", "Punching bag", "Absorb damage, like a bag of sand")); +// break; +// case JUMPING: +// messages.add(LocaleLoader.getString("Effects.Template", "Jump", "PRESS SPACE TO JUMP")); +// messages.add(LocaleLoader.getString("Effects.Template", "Jump Twice", "PRESS SPACE TWICE TO JUMP TWICE")); +// break; +// case THROWING: +// messages.add(LocaleLoader.getString("Effects.Template", "Drop Item", "Randomly drop items, at random")); +// break; +// case WRECKING: +// messages.add(LocaleLoader.getString("Effects.Template", "Ralphinator", "Smash windows with your fists")); +// break; +// case CRAFTING: +// messages.add(LocaleLoader.getString("Effects.Template", "Crafting", "Chance of successful craft")); +// break; +// case WALKING: +// messages.add(LocaleLoader.getString("Effects.Template", "Walk", "Traveling gracefully by foot")); +// break; +// case SWIMMING: +// messages.add(LocaleLoader.getString("Effects.Template", "Swim", "Just keep swimming, swimming, swimming")); +// break; +// case FALLING: +// messages.add(LocaleLoader.getString("Effects.Template", "Skydiving", "Go jump of a cliff. No, seriously.")); +// break; +// case CLIMBING: +// messages.add(LocaleLoader.getString("Effects.Template", "Rock Climber", "Use string to climb mountains faster")); +// break; +// case FLYING: +// messages.add(LocaleLoader.getString("Effects.Template", "Fly", "Throw yourself at the ground and miss")); +// break; +// case DIVING: +// messages.add(LocaleLoader.getString("Effects.Template", "Hold Breath", "Press shift to hold your breath longer")); +// break; +// case PIGGY: +// messages.add(LocaleLoader.getString("Effects.Template", "Carrot Turbo", "Supercharge your pigs with carrots")); +// break; +// } +// +// return messages; +// } +// +// private List statsDisplay(FakeSkillType fakeSkillType) { +// List messages = new ArrayList<>(); +// +// switch (fakeSkillType) { +// case MACHO: +// messages.add(LocaleLoader.formatString("&cDamage Taken: &e{0}%", decimal.format(Misc.getRandom().nextInt(77)))); +// break; +// case JUMPING: +// messages.add(LocaleLoader.formatString("&cDouble Jump Chance: &e{0}%", decimal.format(Misc.getRandom().nextInt(27)))); +// break; +// case THROWING: +// messages.add(LocaleLoader.formatString("&cDrop Item Chance: &e{0}%", decimal.format(Misc.getRandom().nextInt(87)))); +// break; +// case WRECKING: +// messages.add(LocaleLoader.formatString("&cWrecking Chance: &e{0}%", decimal.format(Misc.getRandom().nextInt(14)))); +// break; +// case CRAFTING: +// messages.add(LocaleLoader.formatString("&cCrafting Success: &e{0}%", decimal.format(Misc.getRandom().nextInt(27)))); +// break; +// case WALKING: +// messages.add(LocaleLoader.formatString("&cWalk Chance: &e{0}%", decimal.format(Misc.getRandom().nextInt(27)))); +// break; +// case SWIMMING: +// messages.add(LocaleLoader.formatString("&cSwim Chance: &e{0}%", decimal.format(Misc.getRandom().nextInt(27)))); +// break; +// case FALLING: +// messages.add(LocaleLoader.formatString("&cSkydiving Success: &e{0}%", decimal.format(Misc.getRandom().nextInt(37)))); +// break; +// case CLIMBING: +// messages.add(LocaleLoader.formatString("&cRock Climber Chance: &e{0}%", decimal.format(Misc.getRandom().nextInt(27)))); +// break; +// case FLYING: +// messages.add(LocaleLoader.formatString("&cFly Chance: &e{0}%", decimal.format(Misc.getRandom().nextInt(27)))); +// break; +// case DIVING: +// messages.add(LocaleLoader.formatString("&cHold Breath Chance: &e{0}%", decimal.format(Misc.getRandom().nextInt(27)))); +// break; +// case PIGGY: +// messages.add(LocaleLoader.formatString("&cCarrot Turbo Boost: &e{0}%", decimal.format(Misc.getRandom().nextInt(80)) + 10)); +// break; +// } +// +// return messages; +// } +//} diff --git a/src/main/java/com/gmail/nossr50/commands/skills/ArcheryCommand.java b/src/main/java/com/gmail/nossr50/commands/skills/ArcheryCommand.java index 42f4510f4..59decaf9f 100644 --- a/src/main/java/com/gmail/nossr50/commands/skills/ArcheryCommand.java +++ b/src/main/java/com/gmail/nossr50/commands/skills/ArcheryCommand.java @@ -4,10 +4,10 @@ import com.gmail.nossr50.datatypes.skills.PrimarySkillType; import com.gmail.nossr50.datatypes.skills.SubSkillType; import com.gmail.nossr50.locale.LocaleLoader; import com.gmail.nossr50.skills.archery.Archery; -import com.gmail.nossr50.util.TextComponentFactory; import com.gmail.nossr50.util.skills.CombatUtils; import com.gmail.nossr50.util.skills.SkillActivationType; -import net.md_5.bungee.api.chat.TextComponent; +import com.gmail.nossr50.util.text.TextComponentFactory; +import net.kyori.adventure.text.Component; import org.bukkit.entity.Player; import java.util.ArrayList; @@ -59,7 +59,7 @@ public class ArcheryCommand extends SkillCommand { @Override protected List statsDisplay(Player player, float skillValue, boolean hasEndurance, boolean isLucky) { - List messages = new ArrayList(); + List messages = new ArrayList<>(); if (canRetrieve) { messages.add(getStatMessage(SubSkillType.ARCHERY_ARROW_RETRIEVAL, retrieveChance) @@ -84,8 +84,8 @@ public class ArcheryCommand extends SkillCommand { } @Override - protected List getTextComponents(Player player) { - List textComponents = new ArrayList<>(); + protected List getTextComponents(Player player) { + List textComponents = new ArrayList<>(); TextComponentFactory.getSubSkillTextComponents(player, textComponents, PrimarySkillType.ARCHERY); diff --git a/src/main/java/com/gmail/nossr50/commands/skills/AxesCommand.java b/src/main/java/com/gmail/nossr50/commands/skills/AxesCommand.java index 1ca55780a..d6b5c029a 100644 --- a/src/main/java/com/gmail/nossr50/commands/skills/AxesCommand.java +++ b/src/main/java/com/gmail/nossr50/commands/skills/AxesCommand.java @@ -5,12 +5,12 @@ import com.gmail.nossr50.datatypes.skills.SubSkillType; import com.gmail.nossr50.locale.LocaleLoader; import com.gmail.nossr50.skills.axes.Axes; import com.gmail.nossr50.util.Permissions; -import com.gmail.nossr50.util.TextComponentFactory; import com.gmail.nossr50.util.player.UserManager; import com.gmail.nossr50.util.skills.CombatUtils; import com.gmail.nossr50.util.skills.RankUtils; import com.gmail.nossr50.util.skills.SkillActivationType; -import net.md_5.bungee.api.chat.TextComponent; +import com.gmail.nossr50.util.text.TextComponentFactory; +import net.kyori.adventure.text.Component; import org.bukkit.entity.Player; import java.util.ArrayList; @@ -72,7 +72,7 @@ public class AxesCommand extends SkillCommand { @Override protected List statsDisplay(Player player, float skillValue, boolean hasEndurance, boolean isLucky) { - List messages = new ArrayList(); + List messages = new ArrayList<>(); if (canImpact) { messages.add(LocaleLoader.getString("Ability.Generic.Template", LocaleLoader.getString("Axes.Ability.Bonus.2"), LocaleLoader.getString("Axes.Ability.Bonus.3", impactDamage))); @@ -105,8 +105,8 @@ public class AxesCommand extends SkillCommand { } @Override - protected List getTextComponents(Player player) { - List textComponents = new ArrayList<>(); + protected List getTextComponents(Player player) { + List textComponents = new ArrayList<>(); TextComponentFactory.getSubSkillTextComponents(player, textComponents, PrimarySkillType.AXES); diff --git a/src/main/java/com/gmail/nossr50/commands/skills/ExcavationCommand.java b/src/main/java/com/gmail/nossr50/commands/skills/ExcavationCommand.java index 2d9093311..de7341e93 100644 --- a/src/main/java/com/gmail/nossr50/commands/skills/ExcavationCommand.java +++ b/src/main/java/com/gmail/nossr50/commands/skills/ExcavationCommand.java @@ -5,10 +5,10 @@ import com.gmail.nossr50.datatypes.skills.SubSkillType; import com.gmail.nossr50.locale.LocaleLoader; import com.gmail.nossr50.skills.excavation.ExcavationManager; import com.gmail.nossr50.util.Permissions; -import com.gmail.nossr50.util.TextComponentFactory; import com.gmail.nossr50.util.player.UserManager; import com.gmail.nossr50.util.skills.RankUtils; -import net.md_5.bungee.api.chat.TextComponent; +import com.gmail.nossr50.util.text.TextComponentFactory; +import net.kyori.adventure.text.Component; import org.bukkit.entity.Player; import java.util.ArrayList; @@ -29,7 +29,7 @@ public class ExcavationCommand extends SkillCommand { protected void dataCalculations(Player player, float skillValue) { // GIGA DRILL BREAKER if (canGigaDrill) { - String gigaDrillStrings[] = calculateLengthDisplayValues(player, skillValue); + String[] gigaDrillStrings = calculateLengthDisplayValues(player, skillValue); gigaDrillBreakerLength = gigaDrillStrings[0]; gigaDrillBreakerLengthEndurance = gigaDrillStrings[1]; } @@ -43,7 +43,7 @@ public class ExcavationCommand extends SkillCommand { @Override protected List statsDisplay(Player player, float skillValue, boolean hasEndurance, boolean isLucky) { - List messages = new ArrayList(); + List messages = new ArrayList<>(); ExcavationManager excavationManager = UserManager.getPlayer(player).getExcavationManager(); @@ -66,8 +66,8 @@ public class ExcavationCommand extends SkillCommand { } @Override - protected List getTextComponents(Player player) { - List textComponents = new ArrayList<>(); + protected List getTextComponents(Player player) { + List textComponents = new ArrayList<>(); TextComponentFactory.getSubSkillTextComponents(player, textComponents, PrimarySkillType.EXCAVATION); diff --git a/src/main/java/com/gmail/nossr50/commands/skills/FishingCommand.java b/src/main/java/com/gmail/nossr50/commands/skills/FishingCommand.java index c6c1b0e5b..f22f8399e 100644 --- a/src/main/java/com/gmail/nossr50/commands/skills/FishingCommand.java +++ b/src/main/java/com/gmail/nossr50/commands/skills/FishingCommand.java @@ -1,21 +1,18 @@ package com.gmail.nossr50.commands.skills; -import com.gmail.nossr50.config.AdvancedConfig; -import com.gmail.nossr50.config.treasure.TreasureConfig; +import com.gmail.nossr50.config.treasure.FishingTreasureConfig; import com.gmail.nossr50.datatypes.skills.PrimarySkillType; import com.gmail.nossr50.datatypes.skills.SubSkillType; import com.gmail.nossr50.datatypes.treasure.Rarity; import com.gmail.nossr50.locale.LocaleLoader; -import com.gmail.nossr50.skills.fishing.Fishing; +import com.gmail.nossr50.mcMMO; import com.gmail.nossr50.skills.fishing.FishingManager; -import com.gmail.nossr50.util.Permissions; -import com.gmail.nossr50.util.TextComponentFactory; import com.gmail.nossr50.util.player.UserManager; import com.gmail.nossr50.util.random.RandomChanceUtil; import com.gmail.nossr50.util.skills.RankUtils; -import net.md_5.bungee.api.chat.TextComponent; -import org.bukkit.Location; -import org.bukkit.entity.EntityType; +import com.gmail.nossr50.util.text.StringUtils; +import com.gmail.nossr50.util.text.TextComponentFactory; +import net.kyori.adventure.text.Component; import org.bukkit.entity.Player; import java.util.ArrayList; @@ -26,15 +23,13 @@ public class FishingCommand extends SkillCommand { 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 mythicTreasure; private String magicChance; @@ -45,6 +40,8 @@ public class FishingCommand extends SkillCommand { private boolean canMasterAngler; private boolean canIceFish; + private String maMinWaitTime, maMaxWaitTime; + public FishingCommand() { super(PrimarySkillType.FISHING); } @@ -58,19 +55,19 @@ public class FishingCommand extends SkillCommand { lootTier = fishingManager.getLootTier(); // Item 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); + commonTreasure = percent.format(FishingTreasureConfig.getInstance().getItemDropRate(lootTier, Rarity.COMMON) / 100.0); + uncommonTreasure = percent.format(FishingTreasureConfig.getInstance().getItemDropRate(lootTier, Rarity.UNCOMMON) / 100.0); + rareTreasure = percent.format(FishingTreasureConfig.getInstance().getItemDropRate(lootTier, Rarity.RARE) / 100.0); + epicTreasure = percent.format(FishingTreasureConfig.getInstance().getItemDropRate(lootTier, Rarity.EPIC) / 100.0); + legendaryTreasure = percent.format(FishingTreasureConfig.getInstance().getItemDropRate(lootTier, Rarity.LEGENDARY) / 100.0); + mythicTreasure = percent.format(FishingTreasureConfig.getInstance().getItemDropRate(lootTier, Rarity.MYTHIC) / 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 (rarity != Rarity.MYTHIC) { + totalEnchantChance += FishingTreasureConfig.getInstance().getEnchantmentDropRate(lootTier, rarity); } } @@ -94,25 +91,8 @@ public class FishingCommand extends SkillCommand { // 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); + maMinWaitTime = StringUtils.ticksToSeconds(fishingManager.getMasterAnglerTickMinWaitReduction(RankUtils.getRank(player, SubSkillType.FISHING_MASTER_ANGLER), false)); + maMaxWaitTime = StringUtils.ticksToSeconds(fishingManager.getMasterAnglerTickMaxWaitReduction(RankUtils.getRank(player, SubSkillType.FISHING_MASTER_ANGLER), false, 0)); } } @@ -122,13 +102,13 @@ public class FishingCommand extends SkillCommand { 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); + canMasterAngler = mcMMO.getCompatibilityManager().getMasterAnglerCompatibilityLayer() != null && canUseSubskill(player, SubSkillType.FISHING_MASTER_ANGLER); canIceFish = canUseSubskill(player, SubSkillType.FISHING_ICE_FISHING); } @Override protected List statsDisplay(Player player, float skillValue, boolean hasEndurance, boolean isLucky) { - List messages = new ArrayList(); + List messages = new ArrayList<>(); if (canFishermansDiet) { messages.add(getStatMessage(false, true, SubSkillType.FISHING_FISHERMANS_DIET, String.valueOf(fishermansDietRank))); @@ -143,8 +123,13 @@ public class FishingCommand extends SkillCommand { } if (canMasterAngler) { - //TODO: Update this with more details - messages.add(getStatMessage(false, true, SubSkillType.FISHING_MASTER_ANGLER, biteChance)); + messages.add(getStatMessage(false,true, + SubSkillType.FISHING_MASTER_ANGLER, + maMinWaitTime)); + + messages.add(getStatMessage(true,true, + SubSkillType.FISHING_MASTER_ANGLER, + maMaxWaitTime)); } if (canShake) { @@ -160,15 +145,15 @@ public class FishingCommand extends SkillCommand { String.valueOf(rareTreasure), String.valueOf(epicTreasure), String.valueOf(legendaryTreasure), - String.valueOf(recordTreasure))); + String.valueOf(mythicTreasure))); } return messages; } @Override - protected List getTextComponents(Player player) { - List textComponents = new ArrayList<>(); + protected List getTextComponents(Player player) { + List textComponents = new ArrayList<>(); TextComponentFactory.getSubSkillTextComponents(player, textComponents, PrimarySkillType.FISHING); diff --git a/src/main/java/com/gmail/nossr50/commands/skills/HerbalismCommand.java b/src/main/java/com/gmail/nossr50/commands/skills/HerbalismCommand.java index caff87ad5..eba4520a7 100644 --- a/src/main/java/com/gmail/nossr50/commands/skills/HerbalismCommand.java +++ b/src/main/java/com/gmail/nossr50/commands/skills/HerbalismCommand.java @@ -3,11 +3,12 @@ package com.gmail.nossr50.commands.skills; import com.gmail.nossr50.datatypes.skills.PrimarySkillType; import com.gmail.nossr50.datatypes.skills.SubSkillType; import com.gmail.nossr50.locale.LocaleLoader; +import com.gmail.nossr50.mcMMO; import com.gmail.nossr50.util.Permissions; -import com.gmail.nossr50.util.TextComponentFactory; import com.gmail.nossr50.util.skills.RankUtils; import com.gmail.nossr50.util.skills.SkillActivationType; -import net.md_5.bungee.api.chat.TextComponent; +import com.gmail.nossr50.util.text.TextComponentFactory; +import net.kyori.adventure.text.Component; import org.bukkit.Material; import org.bukkit.entity.Player; @@ -45,7 +46,7 @@ public class HerbalismCommand extends SkillCommand { // DOUBLE DROPS if (canDoubleDrop) { - String[] doubleDropStrings = getAbilityDisplayValues(SkillActivationType.RANDOM_LINEAR_100_SCALE_WITH_CAP, player, SubSkillType.HERBALISM_DOUBLE_DROPS);; + String[] doubleDropStrings = getAbilityDisplayValues(SkillActivationType.RANDOM_LINEAR_100_SCALE_WITH_CAP, player, SubSkillType.HERBALISM_DOUBLE_DROPS); doubleDropChance = doubleDropStrings[0]; doubleDropChanceLucky = doubleDropStrings[1]; } @@ -90,16 +91,16 @@ public class HerbalismCommand extends SkillCommand { 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)); + 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.BEETROOTS) || 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(); + canDoubleDrop = canUseSubskill(player, SubSkillType.HERBALISM_DOUBLE_DROPS) && !mcMMO.p.getGeneralConfig().getDoubleDropsDisabled(skill); canShroomThumb = canUseSubskill(player, SubSkillType.HERBALISM_SHROOM_THUMB); } @Override protected List statsDisplay(Player player, float skillValue, boolean hasEndurance, boolean isLucky) { - List messages = new ArrayList(); + List messages = new ArrayList<>(); if (canDoubleDrop) { messages.add(getStatMessage(SubSkillType.HERBALISM_DOUBLE_DROPS, doubleDropChance) @@ -141,8 +142,8 @@ public class HerbalismCommand extends SkillCommand { } @Override - protected List getTextComponents(Player player) { - List textComponents = new ArrayList<>(); + protected List getTextComponents(Player player) { + List textComponents = new ArrayList<>(); TextComponentFactory.getSubSkillTextComponents(player, textComponents, PrimarySkillType.HERBALISM); diff --git a/src/main/java/com/gmail/nossr50/commands/skills/MiningCommand.java b/src/main/java/com/gmail/nossr50/commands/skills/MiningCommand.java index 7e7c5d5c6..5e7a14a7a 100644 --- a/src/main/java/com/gmail/nossr50/commands/skills/MiningCommand.java +++ b/src/main/java/com/gmail/nossr50/commands/skills/MiningCommand.java @@ -5,11 +5,11 @@ import com.gmail.nossr50.datatypes.skills.SubSkillType; import com.gmail.nossr50.locale.LocaleLoader; import com.gmail.nossr50.skills.mining.MiningManager; import com.gmail.nossr50.util.Permissions; -import com.gmail.nossr50.util.TextComponentFactory; import com.gmail.nossr50.util.player.UserManager; import com.gmail.nossr50.util.skills.RankUtils; import com.gmail.nossr50.util.skills.SkillActivationType; -import net.md_5.bungee.api.chat.TextComponent; +import com.gmail.nossr50.util.text.TextComponentFactory; +import net.kyori.adventure.text.Component; import org.bukkit.entity.Player; import java.util.ArrayList; @@ -78,7 +78,7 @@ public class MiningCommand extends SkillCommand { @Override protected List statsDisplay(Player player, float skillValue, boolean hasEndurance, boolean isLucky) { - List messages = new ArrayList(); + List messages = new ArrayList<>(); if (canBiggerBombs) { messages.add(getStatMessage(true, true, SubSkillType.MINING_BLAST_MINING, String.valueOf(blastRadiusIncrease))); @@ -111,8 +111,8 @@ public class MiningCommand extends SkillCommand { } @Override - protected List getTextComponents(Player player) { - List textComponents = new ArrayList<>(); + protected List getTextComponents(Player player) { + List textComponents = new ArrayList<>(); TextComponentFactory.getSubSkillTextComponents(player, textComponents, PrimarySkillType.MINING); diff --git a/src/main/java/com/gmail/nossr50/commands/skills/MmoInfoCommand.java b/src/main/java/com/gmail/nossr50/commands/skills/MmoInfoCommand.java index 95dc29458..d3090f46b 100644 --- a/src/main/java/com/gmail/nossr50/commands/skills/MmoInfoCommand.java +++ b/src/main/java/com/gmail/nossr50/commands/skills/MmoInfoCommand.java @@ -1,18 +1,18 @@ package com.gmail.nossr50.commands.skills; -import com.gmail.nossr50.datatypes.skills.PrimarySkillType; import com.gmail.nossr50.datatypes.skills.SubSkillType; -import com.gmail.nossr50.datatypes.skills.subskills.AbstractSubSkill; import com.gmail.nossr50.listeners.InteractionManager; import com.gmail.nossr50.locale.LocaleLoader; +import com.gmail.nossr50.mcMMO; import com.gmail.nossr50.util.Permissions; -import com.gmail.nossr50.util.TextComponentFactory; +import com.gmail.nossr50.util.text.TextComponentFactory; 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 org.jetbrains.annotations.NotNull; import java.util.ArrayList; import java.util.List; @@ -23,7 +23,7 @@ import java.util.List; public class MmoInfoCommand implements TabExecutor { @Override - public boolean onCommand(CommandSender commandSender, Command command, String s, String[] args) { + public boolean onCommand(@NotNull CommandSender commandSender, @NotNull Command command, @NotNull String s, String[] args) { /* * Only allow players to use this command */ @@ -45,7 +45,7 @@ public class MmoInfoCommand implements TabExecutor { 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])) + } else if(InteractionManager.getAbstractByName(args[0]) != null || mcMMO.p.getSkillTools().EXACT_SUBSKILL_NAMES.contains(args[0])) { displayInfo(player, args[0]); return true; @@ -61,33 +61,19 @@ public class MmoInfoCommand implements TabExecutor { } @Override - public List onTabComplete(CommandSender sender, Command command, String alias, String[] args) { - switch (args.length) { - case 1: - return StringUtil.copyPartialMatches(args[0], PrimarySkillType.SUBSKILL_NAMES, new ArrayList(PrimarySkillType.SUBSKILL_NAMES.size())); - default: - return ImmutableList.of(); + public List onTabComplete(@NotNull CommandSender sender, @NotNull Command command, @NotNull String alias, String[] args) { + if (args.length == 1) { + return StringUtil.copyPartialMatches(args[0], mcMMO.p.getSkillTools().EXACT_SUBSKILL_NAMES, new ArrayList<>(mcMMO.p.getSkillTools().EXACT_SUBSKILL_NAMES.size())); } + 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")); - } + 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()) { diff --git a/src/main/java/com/gmail/nossr50/commands/skills/RepairCommand.java b/src/main/java/com/gmail/nossr50/commands/skills/RepairCommand.java index 1e590e644..1941357d0 100644 --- a/src/main/java/com/gmail/nossr50/commands/skills/RepairCommand.java +++ b/src/main/java/com/gmail/nossr50/commands/skills/RepairCommand.java @@ -10,11 +10,11 @@ import com.gmail.nossr50.skills.repair.Repair; import com.gmail.nossr50.skills.repair.RepairManager; import com.gmail.nossr50.skills.repair.repairables.Repairable; import com.gmail.nossr50.util.Permissions; -import com.gmail.nossr50.util.TextComponentFactory; import com.gmail.nossr50.util.player.UserManager; import com.gmail.nossr50.util.skills.RankUtils; import com.gmail.nossr50.util.skills.SkillActivationType; -import net.md_5.bungee.api.chat.TextComponent; +import com.gmail.nossr50.util.text.TextComponentFactory; +import net.kyori.adventure.text.Component; import org.bukkit.Material; import org.bukkit.entity.Player; @@ -91,7 +91,7 @@ public class RepairCommand extends SkillCommand { @Override protected List statsDisplay(Player player, float skillValue, boolean hasEndurance, boolean isLucky) { - List messages = new ArrayList(); + List messages = new ArrayList<>(); if (canArcaneForge) { RepairManager repairManager = UserManager.getPlayer(player).getRepairManager(); @@ -121,8 +121,8 @@ public class RepairCommand extends SkillCommand { } @Override - protected List getTextComponents(Player player) { - List textComponents = new ArrayList<>(); + protected List getTextComponents(Player player) { + List textComponents = new ArrayList<>(); TextComponentFactory.getSubSkillTextComponents(player, textComponents, PrimarySkillType.REPAIR); diff --git a/src/main/java/com/gmail/nossr50/commands/skills/SalvageCommand.java b/src/main/java/com/gmail/nossr50/commands/skills/SalvageCommand.java index 6d16655b7..770299951 100644 --- a/src/main/java/com/gmail/nossr50/commands/skills/SalvageCommand.java +++ b/src/main/java/com/gmail/nossr50/commands/skills/SalvageCommand.java @@ -5,10 +5,10 @@ import com.gmail.nossr50.datatypes.skills.SubSkillType; import com.gmail.nossr50.locale.LocaleLoader; import com.gmail.nossr50.skills.salvage.Salvage; import com.gmail.nossr50.skills.salvage.SalvageManager; -import com.gmail.nossr50.util.TextComponentFactory; import com.gmail.nossr50.util.player.UserManager; import com.gmail.nossr50.util.skills.RankUtils; -import net.md_5.bungee.api.chat.TextComponent; +import com.gmail.nossr50.util.text.TextComponentFactory; +import net.kyori.adventure.text.Component; import org.bukkit.entity.Player; import java.util.ArrayList; @@ -36,7 +36,7 @@ public class SalvageCommand extends SkillCommand { @Override protected List statsDisplay(Player player, float skillValue, boolean hasEndurance, boolean isLucky) { - List messages = new ArrayList(); + List messages = new ArrayList<>(); SalvageManager salvageManager = UserManager.getPlayer(player).getSalvageManager(); if (canScrapCollector) { @@ -64,8 +64,8 @@ public class SalvageCommand extends SkillCommand { } @Override - protected List getTextComponents(Player player) { - List textComponents = new ArrayList<>(); + protected List getTextComponents(Player player) { + List textComponents = new ArrayList<>(); TextComponentFactory.getSubSkillTextComponents(player, textComponents, PrimarySkillType.SALVAGE); diff --git a/src/main/java/com/gmail/nossr50/commands/skills/SkillCommand.java b/src/main/java/com/gmail/nossr50/commands/skills/SkillCommand.java index 1241b9e11..df3f8a8a4 100644 --- a/src/main/java/com/gmail/nossr50/commands/skills/SkillCommand.java +++ b/src/main/java/com/gmail/nossr50/commands/skills/SkillCommand.java @@ -1,15 +1,12 @@ package com.gmail.nossr50.commands.skills; -import com.gmail.nossr50.config.AdvancedConfig; -import com.gmail.nossr50.config.Config; import com.gmail.nossr50.datatypes.player.McMMOPlayer; import com.gmail.nossr50.datatypes.skills.PrimarySkillType; import com.gmail.nossr50.datatypes.skills.SubSkillType; import com.gmail.nossr50.locale.LocaleLoader; +import com.gmail.nossr50.mcMMO; import com.gmail.nossr50.skills.child.FamilyTree; import com.gmail.nossr50.util.Permissions; -import com.gmail.nossr50.util.StringUtils; -import com.gmail.nossr50.util.TextComponentFactory; import com.gmail.nossr50.util.commands.CommandUtils; import com.gmail.nossr50.util.player.NotificationManager; import com.gmail.nossr50.util.player.UserManager; @@ -18,14 +15,18 @@ import com.gmail.nossr50.util.scoreboards.ScoreboardManager; import com.gmail.nossr50.util.skills.PerksUtils; import com.gmail.nossr50.util.skills.RankUtils; import com.gmail.nossr50.util.skills.SkillActivationType; +import com.gmail.nossr50.util.skills.SkillTools; +import com.gmail.nossr50.util.text.StringUtils; +import com.gmail.nossr50.util.text.TextComponentFactory; import com.google.common.collect.ImmutableList; +import net.kyori.adventure.text.Component; 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 org.jetbrains.annotations.NotNull; import java.text.DecimalFormat; import java.util.ArrayList; @@ -35,21 +36,21 @@ import java.util.Set; public abstract class SkillCommand implements TabExecutor { protected PrimarySkillType skill; - private String skillName; + private final String skillName; protected DecimalFormat percent = new DecimalFormat("##0.00%"); protected DecimalFormat decimal = new DecimalFormat("##0.00"); - private CommandExecutor skillGuideCommand; + private final CommandExecutor skillGuideCommand; public SkillCommand(PrimarySkillType skill) { this.skill = skill; - skillName = skill.getName(); + skillName = mcMMO.p.getSkillTools().getLocalizedSkillName(skill); skillGuideCommand = new SkillGuideCommand(skill); } @Override - public boolean onCommand(CommandSender sender, Command command, String label, String[] args) { + public boolean onCommand(@NotNull CommandSender sender, @NotNull Command command, @NotNull String label, String[] args) { if (CommandUtils.noConsoleUsage(sender)) { return true; } @@ -58,70 +59,78 @@ public abstract class SkillCommand implements TabExecutor { return true; } - if(UserManager.getPlayer((Player) sender) == null) - { + Player player = (Player) sender; + McMMOPlayer mcMMOPlayer = UserManager.getPlayer(player); + + if (mcMMOPlayer == null) { sender.sendMessage(LocaleLoader.getString("Profile.PendingLoad")); return true; } - switch (args.length) { - case 0: - Player player = (Player) sender; - McMMOPlayer mcMMOPlayer = UserManager.getPlayer(player); + if (args.length == 0) { + boolean isLucky = Permissions.lucky(player, skill); + boolean hasEndurance = PerksUtils.handleActivationPerks(player, 0, 0) != 0; + float skillValue = mcMMOPlayer.getSkillLevel(skill); - 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 (mcMMO.p.getAdvancedConfig().doesSkillCommandSendBlankLines()) + for (int i = 0; i < 2; i++) { + player.sendMessage(""); + } - //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); - permissionsCheck(player); - dataCalculations(player, skillValue); + sendSkillCommandHeader(player, mcMMOPlayer, (int) skillValue); - sendSkillCommandHeader(player, mcMMOPlayer, (int) skillValue); + //Make JSON text components + List subskillTextComponents = getTextComponents(player); - //Make JSON text components - List subskillTextComponents = getTextComponents(player); + //Subskills Header + player.sendMessage(LocaleLoader.getString("Skills.Overhaul.Header", LocaleLoader.getString("Effects.SubSkills.Overhaul"))); - //Subskills Header - player.sendMessage(LocaleLoader.getString("Skills.Overhaul.Header", LocaleLoader.getString("Effects.SubSkills.Overhaul"))); + //Send JSON text components - //Send JSON text components - - TextComponentFactory.sendPlayerSubSkillList(player, subskillTextComponents); + TextComponentFactory.sendPlayerSubSkillList(player, subskillTextComponents); /*for(TextComponent tc : subskillTextComponents) { player.spigot().sendMessage(new TextComponent[]{tc, new TextComponent(": TESTING")}); }*/ - //Stats - getStatMessages(player, isLucky, hasEndurance, skillValue); + //Stats + getStatMessages(player, isLucky, hasEndurance, skillValue); - //Header + //Header - //Link Header - if(Config.getInstance().getUrlLinksEnabled()) - { - player.sendMessage(LocaleLoader.getString("Overhaul.mcMMO.Header")); - TextComponentFactory.sendPlayerUrlHeader(player); - } + //Link Header + if (mcMMO.p.getGeneralConfig().getUrlLinksEnabled()) { + player.sendMessage(LocaleLoader.getString("Overhaul.mcMMO.Header")); + TextComponentFactory.sendPlayerUrlHeader(player); + } - if (Config.getInstance().getScoreboardsEnabled() && Config.getInstance().getSkillUseBoard()) { - ScoreboardManager.enablePlayerSkillScoreboard(player, skill); - } + if (mcMMO.p.getGeneralConfig().getScoreboardsEnabled() && mcMMO.p.getGeneralConfig().getSkillUseBoard()) { + ScoreboardManager.enablePlayerSkillScoreboard(player, skill); + } + return true; + } else if ("keep".equals(args[0].toLowerCase())) { + if (!mcMMO.p.getGeneralConfig().getAllowKeepBoard() + || !mcMMO.p.getGeneralConfig().getScoreboardsEnabled() + || !mcMMO.p.getGeneralConfig().getSkillUseBoard()) { + sender.sendMessage(LocaleLoader.getString("Commands.Disabled")); return true; - default: - return skillGuideCommand.onCommand(sender, command, label, args); + } + + ScoreboardManager.enablePlayerSkillScoreboard(player, skill); + ScoreboardManager.keepBoard(sender.getName()); + sender.sendMessage(LocaleLoader.getString("Commands.Scoreboard.Keep")); + return true; } + + return skillGuideCommand.onCommand(sender, command, label, args); } private void getStatMessages(Player player, boolean isLucky, boolean hasEndurance, float skillValue) { @@ -146,7 +155,7 @@ public abstract class SkillCommand implements TabExecutor { player.sendMessage(LocaleLoader.getString("Skills.Overhaul.Header", skillName)); - if(!skill.isChildSkill()) + if(!SkillTools.isChildSkill(skill)) { /* * NON-CHILD SKILLS @@ -165,37 +174,34 @@ public abstract class SkillCommand implements TabExecutor { Set parents = FamilyTree.getParents(skill); - ArrayList 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)))*/; - } + /*player.sendMessage(parent.getName() + " - " + LocaleLoader.getString("Effects.Level.Overhaul", mcMMOPlayer.getSkillLevel(parent), mcMMOPlayer.getSkillXpLevel(parent), mcMMOPlayer.getXpToLevel(parent)))*/ + ArrayList parentList = new ArrayList<>(parents); - String parentMessage = ""; + StringBuilder parentMessage = new StringBuilder(); 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+", "; + parentMessage.append(LocaleLoader.getString("Effects.Child.ParentList", mcMMO.p.getSkillTools().getLocalizedSkillName(parentList.get(i)), mcMMOPlayer.getSkillLevel(parentList.get(i)))); + parentMessage.append(ChatColor.GRAY).append(", "); } else { - parentMessage += LocaleLoader.getString("Effects.Child.ParentList", parentList.get(i).getName(), mcMMOPlayer.getSkillLevel(parentList.get(i))); + parentMessage.append(LocaleLoader.getString("Effects.Child.ParentList", mcMMO.p.getSkillTools().getLocalizedSkillName(parentList.get(i)), 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)); + player.sendMessage(LocaleLoader.getString("Effects.Child.Overhaul", skillValue, parentMessage.toString())); //LEVEL //player.sendMessage(LocaleLoader.getString("Effects.Child.Overhaul", skillValue, skillValue)); } /* - if (!skill.isChildSkill()) { + if (!SkillTools.isChildSkill(skill)) { 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))); @@ -215,13 +221,11 @@ public abstract class SkillCommand implements TabExecutor { } @Override - public List onTabComplete(CommandSender sender, Command command, String alias, String[] args) { - switch (args.length) { - case 1: - return ImmutableList.of("?"); - default: - return ImmutableList.of(); + public List onTabComplete(@NotNull CommandSender sender, @NotNull Command command, @NotNull String alias, String[] args) { + if (args.length == 1) { + return ImmutableList.of("?", "keep"); } + return ImmutableList.of(); } protected int calculateRank(float skillValue, int maxLevel, int rankChangeLevel) { @@ -233,9 +237,9 @@ public abstract class SkillCommand implements TabExecutor { } protected String[] calculateLengthDisplayValues(Player player, float skillValue) { - int maxLength = skill.getAbility().getMaxLength(); - int abilityLengthVar = AdvancedConfig.getInstance().getAbilityLength(); - int abilityLengthCap = AdvancedConfig.getInstance().getAbilityLengthCap(); + int maxLength = mcMMO.p.getSkillTools().getSuperAbilityMaxLength(mcMMO.p.getSkillTools().getSuperAbility(skill)); + int abilityLengthVar = mcMMO.p.getAdvancedConfig().getAbilityLength(); + int abilityLengthCap = mcMMO.p.getAdvancedConfig().getAbilityLengthCap(); int length; @@ -276,7 +280,7 @@ public abstract class SkillCommand implements TabExecutor { } protected String getLimitBreakDescriptionParameter() { - if(AdvancedConfig.getInstance().canApplyLimitBreakPVE()) { + if(mcMMO.p.getAdvancedConfig().canApplyLimitBreakPVE()) { return "(PVP/PVE)"; } else { return "(PVP)"; @@ -291,7 +295,7 @@ public abstract class SkillCommand implements TabExecutor { protected abstract List statsDisplay(Player player, float skillValue, boolean hasEndurance, boolean isLucky); - protected abstract List getTextComponents(Player player); + protected abstract List getTextComponents(Player player); /** * Checks if a player can use a skill diff --git a/src/main/java/com/gmail/nossr50/commands/skills/SkillGuideCommand.java b/src/main/java/com/gmail/nossr50/commands/skills/SkillGuideCommand.java index 6f34f77b1..ed471f188 100644 --- a/src/main/java/com/gmail/nossr50/commands/skills/SkillGuideCommand.java +++ b/src/main/java/com/gmail/nossr50/commands/skills/SkillGuideCommand.java @@ -2,27 +2,29 @@ package com.gmail.nossr50.commands.skills; import com.gmail.nossr50.datatypes.skills.PrimarySkillType; import com.gmail.nossr50.locale.LocaleLoader; -import com.gmail.nossr50.util.StringUtils; +import com.gmail.nossr50.mcMMO; +import com.gmail.nossr50.util.text.StringUtils; import org.bukkit.command.Command; import org.bukkit.command.CommandExecutor; import org.bukkit.command.CommandSender; +import org.jetbrains.annotations.NotNull; import java.util.ArrayList; import java.util.Arrays; public class SkillGuideCommand implements CommandExecutor { - private String header; - private ArrayList guide; + private final String header; + private final ArrayList guide; - private String invalidPage = LocaleLoader.getString("Guides.Page.Invalid"); + private final String invalidPage = LocaleLoader.getString("Guides.Page.Invalid"); public SkillGuideCommand(PrimarySkillType skill) { - header = LocaleLoader.getString("Guides.Header", skill.getName()); + header = LocaleLoader.getString("Guides.Header", mcMMO.p.getSkillTools().getLocalizedSkillName(skill)); guide = getGuide(skill); } @Override - public boolean onCommand(CommandSender sender, Command command, String label, String[] args) { + public boolean onCommand(@NotNull CommandSender sender, @NotNull Command command, @NotNull String label, String[] args) { switch (args.length) { case 1: if (!args[0].equals("?")) { @@ -67,7 +69,7 @@ public class SkillGuideCommand implements CommandExecutor { private ArrayList grabPageContents(int page) { int pageIndexStart = 8 * (page - 1); // Determine what string to start at - ArrayList allStrings = new ArrayList(); + ArrayList allStrings = new ArrayList<>(); allStrings.add(header); @@ -86,7 +88,7 @@ public class SkillGuideCommand implements CommandExecutor { } private ArrayList getGuide(PrimarySkillType skill) { - ArrayList guide = new ArrayList(); + ArrayList guide = new ArrayList<>(); for (int i = 0; i < 10; i++) { String[] section = LocaleLoader.getString("Guides." + StringUtils.getCapitalized(skill.toString()) + ".Section." + i).split("\n"); diff --git a/src/main/java/com/gmail/nossr50/commands/skills/SmeltingCommand.java b/src/main/java/com/gmail/nossr50/commands/skills/SmeltingCommand.java index b688691c6..55544acc2 100644 --- a/src/main/java/com/gmail/nossr50/commands/skills/SmeltingCommand.java +++ b/src/main/java/com/gmail/nossr50/commands/skills/SmeltingCommand.java @@ -4,11 +4,11 @@ import com.gmail.nossr50.datatypes.skills.PrimarySkillType; import com.gmail.nossr50.datatypes.skills.SubSkillType; import com.gmail.nossr50.locale.LocaleLoader; import com.gmail.nossr50.util.Permissions; -import com.gmail.nossr50.util.TextComponentFactory; import com.gmail.nossr50.util.player.UserManager; import com.gmail.nossr50.util.skills.RankUtils; import com.gmail.nossr50.util.skills.SkillActivationType; -import net.md_5.bungee.api.chat.TextComponent; +import com.gmail.nossr50.util.text.TextComponentFactory; +import net.kyori.adventure.text.Component; import org.bukkit.entity.Player; import java.util.ArrayList; @@ -62,7 +62,7 @@ public class SmeltingCommand extends SkillCommand { @Override protected List statsDisplay(Player player, float skillValue, boolean hasEndurance, boolean isLucky) { - List messages = new ArrayList(); + List messages = new ArrayList<>(); /*if (canFluxMine) { messages.add(getStatMessage(SubSkillType.SMELTING_FLUX_MINING, str_fluxMiningChance) @@ -88,8 +88,8 @@ public class SmeltingCommand extends SkillCommand { } @Override - protected List getTextComponents(Player player) { - List textComponents = new ArrayList<>(); + protected List getTextComponents(Player player) { + List textComponents = new ArrayList<>(); TextComponentFactory.getSubSkillTextComponents(player, textComponents, PrimarySkillType.SMELTING); diff --git a/src/main/java/com/gmail/nossr50/commands/skills/SwordsCommand.java b/src/main/java/com/gmail/nossr50/commands/skills/SwordsCommand.java index 0bdeaba9c..954c39024 100644 --- a/src/main/java/com/gmail/nossr50/commands/skills/SwordsCommand.java +++ b/src/main/java/com/gmail/nossr50/commands/skills/SwordsCommand.java @@ -1,16 +1,16 @@ package com.gmail.nossr50.commands.skills; -import com.gmail.nossr50.config.AdvancedConfig; import com.gmail.nossr50.datatypes.skills.PrimarySkillType; import com.gmail.nossr50.datatypes.skills.SubSkillType; import com.gmail.nossr50.locale.LocaleLoader; +import com.gmail.nossr50.mcMMO; import com.gmail.nossr50.util.Permissions; -import com.gmail.nossr50.util.TextComponentFactory; import com.gmail.nossr50.util.player.UserManager; import com.gmail.nossr50.util.skills.CombatUtils; import com.gmail.nossr50.util.skills.RankUtils; import com.gmail.nossr50.util.skills.SkillActivationType; -import net.md_5.bungee.api.chat.TextComponent; +import com.gmail.nossr50.util.text.TextComponentFactory; +import net.kyori.adventure.text.Component; import org.bukkit.entity.Player; import java.util.ArrayList; @@ -19,15 +19,16 @@ 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 String rupturePureTickDamageAgainstPlayers, rupturePureTickDamageAgainstMobs, + ruptureExplosionDamageAgainstPlayers, ruptureExplosionDamageAgainstMobs, + ruptureLengthSecondsAgainstPlayers, ruptureLengthSecondsAgainstMobs, ruptureChanceToApply, ruptureChanceToApplyLucky; + private boolean canCounter; private boolean canSerratedStrike; - private boolean canBleed; + private boolean canRupture; public SwordsCommand() { super(PrimarySkillType.SWORDS); @@ -43,12 +44,19 @@ public class SwordsCommand extends SkillCommand { } // SWORDS_RUPTURE - if (canBleed) { - bleedLength = UserManager.getPlayer(player).getSwordsManager().getRuptureBleedTicks(); + if (canRupture) { + int ruptureRank = RankUtils.getRank(player, SubSkillType.SWORDS_RUPTURE); + ruptureLengthSecondsAgainstPlayers = String.valueOf(mcMMO.p.getAdvancedConfig().getRuptureDurationSeconds(true)); + ruptureLengthSecondsAgainstMobs = String.valueOf(mcMMO.p.getAdvancedConfig().getRuptureDurationSeconds(false)); - String[] bleedStrings = getAbilityDisplayValues(SkillActivationType.RANDOM_LINEAR_100_SCALE_WITH_CAP, player, SubSkillType.SWORDS_RUPTURE); - bleedChance = bleedStrings[0]; - bleedChanceLucky = bleedStrings[1]; + rupturePureTickDamageAgainstPlayers = String.valueOf(mcMMO.p.getAdvancedConfig().getRuptureTickDamage(true, ruptureRank)); + rupturePureTickDamageAgainstMobs = String.valueOf(mcMMO.p.getAdvancedConfig().getRuptureTickDamage(false, ruptureRank)); + + ruptureExplosionDamageAgainstPlayers = String.valueOf(mcMMO.p.getAdvancedConfig().getRuptureExplosionDamage(true, ruptureRank)); + ruptureExplosionDamageAgainstMobs = String.valueOf(mcMMO.p.getAdvancedConfig().getRuptureExplosionDamage(false, ruptureRank)); + + ruptureChanceToApply = String.valueOf(mcMMO.p.getAdvancedConfig().getRuptureChanceToApplyOnHit(ruptureRank) + "%"); + ruptureChanceToApplyLucky = String.valueOf(mcMMO.p.getAdvancedConfig().getRuptureChanceToApplyOnHit(ruptureRank) * 1.33); } // SERRATED STRIKES @@ -61,33 +69,31 @@ public class SwordsCommand extends SkillCommand { @Override protected void permissionsCheck(Player player) { - canBleed = canUseSubskill(player, SubSkillType.SWORDS_RUPTURE); + canRupture = 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 statsDisplay(Player player, float skillValue, boolean hasEndurance, boolean isLucky) { - List messages = new ArrayList(); - - 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(); + List messages = new ArrayList<>(); 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) : "")); + if (canRupture) { + messages.add(getStatMessage(SubSkillType.SWORDS_RUPTURE, ruptureChanceToApply) + + (isLucky ? LocaleLoader.getString("Perks.Lucky.Bonus", ruptureChanceToApplyLucky) : "")); messages.add(getStatMessage(true, true, SubSkillType.SWORDS_RUPTURE, - String.valueOf(ruptureTicks), - String.valueOf(ruptureDamagePlayers), - String.valueOf(ruptureDamageMobs))); + ruptureLengthSecondsAgainstPlayers, + ruptureLengthSecondsAgainstMobs)); - messages.add(LocaleLoader.getString("Swords.Combat.Rupture.Note")); + messages.add(LocaleLoader.getString("Swords.SubSkill.Rupture.Stat.TickDamage", rupturePureTickDamageAgainstPlayers, rupturePureTickDamageAgainstMobs)); +// messages.add(LocaleLoader.getString("Swords.SubSkill.Rupture.Stat.ExplosionDamage", ruptureExplosionDamageAgainstPlayers, ruptureExplosionDamageAgainstMobs)); + + messages.add(LocaleLoader.getString("Swords.Combat.Rupture.Note.Update.One")); } if (canSerratedStrike) { @@ -110,8 +116,8 @@ public class SwordsCommand extends SkillCommand { } @Override - protected List getTextComponents(Player player) { - List textComponents = new ArrayList<>(); + protected List getTextComponents(Player player) { + List textComponents = new ArrayList<>(); TextComponentFactory.getSubSkillTextComponents(player, textComponents, PrimarySkillType.SWORDS); diff --git a/src/main/java/com/gmail/nossr50/commands/skills/TamingCommand.java b/src/main/java/com/gmail/nossr50/commands/skills/TamingCommand.java index fb613544e..35f04f5bc 100644 --- a/src/main/java/com/gmail/nossr50/commands/skills/TamingCommand.java +++ b/src/main/java/com/gmail/nossr50/commands/skills/TamingCommand.java @@ -5,9 +5,9 @@ import com.gmail.nossr50.datatypes.skills.SubSkillType; import com.gmail.nossr50.locale.LocaleLoader; import com.gmail.nossr50.skills.taming.Taming; import com.gmail.nossr50.util.Permissions; -import com.gmail.nossr50.util.TextComponentFactory; import com.gmail.nossr50.util.skills.SkillActivationType; -import net.md_5.bungee.api.chat.TextComponent; +import com.gmail.nossr50.util.text.TextComponentFactory; +import net.kyori.adventure.text.Component; import org.bukkit.entity.EntityType; import org.bukkit.entity.Player; @@ -56,7 +56,7 @@ public class TamingCommand extends SkillCommand { @Override protected List statsDisplay(Player player, float skillValue, boolean hasEndurance, boolean isLucky) { - List messages = new ArrayList(); + List messages = new ArrayList<>(); if (canEnvironmentallyAware) { messages.add(LocaleLoader.getString("Ability.Generic.Template", LocaleLoader.getString("Taming.Ability.Bonus.0"), LocaleLoader.getString("Taming.Ability.Bonus.1"))); @@ -92,8 +92,8 @@ public class TamingCommand extends SkillCommand { } @Override - protected List getTextComponents(Player player) { - List textComponents = new ArrayList<>(); + protected List getTextComponents(Player player) { + List textComponents = new ArrayList<>(); TextComponentFactory.getSubSkillTextComponents(player, textComponents, this.skill); diff --git a/src/main/java/com/gmail/nossr50/commands/skills/UnarmedCommand.java b/src/main/java/com/gmail/nossr50/commands/skills/UnarmedCommand.java index e126cf38c..5f9784be7 100644 --- a/src/main/java/com/gmail/nossr50/commands/skills/UnarmedCommand.java +++ b/src/main/java/com/gmail/nossr50/commands/skills/UnarmedCommand.java @@ -4,12 +4,12 @@ import com.gmail.nossr50.datatypes.skills.PrimarySkillType; import com.gmail.nossr50.datatypes.skills.SubSkillType; import com.gmail.nossr50.locale.LocaleLoader; import com.gmail.nossr50.util.Permissions; -import com.gmail.nossr50.util.TextComponentFactory; import com.gmail.nossr50.util.player.UserManager; import com.gmail.nossr50.util.skills.CombatUtils; import com.gmail.nossr50.util.skills.RankUtils; import com.gmail.nossr50.util.skills.SkillActivationType; -import net.md_5.bungee.api.chat.TextComponent; +import com.gmail.nossr50.util.text.TextComponentFactory; +import net.kyori.adventure.text.Component; import org.bukkit.entity.Player; import java.util.ArrayList; @@ -40,7 +40,7 @@ public class UnarmedCommand extends SkillCommand { 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);; + String[] deflectStrings = getAbilityDisplayValues(SkillActivationType.RANDOM_LINEAR_100_SCALE_WITH_CAP, player, SubSkillType.UNARMED_ARROW_DEFLECT); deflectChance = deflectStrings[0]; deflectChanceLucky = deflectStrings[1]; } @@ -54,14 +54,14 @@ public class UnarmedCommand extends SkillCommand { // UNARMED_DISARM if (canDisarm) { - String[] disarmStrings = getAbilityDisplayValues(SkillActivationType.RANDOM_LINEAR_100_SCALE_WITH_CAP, player, SubSkillType.UNARMED_DISARM);; + 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(); + ironArmBonus = UserManager.getPlayer(player).getUnarmedManager().getSteelArmStyleDamage(); } // IRON GRIP @@ -75,7 +75,7 @@ public class UnarmedCommand extends SkillCommand { @Override protected void permissionsCheck(Player player) { canBerserk = RankUtils.hasUnlockedSubskill(player, SubSkillType.UNARMED_BERSERK) && Permissions.berserk(player); - canIronArm = canUseSubskill(player, SubSkillType.UNARMED_IRON_ARM_STYLE); + canIronArm = canUseSubskill(player, SubSkillType.UNARMED_STEEL_ARM_STYLE); canDeflect = canUseSubskill(player, SubSkillType.UNARMED_ARROW_DEFLECT); canDisarm = canUseSubskill(player, SubSkillType.UNARMED_DISARM); canIronGrip = canUseSubskill(player, SubSkillType.UNARMED_IRON_GRIP); @@ -84,7 +84,7 @@ public class UnarmedCommand extends SkillCommand { @Override protected List statsDisplay(Player player, float skillValue, boolean hasEndurance, boolean isLucky) { - List messages = new ArrayList(); + List messages = new ArrayList<>(); if (canDeflect) { messages.add(getStatMessage(SubSkillType.UNARMED_ARROW_DEFLECT, deflectChance) @@ -123,8 +123,8 @@ public class UnarmedCommand extends SkillCommand { } @Override - protected List getTextComponents(Player player) { - List textComponents = new ArrayList<>(); + protected List getTextComponents(Player player) { + List textComponents = new ArrayList<>(); TextComponentFactory.getSubSkillTextComponents(player, textComponents, PrimarySkillType.UNARMED); diff --git a/src/main/java/com/gmail/nossr50/commands/skills/WoodcuttingCommand.java b/src/main/java/com/gmail/nossr50/commands/skills/WoodcuttingCommand.java index daec5581d..08639c27b 100644 --- a/src/main/java/com/gmail/nossr50/commands/skills/WoodcuttingCommand.java +++ b/src/main/java/com/gmail/nossr50/commands/skills/WoodcuttingCommand.java @@ -3,11 +3,12 @@ package com.gmail.nossr50.commands.skills; import com.gmail.nossr50.datatypes.skills.PrimarySkillType; import com.gmail.nossr50.datatypes.skills.SubSkillType; import com.gmail.nossr50.locale.LocaleLoader; +import com.gmail.nossr50.mcMMO; import com.gmail.nossr50.util.Permissions; -import com.gmail.nossr50.util.TextComponentFactory; import com.gmail.nossr50.util.skills.RankUtils; import com.gmail.nossr50.util.skills.SkillActivationType; -import net.md_5.bungee.api.chat.TextComponent; +import com.gmail.nossr50.util.text.TextComponentFactory; +import net.kyori.adventure.text.Component; import org.bukkit.entity.Player; import java.util.ArrayList; @@ -22,6 +23,7 @@ public class WoodcuttingCommand extends SkillCommand { private boolean canTreeFell; private boolean canLeafBlow; private boolean canDoubleDrop; + private boolean canKnockOnWood; private boolean canSplinter; private boolean canBarkSurgeon; private boolean canNaturesBounty; @@ -46,7 +48,7 @@ public class WoodcuttingCommand extends SkillCommand { } private void setDoubleDropClassicChanceStrings(Player player) { - String[] doubleDropStrings = getAbilityDisplayValues(SkillActivationType.RANDOM_LINEAR_100_SCALE_WITH_CAP, player, SubSkillType.WOODCUTTING_HARVEST_LUMBER);; + String[] doubleDropStrings = getAbilityDisplayValues(SkillActivationType.RANDOM_LINEAR_100_SCALE_WITH_CAP, player, SubSkillType.WOODCUTTING_HARVEST_LUMBER); doubleDropChance = doubleDropStrings[0]; doubleDropChanceLucky = doubleDropStrings[1]; } @@ -54,8 +56,11 @@ public class WoodcuttingCommand extends SkillCommand { @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; + canDoubleDrop = canUseSubskill(player, SubSkillType.WOODCUTTING_HARVEST_LUMBER) + && !mcMMO.p.getGeneralConfig().getDoubleDropsDisabled(skill) + && RankUtils.getRank(player, SubSkillType.WOODCUTTING_HARVEST_LUMBER) >= 1; canLeafBlow = canUseSubskill(player, SubSkillType.WOODCUTTING_LEAF_BLOWER); + canKnockOnWood = canTreeFell && canUseSubskill(player, SubSkillType.WOODCUTTING_KNOCK_ON_WOOD); /*canSplinter = canUseSubskill(player, SubSkillType.WOODCUTTING_SPLINTER); canBarkSurgeon = canUseSubskill(player, SubSkillType.WOODCUTTING_BARK_SURGEON); canNaturesBounty = canUseSubskill(player, SubSkillType.WOODCUTTING_NATURES_BOUNTY);*/ @@ -63,12 +68,24 @@ public class WoodcuttingCommand extends SkillCommand { @Override protected List statsDisplay(Player player, float skillValue, boolean hasEndurance, boolean isLucky) { - List messages = new ArrayList(); + List messages = new ArrayList<>(); if (canDoubleDrop) { messages.add(getStatMessage(SubSkillType.WOODCUTTING_HARVEST_LUMBER, doubleDropChance) + (isLucky ? LocaleLoader.getString("Perks.Lucky.Bonus", doubleDropChanceLucky) : "")); } + + if (canKnockOnWood) { + String lootNote; + + if(RankUtils.hasReachedRank(2, player, SubSkillType.WOODCUTTING_KNOCK_ON_WOOD)) { + lootNote = LocaleLoader.getString("Woodcutting.SubSkill.KnockOnWood.Loot.Rank2"); + } else { + lootNote = LocaleLoader.getString("Woodcutting.SubSkill.KnockOnWood.Loot.Normal"); + } + + messages.add(getStatMessage(SubSkillType.WOODCUTTING_KNOCK_ON_WOOD, lootNote)); + } if (canLeafBlow) { messages.add(LocaleLoader.getString("Ability.Generic.Template", LocaleLoader.getString("Woodcutting.Ability.0"), LocaleLoader.getString("Woodcutting.Ability.1"))); @@ -83,8 +100,8 @@ public class WoodcuttingCommand extends SkillCommand { } @Override - protected List getTextComponents(Player player) { - List textComponents = new ArrayList<>(); + protected List getTextComponents(Player player) { + List textComponents = new ArrayList<>(); TextComponentFactory.getSubSkillTextComponents(player, textComponents, PrimarySkillType.WOODCUTTING); diff --git a/src/main/java/com/gmail/nossr50/config/AdvancedConfig.java b/src/main/java/com/gmail/nossr50/config/AdvancedConfig.java index dccd1a4c8..50b9a0b1f 100644 --- a/src/main/java/com/gmail/nossr50/config/AdvancedConfig.java +++ b/src/main/java/com/gmail/nossr50/config/AdvancedConfig.java @@ -6,170 +6,141 @@ import com.gmail.nossr50.datatypes.skills.subskills.AbstractSubSkill; import com.gmail.nossr50.mcMMO; import net.md_5.bungee.api.ChatColor; +import java.io.File; import java.util.ArrayList; import java.util.List; -public class AdvancedConfig extends AutoUpdateConfigLoader { - private static AdvancedConfig instance; +public class AdvancedConfig extends BukkitConfig { - private AdvancedConfig() { - super("advanced.yml"); - validate(); - } - - public static AdvancedConfig getInstance() { - if (instance == null) { - instance = new AdvancedConfig(); - } - - return instance; + public AdvancedConfig(File dataFolder) { + super("advanced.yml", dataFolder); } @Override - protected boolean validateKeys() { - // Validate all the settings! - List reason = new ArrayList(); + public void initDefaults() { + config.addDefault("Skills.General.StartingLevel", 0); + } + + @Override + protected void validateConfigKeys() { + //TODO: Rewrite legacy validation code + List reason = new ArrayList<>(); /* GENERAL */ if (getAbilityLength() < 1) { - reason.add("Skills.General.Ability.Length..IncreaseLevel should be at least 1!"); + mcMMO.p.getLogger().warning("Skills.General.Ability.Length..IncreaseLevel should be at least 1!"); } if (getEnchantBuff() < 1) { - reason.add("Skills.General.Ability.EnchantBuff should be at least 1!"); + mcMMO.p.getLogger().warning("Skills.General.Ability.EnchantBuff should be at least 1!"); } /* ACROBATICS */ if (getMaximumProbability(SubSkillType.ACROBATICS_DODGE) < 1) { - reason.add("Skills.Acrobatics.Dodge.ChanceMax should be at least 1!"); + mcMMO.p.getLogger().warning("Skills.Acrobatics.Dodge.ChanceMax should be at least 1!"); } if (getMaxBonusLevel(SubSkillType.ACROBATICS_DODGE) < 1) { - reason.add("Skills.Acrobatics.Dodge.MaxBonusLevel should be at least 1!"); + mcMMO.p.getLogger().warning("Skills.Acrobatics.Dodge.MaxBonusLevel should be at least 1!"); } if (getDodgeDamageModifier() <= 1) { - reason.add("Skills.Acrobatics.Dodge.DamageModifier should be greater than 1!"); + mcMMO.p.getLogger().warning("Skills.Acrobatics.Dodge.DamageModifier should be greater than 1!"); } if (getMaximumProbability(SubSkillType.ACROBATICS_ROLL) < 1) { - reason.add("Skills.Acrobatics.Roll.ChanceMax should be at least 1!"); + mcMMO.p.getLogger().warning("Skills.Acrobatics.Roll.ChanceMax should be at least 1!"); } if (getMaxBonusLevel(SubSkillType.ACROBATICS_ROLL) < 1) { - reason.add("Skills.Acrobatics.Roll.MaxBonusLevel should be at least 1!"); + mcMMO.p.getLogger().warning("Skills.Acrobatics.Roll.MaxBonusLevel should be at least 1!"); } if (getRollDamageThreshold() < 0) { - reason.add("Skills.Acrobatics.Roll.DamageThreshold should be at least 0!"); + mcMMO.p.getLogger().warning("Skills.Acrobatics.Roll.DamageThreshold should be at least 0!"); } if (getGracefulRollDamageThreshold() < 0) { - reason.add("Skills.Acrobatics.GracefulRoll.DamageThreshold should be at least 0!"); + mcMMO.p.getLogger().warning("Skills.Acrobatics.GracefulRoll.DamageThreshold should be at least 0!"); } - /* ALCHEMY */ - /*if (getCatalysisUnlockLevel() < 0) { - reason.add("Skills.Alchemy.Catalysis.UnlockLevel should be at least 0!"); - } - - if (getCatalysisMaxBonusLevel() <= getCatalysisUnlockLevel()) { - reason.add("Skills.Alchemy.Catalysis.MaxBonusLevel should be greater than Skills.Alchemy.Catalysis.UnlockLevel!"); - }*/ - if (getCatalysisMinSpeed() <= 0) { - reason.add("Skills.Alchemy.Catalysis.MinSpeed must be greater than 0!"); + mcMMO.p.getLogger().warning("Skills.Alchemy.Catalysis.MinSpeed must be greater than 0!"); } if (getCatalysisMaxSpeed() < getCatalysisMinSpeed()) { - reason.add("Skills.Alchemy.Catalysis.MaxSpeed should be at least Skills.Alchemy.Catalysis.MinSpeed!"); + mcMMO.p.getLogger().warning("Skills.Alchemy.Catalysis.MaxSpeed should be at least Skills.Alchemy.Catalysis.MinSpeed!"); } - /*List alchemyTierList = Arrays.asList(Alchemy.Tier.values()); - for (Alchemy.Tier tier : alchemyTierList) { - if (getConcoctionsTierLevel(tier) < 0) { - reason.add("Skills.Alchemy.Rank_Levels.Rank_" + rank + " should be at least 0!"); - } - - if (tier != Alchemy.Tier.fromNumerical(Alchemy.Tier.values().length)) { - Alchemy.Tier nextTier = alchemyTierList.get(alchemyTierList.indexOf(tier) - 1); - - if (getConcoctionsTierLevel(tier) > getConcoctionsTierLevel(nextTier)) { - reason.add("Skills.Alchemy.Rank_Levels.Rank_" + rank + " should be less than or equal to Skills.Alchemy.Rank_Levels.Rank_" + nextrank + "!"); - } - } - }*/ - /* ARCHERY */ if (getSkillShotRankDamageMultiplier() <= 0) { - reason.add("Skills.Archery.SkillShot.RankDamageMultiplier should be greater than 0!"); + mcMMO.p.getLogger().warning("Skills.Archery.SkillShot.RankDamageMultiplier should be greater than 0!"); } if (getMaximumProbability(SubSkillType.ARCHERY_DAZE) < 1) { - reason.add("Skills.Archery.Daze.ChanceMax should be at least 1!"); + mcMMO.p.getLogger().warning("Skills.Archery.Daze.ChanceMax should be at least 1!"); } if (getMaxBonusLevel(SubSkillType.ARCHERY_DAZE) < 1) { - reason.add("Skills.Archery.Daze.MaxBonusLevel should be at least 1!"); + mcMMO.p.getLogger().warning("Skills.Archery.Daze.MaxBonusLevel should be at least 1!"); } if (getDazeBonusDamage() < 0) { - reason.add("Skills.Archery.Daze.BonusDamage should be at least 0!"); + mcMMO.p.getLogger().warning("Skills.Archery.Daze.BonusDamage should be at least 0!"); } if (getMaximumProbability(SubSkillType.ARCHERY_ARROW_RETRIEVAL) < 1) { - reason.add("Skills.Archery.Retrieve.ChanceMax should be at least 1!"); + mcMMO.p.getLogger().warning("Skills.Archery.Retrieve.ChanceMax should be at least 1!"); } if (getMaxBonusLevel(SubSkillType.ARCHERY_ARROW_RETRIEVAL) < 1) { - reason.add("Skills.Archery.Retrieve.MaxBonusLevel should be at least 1!"); + mcMMO.p.getLogger().warning("Skills.Archery.Retrieve.MaxBonusLevel should be at least 1!"); } if (getForceMultiplier() < 0) { - reason.add("Skills.Archery.ForceMultiplier should be at least 0!"); + mcMMO.p.getLogger().warning("Skills.Archery.ForceMultiplier should be at least 0!"); } /* AXES */ - if(getAxeMasteryRankDamageMultiplier() < 0) - { - reason.add("Skills.Axes.AxeMastery.RankDamageMultiplier should be at least 0!"); + if (getAxeMasteryRankDamageMultiplier() < 0) { + mcMMO.p.getLogger().warning("Skills.Axes.AxeMastery.RankDamageMultiplier should be at least 0!"); } if (getMaximumProbability(SubSkillType.AXES_CRITICAL_STRIKES) < 1) { - reason.add("Skills.Axes.CriticalHit.ChanceMax should be at least 1!"); + mcMMO.p.getLogger().warning("Skills.Axes.CriticalHit.ChanceMax should be at least 1!"); } if (getMaxBonusLevel(SubSkillType.AXES_CRITICAL_STRIKES) < 1) { - reason.add("Skills.Axes.CriticalHit.MaxBonusLevel should be at least 1!"); + mcMMO.p.getLogger().warning("Skills.Axes.CriticalHit.MaxBonusLevel should be at least 1!"); } if (getCriticalStrikesPVPModifier() < 1) { - reason.add("Skills.Axes.CriticalStrikes.PVP_Modifier should be at least 1!"); + mcMMO.p.getLogger().warning("Skills.Axes.CriticalStrikes.PVP_Modifier should be at least 1!"); } if (getCriticalStrikesPVPModifier() < 1) { - reason.add("Skills.Axes.CriticalStrikes.PVE_Modifier should be at least 1!"); + mcMMO.p.getLogger().warning("Skills.Axes.CriticalStrikes.PVE_Modifier should be at least 1!"); } if (getGreaterImpactChance() < 1) { - reason.add("Skills.Axes.GreaterImpact.Chance should be at least 1!"); + mcMMO.p.getLogger().warning("Skills.Axes.GreaterImpact.Chance should be at least 1!"); } if (getGreaterImpactModifier() < 1) { - reason.add("Skills.Axes.GreaterImpact.KnockbackModifier should be at least 1!"); + mcMMO.p.getLogger().warning("Skills.Axes.GreaterImpact.KnockbackModifier should be at least 1!"); } if (getGreaterImpactBonusDamage() < 1) { - reason.add("Skills.Axes.GreaterImpact.BonusDamage should be at least 1!"); + mcMMO.p.getLogger().warning("Skills.Axes.GreaterImpact.BonusDamage should be at least 1!"); } if (getImpactChance() < 1) { - reason.add("Skills.Axes.ArmorImpact.Chance should be at least 1!"); + mcMMO.p.getLogger().warning("Skills.Axes.ArmorImpact.Chance should be at least 1!"); } if (getSkullSplitterModifier() < 1) { - reason.add("Skills.Axes.SkullSplitter.DamageModifier should be at least 1!"); + mcMMO.p.getLogger().warning("Skills.Axes.SkullSplitter.DamageModifier should be at least 1!"); } /* FISHING */ @@ -177,468 +148,276 @@ public class AdvancedConfig extends AutoUpdateConfigLoader { for (int rank : fishingTierList) { if (getFishingTierLevel(tier) < 0) { - reason.add("Skills.Fishing.Rank_Levels.Rank_" + rank + " should be at least 0!"); + mcMMO.p.getLogger().warning("Skills.Fishing.Rank_Levels.Rank_" + rank + " should be at least 0!"); } if (getShakeChance(tier) < 0) { - reason.add("Skills.Fishing.Shake_Chance.Rank_" + rank + " should be at least 0!"); + mcMMO.p.getLogger().warning("Skills.Fishing.Shake_Chance.Rank_" + rank + " should be at least 0!"); } if (getFishingVanillaXPModifier(tier) < 0) { - reason.add("Skills.Fishing.VanillaXPMultiplier.Rank_" + rank + " should be at least 0!"); + mcMMO.p.getLogger().warning("Skills.Fishing.VanillaXPMultiplier.Rank_" + rank + " should be at least 0!"); } if (tier != Fishing.Tier.EIGHT) { Fishing.Tier nextTier = fishingTierList.get(fishingTierList.indexOf(tier) - 1); if (getFishingTierLevel(tier) > getFishingTierLevel(nextTier)) { - reason.add("Skills.Fishing.Rank_Levels.Rank_" + rank + " should be less than or equal to Skills.Fishing.Rank_Levels.Rank_" + nextrank + "!"); + mcMMO.p.getLogger().warning("Skills.Fishing.Rank_Levels.Rank_" + rank + " should be less than or equal to Skills.Fishing.Rank_Levels.Rank_" + nextrank + "!"); } if (getShakeChance(tier) > getShakeChance(nextTier)) { - reason.add("Skills.Fishing.Shake_Chance.Rank_" + rank + " should be less than or equal to Skills.Fishing.Shake_Chance.Rank_" + nextrank + "!"); + mcMMO.p.getLogger().warning("Skills.Fishing.Shake_Chance.Rank_" + rank + " should be less than or equal to Skills.Fishing.Shake_Chance.Rank_" + nextrank + "!"); } if (getFishingVanillaXPModifier(tier) > getFishingVanillaXPModifier(nextTier)) { - reason.add("Skills.Fishing.VanillaXPMultiplier.Rank_" + rank + " should be less than or equal to Skills.Fishing.VanillaXPMultiplier.Rank_" + nextrank + "!"); + mcMMO.p.getLogger().warning("Skills.Fishing.VanillaXPMultiplier.Rank_" + rank + " should be less than or equal to Skills.Fishing.VanillaXPMultiplier.Rank_" + nextrank + "!"); } } }*/ if (getFishermanDietRankChange() < 1) { - reason.add("Skills.Fishing.FishermansDiet.RankChange should be at least 1!"); + mcMMO.p.getLogger().warning("Skills.Fishing.FishermansDiet.RankChange should be at least 1!"); } /*if (getIceFishingUnlockLevel() < 0) { - reason.add("Skills.Fishing.IceFishing.UnlockLevel should be at least 0!"); + mcMMO.p.getLogger().warning("Skills.Fishing.IceFishing.UnlockLevel should be at least 0!"); } if (getMasterAnglerUnlockLevel() < 0) { - reason.add("Skills.Fishing.MasterAngler.UnlockLevel should be at least 0!"); + mcMMO.p.getLogger().warning("Skills.Fishing.MasterAngler.UnlockLevel should be at least 0!"); }*/ if (getMasterAnglerBoatModifier() < 1) { - reason.add("Skills.Fishing.MasterAngler.BoatModifier should be at least 1!"); + mcMMO.p.getLogger().warning("Skills.Fishing.MasterAngler.BoatModifier should be at least 1!"); } if (getMasterAnglerBiomeModifier() < 1) { - reason.add("Skills.Fishing.MasterAngler.BiomeModifier should be at least 1!"); + mcMMO.p.getLogger().warning("Skills.Fishing.MasterAngler.BiomeModifier should be at least 1!"); } /* HERBALISM */ if (getFarmerDietRankChange() < 1) { - reason.add("Skills.Herbalism.FarmersDiet.RankChange should be at least 1!"); + mcMMO.p.getLogger().warning("Skills.Herbalism.FarmersDiet.RankChange should be at least 1!"); } if (getGreenThumbStageChange() < 1) { - reason.add("Skills.Herbalism.GreenThumb.StageChange should be at least 1!"); + mcMMO.p.getLogger().warning("Skills.Herbalism.GreenThumb.StageChange should be at least 1!"); } if (getMaximumProbability(SubSkillType.HERBALISM_GREEN_THUMB) < 1) { - reason.add("Skills.Herbalism.GreenThumb.ChanceMax should be at least 1!"); + mcMMO.p.getLogger().warning("Skills.Herbalism.GreenThumb.ChanceMax should be at least 1!"); } if (getMaxBonusLevel(SubSkillType.HERBALISM_GREEN_THUMB) < 1) { - reason.add("Skills.Herbalism.GreenThumb.MaxBonusLevel should be at least 1!"); + mcMMO.p.getLogger().warning("Skills.Herbalism.GreenThumb.MaxBonusLevel should be at least 1!"); } if (getMaximumProbability(SubSkillType.HERBALISM_DOUBLE_DROPS) < 1) { - reason.add("Skills.Herbalism.DoubleDrops.ChanceMax should be at least 1!"); + mcMMO.p.getLogger().warning("Skills.Herbalism.DoubleDrops.ChanceMax should be at least 1!"); } if (getMaxBonusLevel(SubSkillType.HERBALISM_DOUBLE_DROPS) < 1) { - reason.add("Skills.Herbalism.DoubleDrops.MaxBonusLevel should be at least 1!"); + mcMMO.p.getLogger().warning("Skills.Herbalism.DoubleDrops.MaxBonusLevel should be at least 1!"); } if (getMaximumProbability(SubSkillType.HERBALISM_HYLIAN_LUCK) < 1) { - reason.add("Skills.Herbalism.HylianLuck.ChanceMax should be at least 1!"); + mcMMO.p.getLogger().warning("Skills.Herbalism.HylianLuck.ChanceMax should be at least 1!"); } if (getMaxBonusLevel(SubSkillType.HERBALISM_HYLIAN_LUCK) < 1) { - reason.add("Skills.Herbalism.HylianLuck.MaxBonusLevel should be at least 1!"); + mcMMO.p.getLogger().warning("Skills.Herbalism.HylianLuck.MaxBonusLevel should be at least 1!"); } if (getMaximumProbability(SubSkillType.HERBALISM_SHROOM_THUMB) < 1) { - reason.add("Skills.Herbalism.ShroomThumb.ChanceMax should be at least 1!"); + mcMMO.p.getLogger().warning("Skills.Herbalism.ShroomThumb.ChanceMax should be at least 1!"); } if (getMaxBonusLevel(SubSkillType.HERBALISM_SHROOM_THUMB) < 1) { - reason.add("Skills.Herbalism.ShroomThumb.MaxBonusLevel should be at least 1!"); + mcMMO.p.getLogger().warning("Skills.Herbalism.ShroomThumb.MaxBonusLevel should be at least 1!"); } /* MINING */ if (getMaximumProbability(SubSkillType.MINING_DOUBLE_DROPS) < 1) { - reason.add("Skills.Mining.DoubleDrops.ChanceMax should be at least 1!"); + mcMMO.p.getLogger().warning("Skills.Mining.DoubleDrops.ChanceMax should be at least 1!"); } if (getMaxBonusLevel(SubSkillType.MINING_DOUBLE_DROPS) < 1) { - reason.add("Skills.Mining.DoubleDrops.MaxBonusLevel should be at least 1!"); + mcMMO.p.getLogger().warning("Skills.Mining.DoubleDrops.MaxBonusLevel should be at least 1!"); } - /*List blastMiningTierList = Arrays.asList(BlastMining.Tier.values()); - - for (int rank : blastMiningTierList) { - if (getBlastMiningRankLevel(tier) < 0) { - reason.add("Skills.Mining.BlastMining.Rank_Levels.Rank_" + rank + " should be at least 0!"); - } - - if (getBlastDamageDecrease(tier) < 0) { - reason.add("Skills.Mining.BlastMining.BlastDamageDecrease.Rank_" + rank + " should be at least 0!"); - } - - if (getOreBonus(tier) < 0) { - reason.add("Skills.Mining.BlastMining.OreBonus.Rank_" + rank + " should be at least 0!"); - } - - if (getDebrisReduction(tier) < 0) { - reason.add("Skills.Mining.BlastMining.DebrisReduction.Rank_" + rank + " should be at least 0!"); - } - - if (getDropMultiplier(tier) < 0) { - reason.add("Skills.Mining.BlastMining.DropMultiplier.Rank_" + rank + " should be at least 0!"); - } - - if (getBlastRadiusModifier(tier) < 0) { - reason.add("Skills.Mining.BlastMining.BlastRadiusModifier.Rank_" + rank + " should be at least 0!"); - } - - if (tier != BlastMining.Tier.EIGHT) { - BlastMining.Tier nextTier = blastMiningTierList.get(blastMiningTierList.indexOf(tier) - 1); - - if (getBlastMiningRankLevel(tier) > getBlastMiningRankLevel(nextTier)) { - reason.add("Skills.Mining.BlastMining.Rank_Levels.Rank_" + rank + " should be less than or equal to Skills.Mining.BlastMining.Rank_Levels.Rank_" + nextrank + "!"); - } - - if (getBlastDamageDecrease(tier) > getBlastDamageDecrease(nextTier)) { - reason.add("Skills.Mining.BlastMining.BlastDamageDecrease.Rank_" + rank + " should be less than or equal to Skills.Mining.BlastMining.BlastDamageDecrease.Rank_" + nextrank + "!"); - } - - if (getOreBonus(tier) > getOreBonus(nextTier)) { - reason.add("Skills.Mining.BlastMining.OreBonus.Rank_" + rank + " should be less than or equal to Skills.Mining.BlastMining.OreBonus.Rank_" + nextrank + "!"); - } - - if (getDebrisReduction(tier) > getDebrisReduction(nextTier)) { - reason.add("Skills.Mining.BlastMining.DebrisReduction.Rank_" + rank + " should be less than or equal to Skills.Mining.BlastMining.DebrisReduction.Rank_" + nextrank + "!"); - } - - if (getDropMultiplier(tier) > getDropMultiplier(nextTier)) { - reason.add("Skills.Mining.BlastMining.DropMultiplier.Rank_" + rank + " should be less than or equal to Skills.Mining.BlastMining.DropMultiplier.Rank_" + nextrank + "!"); - } - - if (getBlastRadiusModifier(tier) > getBlastRadiusModifier(nextTier)) { - reason.add("Skills.Mining.BlastMining.BlastRadiusModifier.Rank_" + rank + " should be less than or equal to Skills.Mining.BlastMining.BlastRadiusModifier.Rank_" + nextrank + "!"); - } - } - }*/ - /* REPAIR */ if (getRepairMasteryMaxBonus() < 1) { - reason.add("Skills.Repair.RepairMastery.MaxBonusPercentage should be at least 1!"); + mcMMO.p.getLogger().warning("Skills.Repair.RepairMastery.MaxBonusPercentage should be at least 1!"); } if (getRepairMasteryMaxLevel() < 1) { - reason.add("Skills.Repair.RepairMastery.MaxBonusLevel should be at least 1!"); + mcMMO.p.getLogger().warning("Skills.Repair.RepairMastery.MaxBonusLevel should be at least 1!"); } if (getMaximumProbability(SubSkillType.REPAIR_SUPER_REPAIR) < 1) { - reason.add("Skills.Repair.SuperRepair.ChanceMax should be at least 1!"); + mcMMO.p.getLogger().warning("Skills.Repair.SuperRepair.ChanceMax should be at least 1!"); } if (getMaxBonusLevel(SubSkillType.REPAIR_SUPER_REPAIR) < 1) { - reason.add("Skills.Repair.SuperRepair.MaxBonusLevel should be at least 1!"); + mcMMO.p.getLogger().warning("Skills.Repair.SuperRepair.MaxBonusLevel should be at least 1!"); } - /*List arcaneForgingTierList = Arrays.asList(ArcaneForging.Tier.values()); - - for (ArcaneForging.Tier tier : arcaneForgingTierList) { - if (getArcaneForgingRankLevel(tier) < 0) { - reason.add("Skills.Repair.ArcaneForging.Rank_Levels.Rank_" + rank + " should be at least 0!"); - } - - if (getArcaneForgingDowngradeChance(tier) < 0 || getArcaneForgingDowngradeChance(tier) > 100) { - reason.add("Skills.Repair.ArcaneForging.Downgrades.Chance.Rank_" + rank + " only accepts values from 0 to 100!"); - } - - if (getArcaneForgingKeepEnchantsChance(tier) < 0 || getArcaneForgingKeepEnchantsChance(tier) > 100) { - reason.add("Skills.Repair.ArcaneForging.Keep_Enchants.Chance.Rank_" + rank + " only accepts values from 0 to 100!"); - } - - if (tier != ArcaneForging.Tier.EIGHT) { - ArcaneForging.Tier nextTier = arcaneForgingTierList.get(arcaneForgingTierList.indexOf(tier) - 1); - - if (getArcaneForgingRankLevel(tier) > getArcaneForgingRankLevel(nextTier)) { - reason.add("Skills.Repair.ArcaneForging.Rank_Levels.Rank_" + rank + " should be less than or equal to Skills.Repair.ArcaneForging.Rank_Levels.Rank_" + nextrank + "!"); - } - - if (getArcaneForgingDowngradeChance(nextTier) > getArcaneForgingDowngradeChance(tier)) { - reason.add("Skills.Repair.ArcaneForging.Downgrades.Chance.Rank_" + nextrank + " should be less than or equal to Skills.Repair.ArcaneForging.Downgrades.Chance.Rank_" + rank + "!"); - } - - if (getArcaneForgingKeepEnchantsChance(tier) > getArcaneForgingKeepEnchantsChance(nextTier)) { - reason.add("Skills.Repair.ArcaneForging.Keep_Enchants.Chance.Rank_" + rank + " should be less than or equal to Skills.Repair.ArcaneForging.Keep_Enchants.Chance.Rank_" + nextrank + "!"); - } - } - }*/ - - /* SALVAGE */ - /*if (getSalvageMaxPercentage() < 1) { - reason.add("Skills.Salvage.MaxPercentage should be at least 1!"); - } - - if (getSalvageMaxPercentageLevel() < 1) { - reason.add("Skills.Salvage.MaxPercentageLevel should be at least 1!"); - }*/ - - /*if (getAdvancedSalvageUnlockLevel() < 0) { - reason.add("Skills.Salvage.AdvancedSalvage.UnlockLevel should be at least 0!"); - }*/ - - /*List salvageTierList = Arrays.asList(Salvage.Tier.values()); - - for (Salvage.Tier tier : salvageTierList) { - if (getArcaneSalvageRankLevel(tier) < 0) { - reason.add("Skills.Salvage.ArcaneSalvage.Rank_Levels.Rank_" + rank + " should be at least 0!"); - } - - if (getArcaneSalvageExtractFullEnchantsChance(tier) < 0 || getArcaneSalvageExtractFullEnchantsChance(tier) > 100) { - reason.add("Skills.Salvage.ArcaneSalvage.ExtractFullEnchant.Rank_" + rank + " only accepts values from 0 to 100!"); - } - - if (getArcaneSalvageExtractPartialEnchantsChance(tier) < 0 || getArcaneSalvageExtractPartialEnchantsChance(tier) > 100) { - reason.add("Skills.Salvage.ArcaneSalvage.ExtractPartialEnchant.Rank_" + rank + " only accepts values from 0 to 100!"); - } - - if (tier != Salvage.Tier.EIGHT) { - Salvage.Tier nextTier = salvageTierList.get(salvageTierList.indexOf(tier) - 1); - - if (getArcaneSalvageRankLevel(tier) > getArcaneSalvageRankLevel(nextTier)) { - reason.add("Skills.Salvage.ArcaneSalvage.Rank_Levels.Rank_" + rank + " should be less than or equal to Skills.Salvage.ArcaneSalvage.Rank_Levels.Rank_" + nextrank + "!"); - } - - if (getArcaneSalvageExtractFullEnchantsChance(tier) > getArcaneSalvageExtractFullEnchantsChance(nextTier)) { - reason.add("Skills.Salvage.ArcaneSalvage.ExtractFullEnchant.Rank_" + rank + " should be less than or equal to Skills.Salvage.ArcaneSalvage.ExtractFullEnchant.Rank_" + nextrank + "!"); - } - - if (getArcaneSalvageExtractPartialEnchantsChance(tier) > getArcaneSalvageExtractPartialEnchantsChance(nextTier)) { - reason.add("Skills.Salvage.ArcaneSalvage.ExtractPartialEnchant.Rank_" + rank + " should be less than or equal to Skills.Salvage.ArcaneSalvage.ExtractPartialEnchant.Rank_" + nextrank + "!"); - } - } - }*/ - /* SMELTING */ if (getBurnModifierMaxLevel() < 1) { - reason.add("Skills.Smelting.FuelEfficiency.MaxBonusLevel should be at least 1!"); + mcMMO.p.getLogger().warning("Skills.Smelting.FuelEfficiency.MaxBonusLevel should be at least 1!"); } if (getMaxBonusLevel(SubSkillType.SMELTING_SECOND_SMELT) < 1) { - reason.add("Skills.Smelting.SecondSmelt.MaxBonusLevel should be at least 1!"); + mcMMO.p.getLogger().warning("Skills.Smelting.SecondSmelt.MaxBonusLevel should be at least 1!"); } if (getMaximumProbability(SubSkillType.SMELTING_SECOND_SMELT) < 1) { - reason.add("Skills.Smelting.SecondSmelt.ChanceMax should be at least 1!"); + mcMMO.p.getLogger().warning("Skills.Smelting.SecondSmelt.ChanceMax should be at least 1!"); } - /*if (getFluxMiningUnlockLevel() < 0) { - reason.add("Skills.Smelting.FluxMining.UnlockLevel should be at least 0!"); - }*/ - if (getFluxMiningChance() < 1) { - reason.add("Skills.Smelting.FluxMining.Chance should be at least 1!"); + mcMMO.p.getLogger().warning("Skills.Smelting.FluxMining.Chance should be at least 1!"); } - /*List smeltingTierList = Arrays.asList(Smelting.Tier.values()); - - for (int rank : smeltingTierList) { - if (getSmeltingRankLevel(tier) < 0) { - reason.add("Skills.Smelting.Rank_Levels.Rank_" + rank + " should be at least 0!"); - } - - if (getSmeltingVanillaXPBoostMultiplier(tier) < 1) { - reason.add("Skills.Smelting.VanillaXPMultiplier.Rank_" + rank + " should be at least 1!"); - } - - if (tier != Smelting.Tier.EIGHT) { - Smelting.Tier nextTier = smeltingTierList.get(smeltingTierList.indexOf(tier) - 1); - - if (getSmeltingRankLevel(tier) > getSmeltingRankLevel(nextTier)) { - reason.add("Skills.Smelting.Rank_Levels.Rank_" + rank + " should be less than or equal to Skills.Smelting.Rank_Levels.Rank_" + nextrank + "!"); - } - - if (getSmeltingVanillaXPBoostMultiplier(tier) > getSmeltingVanillaXPBoostMultiplier(nextTier)) { - reason.add("Skills.Smelting.VanillaXPMultiplier.Rank_" + rank + " should be less than or equal to Skills.Smelting.VanillaXPMultiplier.Rank_" + nextrank + "!"); - } - } - }*/ - /* SWORDS */ - if (getMaximumProbability(SubSkillType.SWORDS_RUPTURE) < 1) { - reason.add("Skills.Swords.Rupture.ChanceMax should be at least 1!"); - } - - if (getMaxBonusLevel(SubSkillType.SWORDS_RUPTURE) < 1) { - reason.add("Skills.Swords.Rupture.MaxBonusLevel should be at least 1!"); - } - - if (getRuptureMaxTicks() < 1) { - reason.add("Skills.Swords.Rupture.MaxTicks should be at least 1!"); - } - - if (getRuptureMaxTicks() < getRuptureBaseTicks()) { - reason.add("Skills.Swords.Rupture.MaxTicks should be at least Skills.Swords.Rupture.BaseTicks!"); - } - - if (getRuptureBaseTicks() < 1) { - reason.add("Skills.Swords.Rupture.BaseTicks should be at least 1!"); - } if (getMaximumProbability(SubSkillType.SWORDS_COUNTER_ATTACK) < 1) { - reason.add("Skills.Swords.CounterAttack.ChanceMax should be at least 1!"); + mcMMO.p.getLogger().warning("Skills.Swords.CounterAttack.ChanceMax should be at least 1!"); } if (getMaxBonusLevel(SubSkillType.SWORDS_COUNTER_ATTACK) < 1) { - reason.add("Skills.Swords.CounterAttack.MaxBonusLevel should be at least 1!"); + mcMMO.p.getLogger().warning("Skills.Swords.CounterAttack.MaxBonusLevel should be at least 1!"); } if (getCounterModifier() < 1) { - reason.add("Skills.Swords.CounterAttack.DamageModifier should be at least 1!"); + mcMMO.p.getLogger().warning("Skills.Swords.CounterAttack.DamageModifier should be at least 1!"); } if (getSerratedStrikesModifier() < 1) { - reason.add("Skills.Swords.SerratedStrikes.DamageModifier should be at least 1!"); + mcMMO.p.getLogger().warning("Skills.Swords.SerratedStrikes.DamageModifier should be at least 1!"); } if (getSerratedStrikesTicks() < 1) { - reason.add("Skills.Swords.SerratedStrikes.RuptureTicks should be at least 1!"); + mcMMO.p.getLogger().warning("Skills.Swords.SerratedStrikes.RuptureTicks should be at least 1!"); } /* TAMING */ if (getMaximumProbability(SubSkillType.TAMING_GORE) < 1) { - reason.add("Skills.Taming.Gore.ChanceMax should be at least 1!"); + mcMMO.p.getLogger().warning("Skills.Taming.Gore.ChanceMax should be at least 1!"); } if (getMaxBonusLevel(SubSkillType.TAMING_GORE) < 1) { - reason.add("Skills.Taming.Gore.MaxBonusLevel should be at least 1!"); + mcMMO.p.getLogger().warning("Skills.Taming.Gore.MaxBonusLevel should be at least 1!"); } /*if (getGoreRuptureTicks() < 1) { - reason.add("Skills.Taming.Gore.RuptureTicks should be at least 1!"); + mcMMO.p.getLogger().warning("Skills.Taming.Gore.RuptureTicks should be at least 1!"); }*/ if (getGoreModifier() < 1) { - reason.add("Skills.Taming.Gore.Modifier should be at least 1!"); + mcMMO.p.getLogger().warning("Skills.Taming.Gore.Modifier should be at least 1!"); } /*if (getFastFoodUnlock() < 0) { - reason.add("Skills.Taming.FastFood.UnlockLevel should be at least 0!"); + mcMMO.p.getLogger().warning("Skills.Taming.FastFood.UnlockLevel should be at least 0!"); }*/ if (getFastFoodChance() < 1) { - reason.add("Skills.Taming.FastFood.Chance should be at least 1!"); + mcMMO.p.getLogger().warning("Skills.Taming.FastFood.Chance should be at least 1!"); } /*if (getEnviromentallyAwareUnlock() < 0) { - reason.add("Skills.Taming.EnvironmentallyAware.UnlockLevel should be at least 0!"); + mcMMO.p.getLogger().warning("Skills.Taming.EnvironmentallyAware.UnlockLevel should be at least 0!"); }*/ /*if (getThickFurUnlock() < 0) { - reason.add("Skills.Taming.ThickFur.UnlockLevel should be at least 0!"); + mcMMO.p.getLogger().warning("Skills.Taming.ThickFur.UnlockLevel should be at least 0!"); }*/ if (getThickFurModifier() < 1) { - reason.add("Skills.Taming.ThickFur.Modifier should be at least 1!"); + mcMMO.p.getLogger().warning("Skills.Taming.ThickFur.Modifier should be at least 1!"); } /*if (getHolyHoundUnlock() < 0) { - reason.add("Skills.Taming.HolyHound.UnlockLevel should be at least 0!"); + mcMMO.p.getLogger().warning("Skills.Taming.HolyHound.UnlockLevel should be at least 0!"); } if (getShockProofUnlock() < 0) { - reason.add("Skills.Taming.ShockProof.UnlockLevel should be at least 0!"); + mcMMO.p.getLogger().warning("Skills.Taming.ShockProof.UnlockLevel should be at least 0!"); }*/ if (getShockProofModifier() < 1) { - reason.add("Skills.Taming.ShockProof.Modifier should be at least 1!"); + mcMMO.p.getLogger().warning("Skills.Taming.ShockProof.Modifier should be at least 1!"); } /*if (getSharpenedClawsUnlock() < 0) { - reason.add("Skills.Taming.SharpenedClaws.UnlockLevel should be at least 0!"); + mcMMO.p.getLogger().warning("Skills.Taming.SharpenedClaws.UnlockLevel should be at least 0!"); }*/ if (getSharpenedClawsBonus() < 1) { - reason.add("Skills.Taming.SharpenedClaws.Bonus should be at least 1!"); + mcMMO.p.getLogger().warning("Skills.Taming.SharpenedClaws.Bonus should be at least 1!"); } if (getMaxHorseJumpStrength() < 0 || getMaxHorseJumpStrength() > 2) { - reason.add("Skills.Taming.CallOfTheWild.MaxHorseJumpStrength should be between 0 and 2!"); + mcMMO.p.getLogger().warning("Skills.Taming.CallOfTheWild.MaxHorseJumpStrength should be between 0 and 2!"); } /* UNARMED */ if (getMaximumProbability(SubSkillType.UNARMED_DISARM) < 1) { - reason.add("Skills.Unarmed.Disarm.ChanceMax should be at least 1!"); + mcMMO.p.getLogger().warning("Skills.Unarmed.Disarm.ChanceMax should be at least 1!"); } if (getMaxBonusLevel(SubSkillType.UNARMED_DISARM) < 1) { - reason.add("Skills.Unarmed.Disarm.MaxBonusLevel should be at least 1!"); + mcMMO.p.getLogger().warning("Skills.Unarmed.Disarm.MaxBonusLevel should be at least 1!"); } if (getMaximumProbability(SubSkillType.UNARMED_ARROW_DEFLECT) < 1) { - reason.add("Skills.Unarmed.ArrowDeflect.ChanceMax should be at least 1!"); + mcMMO.p.getLogger().warning("Skills.Unarmed.ArrowDeflect.ChanceMax should be at least 1!"); } if (getMaxBonusLevel(SubSkillType.UNARMED_ARROW_DEFLECT) < 1) { - reason.add("Skills.Unarmed.ArrowDeflect.MaxBonusLevel should be at least 1!"); + mcMMO.p.getLogger().warning("Skills.Unarmed.ArrowDeflect.MaxBonusLevel should be at least 1!"); } if (getMaximumProbability(SubSkillType.UNARMED_IRON_GRIP) < 1) { - reason.add("Skills.Unarmed.IronGrip.ChanceMax should be at least 1!"); + mcMMO.p.getLogger().warning("Skills.Unarmed.IronGrip.ChanceMax should be at least 1!"); } if (getMaxBonusLevel(SubSkillType.UNARMED_IRON_GRIP) < 1) { - reason.add("Skills.Unarmed.IronGrip.MaxBonusLevel should be at least 1!"); + mcMMO.p.getLogger().warning("Skills.Unarmed.IronGrip.MaxBonusLevel should be at least 1!"); } /* WOODCUTTING */ /*if (getLeafBlowUnlockLevel() < 0) { - reason.add("Skills.Woodcutting.LeafBlower.UnlockLevel should be at least 0!"); + mcMMO.p.getLogger().warning("Skills.Woodcutting.LeafBlower.UnlockLevel should be at least 0!"); }*/ if (getMaximumProbability(SubSkillType.WOODCUTTING_HARVEST_LUMBER) < 1) { - reason.add("Skills.Woodcutting.HarvestLumber.ChanceMax should be at least 1!"); + mcMMO.p.getLogger().warning("Skills.Woodcutting.HarvestLumber.ChanceMax should be at least 1!"); } if (getMaxBonusLevel(SubSkillType.WOODCUTTING_HARVEST_LUMBER) < 1) { - reason.add("Skills.Woodcutting.HarvestLumber.MaxBonusLevel should be at least 1!"); + mcMMO.p.getLogger().warning("Skills.Woodcutting.HarvestLumber.MaxBonusLevel should be at least 1!"); } - /* KRAKEN */ - if (getKrakenTriesBeforeRelease() < 1) { - reason.add("Kraken.Tries_Before_Release should be at least 1!"); - } - - if (getKrakenHealth() < 1) { - reason.add("Kraken.Health should be at least 1!"); - } - - if (getKrakenAttackInterval() < 1) { - reason.add("Kraken.Attack_Interval_Seconds should be at least 1!"); - } - - if (getKrakenAttackDamage() < 1) { - reason.add("Kraken.Attack_Damage should be at least 1!"); - } - - return noErrorsInConfig(reason); } @Override - protected void loadKeys() {} + protected void loadKeys() { + } /* GENERAL */ - public boolean canApplyLimitBreakPVE() { return config.getBoolean("Skills.General.LimitBreak.AllowPVE", false); } - public int getStartingLevel() { return config.getInt("Skills.General.StartingLevel", 1); } + public boolean canApplyLimitBreakPVE() { + return config.getBoolean("Skills.General.LimitBreak.AllowPVE", false); + } + + public int getStartingLevel() { + return config.getInt("Skills.General.StartingLevel", 1); + } public boolean allowPlayerTips() { return config.getBoolean("Feedback.PlayerTips", true); @@ -647,10 +426,11 @@ public class AdvancedConfig extends AutoUpdateConfigLoader { /** * 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(!mcMMO.isRetroModeEnabled()) + if (!mcMMO.isRetroModeEnabled()) return config.getInt("Skills.General.Ability.Length.Standard.CapLevel", 50); else return config.getInt("Skills.General.Ability.Length.RetroMode.CapLevel", 500); @@ -659,27 +439,32 @@ public class AdvancedConfig extends AutoUpdateConfigLoader { /** * 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(!mcMMO.isRetroModeEnabled()) + if (!mcMMO.isRetroModeEnabled()) return config.getInt("Skills.General.Ability.Length.Standard.IncreaseLevel", 5); else return config.getInt("Skills.General.Ability.Length.RetroMode.IncreaseLevel", 50); } - public int getEnchantBuff() { return config.getInt("Skills.General.Ability.EnchantBuff", 5); } + public int getEnchantBuff() { + return config.getInt("Skills.General.Ability.EnchantBuff", 5); + } /** * 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 keyPath = subSkillType.getAdvConfigAddress() + ".MaxBonusLevel."; - return mcMMO.isRetroModeEnabled() ? config.getInt(keyPath+"RetroMode", 1000) : config.getInt(keyPath+"Standard", 100); + return mcMMO.isRetroModeEnabled() ? config.getInt(keyPath + "RetroMode", 1000) : config.getInt(keyPath + "Standard", 100); } public int getMaxBonusLevel(AbstractSubSkill abstractSubSkill) { @@ -687,38 +472,36 @@ public class AdvancedConfig extends AutoUpdateConfigLoader { } public double getMaximumProbability(SubSkillType subSkillType) { - double maximumProbability = config.getDouble(subSkillType.getAdvConfigAddress() + ".ChanceMax", 100.0D); - return maximumProbability; + return config.getDouble(subSkillType.getAdvConfigAddress() + ".ChanceMax", 100.0D); } - public double getMaximumProbability(AbstractSubSkill abstractSubSkill) - { + public double getMaximumProbability(AbstractSubSkill abstractSubSkill) { return getMaximumProbability(abstractSubSkill.getSubSkillType()); } /* Notification Settings */ - public boolean doesSkillCommandSendBlankLines() - { + public boolean doesSkillCommandSendBlankLines() { return config.getBoolean("Feedback.SkillCommand.BlankLinesAboveHeader", true); } - public boolean doesNotificationUseActionBar(NotificationType notificationType) - { - return config.getBoolean("Feedback.ActionBarNotifications."+notificationType.toString()+".Enabled", true); + public boolean doesNotificationUseActionBar(NotificationType notificationType) { + return config.getBoolean("Feedback.ActionBarNotifications." + notificationType.toString() + ".Enabled", true); } - public boolean doesNotificationSendCopyToChat(NotificationType notificationType) - { - return config.getBoolean("Feedback.ActionBarNotifications."+notificationType.toString()+".SendCopyOfMessageToChat", false); + public boolean doesNotificationSendCopyToChat(NotificationType notificationType) { + return config.getBoolean("Feedback.ActionBarNotifications." + notificationType.toString() + ".SendCopyOfMessageToChat", false); } - public boolean useTitlesForXPEvent() - { + public boolean useTitlesForXPEvent() { return config.getBoolean("Feedback.Events.XP.SendTitles", true); } + public boolean sendAbilityNotificationToOtherPlayers() { + return config.getBoolean("Feedback.Events.AbilityActivation.SendNotificationToOtherPlayers", true); + } + /* * JSON Style Settings */ @@ -734,6 +517,7 @@ public class AdvancedConfig extends AutoUpdateConfigLoader { /** * Used to color our details header in our JSON Hover Object tooltips + * * @return the ChatColor for this element */ /*public ChatColor getJSONStatHoverDetailsColor() @@ -782,7 +566,6 @@ public class AdvancedConfig extends AutoUpdateConfigLoader { { return getChatColor(config.getString("Style.JSON.Notification."+notificationType.toString()+".Color")); }*/ - private ChatColor getChatColorFromKey(String keyLocation) { String colorName = config.getString(keyLocation); @@ -796,7 +579,7 @@ public class AdvancedConfig extends AutoUpdateConfigLoader { } //Invalid Color - System.out.println("[mcMMO] " + configColor + " is an invalid color value"); + mcMMO.p.getLogger().warning(configColor + " is an invalid color value"); return ChatColor.WHITE; } @@ -823,176 +606,334 @@ public class AdvancedConfig extends AutoUpdateConfigLoader { /** * Some SubSkills have the ability to retain classic functionality + * * @param subSkillType SubSkillType with classic functionality + * * @return true if the subskill is in classic mode */ - public boolean isSubSkillClassic(SubSkillType subSkillType) - { - return config.getBoolean(subSkillType.getAdvConfigAddress()+".Classic"); + public boolean isSubSkillClassic(SubSkillType subSkillType) { + return config.getBoolean(subSkillType.getAdvConfigAddress() + ".Classic"); } /* ACROBATICS */ - public double getDodgeDamageModifier() { return config.getDouble("Skills.Acrobatics.Dodge.DamageModifier", 2.0D); } + public double getDodgeDamageModifier() { + return config.getDouble("Skills.Acrobatics.Dodge.DamageModifier", 2.0D); + } - public double getRollDamageThreshold() { return config.getDouble("Skills.Acrobatics.Roll.DamageThreshold", 7.0D); } + public double getRollDamageThreshold() { + return config.getDouble("Skills.Acrobatics.Roll.DamageThreshold", 7.0D); + } - public double getGracefulRollDamageThreshold() { return config.getDouble("Skills.Acrobatics.GracefulRoll.DamageThreshold", 14.0D); } + public double getGracefulRollDamageThreshold() { + return config.getDouble("Skills.Acrobatics.GracefulRoll.DamageThreshold", 14.0D); + } /* ALCHEMY */ - /*public int getCatalysisUnlockLevel() { return config.getInt("Skills.Alchemy.Catalysis.UnlockLevel", 100); }*/ - public int getCatalysisMaxBonusLevel() { return config.getInt("Skills.Alchemy.Catalysis.MaxBonusLevel", 1000); } + public int getCatalysisMaxBonusLevel() { + return config.getInt("Skills.Alchemy.Catalysis.MaxBonusLevel", 1000); + } - public double getCatalysisMinSpeed() { return config.getDouble("Skills.Alchemy.Catalysis.MinSpeed", 1.0D); } - public double getCatalysisMaxSpeed() { return config.getDouble("Skills.Alchemy.Catalysis.MaxSpeed", 4.0D); } + public double getCatalysisMinSpeed() { + return config.getDouble("Skills.Alchemy.Catalysis.MinSpeed", 1.0D); + } + + public double getCatalysisMaxSpeed() { + return config.getDouble("Skills.Alchemy.Catalysis.MaxSpeed", 4.0D); + } - //public int getConcoctionsTierLevel(Alchemy.Tier tier) { return config.getInt("Skills.Alchemy.Rank_Levels.Rank_" + rank); } /* ARCHERY */ - public double getSkillShotRankDamageMultiplier() { return config.getDouble("Skills.Archery.SkillShot.RankDamageMultiplier", 10.0D); } - public double getSkillShotDamageMax() { return config.getDouble("Skills.Archery.SkillShot.MaxDamage", 9.0D); } + public double getSkillShotRankDamageMultiplier() { + return config.getDouble("Skills.Archery.SkillShot.RankDamageMultiplier", 10.0D); + } - public double getDazeBonusDamage() { return config.getDouble("Skills.Archery.Daze.BonusDamage", 4.0D); } + public double getSkillShotDamageMax() { + return config.getDouble("Skills.Archery.SkillShot.MaxDamage", 9.0D); + } - public double getForceMultiplier() { return config.getDouble("Skills.Archery.ForceMultiplier", 2.0D); } + public double getDazeBonusDamage() { + return config.getDouble("Skills.Archery.Daze.BonusDamage", 4.0D); + } + + public double getForceMultiplier() { + return config.getDouble("Skills.Archery.ForceMultiplier", 2.0D); + } /* AXES */ - public double getAxeMasteryRankDamageMultiplier() { return config.getDouble("Skills.Axes.AxeMastery.RankDamageMultiplier", 1.0D); } + public double getAxeMasteryRankDamageMultiplier() { + return config.getDouble("Skills.Axes.AxeMastery.RankDamageMultiplier", 1.0D); + } - public double getCriticalStrikesPVPModifier() { return config.getDouble("Skills.Axes.CriticalStrikes.PVP_Modifier", 1.5D); } - public double getCriticalStrikesPVEModifier() { return config.getDouble("Skills.Axes.CriticalStrikes.PVE_Modifier", 2.0D); } + public double getCriticalStrikesPVPModifier() { + return config.getDouble("Skills.Axes.CriticalStrikes.PVP_Modifier", 1.5D); + } - public double getGreaterImpactChance() { return config.getDouble("Skills.Axes.GreaterImpact.Chance", 25.0D); } - public double getGreaterImpactModifier() { return config.getDouble("Skills.Axes.GreaterImpact.KnockbackModifier", 1.5D); } - public double getGreaterImpactBonusDamage() { return config.getDouble("Skills.Axes.GreaterImpact.BonusDamage", 2.0D); } + public double getCriticalStrikesPVEModifier() { + return config.getDouble("Skills.Axes.CriticalStrikes.PVE_Modifier", 2.0D); + } - public double getImpactChance() { return config.getDouble("Skills.Axes.ArmorImpact.Chance", 25.0D); } - public double getImpactDurabilityDamageMultiplier() { return config.getDouble("Skills.Axes.ArmorImpact.DamagePerRank", 6.5D); } + public double getGreaterImpactChance() { + return config.getDouble("Skills.Axes.GreaterImpact.Chance", 25.0D); + } - public double getSkullSplitterModifier() { return config.getDouble("Skills.Axes.SkullSplitter.DamageModifier", 2.0D); } + public double getGreaterImpactModifier() { + return config.getDouble("Skills.Axes.GreaterImpact.KnockbackModifier", 1.5D); + } + + public double getGreaterImpactBonusDamage() { + return config.getDouble("Skills.Axes.GreaterImpact.BonusDamage", 2.0D); + } + + public double getImpactChance() { + return config.getDouble("Skills.Axes.ArmorImpact.Chance", 25.0D); + } + + public double getImpactDurabilityDamageMultiplier() { + return config.getDouble("Skills.Axes.ArmorImpact.DamagePerRank", 6.5D); + } + + public double getSkullSplitterModifier() { + return config.getDouble("Skills.Axes.SkullSplitter.DamageModifier", 2.0D); + } /* EXCAVATION */ //Nothing to configure, everything is already configurable in config.yml /* FISHING */ - //public int getFishingTierLevel(int rank) { return config.getInt("Skills.Fishing.Rank_Levels.Rank_" + rank); } - public double getShakeChance(int rank) { return config.getDouble("Skills.Fishing.ShakeChance.Rank_" + rank); } - public int getFishingVanillaXPModifier(int rank) { return config.getInt("Skills.Fishing.VanillaXPMultiplier.Rank_" + rank); } + public double getShakeChance(int rank) { + return config.getDouble("Skills.Fishing.ShakeChance.Rank_" + rank); + } - public int getFishermanDietRankChange() { return config.getInt("Skills.Fishing.FishermansDiet.RankChange", 200); } + public int getFishingVanillaXPModifier(int rank) { + return config.getInt("Skills.Fishing.VanillaXPMultiplier.Rank_" + rank); + } - /*public int getIceFishingUnlockLevel() { return config.getInt("Skills.Fishing.IceFishing.UnlockLevel", 50); } + public int getFishingReductionMinWaitTicks() { + return config.getInt("Skills.Fishing.MasterAngler.Tick_Reduction_Per_Rank.Min_Wait", 10); + } - public int getMasterAnglerUnlockLevel() {return config.getInt("Skills.Fishing.MasterAngler.UnlockLevel", 125); }*/ - public double getMasterAnglerBoatModifier() {return config.getDouble("Skills.Fishing.MasterAngler.BoatModifier", 2.0); } - public double getMasterAnglerBiomeModifier() {return config.getDouble("Skills.Fishing.MasterAngler.BiomeModifier", 2.0); } + public int getFishingReductionMaxWaitTicks() { + return config.getInt("Skills.Fishing.MasterAngler.Tick_Reduction_Per_Rank.Max_Wait", 30); + } + + public int getFishingBoatReductionMinWaitTicks() { + return config.getInt("Skills.Fishing.MasterAngler.Boat_Tick_Reduction.Min_Wait", 10); + } + + public int getFishingBoatReductionMaxWaitTicks() { + return config.getInt("Skills.Fishing.MasterAngler.Boat_Tick_Reduction.Max_Wait", 30); + } + + public int getFishingReductionMinWaitCap() { + return config.getInt("Skills.Fishing.MasterAngler.Tick_Reduction_Caps.Min_Wait", 40); + } + + public int getFishingReductionMaxWaitCap() { + return config.getInt("Skills.Fishing.MasterAngler.Tick_Reduction_Caps.Max_Wait", 100); + } + + public int getFishermanDietRankChange() { + return config.getInt("Skills.Fishing.FishermansDiet.RankChange", 200); + } + + + public double getMasterAnglerBoatModifier() { + return config.getDouble("Skills.Fishing.MasterAngler.BoatModifier", 2.0); + } + + public double getMasterAnglerBiomeModifier() { + return config.getDouble("Skills.Fishing.MasterAngler.BiomeModifier", 2.0); + } /* HERBALISM */ - public int getFarmerDietRankChange() { return config.getInt("Skills.Herbalism.FarmersDiet.RankChange", 200); } + public int getFarmerDietRankChange() { + return config.getInt("Skills.Herbalism.FarmersDiet.RankChange", 200); + } - public int getGreenThumbStageChange() { return config.getInt("Skills.Herbalism.GreenThumb.StageChange", 200); } + public int getGreenThumbStageChange() { + return config.getInt("Skills.Herbalism.GreenThumb.StageChange", 200); + } /* MINING */ - public boolean getDoubleDropSilkTouchEnabled() { return config.getBoolean("Skills.Mining.DoubleDrops.SilkTouch", true); } - public int getBlastMiningRankLevel(int rank) { return config.getInt("Skills.Mining.BlastMining.Rank_Levels.Rank_" + rank); } - public double getBlastDamageDecrease(int rank) { return config.getDouble("Skills.Mining.BlastMining.BlastDamageDecrease.Rank_" + rank); } - public double getOreBonus(int rank) { return config.getDouble("Skills.Mining.BlastMining.OreBonus.Rank_" + rank); } - public double getDebrisReduction(int rank) { return config.getDouble("Skills.Mining.BlastMining.DebrisReduction.Rank_" + rank); } - public int getDropMultiplier(int rank) { return config.getInt("Skills.Mining.BlastMining.DropMultiplier.Rank_" + rank); } - public double getBlastRadiusModifier(int rank) { return config.getDouble("Skills.Mining.BlastMining.BlastRadiusModifier.Rank_" + rank); } + public boolean getDoubleDropSilkTouchEnabled() { + return config.getBoolean("Skills.Mining.DoubleDrops.SilkTouch", true); + } + + public boolean getAllowMiningTripleDrops() { + return config.getBoolean("Skills.Mining.SuperBreaker.AllowTripleDrops", true); + } + + public int getBlastMiningRankLevel(int rank) { + return config.getInt("Skills.Mining.BlastMining.Rank_Levels.Rank_" + rank); + } + + public double getBlastDamageDecrease(int rank) { + return config.getDouble("Skills.Mining.BlastMining.BlastDamageDecrease.Rank_" + rank); + } + + public double getOreBonus(int rank) { + return config.getDouble("Skills.Mining.BlastMining.OreBonus.Rank_" + rank); + } + + public double getDebrisReduction(int rank) { + return config.getDouble("Skills.Mining.BlastMining.DebrisReduction.Rank_" + rank); + } + + public int getDropMultiplier(int rank) { + return config.getInt("Skills.Mining.BlastMining.DropMultiplier.Rank_" + rank); + } + + public double getBlastRadiusModifier(int rank) { + return config.getDouble("Skills.Mining.BlastMining.BlastRadiusModifier.Rank_" + rank); + } /* REPAIR */ - public double getRepairMasteryMaxBonus() { return config.getDouble("Skills.Repair.RepairMastery.MaxBonusPercentage", 200.0D); } - public int getRepairMasteryMaxLevel() { return config.getInt("Skills.Repair.RepairMastery.MaxBonusLevel", 100); } + public double getRepairMasteryMaxBonus() { + return config.getDouble("Skills.Repair.RepairMastery.MaxBonusPercentage", 200.0D); + } - /* Arcane Forging */ - //public int getArcaneForgingRankLevel(int rank) { return config.getInt("Skills.Repair.ArcaneForging.Rank_Levels.Rank_" + rank); } + public int getRepairMasteryMaxLevel() { + return config.getInt("Skills.Repair.RepairMastery.MaxBonusLevel", 100); + } - public boolean getArcaneForgingEnchantLossEnabled() { return config.getBoolean("Skills.Repair.ArcaneForging.May_Lose_Enchants", true); } - public double getArcaneForgingKeepEnchantsChance(int rank) { return config.getDouble("Skills.Repair.ArcaneForging.Keep_Enchants_Chance.Rank_" + rank); } + public boolean getAllowEnchantedRepairMaterials() { + return config.getBoolean("Skills.Repair.Use_Enchanted_Materials", false); + } - public boolean getArcaneForgingDowngradeEnabled() { return config.getBoolean("Skills.Repair.ArcaneForging.Downgrades_Enabled", true); } - public double getArcaneForgingDowngradeChance(int rank) { return config.getDouble("Skills.Repair.ArcaneForging.Downgrades_Chance.Rank_" + rank); } + public boolean getArcaneForgingEnchantLossEnabled() { + return config.getBoolean("Skills.Repair.ArcaneForging.May_Lose_Enchants", true); + } - /* SALVAGE */ - //public double getSalvageMaxPercentage() { return config.getDouble("Skills.Salvage.MaxPercentage", 100.0D); } - //public int getSalvageMaxPercentageLevel() { return config.getInt("Skills.Salvage.MaxPercentageLevel", 1000); } + public double getArcaneForgingKeepEnchantsChance(int rank) { + return config.getDouble("Skills.Repair.ArcaneForging.Keep_Enchants_Chance.Rank_" + rank); + } - public boolean getArcaneSalvageEnchantDowngradeEnabled() { return config.getBoolean("Skills.Salvage.ArcaneSalvage.EnchantDowngradeEnabled", true); } - public boolean getArcaneSalvageEnchantLossEnabled() { return config.getBoolean("Skills.Salvage.ArcaneSalvage.EnchantLossEnabled", true); } + public boolean getArcaneForgingDowngradeEnabled() { + return config.getBoolean("Skills.Repair.ArcaneForging.Downgrades_Enabled", true); + } - //public int getArcaneSalvageRankLevel(int rank) { return config.getInt("Skills.Salvage.ArcaneSalvage.Rank_Levels.Rank_" + rank); } - public double getArcaneSalvageExtractFullEnchantsChance(int rank) { return config.getDouble("Skills.Salvage.ArcaneSalvage.ExtractFullEnchant.Rank_" + rank); } - public double getArcaneSalvageExtractPartialEnchantsChance(int rank) { return config.getDouble("Skills.Salvage.ArcaneSalvage.ExtractPartialEnchant.Rank_" + rank); } + public double getArcaneForgingDowngradeChance(int rank) { + return config.getDouble("Skills.Repair.ArcaneForging.Downgrades_Chance.Rank_" + rank); + } + + public boolean getArcaneSalvageEnchantDowngradeEnabled() { + return config.getBoolean("Skills.Salvage.ArcaneSalvage.EnchantDowngradeEnabled", true); + } + + public boolean getArcaneSalvageEnchantLossEnabled() { + return config.getBoolean("Skills.Salvage.ArcaneSalvage.EnchantLossEnabled", true); + } + + public double getArcaneSalvageExtractFullEnchantsChance(int rank) { + return config.getDouble("Skills.Salvage.ArcaneSalvage.ExtractFullEnchant.Rank_" + rank); + } + + public double getArcaneSalvageExtractPartialEnchantsChance(int rank) { + return config.getDouble("Skills.Salvage.ArcaneSalvage.ExtractPartialEnchant.Rank_" + rank); + } /* SMELTING */ public int getBurnModifierMaxLevel() { - if(mcMMO.isRetroModeEnabled()) + if (mcMMO.isRetroModeEnabled()) return config.getInt("Skills.Smelting.FuelEfficiency.RetroMode.MaxBonusLevel", 1000); else return config.getInt("Skills.Smelting.FuelEfficiency.Standard.MaxBonusLevel", 100); } - /*public int getFluxMiningUnlockLevel() { return config.getInt("Skills.Smelting.FluxMining.UnlockLevel", 250); }*/ - public double getFluxMiningChance() { return config.getDouble("Skills.Smelting.FluxMining.Chance", 33.0D); } - - public int getSmeltingRankLevel(int rank) { return config.getInt("Skills.Smelting.Rank_Levels.Rank_" + rank); } - - public int getSmeltingVanillaXPBoostMultiplier(int rank) { return config.getInt("Skills.Smelting.VanillaXPMultiplier.Rank_" + rank); } + public double getFluxMiningChance() { + return config.getDouble("Skills.Smelting.FluxMining.Chance", 33.0D); + } /* SWORDS */ - public double getRuptureDamagePlayer() { return config.getDouble("Skills.Swords.Rupture.DamagePlayer", 1.0); } - public double getRuptureDamageMobs() { return config.getDouble("Skills.Swords.Rupture.DamageMobs", 2.0); } + public double getRuptureTickDamage(boolean isTargetPlayer, int rank) { + String root = "Skills.Swords.Rupture.Rupture_Mechanics.Tick_Interval_Damage.Against_"; + String targetType = isTargetPlayer ? "Players" : "Mobs"; + String key = root + targetType + ".Rank_" + rank; - public int getRuptureMaxTicks() { return config.getInt("Skills.Swords.Rupture.MaxTicks", 8); } - public int getRuptureBaseTicks() { return config.getInt("Skills.Swords.Rupture.BaseTicks", 2); } + return config.getDouble(key, 1.0D); + } - public double getCounterModifier() { return config.getDouble("Skills.Swords.CounterAttack.DamageModifier", 2.0D); } + public int getRuptureDurationSeconds(boolean isTargetPlayer) { + String root = "Skills.Swords.Rupture.Rupture_Mechanics.Duration_In_Seconds.Against_"; + String targetType = isTargetPlayer ? "Players" : "Mobs"; + return config.getInt(root + targetType, 5); + } - public double getSerratedStrikesModifier() { return config.getDouble("Skills.Swords.SerratedStrikes.DamageModifier", 4.0D); } - public int getSerratedStrikesTicks() { return config.getInt("Skills.Swords.SerratedStrikes.RuptureTicks", 5); } + public double getRuptureExplosionDamage(boolean isTargetPlayer, int rank) { + String root = "Skills.Swords.Rupture.Rupture_Mechanics.Explosion_Damage.Against_"; + String targetType = isTargetPlayer ? "Players" : "Mobs"; + String key = root + targetType + ".Rank_" + rank; + + return config.getDouble(key, 40.0D); + } + + public double getRuptureChanceToApplyOnHit(int rank) { + String root = "Skills.Swords.Rupture.Rupture_Mechanics.Chance_To_Apply_On_Hit.Rank_"; + return config.getDouble(root + rank, 33); + } + + public double getCounterModifier() { + return config.getDouble("Skills.Swords.CounterAttack.DamageModifier", 2.0D); + } + + public double getSerratedStrikesModifier() { + return config.getDouble("Skills.Swords.SerratedStrikes.DamageModifier", 4.0D); + } + + public int getSerratedStrikesTicks() { + return config.getInt("Skills.Swords.SerratedStrikes.RuptureTicks", 5); + } /* TAMING */ - //public int getGoreRuptureTicks() { return config.getInt("Skills.Taming.Gore.RuptureTicks", 2); } - public double getGoreModifier() { return config.getDouble("Skills.Taming.Gore.Modifier", 2.0D); } + public double getGoreModifier() { + return config.getDouble("Skills.Taming.Gore.Modifier", 2.0D); + } - /*public int getFastFoodUnlock() { return config.getInt("Skills.Taming.FastFood.UnlockLevel", 50); }*/ - public double getFastFoodChance() { return config.getDouble("Skills.Taming.FastFoodService.Chance", 50.0D); } - public double getPummelChance() { return config.getDouble("Skills.Taming.Pummel.Chance", 10.0D); } + public double getFastFoodChance() { + return config.getDouble("Skills.Taming.FastFoodService.Chance", 50.0D); + } - //public int getEnviromentallyAwareUnlock() { return config.getInt("Skills.Taming.EnvironmentallyAware.UnlockLevel", 100); } + public double getPummelChance() { + return config.getDouble("Skills.Taming.Pummel.Chance", 10.0D); + } - /*public int getThickFurUnlock() { return config.getInt("Skills.Taming.ThickFur.UnlockLevel", 250); }*/ - public double getThickFurModifier() { return config.getDouble("Skills.Taming.ThickFur.Modifier", 2.0D); } + public double getThickFurModifier() { + return config.getDouble("Skills.Taming.ThickFur.Modifier", 2.0D); + } - /*public int getHolyHoundUnlock() {return config.getInt("Skills.Taming.HolyHound.UnlockLevel", 375); }*/ + public double getShockProofModifier() { + return config.getDouble("Skills.Taming.ShockProof.Modifier", 6.0D); + } - /*public int getShockProofUnlock() { return config.getInt("Skills.Taming.ShockProof.UnlockLevel", 500); }*/ - public double getShockProofModifier() { return config.getDouble("Skills.Taming.ShockProof.Modifier", 6.0D); } + public double getSharpenedClawsBonus() { + return config.getDouble("Skills.Taming.SharpenedClaws.Bonus", 2.0D); + } - /*public int getSharpenedClawsUnlock() { return config.getInt("Skills.Taming.SharpenedClaws.UnlockLevel", 750); }*/ - public double getSharpenedClawsBonus() { return config.getDouble("Skills.Taming.SharpenedClaws.Bonus", 2.0D); } + public double getMinHorseJumpStrength() { + return config.getDouble("Skills.Taming.CallOfTheWild.MinHorseJumpStrength", 0.7D); + } - public double getMinHorseJumpStrength() { return config.getDouble("Skills.Taming.CallOfTheWild.MinHorseJumpStrength", 0.7D); } - public double getMaxHorseJumpStrength() { return config.getDouble("Skills.Taming.CallOfTheWild.MaxHorseJumpStrength", 2.0D); } + public double getMaxHorseJumpStrength() { + return config.getDouble("Skills.Taming.CallOfTheWild.MaxHorseJumpStrength", 2.0D); + } /* UNARMED */ - public boolean getDisarmProtected() { return config.getBoolean("Skills.Unarmed.Disarm.AntiTheft", false); } + public boolean isSteelArmDamageCustom() { + return config.getBoolean("Skills.Unarmed.SteelArmStyle.Damage_Override", false); + } + + public double getSteelArmOverride(int rank, double def) { + String key = "Rank_" + rank; + return config.getDouble("Skills.Unarmed.SteelArmStyle.Override." + key, def); + } + + public boolean getDisarmProtected() { + return config.getBoolean("Skills.Unarmed.Disarm.AntiTheft", false); + } /* WOODCUTTING */ - /*public int getLeafBlowUnlockLevel() { return config.getInt("Skills.Woodcutting.LeafBlower.UnlockLevel", 100); }*/ - - /* KRAKEN STUFF */ - public boolean getKrakenEnabled() { return config.getBoolean("Kraken.Enabled", true); } - public int getKrakenTriesBeforeRelease() { return config.getInt("Kraken.Tries_Before_Release", 50); } - public double getKrakenHealth() { return config.getDouble("Kraken.Health", 50.0D); } - public String getKrakenName() { return config.getString("Kraken.Name", "The Kraken"); } - public int getKrakenAttackInterval() { return config.getInt("Kraken.Attack_Interval_Seconds", 1); } - public double getKrakenAttackDamage() { return config.getDouble("Kraken.Attack_Damage", 1.0D); } - public boolean getKrakenGlobalEffectsEnabled() { return config.getBoolean("Kraken.Global_Effects", false); } - public boolean getKrakenEscapeAllowed() { return config.getBoolean("Kraken.Allow_Escaping", false); } - public String getServerUnleashMessage() { return config.getString("Kraken.Unleashed_Message.Server", ""); } - public String getPlayerUnleashMessage() { return config.getString("Kraken.Unleashed_Message.Player", ""); } - public String getPlayerDefeatMessage() { return config.getString("Kraken.Defeated_Message.Killed", ""); } - public String getPlayerEscapeMessage() { return config.getString("Kraken.Defeated_Message.Escape", ""); } + public boolean isKnockOnWoodXPOrbEnabled() { + return config.getBoolean("Skills.Woodcutting.TreeFeller.Knock_On_Wood.Add_XP_Orbs_To_Drops", true); + } } diff --git a/src/main/java/com/gmail/nossr50/config/AutoUpdateConfigLoader.java b/src/main/java/com/gmail/nossr50/config/AutoUpdateConfigLoader.java index 439eef220..710534e36 100644 --- a/src/main/java/com/gmail/nossr50/config/AutoUpdateConfigLoader.java +++ b/src/main/java/com/gmail/nossr50/config/AutoUpdateConfigLoader.java @@ -1,133 +1,103 @@ package com.gmail.nossr50.config; +import com.gmail.nossr50.mcMMO; import org.bukkit.configuration.file.FileConfiguration; import org.bukkit.configuration.file.YamlConfiguration; +import org.jetbrains.annotations.NotNull; -import java.io.*; -import java.util.HashMap; +import java.io.File; +import java.io.IOException; import java.util.HashSet; -import java.util.LinkedHashMap; import java.util.Set; public abstract class AutoUpdateConfigLoader extends ConfigLoader { + public AutoUpdateConfigLoader(String relativePath, String fileName, File dataFolder) { + super(relativePath, fileName, dataFolder); + } + + public AutoUpdateConfigLoader(String fileName, File dataFolder) { + super(fileName, dataFolder); + } + + @Deprecated public AutoUpdateConfigLoader(String relativePath, String fileName) { super(relativePath, fileName); } + @Deprecated public AutoUpdateConfigLoader(String fileName) { super(fileName); } + protected void saveConfig() { + try { + mcMMO.p.getLogger().info("Saving changes to config file - " + fileName); + config.options().indent(2); + config.save(configFile); + } catch (IOException e) { + e.printStackTrace(); + } + } + + protected @NotNull FileConfiguration getInternalConfig() { + return YamlConfiguration.loadConfiguration(mcMMO.p.getResourceAsReader(fileName)); + } + @Override protected void loadFile() { super.loadFile(); - FileConfiguration internalConfig = YamlConfiguration.loadConfiguration(plugin.getResourceAsReader(fileName)); + FileConfiguration internalConfig = YamlConfiguration.loadConfiguration(mcMMO.p.getResourceAsReader(fileName)); Set configKeys = config.getKeys(true); Set internalConfigKeys = internalConfig.getKeys(true); boolean needSave = false; - Set oldKeys = new HashSet(configKeys); + // keys present in current config file that are not in the template + Set oldKeys = new HashSet<>(configKeys); oldKeys.removeAll(internalConfigKeys); - Set newKeys = new HashSet(internalConfigKeys); + if (!oldKeys.isEmpty()) { + mcMMO.p.debug("old key(s) in \"" + fileName + "\""); + for (String key : oldKeys) { + mcMMO.p.debug(" old-key:" + key); + } + } + + // keys present in template that are not in current file + Set newKeys = new HashSet<>(internalConfigKeys); newKeys.removeAll(configKeys); - // Don't need a re-save if we have old keys sticking around? - // Would be less saving, but less... correct? - if (!newKeys.isEmpty() || !oldKeys.isEmpty()) { + if (!newKeys.isEmpty()) { needSave = true; } - for (String key : oldKeys) { - plugin.debug("Detected potentially unused key: " + key); - //config.set(key, null); - } - for (String key : newKeys) { - plugin.debug("Adding new key: " + key + " = " + internalConfig.get(key)); + mcMMO.p.debug("Adding new key: " + key + " = " + internalConfig.get(key)); config.set(key, internalConfig.get(key)); } if (needSave) { - // Get Bukkit's version of an acceptable config with new keys, and no old keys - String output = config.saveToString(); - - // Convert to the superior 4 space indentation - output = output.replace(" ", " "); - - // Rip out Bukkit's attempt to save comments at the top of the file - while (output.replaceAll("[//s]", "").startsWith("#")) { - output = output.substring(output.indexOf('\n', output.indexOf('#')) + 1); - } - - // Read the internal config to get comments, then put them in the new one - try { - // Read internal - BufferedReader reader = new BufferedReader(new InputStreamReader(plugin.getResource(fileName))); - LinkedHashMap comments = new LinkedHashMap(); - String temp = ""; - - String line; - while ((line = reader.readLine()) != null) { - if (line.contains("#")) { - temp += line + "\n"; - } - else if (line.contains(":")) { - line = line.substring(0, line.indexOf(":") + 1); - if (!temp.isEmpty()) { - if(comments.containsKey(line)) { - int index = 0; - while(comments.containsKey(line + index)) { - index++; - } - - line = line + index; - } - - comments.put(line, temp); - temp = ""; - } - } - } - - // Dump to the new one - HashMap indexed = new HashMap(); - for (String key : comments.keySet()) { - String actualkey = key.substring(0, key.indexOf(":") + 1); - - int index = 0; - if(indexed.containsKey(actualkey)) { - index = indexed.get(actualkey); - } - boolean isAtTop = !output.contains("\n" + actualkey); - index = output.indexOf((isAtTop ? "" : "\n") + actualkey, index); - - if (index >= 0) { - output = output.substring(0, index) + "\n" + comments.get(key) + output.substring(isAtTop ? index : index + 1); - indexed.put(actualkey, index + comments.get(key).length() + actualkey.length() + 1); - } - } - } - catch (Exception e) { - e.printStackTrace(); - } - // Save it + + if (dataFolder == null) { + mcMMO.p.getLogger().severe("Data folder should never be null!"); + return; + } + try { String saveName = fileName; // At this stage we cannot guarantee that Config has been loaded, so we do the check directly here - if (!plugin.getConfig().getBoolean("General.Config_Update_Overwrite", true)) { + if (!mcMMO.p.getConfig().getBoolean("General.Config_Update_Overwrite", true)) { saveName += ".new"; } - BufferedWriter writer = new BufferedWriter(new FileWriter(new File(plugin.getDataFolder(), saveName))); - writer.write(output); - writer.flush(); - writer.close(); - } - catch (Exception e) { + File newSaveFile = new File(dataFolder, saveName); + YamlConfiguration yamlConfiguration = config; + yamlConfiguration.options().indent(4); + yamlConfiguration.save(newSaveFile); + + } catch (Exception e) { e.printStackTrace(); } } diff --git a/src/main/java/com/gmail/nossr50/config/BukkitConfig.java b/src/main/java/com/gmail/nossr50/config/BukkitConfig.java new file mode 100644 index 000000000..ccf59b5a9 --- /dev/null +++ b/src/main/java/com/gmail/nossr50/config/BukkitConfig.java @@ -0,0 +1,224 @@ +package com.gmail.nossr50.config; + +import com.gmail.nossr50.mcMMO; +import org.bukkit.configuration.InvalidConfigurationException; +import org.bukkit.configuration.file.YamlConfiguration; +import org.jetbrains.annotations.NotNull; + +import java.io.*; +import java.util.HashSet; +import java.util.Set; + +public abstract class BukkitConfig { + protected static final String CONFIG_PATCH_PREFIX = "ConfigPatchVersion:"; + protected static final String CURRENT_CONFIG_PATCH_VER = "ConfigPatchVersion: 2"; + protected static final char COMMENT_PREFIX = '#'; + protected final String fileName; + protected final File configFile; + protected YamlConfiguration config; + protected @NotNull + final File dataFolder; + protected boolean unmodifiedConfig = true; //Used to mark when we have made a fix that needs an immediate save + + public BukkitConfig(@NotNull String fileName, @NotNull File dataFolder) { + mcMMO.p.getLogger().info("[config] Initializing config: " + fileName); + this.fileName = fileName; + this.dataFolder = dataFolder; + configFile = new File(dataFolder, fileName); + purgeComments(true); + this.config = initConfig(); + initDefaults(); + updateFile(); + mcMMO.p.getLogger().info("[config] Config initialized: " + fileName); + validate(); + } + + @Deprecated + public BukkitConfig(@NotNull String fileName) { + this(fileName, mcMMO.p.getDataFolder()); + } + + /** + * Initialize default values for the config + */ + public void initDefaults() {} + + /** + * Update the file on the disk by copying out any new and missing defaults + */ + public void updateFile() { + try { + config.save(configFile); + } catch (IOException e) { + e.printStackTrace(); + } + } + + private YamlConfiguration initConfig() { + if (!configFile.exists()) { + mcMMO.p.getLogger().info("[config] User config file not found, copying a default config to disk: " + fileName); + mcMMO.p.saveResource(fileName, false); + } + + mcMMO.p.getLogger().info("[config] Loading config from disk: " + fileName); + YamlConfiguration config = new YamlConfiguration(); + config.options().indent(4); + + try { + config.options().parseComments(true); + } catch (NoSuchMethodError e) { + //e.printStackTrace(); + // mcMMO.p.getLogger().severe("Your Spigot/CraftBukkit API is out of date, update your server software!"); + } + + config.options().copyDefaults(true); + + try { + config.load(configFile); + } catch (IOException | InvalidConfigurationException e) { + e.printStackTrace(); + } + + return config; + } + + protected abstract void loadKeys(); + + protected abstract void validateConfigKeys(); + + protected void fixConfigKey(@NotNull String key, @NotNull String value, @NotNull String reason) { + mcMMO.p.getLogger().warning(reason); + config.set(key, value); + this.unmodifiedConfig = false; //flag to save config + } + + private void validate() { + //TODO: Rewrite legacy validation code + validateConfigKeys(); + + if (unmodifiedConfig) { + mcMMO.p.debug("No errors found in " + fileName + "!"); + } else { + mcMMO.p.getLogger().warning("Errors were found in " + fileName + ", overwriting invalid values with defaults"); + try { + config.save(configFile); + unmodifiedConfig = true; + } catch (IOException e) { + e.printStackTrace(); + } + } + } + + public void backup() { + mcMMO.p.getLogger().severe("You are using an old version of the " + fileName + " file."); + mcMMO.p.getLogger().severe("Your old file has been renamed to " + fileName + ".old and has been replaced by an updated version."); + + configFile.renameTo(new File(configFile.getPath() + ".old")); + + if (mcMMO.p.getResource(fileName) != null) { + mcMMO.p.saveResource(fileName, true); + } + + mcMMO.p.getLogger().warning("Reloading " + fileName + " with new values..."); + initConfig(); + loadKeys(); + } + + public File getFile() { + return configFile; + } + + /** + * Somewhere between December 2021-January 2022 Spigot updated their + * SnakeYAML dependency/API and due to our own crappy legacy code + * this introduced a very problematic bug where comments got duplicated + *

+ * This method hotfixes the problem by just deleting any existing comments + * it's ugly, but it gets the job done + * + * @param silentFail when true mcMMO will report errors during the patch process or debug information + * the option to have it fail silently is because mcMMO wants to check files before they are parsed as a file with a zillion comments will fail to even load + */ + private void purgeComments(boolean silentFail) { + if(!configFile.exists()) + return; + + int dupedLines = 0, lineCount = 0, lineCountAfter = 0; + try (FileReader fileReader = new FileReader(configFile); + BufferedReader bufferedReader = new BufferedReader(fileReader)) { + StringBuilder stringBuilder = new StringBuilder(); + String line; + Set seenBefore = new HashSet<>(); + + stringBuilder.append(CURRENT_CONFIG_PATCH_VER).append(System.lineSeparator()); + boolean noPatchNeeded = false; + + // While not at the end of the file + while ((line = bufferedReader.readLine()) != null) { + lineCount++; + + if(line.startsWith(CURRENT_CONFIG_PATCH_VER)) { + noPatchNeeded = true; + break; + } + + //Older version, don't append this line + if(line.startsWith(CONFIG_PATCH_PREFIX)) + continue; + + if (isFirstCharAsciiCharacter(line, COMMENT_PREFIX)) { + if(seenBefore.contains(line)) + dupedLines++; + else + seenBefore.add(line); + + continue; //Delete the line by not appending it + } + + stringBuilder + .append(line) //Convert existing files into two-spaced format + .append(System.lineSeparator()); + lineCountAfter++; + } + + if(noPatchNeeded) + return; + + if(lineCount == 0 && !silentFail) { + mcMMO.p.getLogger().info("[config patcher] Config line count: " + lineCount); + throw new InvalidConfigurationException("[config patcher] Patching of config file resulted in an empty file, this will not be saved. Contact the mcMMO devs!"); + } + + if(dupedLines > 0 && !silentFail) { + mcMMO.p.getLogger().info("[config patcher] Found "+dupedLines+" duplicate comments in config file: " + configFile.getName()); + mcMMO.p.getLogger().info("[config patcher] Purging the duplicate comments... (Nothing is broken, this is just info used for debugging)"); + mcMMO.p.getLogger().info("[config patcher] Line count before: "+lineCount); + mcMMO.p.getLogger().info("[config patcher] Line count after: "+lineCountAfter); + } + + // Write out the *patched* file + // AKA the file without any comments + try (FileWriter fileWriter = new FileWriter(configFile)) { + fileWriter.write(stringBuilder.toString()); + } + } catch (IOException | InvalidConfigurationException ex) { + mcMMO.p.getLogger().severe("Failed to patch config file: " + configFile.getName()); + ex.printStackTrace(); + } + } + + private boolean isFirstCharAsciiCharacter(String line, char character) { + if(line == null || line.isEmpty()) { + return true; + } + + for(Character c : line.toCharArray()) { + if(c.equals(' ')) + continue; + + return c.equals(character); + } + + return false; + } +} \ No newline at end of file diff --git a/src/main/java/com/gmail/nossr50/config/ChatConfig.java b/src/main/java/com/gmail/nossr50/config/ChatConfig.java new file mode 100644 index 000000000..b01fdb84a --- /dev/null +++ b/src/main/java/com/gmail/nossr50/config/ChatConfig.java @@ -0,0 +1,57 @@ +package com.gmail.nossr50.config; + +import com.gmail.nossr50.datatypes.chat.ChatChannel; +import com.gmail.nossr50.util.text.StringUtils; +import org.jetbrains.annotations.NotNull; + +public class ChatConfig extends BukkitConfig { + private static ChatConfig instance; + + private ChatConfig() { + super("chat.yml"); + } + + public static ChatConfig getInstance() { + if (instance == null) { + instance = new ChatConfig(); + } + + return instance; + } + + @Override + protected void loadKeys() { + //Sigh this old config system... + } + + @Override + protected void validateConfigKeys() { + //TODO: Rewrite legacy validation code + } + + public boolean isChatEnabled() { + return config.getBoolean("Chat.Enable", true); + } + + public boolean isChatChannelEnabled(@NotNull ChatChannel chatChannel) { + String key = "Chat.Channels." + StringUtils.getCapitalized(chatChannel.toString()) + ".Enable"; + return config.getBoolean(key, true); + } + + /** + * Whether or not to use display names for players in target {@link ChatChannel} + * + * @param chatChannel target chat channel + * + * @return true if display names should be used + */ + public boolean useDisplayNames(@NotNull ChatChannel chatChannel) { + String key = "Chat.Channels." + StringUtils.getCapitalized(chatChannel.toString()) + ".Use_Display_Names"; + return config.getBoolean(key, true); + } + + public boolean isSpyingAutomatic() { + return config.getBoolean("Chat.Channels.Party.Spies.Automatically_Enable_Spying", false); + } + +} \ No newline at end of file diff --git a/src/main/java/com/gmail/nossr50/config/Config.java b/src/main/java/com/gmail/nossr50/config/Config.java deleted file mode 100644 index 69e0dc30a..000000000 --- a/src/main/java/com/gmail/nossr50/config/Config.java +++ /dev/null @@ -1,581 +0,0 @@ -package com.gmail.nossr50.config; - -import com.gmail.nossr50.database.SQLDatabaseManager.PoolIdentifier; -import com.gmail.nossr50.datatypes.MobHealthbarType; -import com.gmail.nossr50.datatypes.party.PartyFeature; -import com.gmail.nossr50.datatypes.skills.PrimarySkillType; -import com.gmail.nossr50.datatypes.skills.SuperAbilityType; -import com.gmail.nossr50.util.StringUtils; -import org.bukkit.Material; -import org.bukkit.block.data.BlockData; -import org.bukkit.configuration.ConfigurationSection; - -import java.util.ArrayList; -import java.util.List; -import java.util.Locale; -import java.util.Set; - -public class Config extends AutoUpdateConfigLoader { - private static Config instance; - - private Config() { - super("config.yml"); - validate(); - } - - public static Config getInstance() { - if (instance == null) { - instance = new Config(); - } - - return instance; - } - - @Override - protected void loadKeys() { - - } - - @Override - protected boolean validateKeys() { - // Validate all the settings! - List reason = new ArrayList(); - - /* General Settings */ - if (getSaveInterval() <= 0) { - reason.add("General.Save_Interval should be greater than 0!"); - } - - /* MySQL Settings */ - for (PoolIdentifier identifier : PoolIdentifier.values()) { - if (getMySQLMaxConnections(identifier) <= 0) { - reason.add("MySQL.Database.MaxConnections." + StringUtils.getCapitalized(identifier.toString()) + " should be greater than 0!"); - } - if (getMySQLMaxPoolSize(identifier) <= 0) { - reason.add("MySQL.Database.MaxPoolSize." + StringUtils.getCapitalized(identifier.toString()) + " should be greater than 0!"); - } - } - - /* Mob Healthbar */ - if (getMobHealthbarTime() == 0) { - reason.add("Mob_Healthbar.Display_Time cannot be 0! Set to -1 to disable or set a valid value."); - } - - /* Scoreboards */ - /*if (getRankScoreboardTime() != -1 && getRankScoreboardTime() <= 0) { - reason.add("Scoreboard.Types.Rank.Display_Time should be greater than 0, or -1!"); - } - - if (getStatsScoreboardTime() != -1 && getStatsScoreboardTime() <= 0) { - reason.add("Scoreboard.Types.Stats.Display_Time should be greater than 0, or -1!"); - } - - if (getTopScoreboardTime() != -1 && getTopScoreboardTime() <= 0) { - reason.add("Scoreboard.Types.Top.Display_Time should be greater than 0, or -1!"); - } - - if (getInspectScoreboardTime() != -1 && getInspectScoreboardTime() <= 0) { - reason.add("Scoreboard.Types.Inspect.Display_Time should be greater than 0, or -1!"); - } - - if (getSkillScoreboardTime() != -1 && getSkillScoreboardTime() <= 0) { - reason.add("Scoreboard.Types.Skill.Display_Time should be greater than 0, or -1!"); - } - - if (getSkillLevelUpTime() != -1 && getSkillScoreboardTime() <= 0) { - reason.add("Scoreboard.Types.Skill.Display_Time should be greater than 0, or -1!"); - } - - if (!(getRankUseChat() || getRankUseBoard())) { - reason.add("Either Board or Print in Scoreboard.Types.Rank must be true!"); - } - - if (!(getTopUseChat() || getTopUseBoard())) { - reason.add("Either Board or Print in Scoreboard.Types.Top must be true!"); - } - - if (!(getStatsUseChat() || getStatsUseBoard())) { - reason.add("Either Board or Print in Scoreboard.Types.Stats must be true!"); - } - - if (!(getInspectUseChat() || getInspectUseBoard())) { - reason.add("Either Board or Print in Scoreboard.Types.Inspect must be true!"); - }*/ - - /* Database Purging */ - if (getPurgeInterval() < -1) { - reason.add("Database_Purging.Purge_Interval should be greater than, or equal to -1!"); - } - - if (getOldUsersCutoff() != -1 && getOldUsersCutoff() <= 0) { - reason.add("Database_Purging.Old_User_Cutoff should be greater than 0 or -1!"); - } - - /* Hardcore Mode */ - if (getHardcoreDeathStatPenaltyPercentage() < 0.01 || getHardcoreDeathStatPenaltyPercentage() > 100) { - reason.add("Hardcore.Death_Stat_Loss.Penalty_Percentage only accepts values from 0.01 to 100!"); - } - - if (getHardcoreVampirismStatLeechPercentage() < 0.01 || getHardcoreVampirismStatLeechPercentage() > 100) { - reason.add("Hardcore.Vampirism.Leech_Percentage only accepts values from 0.01 to 100!"); - } - - /* Items */ - if (getChimaeraUseCost() < 1 || getChimaeraUseCost() > 64) { - reason.add("Items.Chimaera_Wing.Use_Cost only accepts values from 1 to 64!"); - } - - if (getChimaeraRecipeCost() < 1 || getChimaeraRecipeCost() > 9) { - reason.add("Items.Chimaera_Wing.Recipe_Cost only accepts values from 1 to 9!"); - } - - if (getChimaeraItem() == null) { - reason.add("Items.Chimaera_Wing.Item_Name is invalid!"); - } - - /* Particles */ - if (getLevelUpEffectsTier() < 1) { - reason.add("Particles.LevelUp_Tier should be at least 1!"); - } - - /* PARTY SETTINGS */ - if (getAutoPartyKickInterval() < -1) { - reason.add("Party.AutoKick_Interval should be at least -1!"); - } - - if (getAutoPartyKickTime() < 0) { - reason.add("Party.Old_Party_Member_Cutoff should be at least 0!"); - } - - if (getPartyShareBonusBase() <= 0) { - reason.add("Party.Sharing.ExpShare_bonus_base should be greater than 0!"); - } - - if (getPartyShareBonusIncrease() < 0) { - reason.add("Party.Sharing.ExpShare_bonus_increase should be at least 0!"); - } - - if (getPartyShareBonusCap() <= 0) { - reason.add("Party.Sharing.ExpShare_bonus_cap should be greater than 0!"); - } - - if (getPartyShareRange() <= 0) { - reason.add("Party.Sharing.Range should be greater than 0!"); - } - - if (getPartyXpCurveMultiplier() < 1) { - reason.add("Party.Leveling.Xp_Curve_Modifier should be at least 1!"); - } - - for (PartyFeature partyFeature : PartyFeature.values()) { - if (getPartyFeatureUnlockLevel(partyFeature) < 0) { - reason.add("Party.Leveling." + StringUtils.getPrettyPartyFeatureString(partyFeature).replace(" ", "") + "_UnlockLevel should be at least 0!"); - } - } - - /* Inspect command distance */ - if (getInspectDistance() <= 0) { - reason.add("Commands.inspect.Max_Distance should be greater than 0!"); - } - - if (getTreeFellerThreshold() <= 0) { - reason.add("Abilities.Limits.Tree_Feller_Threshold should be greater than 0!"); - } - - if (getFishingLureModifier() < 0) { - reason.add("Abilities.Fishing.Lure_Modifier should be at least 0!"); - } - - if (getRepairAnvilMaterial() == null) { - reason.add("Skills.Repair.Anvil_Type is invalid!!"); - } - - if (getSalvageAnvilMaterial() == null) { - reason.add("Skills.Repair.Salvage_Anvil_Type is invalid!"); - } - - if (getRepairAnvilMaterial() == getSalvageAnvilMaterial()) { - reason.add("Cannot use the same item for Repair and Salvage anvils!"); - } - -// if (getTamingCOTWMaterial(EntityType.WOLF) == null) { -// reason.add("Skills.Taming.Call_Of_The_Wild.Wolf.Item_Material is invalid!!"); -// } -// -// if (getTamingCOTWMaterial(EntityType.OCELOT) == null) { -// reason.add("Skills.Taming.Call_Of_The_Wild.Ocelot.Item_Material is invalid!!"); -// } -// -// if (getTamingCOTWMaterial(EntityType.HORSE) == null) { -// reason.add("Skills.Taming.Call_Of_The_Wild.Horse.Item_Material is invalid!!"); -// } -// -// if (getTamingCOTWCost(EntityType.WOLF) <= 0) { -// reason.add("Skills.Taming.Call_Of_The_Wild.Wolf.Item_Amount should be greater than 0!"); -// } -// -// if (getTamingCOTWCost(EntityType.OCELOT) <= 0) { -// reason.add("Skills.Taming.Call_Of_The_Wild.Ocelot.Item_Amount should be greater than 0!"); -// } -// -// if (getTamingCOTWCost(EntityType.HORSE) <= 0) { -// reason.add("Skills.Taming.Call_Of_The_Wild.Horse.Item_Amount should be greater than 0!"); -// } -// -// if (getTamingCOTWAmount(EntityType.WOLF) <= 0) { -// reason.add("Skills.Taming.Call_Of_The_Wild.Wolf.Summon_Amount should be greater than 0!"); -// } -// -// if (getTamingCOTWAmount(EntityType.OCELOT) <= 0) { -// reason.add("Skills.Taming.Call_Of_The_Wild.Ocelot.Summon_Amount should be greater than 0!"); -// } -// -// if (getTamingCOTWAmount(EntityType.HORSE) <= 0) { -// reason.add("Skills.Taming.Call_Of_The_Wild.Horse.Summon_Amount should be greater than 0!"); -// } - - return noErrorsInConfig(reason); - } - - /* - * GENERAL SETTINGS - */ - - public boolean isAprilFoolsAllowed() { return config.getBoolean("General.AprilFoolsEvent", true); } - - /* General Settings */ - public boolean getIsMetricsEnabled() { return config.getBoolean("Metrics.bstats", true); } - - //Retro mode will default the value to true if the config file doesn't contain the entry (server is from a previous mcMMO install) - public boolean getIsRetroMode() { return config.getBoolean("General.RetroMode.Enabled", true); } - - public String getLocale() { return config.getString("General.Locale", "en_us"); } - public boolean getMOTDEnabled() { return config.getBoolean("General.MOTD_Enabled", true); } - public boolean getShowProfileLoadedMessage() { return config.getBoolean("General.Show_Profile_Loaded", true); } - public boolean getDonateMessageEnabled() { return config.getBoolean("Commands.mcmmo.Donate_Message", true); } - public int getSaveInterval() { return config.getInt("General.Save_Interval", 10); } - public boolean getStatsTrackingEnabled() { return config.getBoolean("General.Stats_Tracking", true); } - public boolean getUpdateCheckEnabled() { return config.getBoolean("General.Update_Check", true); } - public boolean getPreferBeta() { return config.getBoolean("General.Prefer_Beta", false); } - public boolean getVerboseLoggingEnabled() { return config.getBoolean("General.Verbose_Logging", false); } - - public String getPartyChatPrefix() { return config.getString("Commands.partychat.Chat_Prefix_Format", "[[GREEN]]([[WHITE]]{0}[[GREEN]])"); } - public boolean getPartyChatColorLeaderName() { return config.getBoolean("Commands.partychat.Gold_Leader_Name", true); } - public boolean getPartyDisplayNames() { return config.getBoolean("Commands.partychat.Use_Display_Names", true); } - public String getPartyChatPrefixAlly() { return config.getString("Commands.partychat.Chat_Prefix_Format_Ally", "[[GREEN]](A)[[RESET]]"); } - - public String getAdminChatPrefix() { return config.getString("Commands.adminchat.Chat_Prefix_Format", "[[AQUA]][[[WHITE]]{0}[[AQUA]]]"); } - public boolean getAdminDisplayNames() { return config.getBoolean("Commands.adminchat.Use_Display_Names", true); } - - public boolean getMatchOfflinePlayers() { return config.getBoolean("Commands.Generic.Match_OfflinePlayers", false); } - public long getDatabasePlayerCooldown() { return config.getLong("Commands.Database.Player_Cooldown", 1750); } - - public boolean getLevelUpSoundsEnabled() { return config.getBoolean("General.LevelUp_Sounds", true); } - public boolean getRefreshChunksEnabled() { return config.getBoolean("General.Refresh_Chunks", false); } - - public boolean getMobHealthbarEnabled() { return config.getBoolean("Mob_Healthbar.Enabled", true); } - - /* Mob Healthbar */ - public MobHealthbarType getMobHealthbarDefault() { - try { - return MobHealthbarType.valueOf(config.getString("Mob_Healthbar.Display_Type", "HEARTS").toUpperCase(Locale.ENGLISH).trim()); - } - catch (IllegalArgumentException ex) { - return MobHealthbarType.HEARTS; - } - } - - public int getMobHealthbarTime() { return config.getInt("Mob_Healthbar.Display_Time", 3); } - - /* Scoreboards */ - public boolean getScoreboardsEnabled() { return config.getBoolean("Scoreboard.UseScoreboards", true); } - public boolean getPowerLevelTagsEnabled() { return config.getBoolean("Scoreboard.Power_Level_Tags", false); } - public boolean getAllowKeepBoard() { return config.getBoolean("Scoreboard.Allow_Keep", true); } - public int getTipsAmount() { return config.getInt("Scoreboard.Tips_Amount", 5); } - public boolean getShowStatsAfterLogin() { return config.getBoolean("Scoreboard.Show_Stats_After_Login", false); } - public boolean getScoreboardRainbows() { return config.getBoolean("Scoreboard.Rainbows", false); } - public boolean getShowAbilityNames() { return config.getBoolean("Scoreboard.Ability_Names", true); } - - public boolean getRankUseChat() { return config.getBoolean("Scoreboard.Types.Rank.Print", false); } - public boolean getRankUseBoard() { return config.getBoolean("Scoreboard.Types.Rank.Board", true); } - public int getRankScoreboardTime() { return config.getInt("Scoreboard.Types.Rank.Display_Time", 10); } - - public boolean getTopUseChat() { return config.getBoolean("Scoreboard.Types.Top.Print", true); } - public boolean getTopUseBoard() { return config.getBoolean("Scoreboard.Types.Top.Board", true); } - public int getTopScoreboardTime() { return config.getInt("Scoreboard.Types.Top.Display_Time", 15); } - - public boolean getStatsUseChat() { return config.getBoolean("Scoreboard.Types.Stats.Print", true); } - public boolean getStatsUseBoard() { return config.getBoolean("Scoreboard.Types.Stats.Board", true); } - public int getStatsScoreboardTime() { return config.getInt("Scoreboard.Types.Stats.Display_Time", 10); } - - public boolean getInspectUseChat() { return config.getBoolean("Scoreboard.Types.Inspect.Print", true); } - public boolean getInspectUseBoard() { return config.getBoolean("Scoreboard.Types.Inspect.Board", true); } - public int getInspectScoreboardTime() { return config.getInt("Scoreboard.Types.Inspect.Display_Time", 25); } - - public boolean getCooldownUseChat() { return config.getBoolean("Scoreboard.Types.Cooldown.Print", false); } - public boolean getCooldownUseBoard() { return config.getBoolean("Scoreboard.Types.Cooldown.Board", true); } - public int getCooldownScoreboardTime() { return config.getInt("Scoreboard.Types.Cooldown.Display_Time", 41); } - - public boolean getSkillUseBoard() { return config.getBoolean("Scoreboard.Types.Skill.Board", true); } - public int getSkillScoreboardTime() { return config.getInt("Scoreboard.Types.Skill.Display_Time", 30); } - public boolean getSkillLevelUpBoard() { return config.getBoolean("Scoreboard.Types.Skill.LevelUp_Board", true); } - public int getSkillLevelUpTime() { return config.getInt("Scoreboard.Types.Skill.LevelUp_Time", 5); } - - /* Database Purging */ - public int getPurgeInterval() { return config.getInt("Database_Purging.Purge_Interval", -1); } - public int getOldUsersCutoff() { return config.getInt("Database_Purging.Old_User_Cutoff", 6); } - - /* Backups */ - public boolean getBackupsEnabled() { return config.getBoolean("Backups.Enabled", true); } - public boolean getKeepLast24Hours() { return config.getBoolean("Backups.Keep.Last_24_Hours", true); } - public boolean getKeepDailyLastWeek() { return config.getBoolean("Backups.Keep.Daily_Last_Week", true); } - public boolean getKeepWeeklyPastMonth() { return config.getBoolean("Backups.Keep.Weekly_Past_Months", true); } - - /* mySQL */ - public boolean getUseMySQL() { return config.getBoolean("MySQL.Enabled", false); } - public String getMySQLTablePrefix() { return config.getString("MySQL.Database.TablePrefix", "mcmmo_"); } - public String getMySQLDatabaseName() { return getStringIncludingInts("MySQL.Database.Name"); } - public String getMySQLUserName() { return getStringIncludingInts("MySQL.Database.User_Name"); } - public int getMySQLServerPort() { return config.getInt("MySQL.Server.Port", 3306); } - public String getMySQLServerName() { return config.getString("MySQL.Server.Address", "localhost"); } - public String getMySQLUserPassword() { return getStringIncludingInts("MySQL.Database.User_Password"); } - public int getMySQLMaxConnections(PoolIdentifier identifier) { return config.getInt("MySQL.Database.MaxConnections." + StringUtils.getCapitalized(identifier.toString()), 30); } - public int getMySQLMaxPoolSize(PoolIdentifier identifier) { return config.getInt("MySQL.Database.MaxPoolSize." + StringUtils.getCapitalized(identifier.toString()), 10); } - public boolean getMySQLSSL() { return config.getBoolean("MySQL.Server.SSL", true); } - public boolean getMySQLDebug() { return config.getBoolean("MySQL.Debug", false); } - - private String getStringIncludingInts(String key) { - String str = config.getString(key); - - if (str == null) { - str = String.valueOf(config.getInt(key)); - } - - if (str.equals("0")) { - str = "No value set for '" + key + "'"; - } - return str; - } - - /* Hardcore Mode */ - public boolean getHardcoreStatLossEnabled(PrimarySkillType primarySkillType) { return config.getBoolean("Hardcore.Death_Stat_Loss.Enabled." + StringUtils.getCapitalized(primarySkillType.toString()), false); } - public void setHardcoreStatLossEnabled(PrimarySkillType primarySkillType, boolean enabled) { config.set("Hardcore.Death_Stat_Loss.Enabled." + StringUtils.getCapitalized(primarySkillType.toString()), enabled); } - - public double getHardcoreDeathStatPenaltyPercentage() { return config.getDouble("Hardcore.Death_Stat_Loss.Penalty_Percentage", 75.0D); } - public void setHardcoreDeathStatPenaltyPercentage(double value) { config.set("Hardcore.Death_Stat_Loss.Penalty_Percentage", value); } - - public int getHardcoreDeathStatPenaltyLevelThreshold() { return config.getInt("Hardcore.Death_Stat_Loss.Level_Threshold", 0); } - - public boolean getHardcoreVampirismEnabled(PrimarySkillType primarySkillType) { return config.getBoolean("Hardcore.Vampirism.Enabled." + StringUtils.getCapitalized(primarySkillType.toString()), false); } - public void setHardcoreVampirismEnabled(PrimarySkillType primarySkillType, boolean enabled) { config.set("Hardcore.Vampirism.Enabled." + StringUtils.getCapitalized(primarySkillType.toString()), enabled); } - - public double getHardcoreVampirismStatLeechPercentage() { return config.getDouble("Hardcore.Vampirism.Leech_Percentage", 5.0D); } - public void setHardcoreVampirismStatLeechPercentage(double value) { config.set("Hardcore.Vampirism.Leech_Percentage", value); } - - public int getHardcoreVampirismLevelThreshold() { return config.getInt("Hardcore.Vampirism.Level_Threshold", 0); } - - /* SMP Mods */ - public boolean getToolModsEnabled() { return config.getBoolean("Mods.Tool_Mods_Enabled", false); } - public boolean getArmorModsEnabled() { return config.getBoolean("Mods.Armor_Mods_Enabled", false); } - public boolean getBlockModsEnabled() { return config.getBoolean("Mods.Block_Mods_Enabled", false); } - public boolean getEntityModsEnabled() { return config.getBoolean("Mods.Entity_Mods_Enabled", false); } - - /* Items */ - public int getChimaeraUseCost() { return config.getInt("Items.Chimaera_Wing.Use_Cost", 1); } - public int getChimaeraRecipeCost() { return config.getInt("Items.Chimaera_Wing.Recipe_Cost", 5); } - public Material getChimaeraItem() { return Material.matchMaterial(config.getString("Items.Chimaera_Wing.Item_Name", "Feather")); } - public boolean getChimaeraEnabled() { return config.getBoolean("Items.Chimaera_Wing.Enabled", true); } - public boolean getChimaeraPreventUseUnderground() { return config.getBoolean("Items.Chimaera_Wing.Prevent_Use_Underground", true); } - public boolean getChimaeraUseBedSpawn() { return config.getBoolean("Items.Chimaera_Wing.Use_Bed_Spawn", true); } - public int getChimaeraCooldown() { return config.getInt("Items.Chimaera_Wing.Cooldown", 240); } - public int getChimaeraWarmup() { return config.getInt("Items.Chimaera_Wing.Warmup", 5); } - public int getChimaeraRecentlyHurtCooldown() { return config.getInt("Items.Chimaera_Wing.RecentlyHurt_Cooldown", 60); } - public boolean getChimaeraSoundEnabled() { return config.getBoolean("Items.Chimaera_Wing.Sound_Enabled", true); } - - public boolean getFluxPickaxeSoundEnabled() { return config.getBoolean("Items.Flux_Pickaxe.Sound_Enabled", true); } - - /* Particles */ - public boolean getAbilityActivationEffectEnabled() { return config.getBoolean("Particles.Ability_Activation", true); } - public boolean getAbilityDeactivationEffectEnabled() { return config.getBoolean("Particles.Ability_Deactivation", true); } - public boolean getBleedEffectEnabled() { return config.getBoolean("Particles.Bleed", true); } - public boolean getDodgeEffectEnabled() { return config.getBoolean("Particles.Dodge", true); } - public boolean getFluxEffectEnabled() { return config.getBoolean("Particles.Flux", true); } - public boolean getGreaterImpactEffectEnabled() { return config.getBoolean("Particles.Greater_Impact", true); } - public boolean getCallOfTheWildEffectEnabled() { return config.getBoolean("Particles.Call_of_the_Wild", true); } - public boolean getLevelUpEffectsEnabled() { return config.getBoolean("Particles.LevelUp_Enabled", true); } - public int getLevelUpEffectsTier() { return config.getInt("Particles.LevelUp_Tier", 100); } -// public boolean getLargeFireworks() { return config.getBoolean("Particles.LargeFireworks", true); } - - /* PARTY SETTINGS */ - public boolean getPartyFriendlyFire() { return config.getBoolean("Party.FriendlyFire", false);} - public int getPartyMaxSize() {return config.getInt("Party.MaxSize", -1); } - public int getAutoPartyKickInterval() { return config.getInt("Party.AutoKick_Interval", 12); } - public int getAutoPartyKickTime() { return config.getInt("Party.Old_Party_Member_Cutoff", 7); } - - public double getPartyShareBonusBase() { return config.getDouble("Party.Sharing.ExpShare_bonus_base", 1.1D); } - public double getPartyShareBonusIncrease() { return config.getDouble("Party.Sharing.ExpShare_bonus_increase", 0.05D); } - public double getPartyShareBonusCap() { return config.getDouble("Party.Sharing.ExpShare_bonus_cap", 1.5D); } - public double getPartyShareRange() { return config.getDouble("Party.Sharing.Range", 75.0D); } - - public int getPartyLevelCap() { - int cap = config.getInt("Party.Leveling.Level_Cap", 10); - return (cap <= 0) ? Integer.MAX_VALUE : cap; - } - - public int getPartyXpCurveMultiplier() { return config.getInt("Party.Leveling.Xp_Curve_Modifier", 3); } - public boolean getPartyXpNearMembersNeeded() { return config.getBoolean("Party.Leveling.Near_Members_Needed", false); } - public boolean getPartyInformAllMembers() { return config.getBoolean("Party.Leveling.Inform_All_Party_Members_On_LevelUp", false); } - - public int getPartyFeatureUnlockLevel(PartyFeature partyFeature) { return config.getInt("Party.Leveling." + StringUtils.getPrettyPartyFeatureString(partyFeature).replace(" ", "") + "_UnlockLevel", 0); } - - /* Party Teleport Settings */ - public int getPTPCommandCooldown() { return config.getInt("Commands.ptp.Cooldown", 120); } - public int getPTPCommandWarmup() { return config.getInt("Commands.ptp.Warmup", 5); } - public int getPTPCommandRecentlyHurtCooldown() { return config.getInt("Commands.ptp.RecentlyHurt_Cooldown", 60); } - public int getPTPCommandTimeout() { return config.getInt("Commands.ptp.Request_Timeout", 300); } - public boolean getPTPCommandConfirmRequired() { return config.getBoolean("Commands.ptp.Accept_Required", true); } - public boolean getPTPCommandWorldPermissions() { return config.getBoolean("Commands.ptp.World_Based_Permissions", false); } - - /* Inspect command distance */ - public double getInspectDistance() { return config.getDouble("Commands.inspect.Max_Distance", 30.0D); } - - /* - * ABILITY SETTINGS - */ - - /* General Settings */ - public boolean getUrlLinksEnabled() { return config.getBoolean("Commands.Skills.URL_Links"); } - public boolean getAbilityMessagesEnabled() { return config.getBoolean("Abilities.Messages", true); } - public boolean getAbilitiesEnabled() { return config.getBoolean("Abilities.Enabled", true); } - public boolean getAbilitiesOnlyActivateWhenSneaking() { return config.getBoolean("Abilities.Activation.Only_Activate_When_Sneaking", false); } - public boolean getAbilitiesGateEnabled() { return config.getBoolean("Abilities.Activation.Level_Gate_Abilities"); } - - public int getCooldown(SuperAbilityType ability) { return config.getInt("Abilities.Cooldowns." + ability.toString()); } - public int getMaxLength(SuperAbilityType ability) { return config.getInt("Abilities.Max_Seconds." + ability.toString()); } - - /* Durability Settings */ - public int getAbilityToolDamage() { return config.getInt("Abilities.Tools.Durability_Loss", 1); } - - /* Thresholds */ - public int getTreeFellerThreshold() { return config.getInt("Abilities.Limits.Tree_Feller_Threshold", 500); } - - /* - * SKILL SETTINGS - */ - public boolean getDoubleDropsEnabled(PrimarySkillType skill, Material material) { return config.getBoolean("Bonus_Drops." + StringUtils.getCapitalized(skill.toString()) + "." + StringUtils.getPrettyItemString(material).replace(" ", "_")); } - - public boolean getDoubleDropsDisabled(PrimarySkillType skill) { - String skillName = StringUtils.getCapitalized(skill.toString()); - ConfigurationSection section = config.getConfigurationSection("Bonus_Drops." + skillName); - if (section == null) - return false; - Set keys = section.getKeys(false); - boolean disabled = true; - - for (String key : keys) { - if (config.getBoolean("Bonus_Drops." + skillName + "." + key)) { - disabled = false; - break; - } - } - - return disabled; - } - - /* Axes */ - public int getAxesGate() { return config.getInt("Skills.Axes.Ability_Activation_Level_Gate", 10); } - - /* Acrobatics */ - public boolean getDodgeLightningDisabled() { return config.getBoolean("Skills.Acrobatics.Prevent_Dodge_Lightning", false); } - public int getXPAfterTeleportCooldown() { return config.getInt("Skills.Acrobatics.XP_After_Teleport_Cooldown", 5); } - - /* Alchemy */ - public boolean getEnabledForHoppers() { return config.getBoolean("Skills.Alchemy.Enabled_for_Hoppers", true); } - public boolean getPreventHopperTransferIngredients() { return config.getBoolean("Skills.Alchemy.Prevent_Hopper_Transfer_Ingredients", false); } - public boolean getPreventHopperTransferBottles() { return config.getBoolean("Skills.Alchemy.Prevent_Hopper_Transfer_Bottles", false); } - - /* Fishing */ - public boolean getFishingDropsEnabled() { return config.getBoolean("Skills.Fishing.Drops_Enabled", true); } - public boolean getFishingOverrideTreasures() { return config.getBoolean("Skills.Fishing.Override_Vanilla_Treasures", true); } - public boolean getFishingExtraFish() { return config.getBoolean("Skills.Fishing.Extra_Fish", true); } - public double getFishingLureModifier() { return config.getDouble("Skills.Fishing.Lure_Modifier", 4.0D); } - - /* Mining */ - public Material getDetonatorItem() { return Material.matchMaterial(config.getString("Skills.Mining.Detonator_Name", "FLINT_AND_STEEL")); } - - /* Excavation */ - public int getExcavationGate() { return config.getInt("Skills.Excavation.Ability_Activation_Level_Gate", 10); } - - /* Repair */ - public boolean getRepairAnvilMessagesEnabled() { return config.getBoolean("Skills.Repair.Anvil_Messages", true); } - public boolean getRepairAnvilPlaceSoundsEnabled() { return config.getBoolean("Skills.Repair.Anvil_Placed_Sounds", true); } - public boolean getRepairAnvilUseSoundsEnabled() { return config.getBoolean("Skills.Repair.Anvil_Use_Sounds", true); } - public Material getRepairAnvilMaterial() { return Material.matchMaterial(config.getString("Skills.Repair.Anvil_Material", "IRON_BLOCK")); } - public boolean getRepairConfirmRequired() { return config.getBoolean("Skills.Repair.Confirm_Required", true); } - - /* Salvage */ - public boolean getSalvageAnvilMessagesEnabled() { return config.getBoolean("Skills.Salvage.Anvil_Messages", true); } - public boolean getSalvageAnvilPlaceSoundsEnabled() { return config.getBoolean("Skills.Salvage.Anvil_Placed_Sounds", true); } - public boolean getSalvageAnvilUseSoundsEnabled() { return config.getBoolean("Skills.Salvage.Anvil_Use_Sounds", true); } - public Material getSalvageAnvilMaterial() { return Material.matchMaterial(config.getString("Skills.Salvage.Anvil_Material", "GOLD_BLOCK")); } - public boolean getSalvageConfirmRequired() { return config.getBoolean("Skills.Salvage.Confirm_Required", true); } - - /* Unarmed */ - public boolean getUnarmedBlockCrackerSmoothbrickToCracked() { return config.getBoolean("Skills.Unarmed.Block_Cracker.SmoothBrick_To_CrackedBrick", true); } - public boolean getUnarmedItemPickupDisabled() { return config.getBoolean("Skills.Unarmed.Item_Pickup_Disabled_Full_Inventory", true); } - public boolean getUnarmedItemsAsUnarmed() { return config.getBoolean("Skills.Unarmed.Items_As_Unarmed", false); } - public int getUnarmedGate() { return config.getInt("Skills.Unarmed.Ability_Activation_Level_Gate", 10); } - - /* Swords */ - public int getSwordsGate() { return config.getInt("Skills.Swords.Ability_Activation_Level_Gate", 10); } - - /* Taming */ -// public Material getTamingCOTWMaterial(EntityType type) { return Material.matchMaterial(config.getString("Skills.Taming.Call_Of_The_Wild." + StringUtils.getPrettyEntityTypeString(type) + ".Item_Material")); } -// public int getTamingCOTWCost(EntityType type) { return config.getInt("Skills.Taming.Call_Of_The_Wild." + StringUtils.getPrettyEntityTypeString(type) + ".Item_Amount"); } -// public int getTamingCOTWAmount(EntityType type) { return config.getInt("Skills.Taming.Call_Of_The_Wild." + StringUtils.getPrettyEntityTypeString(type) + ".Summon_Amount"); } -// public int getTamingCOTWLength(EntityType type) { return config.getInt("Skills.Taming.Call_Of_The_Wild." + StringUtils.getPrettyEntityTypeString(type)+ ".Summon_Length"); } -// public int getTamingCOTWMaxAmount(EntityType type) { return config.getInt("Skills.Taming.Call_Of_The_Wild." + StringUtils.getPrettyEntityTypeString(type)+ ".Summon_Max_Amount"); } - - public Material getTamingCOTWMaterial(String cotwEntity) { return Material.matchMaterial(config.getString("Skills.Taming.Call_Of_The_Wild." + cotwEntity + ".Item_Material")); } - public int getTamingCOTWCost(String cotwEntity) { return config.getInt("Skills.Taming.Call_Of_The_Wild." + cotwEntity + ".Item_Amount"); } - public int getTamingCOTWAmount(String cotwEntity) { return config.getInt("Skills.Taming.Call_Of_The_Wild." + cotwEntity + ".Summon_Amount"); } - public int getTamingCOTWLength(String cotwEntity) { return config.getInt("Skills.Taming.Call_Of_The_Wild." + cotwEntity+ ".Summon_Length"); } - public int getTamingCOTWMaxAmount(String cotwEntity) { return config.getInt("Skills.Taming.Call_Of_The_Wild." + cotwEntity+ ".Per_Player_Limit", 1); } - - /* Woodcutting */ - public boolean getWoodcuttingDoubleDropsEnabled(BlockData material) { return config.getBoolean("Bonus_Drops.Woodcutting." + StringUtils.getFriendlyConfigBlockDataString(material)); } - public boolean getTreeFellerSoundsEnabled() { return config.getBoolean("Skills.Woodcutting.Tree_Feller_Sounds", true); } - public int getWoodcuttingGate() { return config.getInt("Skills.Woodcutting.Ability_Activation_Level_Gate", 10); } - - /* AFK Leveling */ - public boolean getHerbalismPreventAFK() { return config.getBoolean("Skills.Herbalism.Prevent_AFK_Leveling", true); } - - /* Level Caps */ - public int getPowerLevelCap() { - int cap = config.getInt("General.Power_Level_Cap", 0); - return (cap <= 0) ? Integer.MAX_VALUE : cap; - } - - public int getLevelCap(PrimarySkillType skill) { - int cap = config.getInt("Skills." + StringUtils.getCapitalized(skill.toString()) + ".Level_Cap"); - return (cap <= 0) ? Integer.MAX_VALUE : cap; - } - - - /*public int isSuperAbilityUnlocked(PrimarySkillType skill) { - return config.getInt("Skills." + StringUtils.getCapitalized(skill.toString()) + ".Ability_Activation_Level_Gate"); - }*/ - - public boolean getTruncateSkills() { return config.getBoolean("General.TruncateSkills", false); } - - /* PVP & PVE Settings */ - public boolean getPVPEnabled(PrimarySkillType skill) { return config.getBoolean("Skills." + StringUtils.getCapitalized(skill.toString()) + ".Enabled_For_PVP", true); } - public boolean getPVEEnabled(PrimarySkillType skill) { return config.getBoolean("Skills." + StringUtils.getCapitalized(skill.toString()) + ".Enabled_For_PVE", true); } - - //public float getMasterVolume() { return (float) config.getDouble("Sounds.MasterVolume", 1.0); } - - public boolean broadcastEventMessages() { return config.getBoolean("General.EventBroadcasts", true);} - public boolean playerJoinEventInfo() { return config.getBoolean("General.EventInfoOnPlayerJoin", true);} - public boolean adminNotifications() { return config.getBoolean("General.AdminNotifications", true);} - -} diff --git a/src/main/java/com/gmail/nossr50/config/ConfigLoader.java b/src/main/java/com/gmail/nossr50/config/ConfigLoader.java index 025fe981b..376aa2944 100644 --- a/src/main/java/com/gmail/nossr50/config/ConfigLoader.java +++ b/src/main/java/com/gmail/nossr50/config/ConfigLoader.java @@ -1,43 +1,59 @@ package com.gmail.nossr50.config; import com.gmail.nossr50.mcMMO; -import org.bukkit.configuration.file.FileConfiguration; import org.bukkit.configuration.file.YamlConfiguration; +import org.jetbrains.annotations.NotNull; import java.io.File; import java.util.List; public abstract class ConfigLoader { - protected static final mcMMO plugin = mcMMO.p; + protected final File configFile; + protected final @NotNull File dataFolder; protected String fileName; - private File configFile; - protected FileConfiguration config; + protected YamlConfiguration config; - public ConfigLoader(String relativePath, String fileName) { + public ConfigLoader(String relativePath, String fileName, @NotNull File dataFolder) { this.fileName = fileName; - configFile = new File(plugin.getDataFolder(), relativePath + File.separator + fileName); + this.dataFolder = dataFolder; + configFile = new File(dataFolder, relativePath + File.separator + fileName); loadFile(); } + public ConfigLoader(String fileName, @NotNull File dataFolder) { + this.fileName = fileName; + this.dataFolder = dataFolder; + configFile = new File(dataFolder, fileName); + loadFile(); + } + + @Deprecated + public ConfigLoader(String relativePath, String fileName) { + this.fileName = fileName; + configFile = new File(mcMMO.p.getDataFolder(), relativePath + File.separator + fileName); + this.dataFolder = mcMMO.p.getDataFolder(); + loadFile(); + } + + @Deprecated public ConfigLoader(String fileName) { this.fileName = fileName; - configFile = new File(plugin.getDataFolder(), fileName); + configFile = new File(mcMMO.p.getDataFolder(), fileName); + this.dataFolder = mcMMO.p.getDataFolder(); loadFile(); } protected void loadFile() { if (!configFile.exists()) { - plugin.debug("Creating mcMMO " + fileName + " File..."); + mcMMO.p.getLogger().info("Creating mcMMO " + fileName + " File..."); try { - plugin.saveResource(fileName, false); // Normal files + mcMMO.p.saveResource(fileName, false); // Normal files + } catch (IllegalArgumentException ex) { + mcMMO.p.saveResource(configFile.getParentFile().getName() + File.separator + fileName, false); // Mod files } - catch (IllegalArgumentException ex) { - plugin.saveResource(configFile.getParentFile().getName() + File.separator + fileName, false); // Mod files - } - } - else { - plugin.debug("Loading mcMMO " + fileName + " File..."); + } else { + mcMMO.p.getLogger().info("Loading mcMMO " + fileName + " File..."); } config = YamlConfiguration.loadConfiguration(configFile); @@ -51,7 +67,7 @@ public abstract class ConfigLoader { protected boolean noErrorsInConfig(List issues) { for (String issue : issues) { - plugin.getLogger().warning(issue); + mcMMO.p.getLogger().warning(issue); } return issues.isEmpty(); @@ -59,12 +75,10 @@ public abstract class ConfigLoader { protected void validate() { if (validateKeys()) { - plugin.debug("No errors found in " + fileName + "!"); - } - else { - plugin.getLogger().warning("Errors were found in " + fileName + "! mcMMO was disabled!"); - plugin.getServer().getPluginManager().disablePlugin(plugin); - plugin.noErrorsInConfigFiles = false; + mcMMO.p.debug("No errors found in " + fileName + "!"); + } else { + mcMMO.p.getLogger().warning("Errors were found in " + fileName + "! mcMMO was disabled!"); + mcMMO.p.getServer().getPluginManager().disablePlugin(mcMMO.p); } } @@ -73,16 +87,16 @@ public abstract class ConfigLoader { } public void backup() { - plugin.getLogger().warning("You are using an old version of the " + fileName + " file."); - plugin.getLogger().warning("Your old file has been renamed to " + fileName + ".old and has been replaced by an updated version."); + mcMMO.p.getLogger().warning("You are using an old version of the " + fileName + " file."); + mcMMO.p.getLogger().warning("Your old file has been renamed to " + fileName + ".old and has been replaced by an updated version."); configFile.renameTo(new File(configFile.getPath() + ".old")); - if (plugin.getResource(fileName) != null) { - plugin.saveResource(fileName, true); + if (mcMMO.p.getResource(fileName) != null) { + mcMMO.p.saveResource(fileName, true); } - plugin.getLogger().warning("Reloading " + fileName + " with new values..."); + mcMMO.p.getLogger().warning("Reloading " + fileName + " with new values..."); loadFile(); loadKeys(); } diff --git a/src/main/java/com/gmail/nossr50/config/CoreSkillsConfig.java b/src/main/java/com/gmail/nossr50/config/CoreSkillsConfig.java index 269ee30f2..16b763d7c 100644 --- a/src/main/java/com/gmail/nossr50/config/CoreSkillsConfig.java +++ b/src/main/java/com/gmail/nossr50/config/CoreSkillsConfig.java @@ -2,15 +2,20 @@ package com.gmail.nossr50.config; import com.gmail.nossr50.datatypes.skills.PrimarySkillType; import com.gmail.nossr50.datatypes.skills.subskills.AbstractSubSkill; -import com.gmail.nossr50.util.StringUtils; +import com.gmail.nossr50.util.text.StringUtils; -public class CoreSkillsConfig extends AutoUpdateConfigLoader { +public class CoreSkillsConfig extends BukkitConfig { private static CoreSkillsConfig instance; - public CoreSkillsConfig() - { + public CoreSkillsConfig() { super("coreskills.yml"); - validate(); + } + + public static CoreSkillsConfig getInstance() { + if (instance == null) + instance = new CoreSkillsConfig(); + + return instance; } @Override @@ -18,18 +23,9 @@ public class CoreSkillsConfig extends AutoUpdateConfigLoader { } - public static CoreSkillsConfig getInstance() - { - if(instance == null) - return new CoreSkillsConfig(); - - return instance; - } - @Override - protected boolean validateKeys() { - - return true; + protected void validateConfigKeys() { + //TODO: Rewrite legacy validation code } /* @@ -39,21 +35,23 @@ public class CoreSkillsConfig extends AutoUpdateConfigLoader { /** * 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 config.getBoolean(StringUtils.getCapitalized(abstractSubSkill.getPrimarySkill().toString())+"."+ abstractSubSkill.getConfigKeyName()+".Enabled", true); + public boolean isSkillEnabled(AbstractSubSkill abstractSubSkill) { + return config.getBoolean(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 config.getBoolean(StringUtils.getCapitalized(primarySkillType.toString())+".Enabled", true); + public boolean isPrimarySkillEnabled(PrimarySkillType primarySkillType) { + return config.getBoolean(StringUtils.getCapitalized(primarySkillType.toString()) + ".Enabled", true); } } diff --git a/src/main/java/com/gmail/nossr50/config/GeneralConfig.java b/src/main/java/com/gmail/nossr50/config/GeneralConfig.java new file mode 100644 index 000000000..4749d908d --- /dev/null +++ b/src/main/java/com/gmail/nossr50/config/GeneralConfig.java @@ -0,0 +1,1006 @@ +package com.gmail.nossr50.config; + +import com.gmail.nossr50.database.SQLDatabaseManager.PoolIdentifier; +import com.gmail.nossr50.datatypes.MobHealthbarType; +import com.gmail.nossr50.datatypes.party.PartyFeature; +import com.gmail.nossr50.datatypes.skills.PrimarySkillType; +import com.gmail.nossr50.datatypes.skills.SuperAbilityType; +import com.gmail.nossr50.mcMMO; +import com.gmail.nossr50.util.text.StringUtils; +import org.bukkit.Material; +import org.bukkit.block.data.BlockData; +import org.bukkit.configuration.ConfigurationSection; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +import java.io.File; +import java.util.ArrayList; +import java.util.List; +import java.util.Locale; +import java.util.Set; + +public class GeneralConfig extends BukkitConfig { + + public GeneralConfig(@NotNull File dataFolder) { + super("config.yml", dataFolder); + } + + @Override + protected void loadKeys() { + + } + + @Override + protected void validateConfigKeys() { + //TODO: Rewrite legacy validation code + List reason = new ArrayList<>(); + + /* General Settings */ + if (getSaveInterval() <= 0) { + mcMMO.p.getLogger().info("General.Save_Interval should be greater than 0!"); + } + + /* MySQL Settings */ + for (PoolIdentifier identifier : PoolIdentifier.values()) { + if (getMySQLMaxConnections(identifier) <= 0) { + mcMMO.p.getLogger().warning("MySQL.Database.MaxConnections." + StringUtils.getCapitalized(identifier.toString()) + " should be greater than 0!"); + } + if (getMySQLMaxPoolSize(identifier) <= 0) { + mcMMO.p.getLogger().warning("MySQL.Database.MaxPoolSize." + StringUtils.getCapitalized(identifier.toString()) + " should be greater than 0!"); + } + } + + /* Mob Healthbar */ + if (getMobHealthbarTime() == 0) { + mcMMO.p.getLogger().warning("Mob_Healthbar.Display_Time cannot be 0! Set to -1 to disable or set a valid value."); + } + + /* Database Purging */ + if (getPurgeInterval() < -1) { + mcMMO.p.getLogger().warning("Database_Purging.Purge_Interval should be greater than, or equal to -1!"); + } + + if (getOldUsersCutoff() != -1 && getOldUsersCutoff() <= 0) { + mcMMO.p.getLogger().warning("Database_Purging.Old_User_Cutoff should be greater than 0 or -1!"); + } + + /* Hardcore Mode */ + if (getHardcoreDeathStatPenaltyPercentage() < 0.01 || getHardcoreDeathStatPenaltyPercentage() > 100) { + mcMMO.p.getLogger().warning("Hardcore.Death_Stat_Loss.Penalty_Percentage only accepts values from 0.01 to 100!"); + } + + if (getHardcoreVampirismStatLeechPercentage() < 0.01 || getHardcoreVampirismStatLeechPercentage() > 100) { + mcMMO.p.getLogger().warning("Hardcore.Vampirism.Leech_Percentage only accepts values from 0.01 to 100!"); + } + + /* Items */ + if (getChimaeraUseCost() < 1 || getChimaeraUseCost() > 64) { + mcMMO.p.getLogger().warning("Items.Chimaera_Wing.Use_Cost only accepts values from 1 to 64!"); + } + + if (getChimaeraRecipeCost() < 1 || getChimaeraRecipeCost() > 9) { + mcMMO.p.getLogger().warning("Items.Chimaera_Wing.Recipe_Cost only accepts values from 1 to 9!"); + } + + if (getChimaeraItem() == null) { + mcMMO.p.getLogger().warning("Items.Chimaera_Wing.Item_Name is invalid!"); + } + + /* Particles */ + if (getLevelUpEffectsTier() < 1) { + mcMMO.p.getLogger().warning("Particles.LevelUp_Tier should be at least 1!"); + } + + /* PARTY SETTINGS */ + if (getAutoPartyKickInterval() < -1) { + mcMMO.p.getLogger().warning("Party.AutoKick_Interval should be at least -1!"); + } + + if (getAutoPartyKickTime() < 0) { + mcMMO.p.getLogger().warning("Party.Old_Party_Member_Cutoff should be at least 0!"); + } + + if (getPartyShareBonusBase() <= 0) { + mcMMO.p.getLogger().warning("Party.Sharing.ExpShare_bonus_base should be greater than 0!"); + } + + if (getPartyShareBonusIncrease() < 0) { + mcMMO.p.getLogger().warning("Party.Sharing.ExpShare_bonus_increase should be at least 0!"); + } + + if (getPartyShareBonusCap() <= 0) { + mcMMO.p.getLogger().warning("Party.Sharing.ExpShare_bonus_cap should be greater than 0!"); + } + + if (getPartyShareRange() <= 0) { + mcMMO.p.getLogger().warning("Party.Sharing.Range should be greater than 0!"); + } + + if (getPartyXpCurveMultiplier() < 1) { + mcMMO.p.getLogger().warning("Party.Leveling.Xp_Curve_Modifier should be at least 1!"); + } + + for (PartyFeature partyFeature : PartyFeature.values()) { + if (getPartyFeatureUnlockLevel(partyFeature) < 0) { + mcMMO.p.getLogger().warning("Party.Leveling." + StringUtils.getPrettyPartyFeatureString(partyFeature).replace(" ", "") + "_UnlockLevel should be at least 0!"); + } + } + + /* Inspect command distance */ + if (getInspectDistance() <= 0) { + mcMMO.p.getLogger().warning("Commands.inspect.Max_Distance should be greater than 0!"); + } + + if (getTreeFellerThreshold() <= 0) { + mcMMO.p.getLogger().warning("Abilities.Limits.Tree_Feller_Threshold should be greater than 0!"); + } + + if (getFishingLureModifier() < 0) { + mcMMO.p.getLogger().warning("Abilities.Fishing.Lure_Modifier should be at least 0!"); + } + + if (getRepairAnvilMaterial() == null) { + mcMMO.p.getLogger().warning("Skills.Repair.Anvil_Type is invalid!!"); + } + + if (getSalvageAnvilMaterial() == null) { + mcMMO.p.getLogger().warning("Skills.Repair.Salvage_Anvil_Type is invalid!"); + } + + if (getRepairAnvilMaterial() == getSalvageAnvilMaterial()) { + mcMMO.p.getLogger().warning("Cannot use the same item for Repair and Salvage anvils!"); + } + } + + /* + * GENERAL SETTINGS + */ + + /* General Settings */ + public boolean getIsMetricsEnabled() { + return config.getBoolean("Metrics.bstats", true); + } + + //Retro mode will default the value to true if the config file doesn't contain the entry (server is from a previous mcMMO install) + public boolean getIsRetroMode() { + return config.getBoolean("General.RetroMode.Enabled", true); + } + + public String getLocale() { + return config.getString("General.Locale", "en_US"); + } + + public boolean getMOTDEnabled() { + return config.getBoolean("General.MOTD_Enabled", true); + } + + public boolean getShowProfileLoadedMessage() { + return config.getBoolean("General.Show_Profile_Loaded", true); + } + + public boolean getDonateMessageEnabled() { + return config.getBoolean("Commands.mcmmo.Donate_Message", true); + } + + public int getSaveInterval() { + return config.getInt("General.Save_Interval", 10); + } + + public boolean getStatsTrackingEnabled() { + return config.getBoolean("General.Stats_Tracking", true); + } + + public boolean getUpdateCheckEnabled() { + return config.getBoolean("General.Update_Check", true); + } + + public boolean getPreferBeta() { + return config.getBoolean("General.Prefer_Beta", false); + } + + public boolean getVerboseLoggingEnabled() { + return config.getBoolean("General.Verbose_Logging", false); + } + + + public boolean getMatchOfflinePlayers() { + return config.getBoolean("Commands.Generic.Match_OfflinePlayers", false); + } + + public long getDatabasePlayerCooldown() { + return config.getLong("Commands.Database.Player_Cooldown", 1750); + } + + public boolean getLevelUpSoundsEnabled() { + return config.getBoolean("General.LevelUp_Sounds", true); + } + + public boolean getRefreshChunksEnabled() { + return config.getBoolean("General.Refresh_Chunks", false); + } + + public boolean getMobHealthbarEnabled() { + return config.getBoolean("Mob_Healthbar.Enabled", true); + } + + /* Mob Healthbar */ + public MobHealthbarType getMobHealthbarDefault() { + try { + return MobHealthbarType.valueOf(config.getString("Mob_Healthbar.Display_Type", "HEARTS").toUpperCase(Locale.ENGLISH).trim()); + } catch (IllegalArgumentException ex) { + return MobHealthbarType.HEARTS; + } + } + + public int getMobHealthbarTime() { + return Math.max(1, config.getInt("Mob_Healthbar.Display_Time", 3)); + } + + /* Scoreboards */ + public boolean getScoreboardsEnabled() { + return config.getBoolean("Scoreboard.UseScoreboards", true); + } + + public boolean getPowerLevelTagsEnabled() { + return config.getBoolean("Scoreboard.Power_Level_Tags", false); + } + + public boolean getAllowKeepBoard() { + return config.getBoolean("Scoreboard.Allow_Keep", true); + } + + public int getTipsAmount() { + return config.getInt("Scoreboard.Tips_Amount", 5); + } + + public boolean getShowStatsAfterLogin() { + return config.getBoolean("Scoreboard.Show_Stats_After_Login", false); + } + + public boolean getScoreboardRainbows() { + return config.getBoolean("Scoreboard.Rainbows", false); + } + + public boolean getShowAbilityNames() { + return config.getBoolean("Scoreboard.Ability_Names", true); + } + + public boolean getRankUseChat() { + return config.getBoolean("Scoreboard.Types.Rank.Print", false); + } + + public boolean getRankUseBoard() { + return config.getBoolean("Scoreboard.Types.Rank.Board", true); + } + + public int getRankScoreboardTime() { + return config.getInt("Scoreboard.Types.Rank.Display_Time", 10); + } + + public boolean getTopUseChat() { + return config.getBoolean("Scoreboard.Types.Top.Print", true); + } + + public boolean getTopUseBoard() { + return config.getBoolean("Scoreboard.Types.Top.Board", true); + } + + public int getTopScoreboardTime() { + return config.getInt("Scoreboard.Types.Top.Display_Time", 15); + } + + public boolean getStatsUseChat() { + return config.getBoolean("Scoreboard.Types.Stats.Print", true); + } + + public boolean getStatsUseBoard() { + return config.getBoolean("Scoreboard.Types.Stats.Board", true); + } + + public int getStatsScoreboardTime() { + return config.getInt("Scoreboard.Types.Stats.Display_Time", 10); + } + + public boolean getInspectUseChat() { + return config.getBoolean("Scoreboard.Types.Inspect.Print", true); + } + + public boolean getInspectUseBoard() { + return config.getBoolean("Scoreboard.Types.Inspect.Board", true); + } + + public int getInspectScoreboardTime() { + return config.getInt("Scoreboard.Types.Inspect.Display_Time", 25); + } + + public boolean getCooldownUseChat() { + return config.getBoolean("Scoreboard.Types.Cooldown.Print", false); + } + + public boolean getCooldownUseBoard() { + return config.getBoolean("Scoreboard.Types.Cooldown.Board", true); + } + + public int getCooldownScoreboardTime() { + return config.getInt("Scoreboard.Types.Cooldown.Display_Time", 41); + } + + public boolean getSkillUseBoard() { + return config.getBoolean("Scoreboard.Types.Skill.Board", true); + } + + public int getSkillScoreboardTime() { + return config.getInt("Scoreboard.Types.Skill.Display_Time", 30); + } + + public boolean getSkillLevelUpBoard() { + return config.getBoolean("Scoreboard.Types.Skill.LevelUp_Board", true); + } + + public int getSkillLevelUpTime() { + return config.getInt("Scoreboard.Types.Skill.LevelUp_Time", 5); + } + + /* Database Purging */ + public int getPurgeInterval() { + return config.getInt("Database_Purging.Purge_Interval", -1); + } + + public int getOldUsersCutoff() { + return config.getInt("Database_Purging.Old_User_Cutoff", 6); + } + + /* Backups */ + public boolean getBackupsEnabled() { + return config.getBoolean("Backups.Enabled", true); + } + + public boolean getKeepLast24Hours() { + return config.getBoolean("Backups.Keep.Last_24_Hours", true); + } + + public boolean getKeepDailyLastWeek() { + return config.getBoolean("Backups.Keep.Daily_Last_Week", true); + } + + public boolean getKeepWeeklyPastMonth() { + return config.getBoolean("Backups.Keep.Weekly_Past_Months", true); + } + + /* mySQL */ + public boolean getUseMySQL() { + return config.getBoolean("MySQL.Enabled", false); + } + + public String getMySQLTablePrefix() { + return config.getString("MySQL.Database.TablePrefix", "mcmmo_"); + } + + public String getMySQLDatabaseName() { + return getStringIncludingInts("MySQL.Database.Name"); + } + + public String getMySQLUserName() { + return getStringIncludingInts("MySQL.Database.User_Name"); + } + + public int getMySQLServerPort() { + return config.getInt("MySQL.Server.Port", 3306); + } + + public String getMySQLServerName() { + return config.getString("MySQL.Server.Address", "localhost"); + } + + public String getMySQLUserPassword() { + return getStringIncludingInts("MySQL.Database.User_Password"); + } + + public int getMySQLMaxConnections(PoolIdentifier identifier) { + return config.getInt("MySQL.Database.MaxConnections." + StringUtils.getCapitalized(identifier.toString()), 30); + } + + public int getMySQLMaxPoolSize(PoolIdentifier identifier) { + return config.getInt("MySQL.Database.MaxPoolSize." + StringUtils.getCapitalized(identifier.toString()), 10); + } + + public boolean getMySQLSSL() { + return config.getBoolean("MySQL.Server.SSL", true); + } + + public boolean getMySQLDebug() { + return config.getBoolean("MySQL.Debug", false); + } + + public boolean getMySQLPublicKeyRetrieval() { + return config.getBoolean("MySQL.Server.allowPublicKeyRetrieval", true); + } + + private String getStringIncludingInts(String key) { + String str = config.getString(key); + + if (str == null) { + str = String.valueOf(config.getInt(key)); + } + + if (str.equals("0")) { + str = "No value set for '" + key + "'"; + } + return str; + } + + /* Hardcore Mode */ + public boolean getHardcoreStatLossEnabled(PrimarySkillType primarySkillType) { + return config.getBoolean("Hardcore.Death_Stat_Loss.Enabled." + StringUtils.getCapitalized(primarySkillType.toString()), false); + } + + public void setHardcoreStatLossEnabled(PrimarySkillType primarySkillType, boolean enabled) { + config.set("Hardcore.Death_Stat_Loss.Enabled." + StringUtils.getCapitalized(primarySkillType.toString()), enabled); + } + + public double getHardcoreDeathStatPenaltyPercentage() { + return config.getDouble("Hardcore.Death_Stat_Loss.Penalty_Percentage", 75.0D); + } + + public void setHardcoreDeathStatPenaltyPercentage(double value) { + config.set("Hardcore.Death_Stat_Loss.Penalty_Percentage", value); + } + + public int getHardcoreDeathStatPenaltyLevelThreshold() { + return config.getInt("Hardcore.Death_Stat_Loss.Level_Threshold", 0); + } + + public boolean getHardcoreVampirismEnabled(PrimarySkillType primarySkillType) { + return config.getBoolean("Hardcore.Vampirism.Enabled." + StringUtils.getCapitalized(primarySkillType.toString()), false); + } + + public void setHardcoreVampirismEnabled(PrimarySkillType primarySkillType, boolean enabled) { + config.set("Hardcore.Vampirism.Enabled." + StringUtils.getCapitalized(primarySkillType.toString()), enabled); + } + + public double getHardcoreVampirismStatLeechPercentage() { + return config.getDouble("Hardcore.Vampirism.Leech_Percentage", 5.0D); + } + + public void setHardcoreVampirismStatLeechPercentage(double value) { + config.set("Hardcore.Vampirism.Leech_Percentage", value); + } + + public int getHardcoreVampirismLevelThreshold() { + return config.getInt("Hardcore.Vampirism.Level_Threshold", 0); + } + + /* SMP Mods */ + public boolean getToolModsEnabled() { + return config.getBoolean("Mods.Tool_Mods_Enabled", false); + } + + public boolean getArmorModsEnabled() { + return config.getBoolean("Mods.Armor_Mods_Enabled", false); + } + + public boolean getBlockModsEnabled() { + return config.getBoolean("Mods.Block_Mods_Enabled", false); + } + + public boolean getEntityModsEnabled() { + return config.getBoolean("Mods.Entity_Mods_Enabled", false); + } + + /* Items */ + public int getChimaeraUseCost() { + return config.getInt("Items.Chimaera_Wing.Use_Cost", 1); + } + + public int getChimaeraRecipeCost() { + return config.getInt("Items.Chimaera_Wing.Recipe_Cost", 5); + } + + public Material getChimaeraItem() { + return Material.matchMaterial(config.getString("Items.Chimaera_Wing.Item_Name", "Feather")); + } + + public boolean getChimaeraEnabled() { + return config.getBoolean("Items.Chimaera_Wing.Enabled", true); + } + + public boolean getChimaeraPreventUseUnderground() { + return config.getBoolean("Items.Chimaera_Wing.Prevent_Use_Underground", true); + } + + public boolean getChimaeraUseBedSpawn() { + return config.getBoolean("Items.Chimaera_Wing.Use_Bed_Spawn", true); + } + + public int getChimaeraCooldown() { + return config.getInt("Items.Chimaera_Wing.Cooldown", 240); + } + + public int getChimaeraWarmup() { + return config.getInt("Items.Chimaera_Wing.Warmup", 5); + } + + public int getChimaeraRecentlyHurtCooldown() { + return config.getInt("Items.Chimaera_Wing.RecentlyHurt_Cooldown", 60); + } + + public boolean getChimaeraSoundEnabled() { + return config.getBoolean("Items.Chimaera_Wing.Sound_Enabled", true); + } + + public boolean getFluxPickaxeSoundEnabled() { + return config.getBoolean("Items.Flux_Pickaxe.Sound_Enabled", true); + } + + /* Particles */ + public boolean getAbilityActivationEffectEnabled() { + return config.getBoolean("Particles.Ability_Activation", true); + } + + public boolean getAbilityDeactivationEffectEnabled() { + return config.getBoolean("Particles.Ability_Deactivation", true); + } + + public boolean getBleedEffectEnabled() { + return config.getBoolean("Particles.Bleed", true); + } + + public boolean getDodgeEffectEnabled() { + return config.getBoolean("Particles.Dodge", true); + } + + public boolean getFluxEffectEnabled() { + return config.getBoolean("Particles.Flux", true); + } + + public boolean getGreaterImpactEffectEnabled() { + return config.getBoolean("Particles.Greater_Impact", true); + } + + public boolean getCallOfTheWildEffectEnabled() { + return config.getBoolean("Particles.Call_of_the_Wild", true); + } + + public boolean getLevelUpEffectsEnabled() { + return config.getBoolean("Particles.LevelUp_Enabled", true); + } + + public int getLevelUpEffectsTier() { + return config.getInt("Particles.LevelUp_Tier", 100); + } +// public boolean getLargeFireworks() { return config.getBoolean("Particles.LargeFireworks", true); } + + /* PARTY SETTINGS */ + public boolean getPartyFriendlyFire() { + return config.getBoolean("Party.FriendlyFire", false); + } + + public int getPartyMaxSize() { + return config.getInt("Party.MaxSize", -1); + } + + public int getAutoPartyKickInterval() { + return config.getInt("Party.AutoKick_Interval", 12); + } + + public int getAutoPartyKickTime() { + return config.getInt("Party.Old_Party_Member_Cutoff", 7); + } + + public double getPartyShareBonusBase() { + return config.getDouble("Party.Sharing.ExpShare_bonus_base", 1.1D); + } + + public double getPartyShareBonusIncrease() { + return config.getDouble("Party.Sharing.ExpShare_bonus_increase", 0.05D); + } + + public double getPartyShareBonusCap() { + return config.getDouble("Party.Sharing.ExpShare_bonus_cap", 1.5D); + } + + public double getPartyShareRange() { + return config.getDouble("Party.Sharing.Range", 75.0D); + } + + public int getPartyLevelCap() { + int cap = config.getInt("Party.Leveling.Level_Cap", 10); + return (cap <= 0) ? Integer.MAX_VALUE : cap; + } + + public int getPartyXpCurveMultiplier() { + return config.getInt("Party.Leveling.Xp_Curve_Modifier", 3); + } + + public boolean getPartyXpNearMembersNeeded() { + return config.getBoolean("Party.Leveling.Near_Members_Needed", false); + } + + public boolean getPartyInformAllMembers() { + return config.getBoolean("Party.Leveling.Inform_All_Party_Members_On_LevelUp", false); + } + + public int getPartyFeatureUnlockLevel(PartyFeature partyFeature) { + return config.getInt("Party.Leveling." + StringUtils.getPrettyPartyFeatureString(partyFeature).replace(" ", "") + "_UnlockLevel", 0); + } + + /* Party Teleport Settings */ + public int getPTPCommandCooldown() { + return config.getInt("Commands.ptp.Cooldown", 120); + } + + public int getPTPCommandWarmup() { + return config.getInt("Commands.ptp.Warmup", 5); + } + + public int getPTPCommandRecentlyHurtCooldown() { + return config.getInt("Commands.ptp.RecentlyHurt_Cooldown", 60); + } + + public int getPTPCommandTimeout() { + return config.getInt("Commands.ptp.Request_Timeout", 300); + } + + public boolean getPTPCommandConfirmRequired() { + return config.getBoolean("Commands.ptp.Accept_Required", true); + } + + public boolean getPTPCommandWorldPermissions() { + return config.getBoolean("Commands.ptp.World_Based_Permissions", false); + } + + /* Inspect command distance */ + public double getInspectDistance() { + return config.getDouble("Commands.inspect.Max_Distance", 30.0D); + } + + /* + * ABILITY SETTINGS + */ + + /* General Settings */ + public boolean getUrlLinksEnabled() { + return config.getBoolean("Commands.Skills.URL_Links"); + } + + public boolean getAbilityMessagesEnabled() { + return config.getBoolean("Abilities.Messages", true); + } + + public boolean getAbilitiesEnabled() { + return config.getBoolean("Abilities.Enabled", true); + } + + public boolean getAbilitiesOnlyActivateWhenSneaking() { + return config.getBoolean("Abilities.Activation.Only_Activate_When_Sneaking", false); + } + + public boolean getAbilitiesGateEnabled() { + return config.getBoolean("Abilities.Activation.Level_Gate_Abilities"); + } + + public int getCooldown(SuperAbilityType ability) { + return config.getInt("Abilities.Cooldowns." + ability.toString()); + } + + public int getMaxLength(SuperAbilityType ability) { + return config.getInt("Abilities.Max_Seconds." + ability.toString()); + } + + /* Durability Settings */ + public int getAbilityToolDamage() { + return config.getInt("Abilities.Tools.Durability_Loss", 1); + } + + /* Thresholds */ + public int getTreeFellerThreshold() { + return config.getInt("Abilities.Limits.Tree_Feller_Threshold", 1000); + } + + /* + * SKILL SETTINGS + */ + public boolean getDoubleDropsEnabled(PrimarySkillType skill, Material material) { + //TODO: Temporary measure to fix an exploit caused by a yet to be fixed Spigot bug (as of 7/3/2020) + if (material.toString().equalsIgnoreCase("LILY_PAD")) + return false; + + return config.getBoolean("Bonus_Drops." + StringUtils.getCapitalized(skill.toString()) + "." + StringUtils.getPrettyItemString(material).replace(" ", "_")); + } + + public boolean getDoubleDropsDisabled(PrimarySkillType skill) { + String skillName = StringUtils.getCapitalized(skill.toString()); + ConfigurationSection section = config.getConfigurationSection("Bonus_Drops." + skillName); + if (section == null) + return false; + Set keys = section.getKeys(false); + boolean disabled = true; + + for (String key : keys) { + if (config.getBoolean("Bonus_Drops." + skillName + "." + key)) { + disabled = false; + break; + } + } + + return disabled; + } + + /* Axes */ + public int getAxesGate() { + return config.getInt("Skills.Axes.Ability_Activation_Level_Gate", 10); + } + + /* Acrobatics */ + public boolean getDodgeLightningDisabled() { + return config.getBoolean("Skills.Acrobatics.Prevent_Dodge_Lightning", false); + } + + public int getXPAfterTeleportCooldown() { + return config.getInt("Skills.Acrobatics.XP_After_Teleport_Cooldown", 5); + } + + /* Alchemy */ + public boolean getEnabledForHoppers() { + return config.getBoolean("Skills.Alchemy.Enabled_for_Hoppers", true); + } + + public boolean getPreventHopperTransferIngredients() { + return config.getBoolean("Skills.Alchemy.Prevent_Hopper_Transfer_Ingredients", false); + } + + public boolean getPreventHopperTransferBottles() { + return config.getBoolean("Skills.Alchemy.Prevent_Hopper_Transfer_Bottles", false); + } + + /* Fishing */ + public boolean getFishingDropsEnabled() { + return config.getBoolean("Skills.Fishing.Drops_Enabled", true); + } + + public boolean getFishingOverrideTreasures() { + return config.getBoolean("Skills.Fishing.Override_Vanilla_Treasures", true); + } + + public boolean getFishingExtraFish() { + return config.getBoolean("Skills.Fishing.Extra_Fish", true); + } + + public double getFishingLureModifier() { + return config.getDouble("Skills.Fishing.Lure_Modifier", 4.0D); + } + + /* Mining */ + public Material getDetonatorItem() { + return Material.matchMaterial(config.getString("Skills.Mining.Detonator_Name", "FLINT_AND_STEEL")); + } + + /* Excavation */ + public int getExcavationGate() { + return config.getInt("Skills.Excavation.Ability_Activation_Level_Gate", 10); + } + + /* Repair */ + public boolean getRepairAnvilMessagesEnabled() { + return config.getBoolean("Skills.Repair.Anvil_Messages", true); + } + + public boolean getRepairAnvilPlaceSoundsEnabled() { + return config.getBoolean("Skills.Repair.Anvil_Placed_Sounds", true); + } + + public boolean getRepairAnvilUseSoundsEnabled() { + return config.getBoolean("Skills.Repair.Anvil_Use_Sounds", true); + } + + public @Nullable Material getRepairAnvilMaterial() { + return Material.matchMaterial(config.getString("Skills.Repair.Anvil_Material", "IRON_BLOCK")); + } + + public boolean getRepairConfirmRequired() { + return config.getBoolean("Skills.Repair.Confirm_Required", true); + } + + public boolean getAllowVanillaInventoryRepair() { + return config.getBoolean("Skills.Repair.Allow_Vanilla_Anvil_Repair", false); + } + + public boolean getAllowVanillaAnvilRepair() { + return config.getBoolean("Skills.Repair.Allow_Vanilla_Inventory_Repair", false); + } + + public boolean getAllowVanillaGrindstoneRepair() { + return config.getBoolean("Skills.Repair.Allow_Vanilla_Grindstone_Repair", false); + } + + /* Salvage */ + public boolean getSalvageAnvilMessagesEnabled() { + return config.getBoolean("Skills.Salvage.Anvil_Messages", true); + } + + public boolean getSalvageAnvilPlaceSoundsEnabled() { + return config.getBoolean("Skills.Salvage.Anvil_Placed_Sounds", true); + } + + public boolean getSalvageAnvilUseSoundsEnabled() { + return config.getBoolean("Skills.Salvage.Anvil_Use_Sounds", true); + } + + public @Nullable Material getSalvageAnvilMaterial() { + return Material.matchMaterial(config.getString("Skills.Salvage.Anvil_Material", "GOLD_BLOCK")); + } + + public boolean getSalvageConfirmRequired() { + return config.getBoolean("Skills.Salvage.Confirm_Required", true); + } + + /* Unarmed */ + public boolean getUnarmedBlockCrackerSmoothbrickToCracked() { + return config.getBoolean("Skills.Unarmed.Block_Cracker.SmoothBrick_To_CrackedBrick", true); + } + + public boolean getUnarmedItemPickupDisabled() { + return config.getBoolean("Skills.Unarmed.Item_Pickup_Disabled_Full_Inventory", true); + } + + public boolean getUnarmedItemsAsUnarmed() { + return config.getBoolean("Skills.Unarmed.Items_As_Unarmed", false); + } + + public int getUnarmedGate() { + return config.getInt("Skills.Unarmed.Ability_Activation_Level_Gate", 10); + } + + /* Swords */ + public int getSwordsGate() { + return config.getInt("Skills.Swords.Ability_Activation_Level_Gate", 10); + } + + /* Taming */ +// public Material getTamingCOTWMaterial(EntityType type) { return Material.matchMaterial(config.getString("Skills.Taming.Call_Of_The_Wild." + StringUtils.getPrettyEntityTypeString(type) + ".Item_Material")); } +// public int getTamingCOTWCost(EntityType type) { return config.getInt("Skills.Taming.Call_Of_The_Wild." + StringUtils.getPrettyEntityTypeString(type) + ".Item_Amount"); } +// public int getTamingCOTWAmount(EntityType type) { return config.getInt("Skills.Taming.Call_Of_The_Wild." + StringUtils.getPrettyEntityTypeString(type) + ".Summon_Amount"); } +// public int getTamingCOTWLength(EntityType type) { return config.getInt("Skills.Taming.Call_Of_The_Wild." + StringUtils.getPrettyEntityTypeString(type)+ ".Summon_Length"); } +// public int getTamingCOTWMaxAmount(EntityType type) { return config.getInt("Skills.Taming.Call_Of_The_Wild." + StringUtils.getPrettyEntityTypeString(type)+ ".Summon_Max_Amount"); } + + public Material getTamingCOTWMaterial(String cotwEntity) { + return Material.matchMaterial(config.getString("Skills.Taming.Call_Of_The_Wild." + cotwEntity + ".Item_Material")); + } + + public int getTamingCOTWCost(String cotwEntity) { + return config.getInt("Skills.Taming.Call_Of_The_Wild." + cotwEntity + ".Item_Amount"); + } + + public int getTamingCOTWAmount(String cotwEntity) { + return config.getInt("Skills.Taming.Call_Of_The_Wild." + cotwEntity + ".Summon_Amount"); + } + + public int getTamingCOTWLength(String cotwEntity) { + return config.getInt("Skills.Taming.Call_Of_The_Wild." + cotwEntity + ".Summon_Length"); + } + + public int getTamingCOTWMaxAmount(String cotwEntity) { + return config.getInt("Skills.Taming.Call_Of_The_Wild." + cotwEntity + ".Per_Player_Limit", 1); + } + + /* Woodcutting */ + public boolean getWoodcuttingDoubleDropsEnabled(BlockData material) { + return config.getBoolean("Bonus_Drops.Woodcutting." + StringUtils.getFriendlyConfigBlockDataString(material)); + } + + public boolean getTreeFellerSoundsEnabled() { + return config.getBoolean("Skills.Woodcutting.Tree_Feller_Sounds", true); + } + + public int getWoodcuttingGate() { + return config.getInt("Skills.Woodcutting.Ability_Activation_Level_Gate", 10); + } + + /* AFK Leveling */ + public boolean getHerbalismPreventAFK() { + return config.getBoolean("Skills.Herbalism.Prevent_AFK_Leveling", true); + } + + /* Level Caps */ + public int getPowerLevelCap() { + int cap = config.getInt("General.Power_Level_Cap", 0); + return (cap <= 0) ? Integer.MAX_VALUE : cap; + } + + public int getLevelCap(PrimarySkillType skill) { + int cap = config.getInt("Skills." + StringUtils.getCapitalized(skill.toString()) + ".Level_Cap"); + return (cap <= 0) ? Integer.MAX_VALUE : cap; + } + + + /*public int isSuperAbilityUnlocked(PrimarySkillType skill) { + return config.getInt("Skills." + StringUtils.getCapitalized(skill.toString()) + ".Ability_Activation_Level_Gate"); + }*/ + + public boolean getTruncateSkills() { + return config.getBoolean("General.TruncateSkills", false); + } + + /* PVP & PVE Settings */ + public boolean getPVPEnabled(PrimarySkillType skill) { + return config.getBoolean("Skills." + StringUtils.getCapitalized(skill.toString()) + ".Enabled_For_PVP", true); + } + + public boolean getPVEEnabled(PrimarySkillType skill) { + return config.getBoolean("Skills." + StringUtils.getCapitalized(skill.toString()) + ".Enabled_For_PVE", true); + } + + //public float getMasterVolume() { return (float) config.getDouble("Sounds.MasterVolume", 1.0); } + + public boolean broadcastEventMessages() { + return config.getBoolean("General.EventBroadcasts", true); + } + + public boolean playerJoinEventInfo() { + return config.getBoolean("General.EventInfoOnPlayerJoin", true); + } + + public boolean adminNotifications() { + return config.getBoolean("General.AdminNotifications", true); + } + + public boolean shouldLevelUpBroadcasts() { + return config.getBoolean("General.Level_Up_Chat_Broadcasts.Enabled", true); + } + + public boolean shouldLevelUpBroadcastToConsole() { + return config.getBoolean("General.Level_Up_Chat_Broadcasts.Broadcast_Targets.Send_To_Console", true); + } + + public boolean isLevelUpBroadcastsPartyMembersOnly() { + return config.getBoolean("General.Level_Up_Chat_Broadcasts.Broadcast_Targets.Only_Party_Members", false); + } + + public boolean isLevelUpBroadcastsSameWorldOnly() { + return config.getBoolean("General.Level_Up_Chat_Broadcasts.Broadcast_Targets.Only_Same_World", false); + } + + public boolean shouldLevelUpBroadcastsRestrictDistance() { + return config.getBoolean("General.Level_Up_Chat_Broadcasts.Broadcast_Targets.Distance_Restrictions.Restrict_Distance", false); + } + + public int getLevelUpBroadcastRadius() { + return config.getInt("General.Level_Up_Chat_Broadcasts.Broadcast_Targets.Distance_Restrictions.Restricted_Radius", 100); + } + + public int getLevelUpBroadcastInterval() { + return config.getInt("General.Level_Up_Chat_Broadcasts.Milestone_Interval", 100); + } + + public boolean shouldPowerLevelUpBroadcasts() { + return config.getBoolean("General.Level_Up_Chat_Broadcasts.Broadcast_Powerlevels.Enabled", true); + } + + public boolean shouldPowerLevelUpBroadcastToConsole() { + return config.getBoolean("General.Level_Up_Chat_Broadcasts.Broadcast_Powerlevels.Broadcast_Targets.Send_To_Console", true); + } + + public boolean isPowerLevelUpBroadcastsPartyMembersOnly() { + return config.getBoolean("General.Level_Up_Chat_Broadcasts.Broadcast_Powerlevels.Broadcast_Targets.Only_Party_Members", false); + } + + public boolean isPowerLevelUpBroadcastsSameWorldOnly() { + return config.getBoolean("General.Level_Up_Chat_Broadcasts.Broadcast_Powerlevels.Broadcast_Targets.Only_Same_World", false); + } + + public boolean shouldPowerLevelUpBroadcastsRestrictDistance() { + return config.getBoolean("General.Level_Up_Chat_Broadcasts.Broadcast_Powerlevels.Broadcast_Targets.Distance_Restrictions.Restrict_Distance", false); + } + + public int getPowerLevelUpBroadcastRadius() { + return config.getInt("General.Level_Up_Chat_Broadcasts.Broadcast_Powerlevels.Broadcast_Targets.Distance_Restrictions.Restricted_Radius", 100); + } + + public int getPowerLevelUpBroadcastInterval() { + return config.getInt("General.Level_Up_Chat_Broadcasts.Broadcast_Powerlevels.Milestone_Interval", 100); + } + + public boolean isGreenThumbReplantableCrop(@NotNull Material material) { + return config.getBoolean("Green_Thumb_Replanting_Crops." + StringUtils.getCapitalized(material.toString()), true); + } +} diff --git a/src/main/java/com/gmail/nossr50/config/HiddenConfig.java b/src/main/java/com/gmail/nossr50/config/HiddenConfig.java index edf89885d..54cdf0ff0 100644 --- a/src/main/java/com/gmail/nossr50/config/HiddenConfig.java +++ b/src/main/java/com/gmail/nossr50/config/HiddenConfig.java @@ -7,14 +7,10 @@ import java.io.InputStreamReader; public class HiddenConfig { private static HiddenConfig instance; - private String fileName; + private final String fileName; private YamlConfiguration config; - private boolean chunkletsEnabled; private int conversionRate; private boolean useEnchantmentBuffs; - private int uuidConvertAmount; - private int mojangRateLimit; - private long mojangLimitPeriod; public HiddenConfig(String fileName) { this.fileName = fileName; @@ -33,18 +29,11 @@ public class HiddenConfig { InputStreamReader reader = mcMMO.p.getResourceAsReader(fileName); if (reader != null) { config = YamlConfiguration.loadConfiguration(reader); - chunkletsEnabled = config.getBoolean("Options.Chunklets", true); conversionRate = config.getInt("Options.ConversionRate", 1); useEnchantmentBuffs = config.getBoolean("Options.EnchantmentBuffs", true); - uuidConvertAmount = config.getInt("Options.UUIDConvertAmount", 5); - mojangRateLimit = config.getInt("Options.MojangRateLimit", 50000); - mojangLimitPeriod = config.getLong("Options.MojangLimitPeriod", 600000); } } - public boolean getChunkletsEnabled() { - return chunkletsEnabled; - } public int getConversionRate() { return conversionRate; @@ -53,16 +42,4 @@ public class HiddenConfig { public boolean useEnchantmentBuffs() { return useEnchantmentBuffs; } - - public int getUUIDConvertAmount() { - return uuidConvertAmount; - } - - public int getMojangRateLimit() { - return mojangRateLimit; - } - - public long getMojangLimitPeriod() { - return mojangLimitPeriod; - } } diff --git a/src/main/java/com/gmail/nossr50/config/PersistentDataConfig.java b/src/main/java/com/gmail/nossr50/config/PersistentDataConfig.java new file mode 100644 index 000000000..e0fd3d8e9 --- /dev/null +++ b/src/main/java/com/gmail/nossr50/config/PersistentDataConfig.java @@ -0,0 +1,41 @@ +package com.gmail.nossr50.config; + +import com.gmail.nossr50.metadata.MobMetaFlagType; + +public class PersistentDataConfig extends BukkitConfig { + private static PersistentDataConfig instance; + + private PersistentDataConfig() { + super("persistent_data.yml"); + } + + public static PersistentDataConfig getInstance() { + if (instance == null) { + instance = new PersistentDataConfig(); + } + + return instance; + } + + @Override + protected void loadKeys() { + //Sigh this old config system... + } + + @Override + protected void validateConfigKeys() { + //TODO: Rewrite legacy validation code + } + + //Persistent Data Toggles + public boolean isMobPersistent(MobMetaFlagType mobMetaFlagType) { + String key = "Persistent_Data.Mobs.Flags." + mobMetaFlagType.toString() + ".Saved_To_Disk"; + return config.getBoolean(key, false); + } + + public boolean useBlockTracker() { + return config.getBoolean("mcMMO_Region_System.Enabled", true); + } + + +} \ No newline at end of file diff --git a/src/main/java/com/gmail/nossr50/config/RankConfig.java b/src/main/java/com/gmail/nossr50/config/RankConfig.java index f5a1a7e71..003b27a4d 100644 --- a/src/main/java/com/gmail/nossr50/config/RankConfig.java +++ b/src/main/java/com/gmail/nossr50/config/RankConfig.java @@ -2,18 +2,27 @@ package com.gmail.nossr50.config; import com.gmail.nossr50.datatypes.skills.SubSkillType; import com.gmail.nossr50.datatypes.skills.subskills.AbstractSubSkill; +import com.gmail.nossr50.mcMMO; +import org.jetbrains.annotations.NotNull; import java.util.ArrayList; +import java.util.HashSet; import java.util.List; public class RankConfig extends AutoUpdateConfigLoader { private static RankConfig instance; - public RankConfig() - { + public RankConfig() { super("skillranks.yml"); validate(); - this.instance = this; + instance = this; + } + + public static RankConfig getInstance() { + if (instance == null) + return new RankConfig(); + + return instance; } @Override @@ -21,17 +30,9 @@ public class RankConfig extends AutoUpdateConfigLoader { } - public static RankConfig getInstance() - { - if(instance == null) - return new RankConfig(); - - return instance; - } - @Override protected boolean validateKeys() { - List reason = new ArrayList(); + List reason = new ArrayList<>(); /* * In the future this method will check keys for all skills, but for now it only checks overhauled skills @@ -43,12 +44,13 @@ public class RankConfig extends AutoUpdateConfigLoader { /** * Returns the unlock level for a subskill depending on the gamemode + * * @param subSkillType target subskill - * @param rank the rank we are checking + * @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) - { + public int getSubSkillUnlockLevel(SubSkillType subSkillType, int rank) { String key = subSkillType.getRankConfigAddress(); return findRankByRootAddress(rank, key); @@ -56,25 +58,41 @@ public class RankConfig extends AutoUpdateConfigLoader { /** * Returns the unlock level for a subskill depending on the gamemode - * @param abstractSubSkill target subskill - * @param rank the rank we are checking + * + * @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(AbstractSubSkill abstractSubSkill, int rank) - { - String key = abstractSubSkill.getPrimaryKeyName()+"."+abstractSubSkill.getConfigKeyName(); + public int getSubSkillUnlockLevel(SubSkillType subSkillType, int rank, boolean retroMode) { + String key = getRankAddressKey(subSkillType, rank, retroMode); + return config.getInt(key, getInternalConfig().getInt(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 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 = Config.getInstance().getIsRetroMode() ? ".RetroMode." : ".Standard."; + String scalingKey = mcMMO.p.getGeneralConfig().getIsRetroMode() ? ".RetroMode." : ".Standard."; String targetRank = "Rank_" + rank; @@ -84,37 +102,99 @@ public class RankConfig extends AutoUpdateConfigLoader { return config.getInt(key); } + public String getRankAddressKey(SubSkillType subSkillType, int rank, boolean retroMode) { + String key = subSkillType.getRankConfigAddress(); + String scalingKey = retroMode ? ".RetroMode." : ".Standard."; + + String targetRank = "Rank_" + rank; + + key += scalingKey; + key += targetRank; + + return key; + } + + public String getRankAddressKey(AbstractSubSkill subSkillType, int rank, boolean retroMode) { + String key = subSkillType.getPrimaryKeyName() + "." + subSkillType.getConfigKeyName(); + String scalingKey = retroMode ? ".RetroMode." : ".Standard."; + + String targetRank = "Rank_" + rank; + + key += scalingKey; + key += targetRank; + + return key; + } + + private void resetRankValue(@NotNull SubSkillType subSkillType, int rank, boolean retroMode) { + String key = getRankAddressKey(subSkillType, rank, retroMode); + int defaultValue = getInternalConfig().getInt(key); + config.set(key, defaultValue); + mcMMO.p.getLogger().info(key + " SET -> " + defaultValue); + } + /** * Checks for valid keys for subskill ranks */ - private void checkKeys(List reasons) - { + private void checkKeys(@NotNull List reasons) { + HashSet badSkillSetup = new HashSet<>(); + //For now we will only check ranks of stuff I've overhauled - for(SubSkillType subSkillType : SubSkillType.values()) - { + checkConfig(reasons, badSkillSetup, true); + checkConfig(reasons, badSkillSetup, false); + + //Fix bad entries + if (badSkillSetup.isEmpty()) + return; + + mcMMO.p.getLogger().info("(FIXING CONFIG) mcMMO is correcting a few mistakes found in your skill rank config setup"); + + for (SubSkillType subSkillType : badSkillSetup) { + mcMMO.p.getLogger().info("(FIXING CONFIG) Resetting rank config settings for skill named - " + subSkillType.toString()); + fixBadEntries(subSkillType); + } + } + + private void checkConfig(@NotNull List reasons, @NotNull HashSet badSkillSetup, boolean retroMode) { + 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) + for (int x = 0; x < subSkillType.getNumRanks(); x++) { + int index = x + 1; + + if (curRank > 0) prevRank = curRank; - curRank = getSubSkillUnlockLevel(subSkillType, x); + curRank = getSubSkillUnlockLevel(subSkillType, index, retroMode); //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 (curRank < 0) { + reasons.add("(CONFIG ISSUE) " + subSkillType + " should not have any ranks that require a negative level!"); + badSkillSetup.add(subSkillType); + continue; } - if(prevRank > curRank) - { + 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"); + mcMMO.p.getLogger().info("(CONFIG ISSUE) You have the ranks for the subskill " + subSkillType + " set up poorly, sequential ranks should have ascending requirements"); + badSkillSetup.add(subSkillType); } } } } + + private void fixBadEntries(@NotNull SubSkillType subSkillType) { + for (int x = 0; x < subSkillType.getNumRanks(); x++) { + int index = x + 1; + + //Reset Retromode entries + resetRankValue(subSkillType, index, true); + //Reset Standard Entries + resetRankValue(subSkillType, index, false); + } + + saveConfig(); + } } diff --git a/src/main/java/com/gmail/nossr50/config/SoundConfig.java b/src/main/java/com/gmail/nossr50/config/SoundConfig.java index 1bd215461..d365ab31b 100644 --- a/src/main/java/com/gmail/nossr50/config/SoundConfig.java +++ b/src/main/java/com/gmail/nossr50/config/SoundConfig.java @@ -1,15 +1,21 @@ package com.gmail.nossr50.config; +import com.gmail.nossr50.mcMMO; import com.gmail.nossr50.util.sounds.SoundType; -public class SoundConfig extends AutoUpdateConfigLoader { +public class SoundConfig extends BukkitConfig { private static SoundConfig instance; - public SoundConfig() - { + public SoundConfig() { super("sounds.yml"); - validate(); - this.instance = this; + instance = this; + } + + public static SoundConfig getInstance() { + if (instance == null) + return new SoundConfig(); + + return instance; } @Override @@ -17,54 +23,43 @@ public class SoundConfig extends AutoUpdateConfigLoader { } - public static SoundConfig getInstance() - { - if(instance == null) - return new SoundConfig(); - - return instance; - } - @Override - protected boolean validateKeys() { - for(SoundType soundType : SoundType.values()) - { - if(config.getDouble("Sounds."+soundType.toString()+".Volume") < 0) - { - plugin.getLogger().info("[mcMMO] Sound volume cannot be below 0 for "+soundType.toString()); - return false; + protected void validateConfigKeys() { + //TODO: Rewrite legacy validation code + for (SoundType soundType : SoundType.values()) { + if (config.getDouble("Sounds." + soundType.toString() + ".Volume") < 0) { + mcMMO.p.getLogger().info("[mcMMO] Sound volume cannot be below 0 for " + soundType); + //TODO: Rewrite legacy validation code + //return false; } //Sounds with custom pitching don't use pitch values - if(!soundType.usesCustomPitch()) - { - if(config.getDouble("Sounds."+soundType.toString()+".Pitch") < 0) - { - plugin.getLogger().info("[mcMMO] Sound pitch cannot be below 0 for "+soundType.toString()); - return false; + if (!soundType.usesCustomPitch()) { + if (config.getDouble("Sounds." + soundType + ".Pitch") < 0) { + mcMMO.p.getLogger().info("[mcMMO] Sound pitch cannot be below 0 for " + soundType); + //TODO: Rewrite legacy validation code + //return false; } } } - return true; } - public float getMasterVolume() { return (float) config.getDouble("Sounds.MasterVolume", 1.0); } + public float getMasterVolume() { + return (float) config.getDouble("Sounds.MasterVolume", 1.0); + } - public float getVolume(SoundType soundType) - { - String key = "Sounds."+soundType.toString()+".Volume"; + public float getVolume(SoundType soundType) { + String key = "Sounds." + soundType.toString() + ".Volume"; return (float) config.getDouble(key); } - public float getPitch(SoundType soundType) - { - String key = "Sounds."+soundType.toString()+".Pitch"; + public float getPitch(SoundType soundType) { + String key = "Sounds." + soundType.toString() + ".Pitch"; return (float) config.getDouble(key); } - public boolean getIsEnabled(SoundType soundType) - { - String key = "Sounds."+soundType.toString()+".Enabled"; + public boolean getIsEnabled(SoundType soundType) { + String key = "Sounds." + soundType.toString() + ".Enabled"; return config.getBoolean(key, true); } } diff --git a/src/main/java/com/gmail/nossr50/config/WorldBlacklist.java b/src/main/java/com/gmail/nossr50/config/WorldBlacklist.java index a37b89b3e..44ec42530 100644 --- a/src/main/java/com/gmail/nossr50/config/WorldBlacklist.java +++ b/src/main/java/com/gmail/nossr50/config/WorldBlacklist.java @@ -11,24 +11,32 @@ import java.util.ArrayList; */ public class WorldBlacklist { private static ArrayList blacklist; - private mcMMO plugin; + private final mcMMO plugin; private final String blackListFileName = "world_blacklist.txt"; - public WorldBlacklist(mcMMO plugin) - { + public WorldBlacklist(mcMMO plugin) { this.plugin = plugin; blacklist = new ArrayList<>(); init(); } - public void 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 File blackListFile = new File(plugin.getDataFolder() + File.separator + blackListFileName); try { - if(!blackListFile.exists()) + if (!blackListFile.exists()) blackListFile.createNewFile(); } catch (IOException e) { e.printStackTrace(); @@ -40,43 +48,41 @@ public class WorldBlacklist { } private void loadBlacklist(File blackListFile) { + FileReader fileReader = null; + BufferedReader bufferedReader = null; try { - FileReader fileReader = new FileReader(blackListFile); - BufferedReader bufferedReader = new BufferedReader(fileReader); + fileReader = new FileReader(blackListFile); + bufferedReader = new BufferedReader(fileReader); String currentLine; - while((currentLine = bufferedReader.readLine()) != null) - { - if(currentLine.length() == 0) + while ((currentLine = bufferedReader.readLine()) != null) { + if (currentLine.length() == 0) continue; - if(!blacklist.contains(currentLine)) + if (!blacklist.contains(currentLine)) blacklist.add(currentLine); } + + } catch (IOException e) { + e.printStackTrace(); + } finally { //Close readers - bufferedReader.close(); - fileReader.close(); - } catch (FileNotFoundException e) { - e.printStackTrace(); - } catch (IOException e) - { - e.printStackTrace(); + closeRead(bufferedReader); + closeRead(fileReader); } - plugin.getLogger().info(blacklist.size()+" entries in mcMMO World Blacklist"); + plugin.getLogger().info(blacklist.size() + " entries in mcMMO World Blacklist"); } - public static boolean isWorldBlacklisted(World world) - { - - for(String s : blacklist) - { - if(world.getName().equalsIgnoreCase(s)) - return true; + private void closeRead(Reader reader) { + if (reader != null) { + try { + reader.close(); + } catch (IOException e) { + e.printStackTrace(); + } } - - return false; } } diff --git a/src/main/java/com/gmail/nossr50/config/experience/ExperienceConfig.java b/src/main/java/com/gmail/nossr50/config/experience/ExperienceConfig.java index 06c4ea9ce..8a51736c8 100644 --- a/src/main/java/com/gmail/nossr50/config/experience/ExperienceConfig.java +++ b/src/main/java/com/gmail/nossr50/config/experience/ExperienceConfig.java @@ -1,11 +1,12 @@ package com.gmail.nossr50.config.experience; -import com.gmail.nossr50.config.AutoUpdateConfigLoader; +import com.gmail.nossr50.config.BukkitConfig; import com.gmail.nossr50.datatypes.experience.FormulaType; import com.gmail.nossr50.datatypes.skills.MaterialType; import com.gmail.nossr50.datatypes.skills.PrimarySkillType; import com.gmail.nossr50.datatypes.skills.alchemy.PotionStage; -import com.gmail.nossr50.util.StringUtils; +import com.gmail.nossr50.mcMMO; +import com.gmail.nossr50.util.text.StringUtils; import org.bukkit.Material; import org.bukkit.block.Block; import org.bukkit.block.BlockState; @@ -13,16 +14,17 @@ import org.bukkit.block.data.BlockData; import org.bukkit.boss.BarColor; import org.bukkit.boss.BarStyle; import org.bukkit.entity.EntityType; +import org.jetbrains.annotations.NotNull; import java.util.ArrayList; import java.util.List; +import java.util.function.BiConsumer; -public class ExperienceConfig extends AutoUpdateConfigLoader { +public class ExperienceConfig extends BukkitConfig { private static ExperienceConfig instance; private ExperienceConfig() { super("experience.yml"); - validate(); } public static ExperienceConfig getInstance() { @@ -34,52 +36,66 @@ public class ExperienceConfig extends AutoUpdateConfigLoader { } @Override - protected void loadKeys() {} + public void initDefaults() { + super.initDefaults(); + } @Override - protected boolean validateKeys() { - List reason = new ArrayList(); + protected void loadKeys() { + } + + @Override + protected void validateConfigKeys() { + //TODO: Rewrite legacy validation code + List reason = new ArrayList<>(); /* * FORMULA SETTINGS */ /* Curve values */ - if (getMultiplier(FormulaType.EXPONENTIAL) <= 0) { - reason.add("Experience_Formula.Exponential_Values.multiplier should be greater than 0!"); - } + final BiConsumer consumer = (String str, Object obj) -> config.set(str, obj); if (getMultiplier(FormulaType.LINEAR) <= 0) { - reason.add("Experience_Formula.Linear_Values.multiplier should be greater than 0!"); + mcMMO.p.getLogger().warning("Experience_Formula.Linear_Values.multiplier should be greater than 0!"); + config.set("Experience_Formula." + StringUtils.getCapitalized(FormulaType.LINEAR.toString()) + "_Values.multiplier", 0.1); + } + + if (getMultiplier(FormulaType.EXPONENTIAL) <= 0) { + mcMMO.p.getLogger().warning("Experience_Formula.Exponential_Values.multiplier should be greater than 0!"); + config.set("Experience_Formula." + StringUtils.getCapitalized(FormulaType.EXPONENTIAL.toString()) + "_Values.multiplier", 0.1); } if (getExponent(FormulaType.EXPONENTIAL) <= 0) { - reason.add("Experience_Formula.Exponential_Values.exponent should be greater than 0!"); + mcMMO.p.getLogger().warning("Experience_Formula.Exponential_Values.exponent should be greater than 0!"); + config.set("Experience_Formula." + StringUtils.getCapitalized(FormulaType.EXPONENTIAL.toString()) + "_Values.exponent", 1.80); } /* Global modifier */ if (getExperienceGainsGlobalMultiplier() <= 0) { - reason.add("Experience_Formula.Multiplier.Global should be greater than 0!"); + mcMMO.p.getLogger().warning("Experience_Formula.Multiplier.Global should be at least 0!"); + config.set("Experience_Formula.Multiplier.Global", 1.0); + } /* PVP modifier */ if (getPlayerVersusPlayerXP() < 0) { - reason.add("Experience_Formula.Multiplier.PVP should be at least 0!"); + mcMMO.p.getLogger().warning("Experience_Formula.Multiplier.PVP should be at least 0!"); } /* Spawned Mob modifier */ if (getSpawnedMobXpMultiplier() < 0) { - reason.add("Experience_Formula.Mobspawners.Multiplier should be at least 0!"); + mcMMO.p.getLogger().warning("Experience_Formula.Mobspawners.Multiplier should be at least 0!"); } /* Bred Mob modifier */ if (getBredMobXpMultiplier() < 0) { - reason.add("Experience_Formula.Breeding.Multiplier should be at least 0!"); + mcMMO.p.getLogger().warning("Experience_Formula.Breeding.Multiplier should be at least 0!"); } /* Conversion */ if (getExpModifier() <= 0) { - reason.add("Conversion.Exp_Modifier should be greater than 0!"); + mcMMO.p.getLogger().warning("Conversion.Exp_Modifier should be greater than 0!"); } /* @@ -89,141 +105,247 @@ public class ExperienceConfig extends AutoUpdateConfigLoader { /* Alchemy */ for (PotionStage potionStage : PotionStage.values()) { if (getPotionXP(potionStage) < 0) { - reason.add("Experience_Values.Alchemy.Potion_Stage_" + potionStage.toNumerical() + " should be at least 0!"); + mcMMO.p.getLogger().warning("Experience_Values.Alchemy.Potion_Stage_" + potionStage.toNumerical() + " should be at least 0!"); } } /* Archery */ if (getArcheryDistanceMultiplier() < 0) { - reason.add("Experience_Values.Archery.Distance_Multiplier should be at least 0!"); + mcMMO.p.getLogger().warning("Experience_Values.Archery.Distance_Multiplier should be at least 0!"); } /* Combat XP Multipliers */ if (getAnimalsXP() < 0) { - reason.add("Experience_Values.Combat.Multiplier.Animals should be at least 0!"); + mcMMO.p.getLogger().warning("Experience_Values.Combat.Multiplier.Animals should be at least 0!"); } if (getDodgeXPModifier() < 0) { - reason.add("Skills.Acrobatics.Dodge_XP_Modifier should be at least 0!"); + mcMMO.p.getLogger().warning("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!"); + mcMMO.p.getLogger().warning("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!"); + mcMMO.p.getLogger().warning("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_Values.Fishing.Shake should be greater than 0!"); + mcMMO.p.getLogger().warning("Experience_Values.Fishing.Shake should be greater than 0!"); } /* Repair */ if (getRepairXPBase() <= 0) { - reason.add("Experience_Values.Repair.Base should be greater than 0!"); + mcMMO.p.getLogger().warning("Experience_Values.Repair.Base should be greater than 0!"); } /* Taming */ if (getTamingXP(EntityType.WOLF) <= 0) { - reason.add("Experience_Values.Taming.Animal_Taming.Wolf should be greater than 0!"); + mcMMO.p.getLogger().warning("Experience_Values.Taming.Animal_Taming.Wolf should be greater than 0!"); } if (getTamingXP(EntityType.OCELOT) <= 0) { - reason.add("Experience_Values.Taming.Animal_Taming.Ocelot should be greater than 0!"); + mcMMO.p.getLogger().warning("Experience_Values.Taming.Animal_Taming.Ocelot should be greater than 0!"); } - - return noErrorsInConfig(reason); } - public boolean isEarlyGameBoostEnabled() { return config.getBoolean("EarlyGameBoost.Enabled", true); } + public boolean isEarlyGameBoostEnabled() { + return config.getBoolean("EarlyGameBoost.Enabled", true); + } /* * FORMULA SETTINGS */ /* EXPLOIT TOGGLES */ - public boolean isSnowExploitPrevented() { return config.getBoolean("ExploitFix.SnowGolemExcavation", true); } - public boolean isEndermanEndermiteFarmingPrevented() { return config.getBoolean("ExploitFix.EndermanEndermiteFarms", true); } - public boolean isPistonCheatingPrevented() { return config.getBoolean("ExploitFix.PistonCheating", true); } - public boolean isPistonExploitPrevented() { return config.getBoolean("ExploitFix.Pistons", false); } - public boolean allowUnsafeEnchantments() { return config.getBoolean("ExploitFix.UnsafeEnchantments", false); } - public boolean isCOTWBreedingPrevented() { return config.getBoolean("ExploitFix.COTWBreeding", true); } + public boolean isSnowExploitPrevented() { + return config.getBoolean("ExploitFix.SnowGolemExcavation", true); + } - public boolean isFishingExploitingPrevented() { return config.getBoolean("ExploitFix.Fishing", true); } - public boolean isAcrobaticsExploitingPrevented() { return config.getBoolean("ExploitFix.Acrobatics", true); } - public boolean isTreeFellerXPReduced() { return config.getBoolean("ExploitFix.TreeFellerReducedXP", true); } + public boolean isEndermanEndermiteFarmingPrevented() { + return config.getBoolean("ExploitFix.EndermanEndermiteFarms", true); + } + + public boolean isPistonCheatingPrevented() { + return config.getBoolean("ExploitFix.PistonCheating", true); + } + + public boolean isPistonExploitPrevented() { + return config.getBoolean("ExploitFix.Pistons", false); + } + + public boolean allowUnsafeEnchantments() { + return config.getBoolean("ExploitFix.UnsafeEnchantments", false); + } + + public boolean isCOTWBreedingPrevented() { + return config.getBoolean("ExploitFix.COTWBreeding", true); + } + + public boolean isNPCInteractionPrevented() { + return config.getBoolean("ExploitFix.PreventPluginNPCInteraction", true); + } + + public boolean isFishingExploitingPrevented() { + return config.getBoolean("ExploitFix.Fishing", true); + } + + public int getFishingExploitingOptionMoveRange() { + return config.getInt("Fishing_ExploitFix_Options.MoveRange", 3); + } + + public int getFishingExploitingOptionOverFishLimit() { + return config.getInt("Fishing_ExploitFix_Options.OverFishLimit", 10); + } + + public boolean isAcrobaticsExploitingPrevented() { + return config.getBoolean("ExploitFix.Acrobatics", true); + } + + public boolean isTreeFellerXPReduced() { + return config.getBoolean("ExploitFix.TreeFellerReducedXP", true); + } /* Curve settings */ - public FormulaType getFormulaType() { return FormulaType.getFormulaType(config.getString("Experience_Formula.Curve")); } - public boolean getCumulativeCurveEnabled() { return config.getBoolean("Experience_Formula.Cumulative_Curve", false); } + public FormulaType getFormulaType() { + return FormulaType.getFormulaType(config.getString("Experience_Formula.Curve")); + } + + public boolean getCumulativeCurveEnabled() { + return config.getBoolean("Experience_Formula.Cumulative_Curve", false); + } /* Curve values */ - public double getMultiplier(FormulaType type) { return config.getDouble("Experience_Formula." + StringUtils.getCapitalized(type.toString()) + "_Values.multiplier"); } - public int getBase(FormulaType type) { return config.getInt("Experience_Formula." + StringUtils.getCapitalized(type.toString()) + "_Values.base"); } - public double getExponent(FormulaType type) { return config.getDouble("Experience_Formula." + StringUtils.getCapitalized(type.toString()) + "_Values.exponent"); } + public double getMultiplier(FormulaType type) { + return config.getDouble("Experience_Formula." + StringUtils.getCapitalized(type.toString()) + "_Values.multiplier"); + } + + public int getBase(FormulaType type) { + return config.getInt("Experience_Formula." + StringUtils.getCapitalized(type.toString()) + "_Values.base"); + } + + public double getExponent(FormulaType type) { + return config.getDouble("Experience_Formula." + StringUtils.getCapitalized(type.toString()) + "_Values.exponent"); + } /* Global modifier */ - public double getExperienceGainsGlobalMultiplier() { return config.getDouble("Experience_Formula.Multiplier.Global", 1.0); } - public void setExperienceGainsGlobalMultiplier(double value) { config.set("Experience_Formula.Multiplier.Global", value); } + public double getExperienceGainsGlobalMultiplier() { + return config.getDouble("Experience_Formula.Multiplier.Global", 1.0); + } + + public void setExperienceGainsGlobalMultiplier(double value) { + config.set("Experience_Formula.Multiplier.Global", value); + } /* PVP modifier */ - public double getPlayerVersusPlayerXP() { return config.getDouble("Experience_Formula.Multiplier.PVP", 1.0); } + public double getPlayerVersusPlayerXP() { + return config.getDouble("Experience_Formula.Multiplier.PVP", 1.0); + } /* Spawned Mob modifier */ - public double getSpawnedMobXpMultiplier() { return config.getDouble("Experience_Formula.Mobspawners.Multiplier", 0.0); } - public double getBredMobXpMultiplier() { return config.getDouble("Experience_Formula.Breeding.Multiplier", 1.0); } + public double getSpawnedMobXpMultiplier() { + return config.getDouble("Experience_Formula.Mobspawners.Multiplier", 0.0); + } + + public double getEggXpMultiplier() { + return config.getDouble("Experience_Formula.Eggs.Multiplier", 0.0); + } + + public double getTamedMobXpMultiplier() { + return config.getDouble("Experience_Formula.Player_Tamed.Multiplier", 0.0); + } + + public double getNetherPortalXpMultiplier() { + return config.getDouble("Experience_Formula.Nether_Portal.Multiplier", 0.0); + } + + public double getBredMobXpMultiplier() { + return config.getDouble("Experience_Formula.Breeding.Multiplier", 1.0); + } /* Skill modifiers */ - public double getFormulaSkillModifier(PrimarySkillType skill) { return config.getDouble("Experience_Formula.Modifier." + StringUtils.getCapitalized(skill.toString())); } + public double getFormulaSkillModifier(PrimarySkillType skill) { + return config.getDouble("Experience_Formula.Modifier." + StringUtils.getCapitalized(skill.toString())); + } /* Custom XP perk */ - public double getCustomXpPerkBoost() { return config.getDouble("Experience_Formula.Custom_XP_Perk.Boost", 1.25); } + public double getCustomXpPerkBoost() { + return config.getDouble("Experience_Formula.Custom_XP_Perk.Boost", 1.25); + } /* Diminished Returns */ - public float getDiminishedReturnsCap() { return (float) config.getDouble("Dimished_Returns.Guaranteed_Minimum_Percentage", 0.05D); } - public boolean getDiminishedReturnsEnabled() { return config.getBoolean("Diminished_Returns.Enabled", false); } - public int getDiminishedReturnsThreshold(PrimarySkillType skill) { return config.getInt("Diminished_Returns.Threshold." + StringUtils.getCapitalized(skill.toString()), 20000); } - public int getDiminishedReturnsTimeInterval() { return config.getInt("Diminished_Returns.Time_Interval", 10); } + public float getDiminishedReturnsCap() { + return (float) config.getDouble("Dimished_Returns.Guaranteed_Minimum_Percentage", 0.05D); + } + + public boolean getDiminishedReturnsEnabled() { + return config.getBoolean("Diminished_Returns.Enabled", false); + } + + public int getDiminishedReturnsThreshold(PrimarySkillType skill) { + return config.getInt("Diminished_Returns.Threshold." + StringUtils.getCapitalized(skill.toString()), 20000); + } + + public int getDiminishedReturnsTimeInterval() { + return config.getInt("Diminished_Returns.Time_Interval", 10); + } /* Conversion */ - public double getExpModifier() { return config.getDouble("Conversion.Exp_Modifier", 1); } + public double getExpModifier() { + return config.getDouble("Conversion.Exp_Modifier", 1); + } /* * XP SETTINGS */ /* General Settings */ - public boolean getExperienceGainsPlayerVersusPlayerEnabled() { return config.getBoolean("Experience_Values.PVP.Rewards", true); } + public boolean getExperienceGainsPlayerVersusPlayerEnabled() { + return config.getBoolean("Experience_Values.PVP.Rewards", true); + } /* Combat XP Multipliers */ - public double getCombatXP(EntityType entity) { return config.getDouble("Experience_Values.Combat.Multiplier." + StringUtils.getPrettyEntityTypeString(entity).replace(" ", "_")); } - public double getAnimalsXP(EntityType entity) { return config.getDouble("Experience_Values.Combat.Multiplier." + StringUtils.getPrettyEntityTypeString(entity).replace(" ", "_"), getAnimalsXP()); } - public double getAnimalsXP() { return config.getDouble("Experience_Values.Combat.Multiplier.Animals", 1.0); } - public boolean hasCombatXP(EntityType entity) {return config.contains("Experience_Values.Combat.Multiplier." + StringUtils.getPrettyEntityTypeString(entity).replace(" ", "_")); } + public double getCombatXP(EntityType entity) { + return config.getDouble("Experience_Values.Combat.Multiplier." + StringUtils.getPrettyEntityTypeString(entity).replace(" ", "_")); + } + + public double getAnimalsXP(EntityType entity) { + return config.getDouble("Experience_Values.Combat.Multiplier." + StringUtils.getPrettyEntityTypeString(entity).replace(" ", "_"), getAnimalsXP()); + } + + public double getAnimalsXP() { + return config.getDouble("Experience_Values.Combat.Multiplier.Animals", 1.0); + } + + public boolean hasCombatXP(EntityType entity) { + return config.contains("Experience_Values.Combat.Multiplier." + StringUtils.getPrettyEntityTypeString(entity).replace(" ", "_")); + } /* Materials */ - public int getXp(PrimarySkillType skill, Material data) - { + public int getXp(PrimarySkillType skill, Material material) { + //TODO: Temporary measure to fix an exploit caused by a yet to be fixed Spigot bug (as of 7/3/2020) + if (material.toString().equalsIgnoreCase("LILY_PAD")) + return 0; + String baseString = "Experience_Values." + StringUtils.getCapitalized(skill.toString()) + "."; - String explicitString = baseString + StringUtils.getExplicitConfigMaterialString(data); + String explicitString = baseString + StringUtils.getExplicitConfigMaterialString(material); if (config.contains(explicitString)) return config.getInt(explicitString); - String friendlyString = baseString + StringUtils.getFriendlyConfigMaterialString(data); + String friendlyString = baseString + StringUtils.getFriendlyConfigMaterialString(material); if (config.contains(friendlyString)) return config.getInt(friendlyString); - String wildcardString = baseString + StringUtils.getWildcardConfigMaterialString(data); + String wildcardString = baseString + StringUtils.getWildcardConfigMaterialString(material); if (config.contains(wildcardString)) return config.getInt(wildcardString); return 0; } /* Materials */ - public int getXp(PrimarySkillType skill, BlockState blockState) - { + public int getXp(PrimarySkillType skill, BlockState blockState) { Material data = blockState.getType(); String baseString = "Experience_Values." + StringUtils.getCapitalized(skill.toString()) + "."; @@ -240,8 +362,7 @@ public class ExperienceConfig extends AutoUpdateConfigLoader { } /* Materials */ - public int getXp(PrimarySkillType skill, Block block) - { + public int getXp(PrimarySkillType skill, Block block) { Material data = block.getType(); String baseString = "Experience_Values." + StringUtils.getCapitalized(skill.toString()) + "."; @@ -258,8 +379,7 @@ public class ExperienceConfig extends AutoUpdateConfigLoader { } /* Materials */ - public int getXp(PrimarySkillType skill, BlockData data) - { + public int getXp(PrimarySkillType skill, BlockData data) { String baseString = "Experience_Values." + StringUtils.getCapitalized(skill.toString()) + "."; String explicitString = baseString + StringUtils.getExplicitConfigBlockDataString(data); if (config.contains(explicitString)) @@ -273,8 +393,7 @@ public class ExperienceConfig extends AutoUpdateConfigLoader { return 0; } - public boolean doesBlockGiveSkillXP(PrimarySkillType skill, Material data) - { + public boolean doesBlockGiveSkillXP(PrimarySkillType skill, Material data) { String baseString = "Experience_Values." + StringUtils.getCapitalized(skill.toString()) + "."; String explicitString = baseString + StringUtils.getExplicitConfigMaterialString(data); if (config.contains(explicitString)) @@ -286,8 +405,7 @@ public class ExperienceConfig extends AutoUpdateConfigLoader { return config.contains(wildcardString); } - public boolean doesBlockGiveSkillXP(PrimarySkillType skill, BlockData data) - { + public boolean doesBlockGiveSkillXP(PrimarySkillType skill, BlockData data) { String baseString = "Experience_Values." + StringUtils.getCapitalized(skill.toString()) + "."; String explicitString = baseString + StringUtils.getExplicitConfigBlockDataString(data); if (config.contains(explicitString)) @@ -303,32 +421,35 @@ public class ExperienceConfig extends AutoUpdateConfigLoader { * Experience Bar Stuff */ - public boolean isPartyExperienceBarsEnabled() - { + public boolean isPartyExperienceBarsEnabled() { return config.getBoolean("Experience_Bars.Update.Party", true); } - public boolean isPassiveGainsExperienceBarsEnabled() - { + public boolean isPassiveGainsExperienceBarsEnabled() { return config.getBoolean("Experience_Bars.Update.Passive", true); } - public boolean getDoExperienceBarsAlwaysUpdateTitle() - { + public boolean getDoExperienceBarsAlwaysUpdateTitle() { return config.getBoolean("Experience_Bars.ThisMayCauseLag.AlwaysUpdateTitlesWhenXPIsGained.Enable", false) || getAddExtraDetails(); } - public boolean getAddExtraDetails() { return config.getBoolean("Experience_Bars.ThisMayCauseLag.AlwaysUpdateTitlesWhenXPIsGained.ExtraDetails", false);} - public boolean isExperienceBarsEnabled() { return config.getBoolean("Experience_Bars.Enable", true); } - public boolean isExperienceBarEnabled(PrimarySkillType primarySkillType) { return config.getBoolean("Experience_Bars."+StringUtils.getCapitalized(primarySkillType.toString())+".Enable", true);} + public boolean getAddExtraDetails() { + return config.getBoolean("Experience_Bars.ThisMayCauseLag.AlwaysUpdateTitlesWhenXPIsGained.ExtraDetails", false); + } - public BarColor getExperienceBarColor(PrimarySkillType primarySkillType) - { - String colorValueFromConfig = config.getString("Experience_Bars."+StringUtils.getCapitalized(primarySkillType.toString())+".Color"); + public boolean isExperienceBarsEnabled() { + return config.getBoolean("Experience_Bars.Enable", true); + } - for(BarColor barColor : BarColor.values()) - { - if(barColor.toString().equalsIgnoreCase(colorValueFromConfig)) + public boolean isExperienceBarEnabled(PrimarySkillType primarySkillType) { + return config.getBoolean("Experience_Bars." + StringUtils.getCapitalized(primarySkillType.toString()) + ".Enable", true); + } + + public BarColor getExperienceBarColor(PrimarySkillType primarySkillType) { + String colorValueFromConfig = config.getString("Experience_Bars." + StringUtils.getCapitalized(primarySkillType.toString()) + ".Color"); + + for (BarColor barColor : BarColor.values()) { + if (barColor.toString().equalsIgnoreCase(colorValueFromConfig)) return barColor; } @@ -336,13 +457,11 @@ public class ExperienceConfig extends AutoUpdateConfigLoader { return BarColor.WHITE; } - public BarStyle getExperienceBarStyle(PrimarySkillType primarySkillType) - { - String colorValueFromConfig = config.getString("Experience_Bars."+StringUtils.getCapitalized(primarySkillType.toString())+".BarStyle"); + public BarStyle getExperienceBarStyle(PrimarySkillType primarySkillType) { + String colorValueFromConfig = config.getString("Experience_Bars." + StringUtils.getCapitalized(primarySkillType.toString()) + ".BarStyle"); - for(BarStyle barStyle : BarStyle.values()) - { - if(barStyle.toString().equalsIgnoreCase(colorValueFromConfig)) + for (BarStyle barStyle : BarStyle.values()) { + if (barStyle.toString().equalsIgnoreCase(colorValueFromConfig)) return barStyle; } @@ -351,29 +470,51 @@ public class ExperienceConfig extends AutoUpdateConfigLoader { } /* Acrobatics */ - public int getDodgeXPModifier() { return config.getInt("Experience_Values.Acrobatics.Dodge", 120); } - public int getRollXPModifier() { return config.getInt("Experience_Values.Acrobatics.Roll", 80); } - public int getFallXPModifier() { return config.getInt("Experience_Values.Acrobatics.Fall", 120); } + public int getDodgeXPModifier() { + return config.getInt("Experience_Values.Acrobatics.Dodge", 120); + } - public double getFeatherFallXPModifier() { return config.getDouble("Experience_Values.Acrobatics.FeatherFall_Multiplier", 2.0); } + public int getRollXPModifier() { + return config.getInt("Experience_Values.Acrobatics.Roll", 80); + } + + public int getFallXPModifier() { + return config.getInt("Experience_Values.Acrobatics.Fall", 120); + } + + public double getFeatherFallXPModifier() { + return config.getDouble("Experience_Values.Acrobatics.FeatherFall_Multiplier", 2.0); + } /* Alchemy */ - public double getPotionXP(PotionStage stage) { return config.getDouble("Experience_Values.Alchemy.Potion_Stage_" + stage.toNumerical(), 10D); } + public double getPotionXP(PotionStage stage) { + return config.getDouble("Experience_Values.Alchemy.Potion_Stage_" + stage.toNumerical(), 10D); + } /* Archery */ - public double getArcheryDistanceMultiplier() { return config.getDouble("Experience_Values.Archery.Distance_Multiplier", 0.025); } + public double getArcheryDistanceMultiplier() { + return config.getDouble("Experience_Values.Archery.Distance_Multiplier", 0.025); + } - public int getFishingShakeXP() { return config.getInt("Experience_Values.Fishing.Shake", 50); } + public int getFishingShakeXP() { + return config.getInt("Experience_Values.Fishing.Shake", 50); + } /* Repair */ - public double getRepairXPBase() { return config.getDouble("Experience_Values.Repair.Base", 1000.0); } - public double getRepairXP(MaterialType repairMaterialType) { return config.getDouble("Experience_Values.Repair." + StringUtils.getCapitalized(repairMaterialType.toString())); } + public double getRepairXPBase() { + return config.getDouble("Experience_Values.Repair.Base", 1000.0); + } + + public double getRepairXP(MaterialType repairMaterialType) { + return config.getDouble("Experience_Values.Repair." + StringUtils.getCapitalized(repairMaterialType.toString())); + } /* Taming */ - public int getTamingXP(EntityType type) - { + public int getTamingXP(EntityType type) { return config.getInt("Experience_Values.Taming.Animal_Taming." + StringUtils.getPrettyEntityTypeString(type)); } - public boolean preventStoneLavaFarming() { return config.getBoolean("ExploitFix.LavaStoneAndCobbleFarming", true);} + public boolean preventStoneLavaFarming() { + return config.getBoolean("ExploitFix.LavaStoneAndCobbleFarming", true); + } } diff --git a/src/main/java/com/gmail/nossr50/config/mods/CustomArmorConfig.java b/src/main/java/com/gmail/nossr50/config/mods/CustomArmorConfig.java index a32b497b5..0d456b588 100644 --- a/src/main/java/com/gmail/nossr50/config/mods/CustomArmorConfig.java +++ b/src/main/java/com/gmail/nossr50/config/mods/CustomArmorConfig.java @@ -3,6 +3,7 @@ package com.gmail.nossr50.config.mods; import com.gmail.nossr50.config.ConfigLoader; import com.gmail.nossr50.datatypes.skills.ItemType; import com.gmail.nossr50.datatypes.skills.MaterialType; +import com.gmail.nossr50.mcMMO; import com.gmail.nossr50.skills.repair.repairables.Repairable; import com.gmail.nossr50.skills.repair.repairables.RepairableFactory; import org.bukkit.Material; @@ -13,15 +14,13 @@ import java.util.List; import java.util.Set; public class CustomArmorConfig extends ConfigLoader { + public List customBoots = new ArrayList<>(); + public List customChestplates = new ArrayList<>(); + public List customHelmets = new ArrayList<>(); + public List customLeggings = new ArrayList<>(); + public List repairables = new ArrayList<>(); private boolean needsUpdate = false; - public List customBoots = new ArrayList(); - public List customChestplates = new ArrayList(); - public List customHelmets = new ArrayList(); - public List customLeggings = new ArrayList(); - - public List repairables = new ArrayList(); - protected CustomArmorConfig(String fileName) { super("mods", fileName); loadKeys(); @@ -62,7 +61,7 @@ public class CustomArmorConfig extends ConfigLoader { Material armorMaterial = Material.matchMaterial(armorName); if (armorMaterial == null) { - plugin.getLogger().warning("Invalid material name. This item will be skipped. - " + armorName); + mcMMO.p.getLogger().warning("Invalid material name. This item will be skipped. - " + armorName); continue; } @@ -70,7 +69,7 @@ public class CustomArmorConfig extends ConfigLoader { Material repairMaterial = Material.matchMaterial(config.getString(armorType + "." + armorName + ".Repair_Material", "")); if (repairable && (repairMaterial == null)) { - plugin.getLogger().warning("Incomplete repair information. This item will be unrepairable. - " + armorName); + mcMMO.p.getLogger().warning("Incomplete repair information. This item will be unrepairable. - " + armorName); repairable = false; } diff --git a/src/main/java/com/gmail/nossr50/config/mods/CustomBlockConfig.java b/src/main/java/com/gmail/nossr50/config/mods/CustomBlockConfig.java index 2b30ec0cf..3d96ba7f9 100644 --- a/src/main/java/com/gmail/nossr50/config/mods/CustomBlockConfig.java +++ b/src/main/java/com/gmail/nossr50/config/mods/CustomBlockConfig.java @@ -2,6 +2,7 @@ package com.gmail.nossr50.config.mods; import com.gmail.nossr50.config.ConfigLoader; import com.gmail.nossr50.datatypes.mods.CustomBlock; +import com.gmail.nossr50.mcMMO; import org.bukkit.Material; import org.bukkit.configuration.ConfigurationSection; @@ -11,17 +12,15 @@ import java.util.List; import java.util.Set; public class CustomBlockConfig extends ConfigLoader { - private boolean needsUpdate = false; - - public List customExcavationBlocks = new ArrayList<>(); - public List customHerbalismBlocks = new ArrayList<>(); - public List customMiningBlocks = new ArrayList<>(); - public List customOres = new ArrayList<>(); - public List customLogs = new ArrayList<>(); - public List customLeaves = new ArrayList<>(); - public List customAbilityBlocks = new ArrayList<>(); - + public List customExcavationBlocks = new ArrayList<>(); + public List customHerbalismBlocks = new ArrayList<>(); + public List customMiningBlocks = new ArrayList<>(); + public List customOres = new ArrayList<>(); + public List customLogs = new ArrayList<>(); + public List customLeaves = new ArrayList<>(); + public List customAbilityBlocks = new ArrayList<>(); public HashMap customBlockMap = new HashMap<>(); + private boolean needsUpdate = false; protected CustomBlockConfig(String fileName) { super("mods", fileName); @@ -66,7 +65,7 @@ public class CustomBlockConfig extends ConfigLoader { Material blockMaterial = Material.matchMaterial(blockInfo[0]); if (blockMaterial == null) { - plugin.getLogger().warning("Invalid material name. This item will be skipped. - " + blockInfo[0]); + mcMMO.p.getLogger().warning("Invalid material name. This item will be skipped. - " + blockInfo[0]); continue; } @@ -84,12 +83,10 @@ public class CustomBlockConfig extends ConfigLoader { if (skillType.equals("Mining") && config.getBoolean(skillType + "." + blockName + ".Is_Ore")) { customOres.add(blockMaterial); smeltingXp = config.getInt(skillType + "." + blockName + ".Smelting_XP_Gain", xp / 10); - } - else if (skillType.equals("Woodcutting")) { + } else if (skillType.equals("Woodcutting")) { if (config.getBoolean(skillType + "." + blockName + ".Is_Log")) { customLogs.add(blockMaterial); - } - else { + } else { customLeaves.add(blockMaterial); xp = 0; // Leaves don't grant XP } diff --git a/src/main/java/com/gmail/nossr50/config/mods/CustomEntityConfig.java b/src/main/java/com/gmail/nossr50/config/mods/CustomEntityConfig.java index 95ef1e5d1..27cfb1fd9 100644 --- a/src/main/java/com/gmail/nossr50/config/mods/CustomEntityConfig.java +++ b/src/main/java/com/gmail/nossr50/config/mods/CustomEntityConfig.java @@ -2,6 +2,7 @@ package com.gmail.nossr50.config.mods; import com.gmail.nossr50.config.ConfigLoader; import com.gmail.nossr50.datatypes.mods.CustomEntity; +import com.gmail.nossr50.mcMMO; import org.apache.commons.lang.ClassUtils; import org.bukkit.Material; import org.bukkit.inventory.ItemStack; @@ -9,8 +10,8 @@ import org.bukkit.inventory.ItemStack; import java.util.HashMap; public class CustomEntityConfig extends ConfigLoader { - public HashMap customEntityClassMap = new HashMap(); - public HashMap customEntityTypeMap = new HashMap(); + public HashMap customEntityClassMap = new HashMap<>(); + public HashMap customEntityTypeMap = new HashMap<>(); protected CustomEntityConfig(String fileName) { super("mods", fileName); @@ -30,10 +31,9 @@ public class CustomEntityConfig extends ConfigLoader { try { clazz = ClassUtils.getClass(className); - } - catch (ClassNotFoundException e) { - plugin.getLogger().warning("Invalid class (" + className + ") detected for " + entityName + "."); - plugin.getLogger().warning("This custom entity may not function properly."); + } catch (ClassNotFoundException e) { + mcMMO.p.getLogger().warning("Invalid class (" + className + ") detected for " + entityName + "."); + mcMMO.p.getLogger().warning("This custom entity may not function properly."); } String entityTypeName = entityName.replace("_", "."); @@ -48,7 +48,7 @@ public class CustomEntityConfig extends ConfigLoader { int callOfTheWildAmount = config.getInt(entityName + ".COTW_Material_Amount"); if (canBeSummoned && (callOfTheWildMaterial == null || callOfTheWildAmount == 0)) { - plugin.getLogger().warning("Incomplete Call of the Wild information. This entity will not be able to be summoned by Call of the Wild."); + mcMMO.p.getLogger().warning("Incomplete Call of the Wild information. This entity will not be able to be summoned by Call of the Wild."); canBeSummoned = false; } diff --git a/src/main/java/com/gmail/nossr50/config/mods/CustomToolConfig.java b/src/main/java/com/gmail/nossr50/config/mods/CustomToolConfig.java index dc47b6081..4ec07e220 100644 --- a/src/main/java/com/gmail/nossr50/config/mods/CustomToolConfig.java +++ b/src/main/java/com/gmail/nossr50/config/mods/CustomToolConfig.java @@ -4,6 +4,7 @@ import com.gmail.nossr50.config.ConfigLoader; import com.gmail.nossr50.datatypes.mods.CustomTool; import com.gmail.nossr50.datatypes.skills.ItemType; import com.gmail.nossr50.datatypes.skills.MaterialType; +import com.gmail.nossr50.mcMMO; import com.gmail.nossr50.skills.repair.repairables.Repairable; import com.gmail.nossr50.skills.repair.repairables.RepairableFactory; import org.bukkit.Material; @@ -15,19 +16,16 @@ import java.util.List; import java.util.Set; public class CustomToolConfig extends ConfigLoader { + public List customAxes = new ArrayList<>(); + public List customBows = new ArrayList<>(); + public List customHoes = new ArrayList<>(); + public List customPickaxes = new ArrayList<>(); + public List customShovels = new ArrayList<>(); + public List customSwords = new ArrayList<>(); + public HashMap customToolMap = new HashMap<>(); + public List repairables = new ArrayList<>(); private boolean needsUpdate = false; - public List customAxes = new ArrayList(); - public List customBows = new ArrayList(); - public List customHoes = new ArrayList(); - public List customPickaxes = new ArrayList(); - public List customShovels = new ArrayList(); - public List customSwords = new ArrayList(); - - public HashMap customToolMap = new HashMap(); - - public List repairables = new ArrayList(); - protected CustomToolConfig(String fileName) { super("mods", fileName); loadKeys(); @@ -70,7 +68,7 @@ public class CustomToolConfig extends ConfigLoader { Material toolMaterial = Material.matchMaterial(toolName); if (toolMaterial == null) { - plugin.getLogger().warning("Invalid material name. This item will be skipped. - " + toolName); + mcMMO.p.getLogger().warning("Invalid material name. This item will be skipped. - " + toolName); continue; } @@ -78,7 +76,7 @@ public class CustomToolConfig extends ConfigLoader { Material repairMaterial = Material.matchMaterial(config.getString(toolType + "." + toolName + ".Repair_Material", "")); if (repairable && (repairMaterial == null)) { - plugin.getLogger().warning("Incomplete repair information. This item will be unrepairable. - " + toolName); + mcMMO.p.getLogger().warning("Incomplete repair information. This item will be unrepairable. - " + toolName); repairable = false; } diff --git a/src/main/java/com/gmail/nossr50/config/party/ItemWeightConfig.java b/src/main/java/com/gmail/nossr50/config/party/ItemWeightConfig.java index 50af1065b..75620e389 100644 --- a/src/main/java/com/gmail/nossr50/config/party/ItemWeightConfig.java +++ b/src/main/java/com/gmail/nossr50/config/party/ItemWeightConfig.java @@ -1,13 +1,13 @@ package com.gmail.nossr50.config.party; -import com.gmail.nossr50.config.ConfigLoader; -import com.gmail.nossr50.util.StringUtils; +import com.gmail.nossr50.config.BukkitConfig; +import com.gmail.nossr50.util.text.StringUtils; import org.bukkit.Material; import java.util.HashSet; import java.util.Locale; -public class ItemWeightConfig extends ConfigLoader { +public class ItemWeightConfig extends BukkitConfig { private static ItemWeightConfig instance; private ItemWeightConfig() { @@ -22,12 +22,17 @@ public class ItemWeightConfig extends ConfigLoader { return instance; } + @Override + protected void validateConfigKeys() { + //TODO: Rewrite legacy validation code + } + public int getItemWeight(Material material) { return config.getInt("Item_Weights." + StringUtils.getPrettyItemString(material).replace(" ", "_"), config.getInt("Item_Weights.Default")); } public HashSet getMiscItems() { - HashSet miscItems = new HashSet(); + HashSet miscItems = new HashSet<>(); for (String item : config.getStringList("Party_Shareables.Misc_Items")) { Material material = Material.getMaterial(item.toUpperCase(Locale.ENGLISH)); @@ -40,5 +45,6 @@ public class ItemWeightConfig extends ConfigLoader { } @Override - protected void loadKeys() {} + protected void loadKeys() { + } } diff --git a/src/main/java/com/gmail/nossr50/config/skills/alchemy/PotionConfig.java b/src/main/java/com/gmail/nossr50/config/skills/alchemy/PotionConfig.java index 1c8ae0f13..fae1b3eb8 100644 --- a/src/main/java/com/gmail/nossr50/config/skills/alchemy/PotionConfig.java +++ b/src/main/java/com/gmail/nossr50/config/skills/alchemy/PotionConfig.java @@ -18,16 +18,16 @@ import java.util.Map; public class PotionConfig extends ConfigLoader { private static PotionConfig instance; - private List concoctionsIngredientsTierOne = new ArrayList(); - private List concoctionsIngredientsTierTwo = new ArrayList(); - private List concoctionsIngredientsTierThree = new ArrayList(); - private List concoctionsIngredientsTierFour = new ArrayList(); - private List concoctionsIngredientsTierFive = new ArrayList(); - private List concoctionsIngredientsTierSix = new ArrayList(); - private List concoctionsIngredientsTierSeven = new ArrayList(); - private List concoctionsIngredientsTierEight = new ArrayList(); + private final List concoctionsIngredientsTierOne = new ArrayList<>(); + private final List concoctionsIngredientsTierTwo = new ArrayList<>(); + private final List concoctionsIngredientsTierThree = new ArrayList<>(); + private final List concoctionsIngredientsTierFour = new ArrayList<>(); + private final List concoctionsIngredientsTierFive = new ArrayList<>(); + private final List concoctionsIngredientsTierSix = new ArrayList<>(); + private final List concoctionsIngredientsTierSeven = new ArrayList<>(); + private final List concoctionsIngredientsTierEight = new ArrayList<>(); - private Map potionMap = new HashMap(); + private final Map potionMap = new HashMap<>(); private PotionConfig() { super("potions.yml"); @@ -95,8 +95,7 @@ public class PotionConfig extends ConfigLoader { if (potion != null) { potionMap.put(potionName, potion); pass++; - } - else { + } else { fail++; } } @@ -114,13 +113,13 @@ public class PotionConfig extends ConfigLoader { */ private AlchemyPotion loadPotion(ConfigurationSection potion_section) { try { - + String name = potion_section.getString("Name"); if (name != null) { name = ChatColor.translateAlternateColorCodes('&', name); } - + PotionData data; if (!potion_section.contains("PotionData")) { // Backwards config compatability short dataValue = Short.parseShort(potion_section.getName()); @@ -130,21 +129,21 @@ public class PotionConfig extends ConfigLoader { ConfigurationSection potionData = potion_section.getConfigurationSection("PotionData"); data = new PotionData(PotionType.valueOf(potionData.getString("PotionType", "WATER")), potionData.getBoolean("Extended", false), potionData.getBoolean("Upgraded", false)); } - + Material material = Material.POTION; String mat = potion_section.getString("Material", null); if (mat != null) { material = Material.valueOf(mat); } - List lore = new ArrayList(); + List lore = new ArrayList<>(); if (potion_section.contains("Lore")) { for (String line : potion_section.getStringList("Lore")) { lore.add(ChatColor.translateAlternateColorCodes('&', line)); } } - List effects = new ArrayList(); + List effects = new ArrayList<>(); if (potion_section.contains("Effects")) { for (String effect : potion_section.getStringList("Effects")) { String[] parts = effect.split(" "); @@ -155,37 +154,33 @@ public class PotionConfig extends ConfigLoader { if (type != null) { effects.add(new PotionEffect(type, duration, amplifier)); - } - else { + } else { mcMMO.p.getLogger().warning("Failed to parse effect for potion " + name + ": " + effect); } } } - - Color color = null; + + Color color; if (potion_section.contains("Color")) { color = Color.fromRGB(potion_section.getInt("Color")); - } - else { + } else { color = this.generateColor(effects); } - Map children = new HashMap(); + Map children = new HashMap<>(); if (potion_section.contains("Children")) { for (String child : potion_section.getConfigurationSection("Children").getKeys(false)) { ItemStack ingredient = loadIngredient(child); if (ingredient != null) { children.put(ingredient, potion_section.getConfigurationSection("Children").getString(child)); - } - else { + } else { mcMMO.p.getLogger().warning("Failed to parse child for potion " + name + ": " + child); } } } return new AlchemyPotion(material, data, name, lore, effects, color, children); - } - catch (Exception e) { + } catch (Exception e) { mcMMO.p.getLogger().warning("Failed to load Alchemy potion: " + potion_section.getName()); return null; } @@ -243,7 +238,7 @@ public class PotionConfig extends ConfigLoader { public AlchemyPotion getPotion(String name) { return potionMap.get(name); } - + public AlchemyPotion getPotion(ItemStack item) { for (AlchemyPotion potion : potionMap.values()) { if (potion.isSimilar(item)) { @@ -252,10 +247,10 @@ public class PotionConfig extends ConfigLoader { } return null; } - + public Color generateColor(List effects) { if (effects != null && !effects.isEmpty()) { - List colors = new ArrayList(); + List colors = new ArrayList<>(); for (PotionEffect effect : effects) { if (effect.getType().getColor() != null) { colors.add(effect.getType().getColor()); @@ -270,7 +265,7 @@ public class PotionConfig extends ConfigLoader { } return null; } - + public Color calculateAverageColor(List colors) { int red = 0; int green = 0; @@ -280,8 +275,7 @@ public class PotionConfig extends ConfigLoader { green += color.getGreen(); blue += color.getBlue(); } - Color color = Color.fromRGB(red/colors.size(), green/colors.size(), blue/colors.size()); - return color; + return Color.fromRGB(red / colors.size(), green / colors.size(), blue / colors.size()); } - + } diff --git a/src/main/java/com/gmail/nossr50/config/skills/repair/RepairConfig.java b/src/main/java/com/gmail/nossr50/config/skills/repair/RepairConfig.java index ef381ebd6..ed582208f 100644 --- a/src/main/java/com/gmail/nossr50/config/skills/repair/RepairConfig.java +++ b/src/main/java/com/gmail/nossr50/config/skills/repair/RepairConfig.java @@ -1,6 +1,6 @@ package com.gmail.nossr50.config.skills.repair; -import com.gmail.nossr50.config.ConfigLoader; +import com.gmail.nossr50.config.BukkitConfig; import com.gmail.nossr50.datatypes.skills.ItemType; import com.gmail.nossr50.datatypes.skills.MaterialType; import com.gmail.nossr50.mcMMO; @@ -11,21 +11,26 @@ import org.bukkit.Material; import org.bukkit.configuration.ConfigurationSection; import org.bukkit.inventory.ItemStack; -import java.util.ArrayList; -import java.util.List; -import java.util.Set; +import java.util.*; -public class RepairConfig extends ConfigLoader { +public class RepairConfig extends BukkitConfig { + private final HashSet notSupported; private List repairables; public RepairConfig(String fileName) { super(fileName); + notSupported = new HashSet<>(); loadKeys(); } + @Override + protected void validateConfigKeys() { + //TODO: Rewrite legacy validation code + } + @Override protected void loadKeys() { - repairables = new ArrayList(); + repairables = new ArrayList<>(); if (!config.isConfigurationSection("Repairables")) { mcMMO.p.getLogger().severe("Could not find Repairables section in " + fileName); @@ -42,13 +47,14 @@ public class RepairConfig extends ConfigLoader { } // Validate all the things! - List reason = new ArrayList(); + List reason = new ArrayList<>(); // Item Material Material itemMaterial = Material.matchMaterial(key); if (itemMaterial == null) { - mcMMO.p.getLogger().info("No support for repair item "+key+ " in this version of Minecraft, skipping."); + //mcMMO.p.getLogger().info("No support for repair item "+key+ " in this version of Minecraft, skipping."); + notSupported.add(key); //Collect names of unsupported items continue; } @@ -61,32 +67,26 @@ public class RepairConfig extends ConfigLoader { if (ItemUtils.isWoodTool(repairItem)) { repairMaterialType = MaterialType.WOOD; - } - else if (ItemUtils.isStoneTool(repairItem)) { + } else if (ItemUtils.isStoneTool(repairItem)) { repairMaterialType = MaterialType.STONE; - } - else if (ItemUtils.isStringTool(repairItem)) { + } else if (ItemUtils.isStringTool(repairItem)) { repairMaterialType = MaterialType.STRING; - } - else if (ItemUtils.isLeatherArmor(repairItem)) { + } else if (ItemUtils.isLeatherArmor(repairItem)) { repairMaterialType = MaterialType.LEATHER; - } - else if (ItemUtils.isIronArmor(repairItem) || ItemUtils.isIronTool(repairItem)) { + } else if (ItemUtils.isIronArmor(repairItem) || ItemUtils.isIronTool(repairItem)) { repairMaterialType = MaterialType.IRON; - } - else if (ItemUtils.isGoldArmor(repairItem) || ItemUtils.isGoldTool(repairItem)) { + } else if (ItemUtils.isGoldArmor(repairItem) || ItemUtils.isGoldTool(repairItem)) { repairMaterialType = MaterialType.GOLD; - } - else if (ItemUtils.isDiamondArmor(repairItem) || ItemUtils.isDiamondTool(repairItem)) { + } else if (ItemUtils.isDiamondArmor(repairItem) || ItemUtils.isDiamondTool(repairItem)) { repairMaterialType = MaterialType.DIAMOND; + } else if (ItemUtils.isNetheriteArmor(repairItem) || ItemUtils.isNetheriteTool(repairItem)) { + repairMaterialType = MaterialType.NETHERITE; } - } - else { + } else { try { repairMaterialType = MaterialType.valueOf(repairMaterialTypeString); - } - catch (IllegalArgumentException ex) { - reason.add(key + " has an invalid MaterialType of " + repairMaterialTypeString); + } catch (IllegalArgumentException ex) { + mcMMO.p.getLogger().warning(key + " has an invalid MaterialType of " + repairMaterialTypeString); } } @@ -95,7 +95,7 @@ public class RepairConfig extends ConfigLoader { Material repairMaterial = (repairMaterialName == null ? repairMaterialType.getDefaultMaterial() : Material.matchMaterial(repairMaterialName)); if (repairMaterial == null) { - mcMMO.p.getLogger().info("Could not find a valid repair material for item named "+key+", skipping."); + notSupported.add(key); //Collect names of unsupported items continue; } @@ -107,7 +107,7 @@ public class RepairConfig extends ConfigLoader { } if (maximumDurability <= 0) { - reason.add("Maximum durability of " + key + " must be greater than 0!"); + mcMMO.p.getLogger().warning("Maximum durability of " + key + " must be greater than 0!"); } // Item Type @@ -119,17 +119,14 @@ public class RepairConfig extends ConfigLoader { if (ItemUtils.isMinecraftTool(repairItem)) { repairItemType = ItemType.TOOL; - } - else if (ItemUtils.isArmor(repairItem)) { + } else if (ItemUtils.isArmor(repairItem)) { repairItemType = ItemType.ARMOR; } - } - else { + } else { try { repairItemType = ItemType.valueOf(repairItemTypeString); - } - catch (IllegalArgumentException ex) { - reason.add(key + " has an invalid ItemType of " + repairItemTypeString); + } catch (IllegalArgumentException ex) { + mcMMO.p.getLogger().warning(key + " has an invalid ItemType of " + repairItemTypeString); } } @@ -137,13 +134,13 @@ public class RepairConfig extends ConfigLoader { double xpMultiplier = config.getDouble("Repairables." + key + ".XpMultiplier", 1); if (minimumLevel < 0) { - reason.add(key + " has an invalid MinimumLevel of " + minimumLevel); + mcMMO.p.getLogger().warning(key + " has an invalid MinimumLevel of " + minimumLevel); } // Minimum Quantity int minimumQuantity = config.getInt("Repairables." + key + ".MinimumQuantity"); - if(minimumQuantity == 0) { + if (minimumQuantity == 0) { minimumQuantity = -1; } @@ -152,15 +149,34 @@ public class RepairConfig extends ConfigLoader { repairables.add(repairable); } } + //Report unsupported + StringBuilder stringBuilder = new StringBuilder(); + + if (notSupported.size() > 0) { + stringBuilder.append("mcMMO found the following materials in the Repair config that are not supported by the version of Minecraft running on this server: "); + + for (Iterator iterator = notSupported.iterator(); iterator.hasNext(); ) { + String unsupportedMaterial = iterator.next(); + + if (!iterator.hasNext()) { + stringBuilder.append(unsupportedMaterial); + } else { + stringBuilder.append(unsupportedMaterial).append(", "); + } + } + + mcMMO.p.getLogger().info(stringBuilder.toString()); + mcMMO.p.getLogger().info("Items using materials that are not supported will simply be skipped."); + } } protected List getLoadedRepairables() { - return repairables == null ? new ArrayList() : repairables; + return repairables == null ? new ArrayList<>() : repairables; } private boolean noErrorsInRepairable(List issues) { for (String issue : issues) { - plugin.getLogger().warning(issue); + mcMMO.p.getLogger().warning(issue); } return issues.isEmpty(); diff --git a/src/main/java/com/gmail/nossr50/config/skills/repair/RepairConfigManager.java b/src/main/java/com/gmail/nossr50/config/skills/repair/RepairConfigManager.java index fec3cb859..28ba2a746 100644 --- a/src/main/java/com/gmail/nossr50/config/skills/repair/RepairConfigManager.java +++ b/src/main/java/com/gmail/nossr50/config/skills/repair/RepairConfigManager.java @@ -4,23 +4,25 @@ import com.gmail.nossr50.mcMMO; import com.gmail.nossr50.skills.repair.repairables.Repairable; import java.io.File; -import java.util.ArrayList; -import java.util.List; +import java.util.Collection; +import java.util.HashSet; import java.util.regex.Pattern; public class RepairConfigManager { - private final List repairables = new ArrayList(); + public static final String REPAIR_VANILLA_YML = "repair.vanilla.yml"; + private static final Collection repairables = new HashSet<>(); public RepairConfigManager(mcMMO plugin) { Pattern pattern = Pattern.compile("repair\\.(?:.+)\\.yml"); File dataFolder = plugin.getDataFolder(); - File vanilla = new File(dataFolder, "repair.vanilla.yml"); - if (!vanilla.exists()) { - plugin.saveResource("repair.vanilla.yml", false); - } + RepairConfig mainRepairConfig = new RepairConfig(REPAIR_VANILLA_YML); + repairables.addAll(mainRepairConfig.getLoadedRepairables()); for (String fileName : dataFolder.list()) { + if(fileName.equals(REPAIR_VANILLA_YML)) + continue; + if (!pattern.matcher(fileName).matches()) { continue; } @@ -36,7 +38,7 @@ public class RepairConfigManager { } } - public List getLoadedRepairables() { + public Collection getLoadedRepairables() { return repairables; } } diff --git a/src/main/java/com/gmail/nossr50/config/skills/salvage/SalvageConfig.java b/src/main/java/com/gmail/nossr50/config/skills/salvage/SalvageConfig.java index 3200d8139..d47a42d77 100644 --- a/src/main/java/com/gmail/nossr50/config/skills/salvage/SalvageConfig.java +++ b/src/main/java/com/gmail/nossr50/config/skills/salvage/SalvageConfig.java @@ -1,6 +1,7 @@ package com.gmail.nossr50.config.skills.salvage; -import com.gmail.nossr50.config.ConfigLoader; +import com.gmail.nossr50.config.BukkitConfig; +import com.gmail.nossr50.datatypes.database.UpgradeType; import com.gmail.nossr50.datatypes.skills.ItemType; import com.gmail.nossr50.datatypes.skills.MaterialType; import com.gmail.nossr50.mcMMO; @@ -12,22 +13,27 @@ import org.bukkit.Material; import org.bukkit.configuration.ConfigurationSection; import org.bukkit.inventory.ItemStack; -import java.util.ArrayList; -import java.util.List; -import java.util.Locale; -import java.util.Set; +import java.io.IOException; +import java.util.*; -public class SalvageConfig extends ConfigLoader { - private List salvageables; +public class SalvageConfig extends BukkitConfig { + private final HashSet notSupported; + private Set salvageables; public SalvageConfig(String fileName) { super(fileName); + notSupported = new HashSet<>(); loadKeys(); } + @Override + protected void validateConfigKeys() { + //TODO: Rewrite legacy validation code + } + @Override protected void loadKeys() { - salvageables = new ArrayList(); + salvageables = new HashSet<>(); if (!config.isConfigurationSection("Salvageables")) { mcMMO.p.getLogger().severe("Could not find Salvageables section in " + fileName); @@ -37,15 +43,34 @@ public class SalvageConfig extends ConfigLoader { ConfigurationSection section = config.getConfigurationSection("Salvageables"); Set keys = section.getKeys(false); + //Original version of 1.16 support had maximum quantities that were bad, this fixes it + + if (mcMMO.getUpgradeManager().shouldUpgrade(UpgradeType.FIX_NETHERITE_SALVAGE_QUANTITIES)) { + mcMMO.p.getLogger().info("Fixing incorrect Salvage quantities on Netherite gear, this will only run once..."); + for (String namespacedkey : mcMMO.getMaterialMapStore().getNetheriteArmor()) { + config.set("Salvageables." + namespacedkey.toUpperCase() + ".MaximumQuantity", 4); //TODO: Doesn't make sense to default to 4 for everything + } + + try { + config.save(getFile()); + mcMMO.getUpgradeManager().setUpgradeCompleted(UpgradeType.FIX_NETHERITE_SALVAGE_QUANTITIES); + mcMMO.p.getLogger().info("Fixed incorrect Salvage quantities for Netherite gear!"); + } catch (IOException e) { + mcMMO.p.getLogger().info("Unable to fix Salvage config, please delete the salvage yml file to generate a new one."); + e.printStackTrace(); + } + } + + for (String key : keys) { // Validate all the things! - List reason = new ArrayList(); + List reason = new ArrayList<>(); // Item Material Material itemMaterial = Material.matchMaterial(key); if (itemMaterial == null) { - mcMMO.p.getLogger().info("No support for salvage item "+key+ " in this version of Minecraft, skipping."); + notSupported.add(key); continue; } @@ -58,34 +83,26 @@ public class SalvageConfig extends ConfigLoader { if (ItemUtils.isWoodTool(salvageItem)) { salvageMaterialType = MaterialType.WOOD; - } - else if (ItemUtils.isStoneTool(salvageItem)) { + } else if (ItemUtils.isStoneTool(salvageItem)) { salvageMaterialType = MaterialType.STONE; - } - else if (ItemUtils.isStringTool(salvageItem)) { + } else if (ItemUtils.isStringTool(salvageItem)) { salvageMaterialType = MaterialType.STRING; - } - else if (ItemUtils.isLeatherArmor(salvageItem)) { + } else if (ItemUtils.isLeatherArmor(salvageItem)) { salvageMaterialType = MaterialType.LEATHER; - } - else if (ItemUtils.isIronArmor(salvageItem) || ItemUtils.isIronTool(salvageItem)) { + } else if (ItemUtils.isIronArmor(salvageItem) || ItemUtils.isIronTool(salvageItem)) { salvageMaterialType = MaterialType.IRON; - } - else if (ItemUtils.isGoldArmor(salvageItem) || ItemUtils.isGoldTool(salvageItem)) { + } else if (ItemUtils.isGoldArmor(salvageItem) || ItemUtils.isGoldTool(salvageItem)) { salvageMaterialType = MaterialType.GOLD; - } - else if (ItemUtils.isDiamondArmor(salvageItem) || ItemUtils.isDiamondTool(salvageItem)) { + } else if (ItemUtils.isDiamondArmor(salvageItem) || ItemUtils.isDiamondTool(salvageItem)) { salvageMaterialType = MaterialType.DIAMOND; } else if (ItemUtils.isNetheriteTool(salvageItem) || ItemUtils.isNetheriteArmor(salvageItem)) { - salvageMaterialType = MaterialType.NETHER; + salvageMaterialType = MaterialType.NETHERITE; } - } - else { + } else { try { salvageMaterialType = MaterialType.valueOf(salvageMaterialTypeString.replace(" ", "_").toUpperCase(Locale.ENGLISH)); - } - catch (IllegalArgumentException ex) { - reason.add(key + " has an invalid MaterialType of " + salvageMaterialTypeString); + } catch (IllegalArgumentException ex) { + mcMMO.p.getLogger().warning(key + " has an invalid MaterialType of " + salvageMaterialTypeString); } } @@ -94,7 +111,7 @@ public class SalvageConfig extends ConfigLoader { Material salvageMaterial = (salvageMaterialName == null ? salvageMaterialType.getDefaultMaterial() : Material.matchMaterial(salvageMaterialName)); if (salvageMaterial == null) { - mcMMO.p.getLogger().info("Could not find a salvage material for item named " + key + ", skipping."); + notSupported.add(key); continue; } @@ -110,17 +127,14 @@ public class SalvageConfig extends ConfigLoader { if (ItemUtils.isMinecraftTool(salvageItem)) { salvageItemType = ItemType.TOOL; - } - else if (ItemUtils.isArmor(salvageItem)) { + } else if (ItemUtils.isArmor(salvageItem)) { salvageItemType = ItemType.ARMOR; } - } - else { + } else { try { salvageItemType = ItemType.valueOf(salvageItemTypeString.replace(" ", "_").toUpperCase(Locale.ENGLISH)); - } - catch (IllegalArgumentException ex) { - reason.add(key + " has an invalid ItemType of " + salvageItemTypeString); + } catch (IllegalArgumentException ex) { + mcMMO.p.getLogger().warning(key + " has an invalid ItemType of " + salvageItemTypeString); } } @@ -128,11 +142,11 @@ public class SalvageConfig extends ConfigLoader { double xpMultiplier = config.getDouble("Salvageables." + key + ".XpMultiplier", 1); if (minimumLevel < 0) { - reason.add(key + " has an invalid MinimumLevel of " + minimumLevel); + mcMMO.p.getLogger().warning(key + " has an invalid MinimumLevel of " + minimumLevel); } // Maximum Quantity - int maximumQuantity = (itemMaterial != null ? SkillUtils.getRepairAndSalvageQuantities(itemMaterial, salvageMaterial) : config.getInt("Salvageables." + key + ".MaximumQuantity", 2)); + int maximumQuantity = (itemMaterial != null ? SkillUtils.getRepairAndSalvageQuantities(itemMaterial, salvageMaterial) : config.getInt("Salvageables." + key + ".MaximumQuantity", 1)); if (maximumQuantity <= 0 && itemMaterial != null) { maximumQuantity = config.getInt("Salvageables." + key + ".MaximumQuantity", 1); @@ -145,7 +159,7 @@ public class SalvageConfig extends ConfigLoader { } if (maximumQuantity <= 0) { - reason.add("Maximum quantity of " + key + " must be greater than 0!"); + mcMMO.p.getLogger().warning("Maximum quantity of " + key + " must be greater than 0!"); } if (noErrorsInSalvageable(reason)) { @@ -153,20 +167,39 @@ public class SalvageConfig extends ConfigLoader { salvageables.add(salvageable); } } + //Report unsupported + StringBuilder stringBuilder = new StringBuilder(); + + if (notSupported.size() > 0) { + stringBuilder.append("mcMMO found the following materials in the Salvage config that are not supported by the version of Minecraft running on this server: "); + + for (Iterator iterator = notSupported.iterator(); iterator.hasNext(); ) { + String unsupportedMaterial = iterator.next(); + + if (!iterator.hasNext()) { + stringBuilder.append(unsupportedMaterial); + } else { + stringBuilder.append(unsupportedMaterial).append(", "); + } + } + + mcMMO.p.getLogger().info(stringBuilder.toString()); + mcMMO.p.getLogger().info("Items using materials that are not supported will simply be skipped."); + } } - protected List getLoadedSalvageables() { - return salvageables == null ? new ArrayList() : salvageables; + protected Collection getLoadedSalvageables() { + return salvageables == null ? new HashSet<>() : salvageables; } private boolean noErrorsInSalvageable(List issues) { if (!issues.isEmpty()) { - plugin.getLogger().warning("Errors have been found in: " + fileName); - plugin.getLogger().warning("The following issues were found:"); + mcMMO.p.getLogger().warning("Errors have been found in: " + fileName); + mcMMO.p.getLogger().warning("The following issues were found:"); } for (String issue : issues) { - plugin.getLogger().warning(issue); + mcMMO.p.getLogger().warning(issue); } return issues.isEmpty(); diff --git a/src/main/java/com/gmail/nossr50/config/skills/salvage/SalvageConfigManager.java b/src/main/java/com/gmail/nossr50/config/skills/salvage/SalvageConfigManager.java index 3fdca28d6..1e6617034 100644 --- a/src/main/java/com/gmail/nossr50/config/skills/salvage/SalvageConfigManager.java +++ b/src/main/java/com/gmail/nossr50/config/skills/salvage/SalvageConfigManager.java @@ -9,18 +9,21 @@ import java.util.List; import java.util.regex.Pattern; public class SalvageConfigManager { - private final List salvageables = new ArrayList(); + public static final String SALVAGE_VANILLA_YML = "salvage.vanilla.yml"; + private final List salvageables = new ArrayList<>(); //TODO: Collision checking, make the list a set + public SalvageConfigManager(mcMMO plugin) { Pattern pattern = Pattern.compile("salvage\\.(?:.+)\\.yml"); File dataFolder = plugin.getDataFolder(); - File vanilla = new File(dataFolder, "salvage.vanilla.yml"); - if (!vanilla.exists()) { - plugin.saveResource("salvage.vanilla.yml", false); - } + SalvageConfig mainSalvageConfig = new SalvageConfig(SALVAGE_VANILLA_YML); + salvageables.addAll(mainSalvageConfig.getLoadedSalvageables()); for (String fileName : dataFolder.list()) { + if(fileName.equals(SALVAGE_VANILLA_YML)) + continue; + if (!pattern.matcher(fileName).matches()) { continue; } @@ -37,6 +40,6 @@ public class SalvageConfigManager { } public List getLoadedSalvageables() { - return salvageables; + return new ArrayList<>(salvageables); } } diff --git a/src/main/java/com/gmail/nossr50/config/treasure/FishingTreasureConfig.java b/src/main/java/com/gmail/nossr50/config/treasure/FishingTreasureConfig.java new file mode 100755 index 000000000..277997ec0 --- /dev/null +++ b/src/main/java/com/gmail/nossr50/config/treasure/FishingTreasureConfig.java @@ -0,0 +1,386 @@ +package com.gmail.nossr50.config.treasure; + +import com.gmail.nossr50.config.BukkitConfig; +import com.gmail.nossr50.datatypes.treasure.*; +import com.gmail.nossr50.mcMMO; +import com.gmail.nossr50.util.EnchantmentUtils; +import org.bukkit.ChatColor; +import org.bukkit.Material; +import org.bukkit.configuration.ConfigurationSection; +import org.bukkit.enchantments.Enchantment; +import org.bukkit.entity.EntityType; +import org.bukkit.inventory.ItemStack; +import org.bukkit.inventory.meta.ItemMeta; +import org.bukkit.inventory.meta.PotionMeta; +import org.bukkit.potion.PotionData; +import org.bukkit.potion.PotionType; +import org.jetbrains.annotations.NotNull; + +import java.util.*; + +public class FishingTreasureConfig extends BukkitConfig { + + public static final String FILENAME = "fishing_treasures.yml"; + private static FishingTreasureConfig instance; + + public @NotNull HashMap> fishingRewards = new HashMap<>(); + public @NotNull HashMap> fishingEnchantments = new HashMap<>(); + public @NotNull HashMap> shakeMap = new HashMap<>(); + + private FishingTreasureConfig() { + super(FILENAME); + loadKeys(); + } + + public static FishingTreasureConfig getInstance() { + if (instance == null) { + instance = new FishingTreasureConfig(); + } + + return instance; + } + + @Override + protected void validateConfigKeys() { + //TODO: Rewrite legacy validation code + List reason = new ArrayList<>(); + ConfigurationSection enchantment_drop_rates = config.getConfigurationSection("Enchantment_Drop_Rates"); + + if(enchantment_drop_rates != null) { + for (String tier : enchantment_drop_rates.getKeys(false)) { + double totalEnchantDropRate = 0; + double totalItemDropRate = 0; + + for (Rarity rarity : Rarity.values()) { + double enchantDropRate = config.getDouble("Enchantment_Drop_Rates." + tier + "." + rarity.toString()); + double itemDropRate = config.getDouble("Item_Drop_Rates." + tier + "." + rarity); + + if ((enchantDropRate < 0.0 || enchantDropRate > 100.0)) { + mcMMO.p.getLogger().warning("The enchant drop rate for " + tier + " items that are " + rarity + "should be between 0.0 and 100.0!"); + } + + if (itemDropRate < 0.0 || itemDropRate > 100.0) { + mcMMO.p.getLogger().warning("The item drop rate for " + tier + " items that are " + rarity + "should be between 0.0 and 100.0!"); + } + + totalEnchantDropRate += enchantDropRate; + totalItemDropRate += itemDropRate; + } + + if (totalEnchantDropRate < 0 || totalEnchantDropRate > 100.0) { + mcMMO.p.getLogger().warning("The total enchant drop rate for " + tier + " should be between 0.0 and 100.0!"); + } + + if (totalItemDropRate < 0 || totalItemDropRate > 100.0) { + mcMMO.p.getLogger().warning("The total item drop rate for " + tier + " should be between 0.0 and 100.0!"); + } + } + } else { + mcMMO.p.getLogger().warning("Your fishing treasures config is empty, is this intentional? Delete it to regenerate."); + } + } + + @Override + protected void loadKeys() { + if (config.getConfigurationSection("Treasures") != null) { + backup(); + return; + } + + loadTreasures("Fishing"); + loadEnchantments(); + + for (EntityType entity : EntityType.values()) { + if (entity.isAlive()) { + loadTreasures("Shake." + entity); + } + } + } + + private void loadTreasures(@NotNull String type) { + boolean isFishing = type.equals("Fishing"); + boolean isShake = type.contains("Shake"); + + 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<>())); + } + } + + for (String treasureName : treasureSection.getKeys(false)) { + // Validate all the things! + List reason = new ArrayList<>(); + + 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 + addShakeTreasure(new ShakeTreasure(new ItemStack(Material.BEDROCK, 1, (byte) 0), 1, getInventoryStealDropChance(), getInventoryStealDropLevel()), EntityType.PLAYER); + continue; + } else { + material = Material.matchMaterial(materialName); + } + + int amount = config.getInt(type + "." + treasureName + ".Amount"); + short data = (treasureInfo.length == 2) ? Short.parseShort(treasureInfo[1]) : (short) config.getInt(type + "." + treasureName + ".Data"); + + if (material == null) { + mcMMO.p.getLogger().warning("Cannot find matching item type in this version of MC, skipping - " + materialName); + continue; + } + + if (amount <= 0) { + amount = 1; + } + + if (material.isBlock() && (data > 127 || data < -128)) { + mcMMO.p.getLogger().warning("Data of " + treasureName + " is invalid! " + data); + } + + /* + * XP, Drop Chance, and Drop Level + */ + + int xp = config.getInt(type + "." + treasureName + ".XP"); + double dropChance = config.getDouble(type + "." + treasureName + ".Drop_Chance"); + int dropLevel = config.getInt(type + "." + treasureName + ".Drop_Level"); + + if (xp < 0) { + mcMMO.p.getLogger().warning(treasureName + " has an invalid XP value: " + xp); + } + + if (dropChance < 0.0D) { + mcMMO.p.getLogger().warning(treasureName + " has an invalid Drop_Chance: " + dropChance); + } + + if (dropLevel < 0) { + mcMMO.p.getLogger().warning("Fishing Config: " + treasureName + " has an invalid Drop_Level: " + dropLevel); + } + + /* + * Specific Types + */ + Rarity rarity = null; + + if (isFishing) { + String rarityStr = config.getString(type + "." + treasureName + ".Rarity"); + + if (rarityStr != null) { + rarity = Rarity.getRarity(rarityStr); + } else { + mcMMO.p.getLogger().severe("Please edit your config and add a Rarity definition for - " + treasureName); + mcMMO.p.getLogger().severe("Skipping this treasure until rarity is defined - " + treasureName); + continue; + } + } + + /* + * Itemstack + */ + ItemStack item = null; + + + String customName = null; + + if (hasCustomName(type, treasureName)) { + customName = config.getString(type + "." + treasureName + ".Custom_Name"); + } + + if (materialName.contains("POTION")) { + Material mat = Material.matchMaterial(materialName); + if (mat == null) { + mcMMO.p.getLogger().warning("Potion format for " + FILENAME + " has changed"); + } else { + item = new ItemStack(mat, amount, data); + PotionMeta itemMeta = (PotionMeta) item.getItemMeta(); + + if (itemMeta == null) { + mcMMO.p.getLogger().severe("Item meta when adding potion to fishing treasure was null, contact the mcMMO devs!"); + continue; + } + + PotionType potionType = null; + try { + potionType = PotionType.valueOf(config.getString(type + "." + treasureName + ".PotionData.PotionType", "WATER")); + } catch (IllegalArgumentException ex) { + mcMMO.p.getLogger().warning("Invalid Potion_Type: " + config.getString(type + "." + treasureName + ".PotionData.PotionType", "WATER")); + } + boolean extended = config.getBoolean(type + "." + treasureName + ".PotionData.Extended", false); + boolean upgraded = config.getBoolean(type + "." + treasureName + ".PotionData.Upgraded", false); + itemMeta.setBasePotionData(new PotionData(potionType, extended, upgraded)); + + if (customName != null) { + itemMeta.setDisplayName(ChatColor.translateAlternateColorCodes('&', customName)); + } + + if (config.contains(type + "." + treasureName + ".Lore")) { + List lore = new ArrayList<>(); + for (String s : config.getStringList(type + "." + treasureName + ".Lore")) { + lore.add(ChatColor.translateAlternateColorCodes('&', s)); + } + itemMeta.setLore(lore); + } + item.setItemMeta(itemMeta); + } + } else if (material == Material.ENCHANTED_BOOK) { + //If any whitelisted enchants exist we use whitelist-based matching + item = new ItemStack(material, 1); + ItemMeta itemMeta = item.getItemMeta(); + + List allowedEnchantsList = config.getStringList(type + "." + treasureName + ".Enchantments_Whitelist"); + List disallowedEnchantsList = config.getStringList(type + "." + treasureName + ".Enchantments_Blacklist"); + + Set blackListedEnchants = new HashSet<>(); + Set whiteListedEnchants = new HashSet<>(); + + matchAndFillSet(disallowedEnchantsList, blackListedEnchants); + matchAndFillSet(allowedEnchantsList, whiteListedEnchants); + + if (customName != null && itemMeta != null) { + itemMeta.setDisplayName(ChatColor.translateAlternateColorCodes('&', customName)); + item.setItemMeta(itemMeta); + } + + FishingTreasureBook fishingTreasureBook = new FishingTreasureBook(item, xp, blackListedEnchants, whiteListedEnchants); + addFishingTreasure(rarity, fishingTreasureBook); + //TODO: Add book support for shake + continue; //The code in this whole file is a disaster, ignore this hacky solution :P + } else { + item = new ItemStack(material, amount, data); + + if (customName != null) { + ItemMeta itemMeta = item.getItemMeta(); + itemMeta.setDisplayName(ChatColor.translateAlternateColorCodes('&', customName)); + item.setItemMeta(itemMeta); + } + + if (config.contains(type + "." + treasureName + ".Lore")) { + ItemMeta itemMeta = item.getItemMeta(); + List lore = new ArrayList<>(); + for (String s : config.getStringList(type + "." + treasureName + ".Lore")) { + lore.add(ChatColor.translateAlternateColorCodes('&', s)); + } + itemMeta.setLore(lore); + item.setItemMeta(itemMeta); + } + } + + + //TODO: Rewrite legacy validation code + // Look into what needs to change for this + if (isFishing) { + addFishingTreasure(rarity, new FishingTreasure(item, xp)); + } else if (isShake) { + ShakeTreasure shakeTreasure = new ShakeTreasure(item, xp, dropChance, dropLevel); + + EntityType entityType = EntityType.valueOf(type.substring(6)); + addShakeTreasure(shakeTreasure, entityType); + } + } + } + + private void addShakeTreasure(@NotNull ShakeTreasure shakeTreasure, @NotNull EntityType entityType) { + if (!shakeMap.containsKey(entityType)) + shakeMap.put(entityType, new ArrayList<>()); + shakeMap.get(entityType).add(shakeTreasure); + } + + private void addFishingTreasure(@NotNull Rarity rarity, @NotNull FishingTreasure fishingTreasure) { + fishingRewards.get(rarity).add(fishingTreasure); + } + + private boolean hasCustomName(@NotNull String type, @NotNull String treasureName) { + return config.contains(type + "." + treasureName + ".Custom_Name"); + } + + /** + * Matches enchantments on a list (user provided string) to known enchantments in the Spigot API + * Any matches are added to the passed set + * + * @param enchantListStr the users string list of enchantments + * @param permissiveList the permissive list of enchantments + */ + private void matchAndFillSet(@NotNull List enchantListStr, @NotNull Set permissiveList) { + if (enchantListStr.isEmpty()) { + return; + } + + for (String str : enchantListStr) { + boolean foundMatch = false; + for (Enchantment enchantment : Enchantment.values()) { + if (enchantment.getKey().getKey().equalsIgnoreCase(str)) { + permissiveList.add(enchantment); + foundMatch = true; + break; + } + } + + if (!foundMatch) { + mcMMO.p.getLogger().info("[Fishing Treasure Init] Could not find any enchantments which matched the user defined enchantment named: " + str); + } + } + } + + private void loadEnchantments() { + for (Rarity rarity : Rarity.values()) { + if (!fishingEnchantments.containsKey(rarity)) { + fishingEnchantments.put(rarity, (new ArrayList<>())); + } + + ConfigurationSection enchantmentSection = config.getConfigurationSection("Enchantments_Rarity." + rarity.toString()); + + if (enchantmentSection == null) { + return; + } + + for (String enchantmentName : enchantmentSection.getKeys(false)) { + int level = config.getInt("Enchantments_Rarity." + rarity + "." + enchantmentName); + Enchantment enchantment = EnchantmentUtils.getByName(enchantmentName); + + if (enchantment == null) { + mcMMO.p.getLogger().warning("Skipping invalid enchantment in " + FILENAME + ": " + enchantmentName); + continue; + } + + fishingEnchantments.get(rarity).add(new EnchantmentTreasure(enchantment, level)); + } + } + } + + public boolean getInventoryStealEnabled() { + return config.contains("Shake.PLAYER.INVENTORY"); + } + + public boolean getInventoryStealStacks() { + return config.getBoolean("Shake.PLAYER.INVENTORY.Whole_Stacks"); + } + + public double getInventoryStealDropChance() { + return config.getDouble("Shake.PLAYER.INVENTORY.Drop_Chance"); + } + + public int getInventoryStealDropLevel() { + return config.getInt("Shake.PLAYER.INVENTORY.Drop_Level"); + } + + public double getItemDropRate(int tier, @NotNull Rarity rarity) { + return config.getDouble("Item_Drop_Rates.Tier_" + tier + "." + rarity); + } + + public double getEnchantmentDropRate(int tier, @NotNull Rarity rarity) { + return config.getDouble("Enchantment_Drop_Rates.Tier_" + tier + "." + rarity); + } +} diff --git a/src/main/java/com/gmail/nossr50/config/treasure/TreasureConfig.java b/src/main/java/com/gmail/nossr50/config/treasure/TreasureConfig.java index 3d6983b6d..44bd4121e 100755 --- a/src/main/java/com/gmail/nossr50/config/treasure/TreasureConfig.java +++ b/src/main/java/com/gmail/nossr50/config/treasure/TreasureConfig.java @@ -1,41 +1,42 @@ package com.gmail.nossr50.config.treasure; -import com.gmail.nossr50.config.ConfigLoader; -import com.gmail.nossr50.datatypes.treasure.*; -import com.gmail.nossr50.util.EnchantmentUtils; -import com.gmail.nossr50.util.StringUtils; +import com.gmail.nossr50.config.BukkitConfig; +import com.gmail.nossr50.datatypes.treasure.ExcavationTreasure; +import com.gmail.nossr50.datatypes.treasure.HylianTreasure; +import com.gmail.nossr50.mcMMO; +import com.gmail.nossr50.util.text.StringUtils; import org.bukkit.ChatColor; import org.bukkit.Material; import org.bukkit.Tag; import org.bukkit.configuration.ConfigurationSection; -import org.bukkit.enchantments.Enchantment; -import org.bukkit.entity.EntityType; import org.bukkit.inventory.ItemStack; import org.bukkit.inventory.meta.ItemMeta; import org.bukkit.inventory.meta.PotionMeta; import org.bukkit.potion.PotionData; import org.bukkit.potion.PotionType; +import java.io.IOException; import java.util.ArrayList; import java.util.HashMap; import java.util.List; -public class TreasureConfig extends ConfigLoader { +public class TreasureConfig extends BukkitConfig { + public static final String FILENAME = "treasures.yml"; + public static final String LEVEL_REQUIREMENT_RETRO_MODE = ".Level_Requirement.Retro_Mode"; + public static final String LEVEL_REQUIREMENT_STANDARD_MODE = ".Level_Requirement.Standard_Mode"; + public static final String WRONG_KEY_VALUE_STANDARD = ".Drop_Level.Standard_Mode"; + public static final String WRONG_KEY_VALUE_RETRO = ".Drop_Level.Retro_Mode"; + public static final String LEGACY_DROP_LEVEL = ".Drop_Level"; + public static final String WRONG_KEY_ROOT = ".Drop_Level"; private static TreasureConfig instance; - public HashMap> excavationMap = new HashMap>(); - - public HashMap> shakeMap = new HashMap>(); - public HashMap> hylianMap = new HashMap>(); - - public HashMap> fishingRewards = new HashMap>(); - public HashMap> fishingEnchantments = new HashMap>(); + public HashMap> excavationMap = new HashMap<>(); + public HashMap> hylianMap = new HashMap<>(); private TreasureConfig() { - super("treasures.yml"); + super(FILENAME); loadKeys(); - validate(); } public static TreasureConfig getInstance() { @@ -47,39 +48,8 @@ public class TreasureConfig extends ConfigLoader { } @Override - protected boolean validateKeys() { - // Validate all the settings! - List reason = new ArrayList(); - for (String tier : config.getConfigurationSection("Enchantment_Drop_Rates").getKeys(false)) { - double totalEnchantDropRate = 0; - double totalItemDropRate = 0; - - for (Rarity rarity : Rarity.values()) { - double enchantDropRate = config.getDouble("Enchantment_Drop_Rates." + tier + "." + rarity.toString()); - double itemDropRate = config.getDouble("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); + protected void validateConfigKeys() { + //TODO: Rewrite legacy validation code } @Override @@ -89,21 +59,12 @@ public class TreasureConfig extends ConfigLoader { 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 shouldWeUpdateFile = false; boolean isExcavation = type.equals("Excavation"); boolean isHylian = type.equals("Hylian_Luck"); @@ -113,16 +74,9 @@ public class TreasureConfig extends ConfigLoader { return; } - // Initialize fishing HashMap - for (Rarity rarity : Rarity.values()) { - if (!fishingRewards.containsKey(rarity)) { - fishingRewards.put(rarity, (new ArrayList())); - } - } - for (String treasureName : treasureSection.getKeys(false)) { // Validate all the things! - List reason = new ArrayList(); + List reason = new ArrayList<>(); String[] treasureInfo = treasureName.split("[|]"); String materialName = treasureInfo[0]; @@ -131,22 +85,13 @@ public class TreasureConfig extends ConfigLoader { * 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()); - shakeMap.get(EntityType.PLAYER).add(new ShakeTreasure(new ItemStack(Material.BEDROCK, 1, (byte) 0), 1, getInventoryStealDropChance(), getInventoryStealDropLevel())); - continue; - } else { - material = Material.matchMaterial(materialName); - } + material = Material.matchMaterial(materialName); int amount = config.getInt(type + "." + treasureName + ".Amount"); short data = (treasureInfo.length == 2) ? Short.parseShort(treasureInfo[1]) : (short) config.getInt(type + "." + treasureName + ".Data"); if (material == null) { - reason.add("Invalid material: " + materialName); + mcMMO.p.getLogger().warning("Invalid material: " + materialName); } if (amount <= 0) { @@ -154,7 +99,7 @@ public class TreasureConfig extends ConfigLoader { } if (material != null && material.isBlock() && (data > 127 || data < -128)) { - reason.add("Data of " + treasureName + " is invalid! " + data); + mcMMO.p.getLogger().warning("Data of " + treasureName + " is invalid! " + data); } /* @@ -163,31 +108,46 @@ public class TreasureConfig extends ConfigLoader { int xp = config.getInt(type + "." + treasureName + ".XP"); double dropChance = config.getDouble(type + "." + treasureName + ".Drop_Chance"); - int dropLevel = config.getInt(type + "." + treasureName + ".Drop_Level"); + DropLevelKeyConversionType conversionType; + + //Check for legacy drop level values and convert + if (getWrongKeyValue(type, treasureName, DropLevelKeyConversionType.LEGACY) != -1) { + //Legacy Drop level, needs to be converted + shouldWeUpdateFile = processAutomaticKeyConversion(type, shouldWeUpdateFile, treasureName, DropLevelKeyConversionType.LEGACY); + } + + //Check for a bad key that was accidentally shipped out to some users + if (getWrongKeyValue(type, treasureName, DropLevelKeyConversionType.WRONG_KEY_STANDARD) != -1) { + //Partially converted to the new system, I had a dyslexic moment so some configs have this + shouldWeUpdateFile = processAutomaticKeyConversion(type, shouldWeUpdateFile, treasureName, DropLevelKeyConversionType.WRONG_KEY_STANDARD); + } + + //Check for a bad key that was accidentally shipped out to some users + if (getWrongKeyValue(type, treasureName, DropLevelKeyConversionType.WRONG_KEY_RETRO) != -1) { + //Partially converted to the new system, I had a dyslexic moment so some configs have this + shouldWeUpdateFile = processAutomaticKeyConversion(type, shouldWeUpdateFile, treasureName, DropLevelKeyConversionType.WRONG_KEY_RETRO); + } + + int dropLevel = -1; + + if (mcMMO.isRetroModeEnabled()) { + dropLevel = config.getInt(type + "." + treasureName + LEVEL_REQUIREMENT_RETRO_MODE, -1); + } else { + dropLevel = config.getInt(type + "." + treasureName + LEVEL_REQUIREMENT_STANDARD_MODE, -1); + } + + if (dropLevel == -1) { + mcMMO.p.getLogger().severe("Could not find a Level_Requirement entry for treasure " + treasureName); + mcMMO.p.getLogger().severe("Skipping treasure"); + continue; + } if (xp < 0) { - reason.add(treasureName + " has an invalid XP value: " + xp); + mcMMO.p.getLogger().warning(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(config.getString(type + "." + treasureName + ".Rarity")); - - if (rarity == null) { - reason.add("Invalid Rarity for item: " + treasureName); - } + mcMMO.p.getLogger().warning(treasureName + " has an invalid Drop_Chance: " + dropChance); } /* @@ -198,7 +158,7 @@ public class TreasureConfig extends ConfigLoader { if (materialName.contains("POTION")) { Material mat = Material.matchMaterial(materialName); if (mat == null) { - reason.add("Potion format for Treasures.yml has changed"); + mcMMO.p.getLogger().warning("Potion format for " + FILENAME + " has changed"); } else { item = new ItemStack(mat, amount, data); PotionMeta itemMeta = (PotionMeta) item.getItemMeta(); @@ -207,7 +167,7 @@ public class TreasureConfig extends ConfigLoader { try { potionType = PotionType.valueOf(config.getString(type + "." + treasureName + ".PotionData.PotionType", "WATER")); } catch (IllegalArgumentException ex) { - reason.add("Invalid Potion_Type: " + config.getString(type + "." + treasureName + ".PotionData.PotionType", "WATER")); + mcMMO.p.getLogger().warning("Invalid Potion_Type: " + config.getString(type + "." + treasureName + ".PotionData.PotionType", "WATER")); } boolean extended = config.getBoolean(type + "." + treasureName + ".PotionData.Extended", false); boolean upgraded = config.getBoolean(type + "." + treasureName + ".PotionData.Upgraded", false); @@ -218,7 +178,7 @@ public class TreasureConfig extends ConfigLoader { } if (config.contains(type + "." + treasureName + ".Lore")) { - List lore = new ArrayList(); + List lore = new ArrayList<>(); for (String s : config.getStringList(type + "." + treasureName + ".Lore")) { lore.add(ChatColor.translateAlternateColorCodes('&', s)); } @@ -237,7 +197,7 @@ public class TreasureConfig extends ConfigLoader { if (config.contains(type + "." + treasureName + ".Lore")) { ItemMeta itemMeta = item.getItemMeta(); - List lore = new ArrayList(); + List lore = new ArrayList<>(); for (String s : config.getStringList(type + "." + treasureName + ".Lore")) { lore.add(ChatColor.translateAlternateColorCodes('&', s)); } @@ -246,120 +206,119 @@ public class TreasureConfig extends ConfigLoader { } } - if (noErrorsInConfig(reason)) { - if (isFishing) { - fishingRewards.get(rarity).add(new FishingTreasure(item, xp)); - } else if (isShake) { - ShakeTreasure shakeTreasure = new ShakeTreasure(item, xp, dropChance, dropLevel); + //TODO: Rewrite legacy validation code + // Look into what needs to change for this + if (isExcavation) { + ExcavationTreasure excavationTreasure = new ExcavationTreasure(item, xp, dropChance, dropLevel); + List dropList = config.getStringList(type + "." + treasureName + ".Drops_From"); - EntityType entityType = EntityType.valueOf(type.substring(6)); - if (!shakeMap.containsKey(entityType)) - shakeMap.put(entityType, new ArrayList()); - shakeMap.get(entityType).add(shakeTreasure); - } else if (isExcavation) { - ExcavationTreasure excavationTreasure = new ExcavationTreasure(item, xp, dropChance, dropLevel); - List dropList = config.getStringList(type + "." + treasureName + ".Drops_From"); + for (String blockType : dropList) { + if (!excavationMap.containsKey(blockType)) + excavationMap.put(blockType, new ArrayList<>()); + excavationMap.get(blockType).add(excavationTreasure); + } + } else if (isHylian) { + HylianTreasure hylianTreasure = new HylianTreasure(item, xp, dropChance, dropLevel); + List dropList = config.getStringList(type + "." + treasureName + ".Drops_From"); - for (String blockType : dropList) { - if (!excavationMap.containsKey(blockType)) - excavationMap.put(blockType, new ArrayList()); - excavationMap.get(blockType).add(excavationTreasure); + 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; } - } else if (isHylian) { - HylianTreasure hylianTreasure = new HylianTreasure(item, xp, dropChance, dropLevel); - List dropList = config.getStringList(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); + 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); } } } + + //Apply our fix + if (shouldWeUpdateFile) { + try { + config.save(getFile()); + } catch (IOException e) { + e.printStackTrace(); + } + } + } + + private boolean processAutomaticKeyConversion(String type, boolean shouldWeUpdateTheFile, String treasureName, DropLevelKeyConversionType conversionType) { + switch (conversionType) { + case LEGACY: + int legacyDropLevel = getWrongKeyValue(type, treasureName, conversionType); //Legacy only had one value, Retro Mode didn't have a setting + //Config needs to be updated to be more specific + mcMMO.p.getLogger().info("(" + treasureName + ") [Fixing bad address: Legacy] Converting Drop_Level to Level_Requirement in treasures.yml for treasure to match new expected format"); + config.set(type + "." + treasureName + LEGACY_DROP_LEVEL, null); //Remove legacy entry + config.set(type + "." + treasureName + LEVEL_REQUIREMENT_RETRO_MODE, legacyDropLevel * 10); //Multiply by 10 for Retro + config.set(type + "." + treasureName + LEVEL_REQUIREMENT_STANDARD_MODE, legacyDropLevel); + shouldWeUpdateTheFile = true; + break; + case WRONG_KEY_STANDARD: + mcMMO.p.getLogger().info("(" + treasureName + ") [Fixing bad address: STANDARD] Converting Drop_Level to Level_Requirement in treasures.yml for treasure to match new expected format"); + int wrongKeyValueStandard = getWrongKeyValue(type, treasureName, conversionType); + config.set(type + "." + treasureName + WRONG_KEY_ROOT, null); //We also kill the Retro key here as we have enough information for setting in values if needed + + if (wrongKeyValueStandard != -1) { + config.set(type + "." + treasureName + LEVEL_REQUIREMENT_STANDARD_MODE, wrongKeyValueStandard); + config.set(type + "." + treasureName + LEVEL_REQUIREMENT_RETRO_MODE, wrongKeyValueStandard * 10); //Multiply by 10 for Retro + } + + shouldWeUpdateTheFile = true; + break; + case WRONG_KEY_RETRO: + mcMMO.p.getLogger().info("(" + treasureName + ") [Fixing bad address: RETRO] Converting Drop_Level to Level_Requirement in treasures.yml for treasure to match new expected format"); + int wrongKeyValueRetro = getWrongKeyValue(type, treasureName, conversionType); + config.set(type + "." + treasureName + WRONG_KEY_ROOT, null); //We also kill the Retro key here as we have enough information for setting in values if needed + + if (wrongKeyValueRetro != -1) { + config.set(type + "." + treasureName + LEVEL_REQUIREMENT_RETRO_MODE, wrongKeyValueRetro); + } + + shouldWeUpdateTheFile = true; + break; + } + return shouldWeUpdateTheFile; + } + + private int getWrongKeyValue(String type, String treasureName, DropLevelKeyConversionType dropLevelKeyConversionType) { + return switch (dropLevelKeyConversionType) { + case LEGACY -> config.getInt(type + "." + treasureName + LEGACY_DROP_LEVEL, -1); + case WRONG_KEY_STANDARD -> config.getInt(type + "." + treasureName + WRONG_KEY_VALUE_STANDARD, -1); + case WRONG_KEY_RETRO -> config.getInt(type + "." + treasureName + WRONG_KEY_VALUE_RETRO, -1); + }; + } private void AddHylianTreasure(String dropper, HylianTreasure treasure) { if (!hylianMap.containsKey(dropper)) - hylianMap.put(dropper, new ArrayList()); + hylianMap.put(dropper, new ArrayList<>()); 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())); - } - - ConfigurationSection enchantmentSection = config.getConfigurationSection("Enchantments_Rarity." + rarity.toString()); - - if (enchantmentSection == null) { - return; - } - - for (String enchantmentName : enchantmentSection.getKeys(false)) { - int level = config.getInt("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 config.getBoolean("Shake.PLAYER.INVENTORY.Whole_Stacks"); - } - - public double getInventoryStealDropChance() { - return config.getDouble("Shake.PLAYER.INVENTORY.Drop_Chance"); - } - - public int getInventoryStealDropLevel() { - return config.getInt("Shake.PLAYER.INVENTORY.Drop_Level"); - } - - public double getItemDropRate(int tier, Rarity rarity) { - return config.getDouble("Item_Drop_Rates.Tier_" + tier + "." + rarity.toString()); - } - - public double getEnchantmentDropRate(int tier, Rarity rarity) { - return config.getDouble("Enchantment_Drop_Rates.Tier_" + tier + "." + rarity.toString()); + private enum DropLevelKeyConversionType { + LEGACY, + WRONG_KEY_STANDARD, + WRONG_KEY_RETRO } } diff --git a/src/main/java/com/gmail/nossr50/database/DatabaseManager.java b/src/main/java/com/gmail/nossr50/database/DatabaseManager.java index 314b91800..586c8c0b6 100644 --- a/src/main/java/com/gmail/nossr50/database/DatabaseManager.java +++ b/src/main/java/com/gmail/nossr50/database/DatabaseManager.java @@ -1,30 +1,32 @@ package com.gmail.nossr50.database; -import com.gmail.nossr50.config.Config; +import com.gmail.nossr50.api.exceptions.InvalidSkillException; import com.gmail.nossr50.datatypes.database.DatabaseType; import com.gmail.nossr50.datatypes.database.PlayerStat; import com.gmail.nossr50.datatypes.player.PlayerProfile; import com.gmail.nossr50.datatypes.skills.PrimarySkillType; +import org.bukkit.OfflinePlayer; +import org.bukkit.entity.Player; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; import java.util.List; import java.util.Map; import java.util.UUID; public interface DatabaseManager { - // One month in milliseconds - public final long PURGE_TIME = 2630000000L * Config.getInstance().getOldUsersCutoff(); // During convertUsers, how often to output a status - public final int progressInterval = 200; + int progressInterval = 200; /** * Purge users with 0 power level from the database. */ - public void purgePowerlessUsers(); + int purgePowerlessUsers(); /** * Purge users who haven't logged on in over a certain time frame from the database. */ - public void purgeOldUsers(); + void purgeOldUsers(); /** * Remove a user from the database. @@ -33,14 +35,14 @@ public interface DatabaseManager { * @param uuid player UUID, can be null * @return true if the user was successfully removed, false otherwise */ - public boolean removeUser(String playerName, UUID uuid); + boolean removeUser(String playerName, UUID uuid); /** * Removes any cache used for faster lookups * Currently only used for SQL * @param uuid target UUID to cleanup */ - public void cleanupUser(UUID uuid); + void cleanupUser(UUID uuid); /** * Save a user to the database. @@ -48,17 +50,18 @@ public interface DatabaseManager { * @param profile The profile of the player to save * @return true if successful, false on failure */ - public boolean saveUser(PlayerProfile profile); + boolean saveUser(PlayerProfile profile); /** * Retrieve leaderboard info. + * Will never be null but it may be empty * * @param skill The skill to retrieve info on * @param pageNumber Which page in the leaderboards to retrieve * @param statsPerPage The number of stats per page * @return the requested leaderboard information */ - public List readLeaderboard(PrimarySkillType skill, int pageNumber, int statsPerPage); + @NotNull List readLeaderboard(@Nullable PrimarySkillType skill, int pageNumber, int statsPerPage) throws InvalidSkillException; /** * Retrieve rank info into a HashMap from PrimarySkillType to the rank. @@ -69,56 +72,37 @@ public interface DatabaseManager { * @param playerName The name of the user to retrieve the rankings for * @return the requested rank information */ - public Map readRank(String playerName); + Map readRank(String playerName); /** * Add a new user to the database. - * - * @param playerName The name of the player to be added to the database + * @param playerName The name of the player to be added to the database * @param uuid The uuid of the player to be added to the database + * @return */ - public void newUser(String playerName, UUID uuid); + @NotNull PlayerProfile newUser(String playerName, UUID uuid); + + @NotNull PlayerProfile newUser(@NotNull Player player); /** * Load a player from the database. * - * @deprecated replaced by {@link #loadPlayerProfile(String playerName, UUID uuid, boolean createNew)} - * * @param playerName The name of the player to load from the database - * @param createNew Whether to create a new record if the player is not - * found * @return The player's data, or an unloaded PlayerProfile if not found * and createNew is false */ - @Deprecated - public PlayerProfile loadPlayerProfile(String playerName, boolean createNew); + @NotNull PlayerProfile loadPlayerProfile(@NotNull String playerName); - /** - * Load a player from the database. - * - * @param uuid The uuid of the player to load from the database - * @return The player's data, or an unloaded PlayerProfile if not found - */ - public PlayerProfile loadPlayerProfile(UUID uuid); + @NotNull PlayerProfile loadPlayerProfile(@NotNull OfflinePlayer offlinePlayer); - /** - * Load a player from the database. Attempt to use uuid, fall back on playername - * - * @param playerName The name of the player to load from the database - * @param uuid The uuid of the player to load from the database - * @param createNew Whether to create a new record if the player is not - * found - * @return The player's data, or an unloaded PlayerProfile if not found - * and createNew is false - */ - public PlayerProfile loadPlayerProfile(String playerName, UUID uuid, boolean createNew); + @NotNull PlayerProfile loadPlayerProfile(@NotNull UUID uuid); /** * Get all users currently stored in the database. * * @return list of playernames */ - public List getStoredUsers(); + List getStoredUsers(); /** * Convert all users from this database to the provided database using @@ -126,21 +110,21 @@ public interface DatabaseManager { * * @param destination The DatabaseManager to save to */ - public void convertUsers(DatabaseManager destination); + void convertUsers(DatabaseManager destination); - public boolean saveUserUUID(String userName, UUID uuid); + boolean saveUserUUID(String userName, UUID uuid); - public boolean saveUserUUIDs(Map fetchedUUIDs); + boolean saveUserUUIDs(Map fetchedUUIDs); /** * Retrieve the type of database in use. Custom databases should return CUSTOM. * * @return The type of database */ - public DatabaseType getDatabaseType(); + DatabaseType getDatabaseType(); /** * Called when the plugin disables */ - public void onDisable(); + void onDisable(); } diff --git a/src/main/java/com/gmail/nossr50/database/DatabaseManagerFactory.java b/src/main/java/com/gmail/nossr50/database/DatabaseManagerFactory.java index 1fb6555dc..1e30c6819 100644 --- a/src/main/java/com/gmail/nossr50/database/DatabaseManagerFactory.java +++ b/src/main/java/com/gmail/nossr50/database/DatabaseManagerFactory.java @@ -1,13 +1,16 @@ package com.gmail.nossr50.database; -import com.gmail.nossr50.config.Config; import com.gmail.nossr50.datatypes.database.DatabaseType; import com.gmail.nossr50.mcMMO; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +import java.util.logging.Logger; public class DatabaseManagerFactory { private static Class customManager = null; - public static DatabaseManager getDatabaseManager() { + public static DatabaseManager getDatabaseManager(@NotNull String userFilePath, @NotNull Logger logger, long purgeTime, int startingLevel) { if (customManager != null) { try { return createDefaultCustomDatabaseManager(); @@ -20,10 +23,10 @@ public class DatabaseManagerFactory { mcMMO.p.debug("Failed to create custom database manager"); e.printStackTrace(); } - mcMMO.p.debug("Falling back on " + (Config.getInstance().getUseMySQL() ? "SQL" : "Flatfile") + " database"); + mcMMO.p.debug("Falling back on " + (mcMMO.p.getGeneralConfig().getUseMySQL() ? "SQL" : "Flatfile") + " database"); } - return Config.getInstance().getUseMySQL() ? new SQLDatabaseManager() : new FlatfileDatabaseManager(); + return mcMMO.p.getGeneralConfig().getUseMySQL() ? new SQLDatabaseManager() : new FlatFileDatabaseManager(userFilePath, logger, purgeTime, startingLevel); } /** @@ -56,16 +59,19 @@ public class DatabaseManagerFactory { return customManager; } - public static DatabaseManager createDatabaseManager(DatabaseType type) { + public static @Nullable DatabaseManager createDatabaseManager(@NotNull DatabaseType type, @NotNull String userFilePath, @NotNull Logger logger, long purgeTime, int startingLevel) { switch (type) { case FLATFILE: - return new FlatfileDatabaseManager(); + mcMMO.p.getLogger().info("Using FlatFile Database"); + return new FlatFileDatabaseManager(userFilePath, logger, purgeTime, startingLevel); case SQL: + mcMMO.p.getLogger().info("Using SQL Database"); return new SQLDatabaseManager(); case CUSTOM: try { + mcMMO.p.getLogger().info("Attempting to use Custom Database"); return createDefaultCustomDatabaseManager(); } catch (Throwable e) { @@ -77,7 +83,7 @@ public class DatabaseManagerFactory { } } - public static DatabaseManager createDefaultCustomDatabaseManager() throws Throwable { + private static DatabaseManager createDefaultCustomDatabaseManager() throws Throwable { return customManager.getConstructor().newInstance(); } diff --git a/src/main/java/com/gmail/nossr50/database/ExpectedType.java b/src/main/java/com/gmail/nossr50/database/ExpectedType.java new file mode 100644 index 000000000..ab3ad7c9c --- /dev/null +++ b/src/main/java/com/gmail/nossr50/database/ExpectedType.java @@ -0,0 +1,13 @@ +package com.gmail.nossr50.database; + +public enum ExpectedType { + STRING, + INTEGER, + LONG, + BOOLEAN, + FLOAT, + DOUBLE, + UUID, + IGNORED, + OUT_OF_RANGE +} diff --git a/src/main/java/com/gmail/nossr50/database/FlatFileDataFlag.java b/src/main/java/com/gmail/nossr50/database/FlatFileDataFlag.java new file mode 100644 index 000000000..b80c39e15 --- /dev/null +++ b/src/main/java/com/gmail/nossr50/database/FlatFileDataFlag.java @@ -0,0 +1,13 @@ +package com.gmail.nossr50.database; + +public enum FlatFileDataFlag { + INCOMPLETE, + BAD_VALUES, + LAST_LOGIN_SCHEMA_UPGRADE, + MISSING_NAME, + DUPLICATE_NAME, + DUPLICATE_UUID, + BAD_UUID_DATA, //Can be because it is missing, null, or corrupted or some other reason + TOO_INCOMPLETE, + CORRUPTED_OR_UNRECOGNIZABLE, +} diff --git a/src/main/java/com/gmail/nossr50/database/FlatFileDataProcessor.java b/src/main/java/com/gmail/nossr50/database/FlatFileDataProcessor.java new file mode 100644 index 000000000..a232d86cd --- /dev/null +++ b/src/main/java/com/gmail/nossr50/database/FlatFileDataProcessor.java @@ -0,0 +1,345 @@ +package com.gmail.nossr50.database; + +import com.gmail.nossr50.database.flatfile.FlatFileDataBuilder; +import com.gmail.nossr50.database.flatfile.FlatFileDataContainer; +import com.gmail.nossr50.database.flatfile.FlatFileDataUtil; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +import java.util.*; +import java.util.logging.Logger; + +import static com.gmail.nossr50.database.FlatFileDatabaseManager.*; + +public class FlatFileDataProcessor { + private final @NotNull List flatFileDataContainers; + private final @NotNull List flatFileDataFlags; + private final @NotNull Logger logger; + private final HashSet names; + private final HashSet uuids; + private int uniqueProcessingID; //TODO: Not being used, should we use it? + boolean corruptDataFound; + + public FlatFileDataProcessor(@NotNull Logger logger) { + this.logger = logger; + flatFileDataContainers = new ArrayList<>(); + flatFileDataFlags = new ArrayList<>(); + names = new HashSet<>(); + uuids = new HashSet<>(); + uniqueProcessingID = 0; + } + + public void processData(@NotNull String lineData) { + assert !lineData.isEmpty(); + + //Make sure the data line is "correct" + if(lineData.charAt(lineData.length() - 1) != ':') { + // Length checks depend on last rawSplitData being ':' + // We add it here if it is missing + lineData = lineData.concat(":"); + } + + //Split the data into an array + String[] splitDataLine = lineData.split(":"); + + FlatFileDataBuilder builder = new FlatFileDataBuilder(splitDataLine, uniqueProcessingID); + uniqueProcessingID++; + boolean[] badDataValues = new boolean[DATA_ENTRY_COUNT]; + boolean anyBadData = false; + + //This is the minimum size of the split array needed to be considered proper data + if(splitDataLine.length < getMinimumSplitDataLength()) { + //Data is considered junk + if(!corruptDataFound) { + logger.severe("Some corrupt data was found in mcmmo.users and has been repaired, it is possible that some player data has been lost in this process."); + corruptDataFound = true; + } + + //Flag as junk (corrupt) + builder.appendFlag(FlatFileDataFlag.CORRUPTED_OR_UNRECOGNIZABLE); + + //TODO: This block here is probably pointless + if(splitDataLine.length >= 10 //The value here is kind of arbitrary, it shouldn't be too low to avoid false positives, but also we aren't really going to correctly identify when player data has been corrupted or not with 100% accuracy ever + && splitDataLine[0] != null && !splitDataLine[0].isEmpty()) { + if(splitDataLine[0].length() <= 16 && splitDataLine[0].length() >= 3) { + logger.severe("Not enough data found to recover corrupted player data for user: "+splitDataLine[0]); + registerData(builder.appendFlag(FlatFileDataFlag.TOO_INCOMPLETE)); + return; + } + } + + registerData(builder.appendFlag(FlatFileDataFlag.CORRUPTED_OR_UNRECOGNIZABLE)); + return; + } + + /* + * Check for duplicate names + */ + + boolean invalidUUID = false; + + String name = splitDataLine[USERNAME_INDEX]; + String strOfUUID = splitDataLine[UUID_INDEX]; + + if(name.isEmpty()) { + reportBadDataLine("No name found for data", "[MISSING NAME]", lineData); + builder.appendFlag(FlatFileDataFlag.MISSING_NAME); + anyBadData = true; + badDataValues[USERNAME_INDEX] = true; + } + + if(strOfUUID.isEmpty() || strOfUUID.equalsIgnoreCase("NULL")) { + invalidUUID = true; + badDataValues[UUID_INDEX] = true; + reportBadDataLine("Empty/null UUID for user", "Empty/null", lineData); + builder.appendFlag(FlatFileDataFlag.BAD_UUID_DATA); + + anyBadData = true; + } + + UUID uuid = null; + + try { + uuid = UUID.fromString(strOfUUID); + } catch (IllegalArgumentException e) { + //UUID does not conform + invalidUUID = true; + badDataValues[UUID_INDEX] = true; + reportBadDataLine("Invalid UUID data found for user", strOfUUID, lineData); + builder.appendFlag(FlatFileDataFlag.BAD_UUID_DATA); + } + + //Duplicate UUID is no good, reject them + if(!invalidUUID && uuid != null && uuids.contains(uuid)) { + registerData(builder.appendFlag(FlatFileDataFlag.DUPLICATE_UUID)); + return; + } + + uuids.add(uuid); + + if(names.contains(name)) { + builder.appendFlag(FlatFileDataFlag.DUPLICATE_NAME); + anyBadData = true; + badDataValues[USERNAME_INDEX] = true; + } + + if(!name.isEmpty()) + names.add(name); + + //Make sure the data is up to date schema wise, if it isn't we adjust it to the correct size and flag it for repair + splitDataLine = isDataSchemaUpToDate(splitDataLine, builder, badDataValues); + + /* + * After establishing this data has at least an identity we check for bad data + * Bad Value checks + */ + + //Check each data for bad values + for(int i = 0; i < DATA_ENTRY_COUNT; i++) { + if(shouldNotBeEmpty(splitDataLine[i], i)) { + + if(i == OVERHAUL_LAST_LOGIN) { + builder.appendFlag(FlatFileDataFlag.LAST_LOGIN_SCHEMA_UPGRADE); + } + + badDataValues[i] = true; + anyBadData = true; + continue; + } + + boolean isCorrectType = isOfExpectedType(splitDataLine[i], getExpectedValueType(i)); + + if(!isCorrectType) { + anyBadData = true; + badDataValues[i] = true; + } + } + + if(anyBadData) { + builder.appendFlag(FlatFileDataFlag.BAD_VALUES); + builder.appendBadDataValues(badDataValues); + } + + registerData(builder); + } + + public @NotNull String[] isDataSchemaUpToDate(@NotNull String[] splitDataLine, @NotNull FlatFileDataBuilder builder, boolean[] badDataValues) { + assert splitDataLine.length <= DATA_ENTRY_COUNT; //should NEVER be higher + + if(splitDataLine.length < DATA_ENTRY_COUNT) { + int oldLength = splitDataLine.length; + splitDataLine = Arrays.copyOf(splitDataLine, DATA_ENTRY_COUNT); + int newLength = splitDataLine.length; + + //TODO: Test this + for(int i = oldLength; i < (newLength - 1); i++){ + badDataValues[i] = true; + } + + builder.appendFlag(FlatFileDataFlag.INCOMPLETE); + builder.setSplitStringData(splitDataLine); + } + return splitDataLine; + } + + + public boolean shouldNotBeEmpty(@Nullable String data, int index) { + if(getExpectedValueType(index) == ExpectedType.IGNORED) { + return false; + } else { + return data == null || data.isEmpty(); + } + } + + public boolean isOfExpectedType(@NotNull String data, @NotNull ExpectedType expectedType) { + switch(expectedType) { + case STRING: + return true; + case INTEGER: + try { + Integer.valueOf(data); + return true; + } catch (Exception e) { + return false; + } + case BOOLEAN: + return data.equalsIgnoreCase("true") || data.equalsIgnoreCase("false"); + case FLOAT: + try { + Float.valueOf(data); + return true; + } catch (NumberFormatException e) { + return false; + } + case DOUBLE: + try { + Double.valueOf(data); + return true; + } catch (NumberFormatException e) { + return false; + } + case UUID: + try { + UUID.fromString(data); + return true; + } catch (IllegalArgumentException e) { + return false; + } + case OUT_OF_RANGE: + throw new ArrayIndexOutOfBoundsException("Value matched type OUT_OF_RANGE, this should never happen."); + case IGNORED: + default: + return true; + } + + } + + private void reportBadDataLine(String warning, String context, String dataLine) { + logger.warning("FlatFileDatabaseBuilder Warning: " + warning + " - " + context); + logger.warning("FlatFileDatabaseBuilder: (Line Data) - " + dataLine); + logger.warning("mcMMO will repair this data if automatically (if it is possible)."); + } + + private int getMinimumSplitDataLength() { + return UUID_INDEX + 1; + } + + private void registerData(@NotNull FlatFileDataBuilder builder) { + FlatFileDataContainer flatFileDataContainer = builder.build(); + flatFileDataContainers.add(flatFileDataContainer); + + if(flatFileDataContainer.getDataFlags() != null) + flatFileDataFlags.addAll(flatFileDataContainer.getDataFlags()); + } + + public static @NotNull ExpectedType getExpectedValueType(int dataIndex) throws IndexOutOfBoundsException { + switch(dataIndex) { + case USERNAME_INDEX: + return ExpectedType.STRING; + case 2: //Assumption: Used to be for something, no longer used + case 3: //Assumption: Used to be for something, no longer used + case 23: //Assumption: Used to be used for something, no longer used + case 33: //Assumption: Used to be used for something, no longer used + case HEALTHBAR: + case LEGACY_LAST_LOGIN: + return ExpectedType.IGNORED; + case SKILLS_MINING: + case SKILLS_REPAIR: + case SKILLS_UNARMED: + case SKILLS_HERBALISM: + case SKILLS_EXCAVATION: + case SKILLS_ARCHERY: + case SKILLS_SWORDS: + case SKILLS_AXES: + case SKILLS_WOODCUTTING: + case SKILLS_ACROBATICS: + case SKILLS_TAMING: + case SKILLS_FISHING: + case SKILLS_ALCHEMY: + case COOLDOWN_BERSERK: + case COOLDOWN_GIGA_DRILL_BREAKER: + case COOLDOWN_TREE_FELLER: + case COOLDOWN_GREEN_TERRA: + case COOLDOWN_SERRATED_STRIKES: + case COOLDOWN_SKULL_SPLITTER: + case COOLDOWN_SUPER_BREAKER: + case COOLDOWN_BLAST_MINING: + case SCOREBOARD_TIPS: + case COOLDOWN_CHIMAERA_WING: + return ExpectedType.INTEGER; + case EXP_MINING: + case EXP_WOODCUTTING: + case EXP_REPAIR: + case EXP_UNARMED: + case EXP_HERBALISM: + case EXP_EXCAVATION: + case EXP_ARCHERY: + case EXP_SWORDS: + case EXP_AXES: + case EXP_ACROBATICS: + case EXP_TAMING: + case EXP_FISHING: + case EXP_ALCHEMY: + return ExpectedType.FLOAT; + case UUID_INDEX: + return ExpectedType.UUID; + case OVERHAUL_LAST_LOGIN: + return ExpectedType.LONG; + } + + throw new IndexOutOfBoundsException(); + } + + public @NotNull List getFlatFileDataContainers() { + return flatFileDataContainers; + } + + public @NotNull List getFlatFileDataFlags() { + return flatFileDataFlags; + } + + public int getDataFlagCount() { + return flatFileDataFlags.size(); + } + + public @NotNull StringBuilder processDataForSave() { + StringBuilder stringBuilder = new StringBuilder(); + + //Fix our data if needed and prepare it to be saved + + for(FlatFileDataContainer dataContainer : flatFileDataContainers) { + String[] splitData = FlatFileDataUtil.getPreparedSaveDataLine(dataContainer); + + if(splitData == null) + continue; + + //We add a trailing : as it is needed for some reason (is it?) + //TODO: Is the trailing ":" actually necessary? + String fromSplit = org.apache.commons.lang.StringUtils.join(splitData, ":") + ":"; + stringBuilder.append(fromSplit).append("\r\n"); + } + + return stringBuilder; + } + +} diff --git a/src/main/java/com/gmail/nossr50/database/FlatFileDatabaseManager.java b/src/main/java/com/gmail/nossr50/database/FlatFileDatabaseManager.java new file mode 100644 index 000000000..6733680c1 --- /dev/null +++ b/src/main/java/com/gmail/nossr50/database/FlatFileDatabaseManager.java @@ -0,0 +1,1332 @@ +package com.gmail.nossr50.database; + +import com.gmail.nossr50.api.exceptions.InvalidSkillException; +import com.gmail.nossr50.database.flatfile.LeaderboardStatus; +import com.gmail.nossr50.datatypes.database.DatabaseType; +import com.gmail.nossr50.datatypes.database.PlayerStat; +import com.gmail.nossr50.datatypes.player.PlayerProfile; +import com.gmail.nossr50.datatypes.player.UniqueDataType; +import com.gmail.nossr50.datatypes.skills.PrimarySkillType; +import com.gmail.nossr50.datatypes.skills.SuperAbilityType; +import com.gmail.nossr50.mcMMO; +import com.gmail.nossr50.util.Misc; +import com.gmail.nossr50.util.skills.SkillTools; +import org.bukkit.OfflinePlayer; +import org.bukkit.entity.Player; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +import java.io.*; +import java.time.LocalDateTime; +import java.time.format.DateTimeFormatter; +import java.util.*; +import java.util.logging.Logger; + +public final class FlatFileDatabaseManager implements DatabaseManager { + public static final String IGNORED = "IGNORED"; + public static final String LEGACY_INVALID_OLD_USERNAME = "_INVALID_OLD_USERNAME_'"; + private final @NotNull EnumMap> playerStatHash = new EnumMap>(PrimarySkillType.class); + private final @NotNull List powerLevels = new ArrayList<>(); + private long lastUpdate = 0; + private final @NotNull String usersFilePath; + private final @NotNull Logger logger; + private final long purgeTime; + private final int startingLevel; + private final boolean testing; + + private final long UPDATE_WAIT_TIME = 600000L; // 10 minutes + private final @NotNull File usersFile; + private static final Object fileWritingLock = new Object(); + + public static final int USERNAME_INDEX = 0; + public static final int SKILLS_MINING = 1; + public static final int EXP_MINING = 4; + public static final int SKILLS_WOODCUTTING = 5; + public static final int EXP_WOODCUTTING = 6; + public static final int SKILLS_REPAIR = 7; + public static final int SKILLS_UNARMED = 8; + public static final int SKILLS_HERBALISM = 9; + public static final int SKILLS_EXCAVATION = 10; + public static final int SKILLS_ARCHERY = 11; + public static final int SKILLS_SWORDS = 12; + public static final int SKILLS_AXES = 13; + public static final int SKILLS_ACROBATICS = 14; + public static final int EXP_REPAIR = 15; + public static final int EXP_UNARMED = 16; + public static final int EXP_HERBALISM = 17; + public static final int EXP_EXCAVATION = 18; + public static final int EXP_ARCHERY = 19; + public static final int EXP_SWORDS = 20; + public static final int EXP_AXES = 21; + public static final int EXP_ACROBATICS = 22; + public static final int SKILLS_TAMING = 24; + public static final int EXP_TAMING = 25; + public static final int COOLDOWN_BERSERK = 26; + public static final int COOLDOWN_GIGA_DRILL_BREAKER = 27; + public static final int COOLDOWN_TREE_FELLER = 28; + public static final int COOLDOWN_GREEN_TERRA = 29; + public static final int COOLDOWN_SERRATED_STRIKES = 30; + public static final int COOLDOWN_SKULL_SPLITTER = 31; + public static final int COOLDOWN_SUPER_BREAKER = 32; + public static final int SKILLS_FISHING = 34; + public static final int EXP_FISHING = 35; + public static final int COOLDOWN_BLAST_MINING = 36; + public static final int LEGACY_LAST_LOGIN = 37; + public static final int HEALTHBAR = 38; + public static final int SKILLS_ALCHEMY = 39; + public static final int EXP_ALCHEMY = 40; + public static final int UUID_INDEX = 41; + public static final int SCOREBOARD_TIPS = 42; + public static final int COOLDOWN_CHIMAERA_WING = 43; + public static final int OVERHAUL_LAST_LOGIN = 44; + + public static final int DATA_ENTRY_COUNT = OVERHAUL_LAST_LOGIN + 1; //Update this everytime new data is added + + protected FlatFileDatabaseManager(@NotNull File usersFile, @NotNull Logger logger, long purgeTime, int startingLevel, boolean testing) { + this.usersFile = usersFile; + this.usersFilePath = usersFile.getPath(); + this.logger = logger; + this.purgeTime = purgeTime; + this.startingLevel = startingLevel; + this.testing = testing; + + if(!usersFile.exists()) { + initEmptyDB(); + } + + if(!testing) { + List flatFileDataFlags = checkFileHealthAndStructure(); + + if(flatFileDataFlags != null) { + if(flatFileDataFlags.size() > 0) { + logger.info("Detected "+flatFileDataFlags.size() + " data entries which need correction."); + } + } + + updateLeaderboards(); + } + } + + protected FlatFileDatabaseManager(@NotNull String usersFilePath, @NotNull Logger logger, long purgeTime, int startingLevel) { + this(new File(usersFilePath), logger, purgeTime, startingLevel, false); + } + + + public int purgePowerlessUsers() { + int purgedUsers = 0; + + logger.info("Purging powerless users..."); + + BufferedReader in = null; + FileWriter out = null; + + synchronized (fileWritingLock) { + try { + in = new BufferedReader(new FileReader(usersFilePath)); + StringBuilder writer = new StringBuilder(); + String line; + + while ((line = in.readLine()) != null) { + String[] character = line.split(":"); + Map skills = getSkillMapFromLine(character); + + boolean powerless = true; + for (int skill : skills.values()) { + if (skill != 0) { + powerless = false; + break; + } + } + + // If they're still around, rewrite them to the file. + if (!powerless) { + writer.append(line).append("\r\n"); + } + else { + purgedUsers++; + } + } + + // Write the new file + out = new FileWriter(usersFilePath); + out.write(writer.toString()); + } + catch (IOException e) { + logger.severe("Exception while reading " + usersFilePath + " (Are you sure you formatted it correctly?)" + e); + } + finally { + if (in != null) { + try { + in.close(); + } + catch (IOException e) { + // Ignore + } + } + if (out != null) { + try { + out.close(); + } + catch (IOException e) { + // Ignore + } + } + } + } + + logger.info("Purged " + purgedUsers + " users from the database."); + return purgedUsers; + } + + //TODO: Test this + public void purgeOldUsers() { + int removedPlayers = 0; + long currentTime = System.currentTimeMillis(); + + logger.info("Purging old users..."); + + BufferedReader in = null; + FileWriter out = null; + + // This code is O(n) instead of O(n²) + synchronized (fileWritingLock) { + try { + in = new BufferedReader(new FileReader(usersFilePath)); + StringBuilder writer = new StringBuilder(); + String line; + + while ((line = in.readLine()) != null) { + String[] character = line.split(":"); + String name = character[USERNAME_INDEX]; + long lastPlayed = 0; + boolean rewrite = false; + + try { + lastPlayed = Long.parseLong(character[OVERHAUL_LAST_LOGIN]); + } catch (NumberFormatException e) { + e.printStackTrace(); + } + + if (lastPlayed == -1) { + OfflinePlayer player = mcMMO.p.getServer().getOfflinePlayer(name); + + if(player.getLastPlayed() != 0) { + lastPlayed = player.getLastPlayed(); + rewrite = true; + } + } + + if (lastPlayed != -1 && lastPlayed != 0 && currentTime - lastPlayed > purgeTime) { + removedPlayers++; + } else { + if (rewrite) { + // Rewrite their data with a valid time + character[OVERHAUL_LAST_LOGIN] = Long.toString(lastPlayed); + String newLine = org.apache.commons.lang.StringUtils.join(character, ":"); + writer.append(newLine).append("\r\n"); + } else { + writer.append(line).append("\r\n"); + } + } + } + + // Write the new file + out = new FileWriter(usersFilePath); + out.write(writer.toString()); + + if(testing) { + System.out.println(writer.toString()); + } + } + catch (IOException e) { + logger.severe("Exception while reading " + usersFilePath + " (Are you sure you formatted it correctly?)" + e); + } + finally { + if (in != null) { + try { + in.close(); + } + catch (IOException e) { + // Ignore + } + } + if (out != null) { + try { + out.close(); + } + catch (IOException e) { + // Ignore + } + } + } + } + + logger.info("Purged " + removedPlayers + " users from the database."); + } + + public boolean removeUser(String playerName, UUID uuid) { + //NOTE: UUID is unused for FlatFile for this interface implementation + boolean worked = false; + + BufferedReader in = null; + FileWriter out = null; + + synchronized (fileWritingLock) { + try { + in = new BufferedReader(new FileReader(usersFilePath)); + StringBuilder writer = new StringBuilder(); + String line; + + while ((line = in.readLine()) != null) { + // Write out the same file but when we get to the player we want to remove, we skip his line. + if (!worked && line.split(":")[USERNAME_INDEX].equalsIgnoreCase(playerName)) { + logger.info("User found, removing..."); + worked = true; + continue; // Skip the player + } + + writer.append(line).append("\r\n"); + } + + out = new FileWriter(usersFilePath); // Write out the new file + out.write(writer.toString()); + } + catch (Exception e) { + logger.severe("Exception while reading " + usersFilePath + " (Are you sure you formatted it correctly?)" + e); + } + finally { + if (in != null) { + try { + in.close(); + } + catch (IOException e) { + // Ignore + } + } + if (out != null) { + try { + out.close(); + } + catch (IOException e) { + // Ignore + } + } + } + } + + Misc.profileCleanup(playerName); + + return worked; + } + + @Override + public void cleanupUser(UUID uuid) { + //Not used in FlatFile + } + + public boolean saveUser(@NotNull PlayerProfile profile) { + String playerName = profile.getPlayerName(); + UUID uuid = profile.getUniqueId(); + + BufferedReader in = null; + FileWriter out = null; + boolean corruptDataFound = false; + + synchronized (fileWritingLock) { + try { + // Open the file + in = new BufferedReader(new FileReader(usersFilePath)); + StringBuilder writer = new StringBuilder(); + String line; + + boolean wroteUser = false; + // While not at the end of the file + while ((line = in.readLine()) != null) { + if(line.startsWith("#")) { + writer.append(line).append("\r\n"); + continue; + } + + //Check for incomplete or corrupted data + if(!line.contains(":")) { + + if(!corruptDataFound) { + logger.severe("mcMMO found some unexpected or corrupted data in mcmmo.users and is removing it, it is possible some data has been lost."); + corruptDataFound = true; + } + + continue; + } + + String[] splitData = line.split(":"); + + //This would be rare, but check the splitData for having enough entries to contain a UUID + if(splitData.length < UUID_INDEX) { //UUID have been in mcMMO DB for a very long time so any user without + + if(!corruptDataFound) { + logger.severe("mcMMO found some unexpected or corrupted data in mcmmo.users and is removing it, it is possible some data has been lost."); + corruptDataFound = true; + } + + continue; + } + + if (!(uuid != null + && splitData[UUID_INDEX].equalsIgnoreCase(uuid.toString())) + && !splitData[USERNAME_INDEX].equalsIgnoreCase(playerName)) { + writer.append(line).append("\r\n"); //Not the user so write it to file and move on + } else { + //User found + writeUserToLine(profile, writer); + wroteUser = true; + } + } + + /* + * If we couldn't find the user in the DB we need to add him + */ + if(!wroteUser) { + writeUserToLine(profile, writer); + } + + // Write the new file + out = new FileWriter(usersFilePath); + out.write(writer.toString()); + return true; + } + catch (Exception e) { + e.printStackTrace(); + return false; + } + finally { + if (in != null) { + try { + in.close(); + } + catch (IOException e) { + // Ignore + } + } + if (out != null) { + try { + out.close(); + } + catch (IOException e) { + // Ignore + } + } + } + } + } + + public void writeUserToLine(@NotNull PlayerProfile profile, @NotNull Appendable appendable) throws IOException { + appendable.append(profile.getPlayerName()).append(":"); + appendable.append(String.valueOf(profile.getSkillLevel(PrimarySkillType.MINING))).append(":"); + appendable.append(IGNORED).append(":"); + appendable.append(IGNORED).append(":"); + appendable.append(String.valueOf(profile.getSkillXpLevel(PrimarySkillType.MINING))).append(":"); + appendable.append(String.valueOf(profile.getSkillLevel(PrimarySkillType.WOODCUTTING))).append(":"); + appendable.append(String.valueOf(profile.getSkillXpLevel(PrimarySkillType.WOODCUTTING))).append(":"); + appendable.append(String.valueOf(profile.getSkillLevel(PrimarySkillType.REPAIR))).append(":"); + appendable.append(String.valueOf(profile.getSkillLevel(PrimarySkillType.UNARMED))).append(":"); + appendable.append(String.valueOf(profile.getSkillLevel(PrimarySkillType.HERBALISM))).append(":"); + appendable.append(String.valueOf(profile.getSkillLevel(PrimarySkillType.EXCAVATION))).append(":"); + appendable.append(String.valueOf(profile.getSkillLevel(PrimarySkillType.ARCHERY))).append(":"); + appendable.append(String.valueOf(profile.getSkillLevel(PrimarySkillType.SWORDS))).append(":"); + appendable.append(String.valueOf(profile.getSkillLevel(PrimarySkillType.AXES))).append(":"); + appendable.append(String.valueOf(profile.getSkillLevel(PrimarySkillType.ACROBATICS))).append(":"); + appendable.append(String.valueOf(profile.getSkillXpLevel(PrimarySkillType.REPAIR))).append(":"); + appendable.append(String.valueOf(profile.getSkillXpLevel(PrimarySkillType.UNARMED))).append(":"); + appendable.append(String.valueOf(profile.getSkillXpLevel(PrimarySkillType.HERBALISM))).append(":"); + appendable.append(String.valueOf(profile.getSkillXpLevel(PrimarySkillType.EXCAVATION))).append(":"); + appendable.append(String.valueOf(profile.getSkillXpLevel(PrimarySkillType.ARCHERY))).append(":"); + appendable.append(String.valueOf(profile.getSkillXpLevel(PrimarySkillType.SWORDS))).append(":"); + appendable.append(String.valueOf(profile.getSkillXpLevel(PrimarySkillType.AXES))).append(":"); + appendable.append(String.valueOf(profile.getSkillXpLevel(PrimarySkillType.ACROBATICS))).append(":"); + appendable.append(IGNORED).append(":"); + appendable.append(String.valueOf(profile.getSkillLevel(PrimarySkillType.TAMING))).append(":"); + appendable.append(String.valueOf(profile.getSkillXpLevel(PrimarySkillType.TAMING))).append(":"); + appendable.append(String.valueOf(profile.getAbilityDATS(SuperAbilityType.BERSERK))).append(":"); + appendable.append(String.valueOf(profile.getAbilityDATS(SuperAbilityType.GIGA_DRILL_BREAKER))).append(":"); + appendable.append(String.valueOf(profile.getAbilityDATS(SuperAbilityType.TREE_FELLER))).append(":"); + appendable.append(String.valueOf(profile.getAbilityDATS(SuperAbilityType.GREEN_TERRA))).append(":"); + appendable.append(String.valueOf(profile.getAbilityDATS(SuperAbilityType.SERRATED_STRIKES))).append(":"); + appendable.append(String.valueOf(profile.getAbilityDATS(SuperAbilityType.SKULL_SPLITTER))).append(":"); + appendable.append(String.valueOf(profile.getAbilityDATS(SuperAbilityType.SUPER_BREAKER))).append(":"); + appendable.append(IGNORED).append(":"); + appendable.append(String.valueOf(profile.getSkillLevel(PrimarySkillType.FISHING))).append(":"); + appendable.append(String.valueOf(profile.getSkillXpLevel(PrimarySkillType.FISHING))).append(":"); + appendable.append(String.valueOf(profile.getAbilityDATS(SuperAbilityType.BLAST_MINING))).append(":"); + appendable.append(IGNORED).append(":"); //Legacy last login + appendable.append(IGNORED).append(":"); //mob health bar + appendable.append(String.valueOf(profile.getSkillLevel(PrimarySkillType.ALCHEMY))).append(":"); + appendable.append(String.valueOf(profile.getSkillXpLevel(PrimarySkillType.ALCHEMY))).append(":"); + appendable.append(profile.getUniqueId() != null ? profile.getUniqueId().toString() : "NULL").append(":"); + appendable.append(String.valueOf(profile.getScoreboardTipsShown())).append(":"); + appendable.append(String.valueOf(profile.getUniqueData(UniqueDataType.CHIMAERA_WING_DATS))).append(":"); + appendable.append(String.valueOf(profile.getLastLogin())).append(":"); //overhaul last login + appendable.append("\r\n"); + } + + public @NotNull List readLeaderboard(@Nullable PrimarySkillType primarySkillType, int pageNumber, int statsPerPage) throws InvalidSkillException { + //Fix for a plugin that people are using that is throwing SQL errors + if(primarySkillType != null && SkillTools.isChildSkill(primarySkillType)) { + logger.severe("A plugin hooking into mcMMO is being naughty with our database commands, update all plugins that hook into mcMMO and contact their devs!"); + throw new InvalidSkillException("A plugin hooking into mcMMO that you are using is attempting to read leaderboard skills for child skills, child skills do not have leaderboards! This is NOT an mcMMO error!"); + } + + updateLeaderboards(); + List statsList = primarySkillType == null ? powerLevels : playerStatHash.get(primarySkillType); + int fromIndex = (Math.max(pageNumber, 1) - 1) * statsPerPage; + + return statsList.subList(Math.min(fromIndex, statsList.size()), Math.min(fromIndex + statsPerPage, statsList.size())); + } + + public @NotNull HashMap readRank(String playerName) { + updateLeaderboards(); + + HashMap skills = new HashMap<>(); + + for (PrimarySkillType skill : SkillTools.NON_CHILD_SKILLS) { + skills.put(skill, getPlayerRank(playerName, playerStatHash.get(skill))); + } + + //TODO: Gross + skills.put(null, getPlayerRank(playerName, powerLevels)); + + return skills; + } + + public @NotNull PlayerProfile newUser(@NotNull Player player) { + return new PlayerProfile(player.getName(), player.getUniqueId(), true, startingLevel); + } + + public @NotNull PlayerProfile newUser(@NotNull String playerName, @NotNull UUID uuid) { + PlayerProfile playerProfile = new PlayerProfile(playerName, uuid, true, startingLevel); + + synchronized (fileWritingLock) { + try(BufferedReader bufferedReader = new BufferedReader(new FileReader(usersFilePath))) { + StringBuilder stringBuilder = new StringBuilder(); + + String line; + + //Build up the file + while((line = bufferedReader.readLine()) != null) { + stringBuilder.append(line).append("\r\n"); + } + + try (FileWriter fileWriter = new FileWriter(usersFile)) { + writeUserToLine(playerProfile, stringBuilder); + fileWriter.write(stringBuilder.toString()); + } catch (Exception e) { + e.printStackTrace(); + } + } catch (IOException e) { + e.printStackTrace(); + } + } + + return playerProfile; + } + + public @NotNull PlayerProfile loadPlayerProfile(@NotNull OfflinePlayer offlinePlayer) { + return processUserQuery(getUserQuery(offlinePlayer.getUniqueId(), offlinePlayer.getName())); + } + + public @NotNull PlayerProfile loadPlayerProfile(@NotNull String playerName) { + return processUserQuery(getUserQuery(null, playerName)); + } + + public @NotNull PlayerProfile loadPlayerProfile(@NotNull UUID uuid) { + return processUserQuery(getUserQuery(uuid, null)); + } + + private @NotNull UserQuery getUserQuery(@Nullable UUID uuid, @Nullable String playerName) throws NullPointerException { + boolean hasName = playerName != null && !playerName.equalsIgnoreCase("null"); + + if(hasName && uuid != null) { + return new UserQueryFull(playerName, uuid); + } else if (uuid != null) { + return new UserQueryUUIDImpl(uuid); + } else if(hasName) { + return new UserQueryNameImpl(playerName); + } else { + throw new NullPointerException("Both name and UUID cannot be null, at least one must be non-null!"); + } + } + + /** + * Find and load a player by UUID/Name + * If the name isn't null and doesn't match the name in the DB, the players name is then replaced/updated + * + * @param userQuery the query + * @return a profile with the targets data or an unloaded profile if no data was found + */ + private @NotNull PlayerProfile processUserQuery(@NotNull UserQuery userQuery) throws RuntimeException { + switch(userQuery.getType()) { + case UUID_AND_NAME: + return queryByUUIDAndName((UserQueryFull) userQuery); + case UUID: + return queryByUUID((UserQueryUUID) userQuery); + case NAME: + return queryByName((UserQueryNameImpl) userQuery); + default: + throw new RuntimeException("No case for this UserQueryType!"); + } + } + + private @NotNull PlayerProfile queryByName(@NotNull UserQueryName userQuery) { + String playerName = userQuery.getName(); + BufferedReader in = null; + + synchronized (fileWritingLock) { + try { + // Open the user file + in = new BufferedReader(new FileReader(usersFilePath)); + String line; + + + while ((line = in.readLine()) != null) { + if(line.startsWith("#")) { + continue; + } + + + // Find if the line contains the player we want. + String[] rawSplitData = line.split(":"); + + + /* Don't read corrupt data */ + if(rawSplitData.length < (USERNAME_INDEX + 1)) { + continue; + } + + + //If we couldn't find anyone + if(playerName.equalsIgnoreCase(rawSplitData[USERNAME_INDEX])) { + return loadFromLine(rawSplitData); + } + } + } catch (Exception e) { + e.printStackTrace(); + } finally { + // I have no idea why it's necessary to inline tryClose() here, but it removes + // a resource leak warning, and I'm trusting the compiler on this one. + if (in != null) { + try { + in.close(); + } catch (IOException e) { + // Ignore + } + } + } + } + + + //Return a new blank profile + return new PlayerProfile(playerName, new UUID(0, 0), startingLevel); + } + + private @NotNull PlayerProfile queryByUUID(@NotNull UserQueryUUID userQuery) { + BufferedReader in = null; + UUID uuid = userQuery.getUUID(); + + synchronized (fileWritingLock) { + try { + // Open the user file + in = new BufferedReader(new FileReader(usersFilePath)); + String line; + + while ((line = in.readLine()) != null) { + if(line.startsWith("#")) { + continue; + } + // Find if the line contains the player we want. + String[] rawSplitData = line.split(":"); + + /* Don't read corrupt data */ + if(rawSplitData.length < (UUID_INDEX + 1)) { + continue; + } + + try { + UUID fromDataUUID = UUID.fromString(rawSplitData[UUID_INDEX]); + if(fromDataUUID.equals(uuid)) { + return loadFromLine(rawSplitData); + } + } catch (Exception e) { + if(testing) { + e.printStackTrace(); + } + } + } + } catch (Exception e) { + e.printStackTrace(); + } finally { + // I have no idea why it's necessary to inline tryClose() here, but it removes + // a resource leak warning, and I'm trusting the compiler on this one. + if (in != null) { + try { + in.close(); + } catch (IOException e) { + // Ignore + } + } + } + } + + /* + * No match was found in the file + */ + + return grabUnloadedProfile(uuid, "Player-Not-Found="+uuid.toString()); + } + + private @NotNull PlayerProfile queryByUUIDAndName(@NotNull UserQueryFull userQuery) { + BufferedReader in = null; + String playerName = userQuery.getName(); + UUID uuid = userQuery.getUUID(); + + synchronized (fileWritingLock) { + try { + // Open the user file + in = new BufferedReader(new FileReader(usersFilePath)); + String line; + + while ((line = in.readLine()) != null) { + if(line.startsWith("#")) { + continue; + } + // Find if the line contains the player we want. + String[] rawSplitData = line.split(":"); + + /* Don't read corrupt data */ + if(rawSplitData.length < (UUID_INDEX + 1)) { + continue; + } + + try { + UUID fromDataUUID = UUID.fromString(rawSplitData[UUID_INDEX]); + if(fromDataUUID.equals(uuid)) { + //Matched UUID, now check if name matches + String dbPlayerName = rawSplitData[USERNAME_INDEX]; + + boolean matchingName = dbPlayerName.equalsIgnoreCase(playerName); + + if (!matchingName) { + logger.info("When loading user: "+playerName +" with UUID of (" + uuid.toString() + +") we found a mismatched name, the name in the DB will be replaced (DB name: "+dbPlayerName+")"); + //logger.info("Name updated for player: " + rawSplitData[USERNAME_INDEX] + " => " + playerName); + rawSplitData[USERNAME_INDEX] = playerName; + } + + //TODO: Logic to replace name here + return loadFromLine(rawSplitData); + } + } catch (Exception e) { + if(testing) { + e.printStackTrace(); + } + } + } + } catch (Exception e) { + e.printStackTrace(); + } finally { + // I have no idea why it's necessary to inline tryClose() here, but it removes + // a resource leak warning, and I'm trusting the compiler on this one. + if (in != null) { + try { + in.close(); + } catch (IOException e) { + // Ignore + } + } + } + } + + /* + * No match was found in the file + */ + + return grabUnloadedProfile(uuid, playerName); //Create an empty new profile and return + } + + private @NotNull PlayerProfile grabUnloadedProfile(@NotNull UUID uuid, @Nullable String playerName) { + if(playerName == null) { + playerName = ""; //No name for you boy! + } + + return new PlayerProfile(playerName, uuid, 0); + } + + public void convertUsers(DatabaseManager destination) { + BufferedReader in = null; + int convertedUsers = 0; + long startMillis = System.currentTimeMillis(); + + synchronized (fileWritingLock) { + try { + // Open the user file + in = new BufferedReader(new FileReader(usersFilePath)); + String line; + + while ((line = in.readLine()) != null) { + if(line.startsWith("#")) { + continue; + } + + String[] character = line.split(":"); + + try { + destination.saveUser(loadFromLine(character)); + } catch (Exception e) { + e.printStackTrace(); + } + convertedUsers++; + Misc.printProgress(convertedUsers, progressInterval, startMillis); + } + } + catch (Exception e) { + e.printStackTrace(); + } + finally { + if (in != null) { + try { + in.close(); + } + catch (IOException e) { + // Ignore + } + } + } + } + } + + public boolean saveUserUUID(String userName, UUID uuid) { + boolean worked = false; + + int i = 0; + BufferedReader in = null; + FileWriter out = null; + + synchronized (fileWritingLock) { + try { + in = new BufferedReader(new FileReader(usersFilePath)); + StringBuilder writer = new StringBuilder(); + String line; + + while ((line = in.readLine()) != null) { + String[] character = line.split(":"); + if (!worked && character[USERNAME_INDEX].equalsIgnoreCase(userName)) { + if (character.length < 42) { + logger.severe("Could not update UUID for " + userName + "!"); + logger.severe("Database entry is invalid."); + continue; + } + + line = line.replace(character[UUID_INDEX], uuid.toString()); + worked = true; + } + + i++; + writer.append(line).append("\r\n"); + } + + out = new FileWriter(usersFilePath); // Write out the new file + out.write(writer.toString()); + } + catch (Exception e) { + logger.severe("Exception while reading " + usersFilePath + " (Are you sure you formatted it correctly?)" + e); + } + finally { + logger.info(i + " entries written while saving UUID for " + userName); + if (in != null) { + try { + in.close(); + } + catch (IOException e) { + // Ignore + } + } + if (out != null) { + try { + out.close(); + } + catch (IOException e) { + // Ignore + } + } + } + } + + return worked; + } + + public boolean saveUserUUIDs(Map fetchedUUIDs) { + BufferedReader in = null; + FileWriter out = null; + int i = 0; + + synchronized (fileWritingLock) { + try { + in = new BufferedReader(new FileReader(usersFilePath)); + StringBuilder writer = new StringBuilder(); + String line; + + while (((line = in.readLine()) != null)) { + String[] character = line.split(":"); + if (!fetchedUUIDs.isEmpty() && fetchedUUIDs.containsKey(character[USERNAME_INDEX])) { + if (character.length < 42) { + logger.severe("Could not update UUID for " + character[USERNAME_INDEX] + "!"); + logger.severe("Database entry is invalid."); + continue; + } + + character[UUID_INDEX] = fetchedUUIDs.remove(character[USERNAME_INDEX]).toString(); + line = org.apache.commons.lang.StringUtils.join(character, ":") + ":"; + } + + i++; + writer.append(line).append("\r\n"); + } + + out = new FileWriter(usersFilePath); // Write out the new file + out.write(writer.toString()); + } + catch (Exception e) { + logger.severe("Exception while reading " + usersFilePath + " (Are you sure you formatted it correctly?)" + e); + } + finally { + logger.info(i + " entries written while saving UUID batch"); + if (in != null) { + try { + in.close(); + } + catch (IOException e) { + // Ignore + } + } + if (out != null) { + try { + out.close(); + } + catch (IOException e) { + // Ignore + } + } + } + } + + return true; + } + + public List getStoredUsers() { + ArrayList users = new ArrayList<>(); + BufferedReader in = null; + + synchronized (fileWritingLock) { + try { + // Open the user file + in = new BufferedReader(new FileReader(usersFilePath)); + String line; + + while ((line = in.readLine()) != null) { + String[] character = line.split(":"); + users.add(character[USERNAME_INDEX]); + } + } + catch (Exception e) { + e.printStackTrace(); + } + finally { + if (in != null) { + try { + in.close(); + } + catch (IOException e) { + // Ignore + } + } + } + } + return users; + } + + /** + * Update the leader boards. + */ + public @NotNull LeaderboardStatus updateLeaderboards() { + // Only update FFS leaderboards every 10 minutes.. this puts a lot of strain on the server (depending on the size of the database) and should not be done frequently + if (System.currentTimeMillis() < lastUpdate + UPDATE_WAIT_TIME) { + return LeaderboardStatus.TOO_SOON_TO_UPDATE; + } + + lastUpdate = System.currentTimeMillis(); // Log when the last update was run + powerLevels.clear(); // Clear old values from the power levels + + // Initialize lists + List mining = new ArrayList<>(); + List woodcutting = new ArrayList<>(); + List herbalism = new ArrayList<>(); + List excavation = new ArrayList<>(); + List acrobatics = new ArrayList<>(); + List repair = new ArrayList<>(); + List swords = new ArrayList<>(); + List axes = new ArrayList<>(); + List archery = new ArrayList<>(); + List unarmed = new ArrayList<>(); + List taming = new ArrayList<>(); + List fishing = new ArrayList<>(); + List alchemy = new ArrayList<>(); + + BufferedReader in = null; + String playerName = null; + // Read from the FlatFile database and fill our arrays with information + synchronized (fileWritingLock) { + try { + in = new BufferedReader(new FileReader(usersFilePath)); + String line; + + while ((line = in.readLine()) != null) { + + if(line.startsWith("#")) + continue; + + String[] data = line.split(":"); + playerName = data[USERNAME_INDEX]; + int powerLevel = 0; + + Map skills = getSkillMapFromLine(data); + + powerLevel += putStat(acrobatics, playerName, skills.get(PrimarySkillType.ACROBATICS)); + powerLevel += putStat(alchemy, playerName, skills.get(PrimarySkillType.ALCHEMY)); + powerLevel += putStat(archery, playerName, skills.get(PrimarySkillType.ARCHERY)); + powerLevel += putStat(axes, playerName, skills.get(PrimarySkillType.AXES)); + powerLevel += putStat(excavation, playerName, skills.get(PrimarySkillType.EXCAVATION)); + powerLevel += putStat(fishing, playerName, skills.get(PrimarySkillType.FISHING)); + powerLevel += putStat(herbalism, playerName, skills.get(PrimarySkillType.HERBALISM)); + powerLevel += putStat(mining, playerName, skills.get(PrimarySkillType.MINING)); + powerLevel += putStat(repair, playerName, skills.get(PrimarySkillType.REPAIR)); + powerLevel += putStat(swords, playerName, skills.get(PrimarySkillType.SWORDS)); + powerLevel += putStat(taming, playerName, skills.get(PrimarySkillType.TAMING)); + powerLevel += putStat(unarmed, playerName, skills.get(PrimarySkillType.UNARMED)); + powerLevel += putStat(woodcutting, playerName, skills.get(PrimarySkillType.WOODCUTTING)); + + putStat(powerLevels, playerName, powerLevel); + } + } + catch (Exception e) { + logger.severe("Exception while reading " + usersFilePath + " during user " + playerName + " (Are you sure you formatted it correctly?) " + e); + return LeaderboardStatus.FAILED; + } finally { + if (in != null) { + try { + in.close(); + } + catch (IOException e) { + // Ignore + } + } + } + + } + + SkillComparator c = new SkillComparator(); + + mining.sort(c); + woodcutting.sort(c); + repair.sort(c); + unarmed.sort(c); + herbalism.sort(c); + excavation.sort(c); + archery.sort(c); + swords.sort(c); + axes.sort(c); + acrobatics.sort(c); + taming.sort(c); + fishing.sort(c); + alchemy.sort(c); + powerLevels.sort(c); + + playerStatHash.put(PrimarySkillType.MINING, mining); + playerStatHash.put(PrimarySkillType.WOODCUTTING, woodcutting); + playerStatHash.put(PrimarySkillType.REPAIR, repair); + playerStatHash.put(PrimarySkillType.UNARMED, unarmed); + playerStatHash.put(PrimarySkillType.HERBALISM, herbalism); + playerStatHash.put(PrimarySkillType.EXCAVATION, excavation); + playerStatHash.put(PrimarySkillType.ARCHERY, archery); + playerStatHash.put(PrimarySkillType.SWORDS, swords); + playerStatHash.put(PrimarySkillType.AXES, axes); + playerStatHash.put(PrimarySkillType.ACROBATICS, acrobatics); + playerStatHash.put(PrimarySkillType.TAMING, taming); + playerStatHash.put(PrimarySkillType.FISHING, fishing); + playerStatHash.put(PrimarySkillType.ALCHEMY, alchemy); + + return LeaderboardStatus.UPDATED; + } + + private void initEmptyDB() { + BufferedWriter bufferedWriter = null; + synchronized (fileWritingLock) { + try { + // Open the file to write the player + bufferedWriter = new BufferedWriter(new FileWriter(usersFilePath, true)); + DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("MM/dd/yyyy HH:mm"); + LocalDateTime localDateTime = LocalDateTime.now(); + bufferedWriter.append("# mcMMO Database created on ").append(localDateTime.format(dateTimeFormatter)).append("\r\n"); //Empty file + } catch (Exception e) { + e.printStackTrace(); + } finally { + if (bufferedWriter != null) { + try { + bufferedWriter.close(); + } + catch (IOException e) { + // Ignore + } + } + } + } + } + + public @Nullable List checkFileHealthAndStructure() { + ArrayList flagsFound = null; + logger.info("(" + usersFile.getPath() + ") Validating database file.."); + FlatFileDataProcessor dataProcessor = null; + + if (usersFile.exists()) { + BufferedReader bufferedReader = null; + FileWriter fileWriter = null; + + synchronized (fileWritingLock) { + + dataProcessor = new FlatFileDataProcessor(logger); + + try { + String currentLine; + String dbCommentDate = null; + + bufferedReader = new BufferedReader(new FileReader(usersFilePath)); + + //Analyze the data + while ((currentLine = bufferedReader.readLine()) != null) { + //Commented lines + if(currentLine.startsWith("#") && dbCommentDate == null) { //The first commented line in the file is likely to be our note about when the file was created + dbCommentDate = currentLine; + continue; + } + + if(currentLine.isEmpty()) + continue; + + //TODO: We are never passing empty lines, should we remove the flag for them? + dataProcessor.processData(currentLine); + } + + //Only update the file if needed + if(dataProcessor.getFlatFileDataFlags().size() > 0) { + flagsFound = new ArrayList<>(dataProcessor.getFlatFileDataFlags()); + logger.info("Saving the updated and or repaired FlatFile Database..."); + fileWriter = new FileWriter(usersFilePath); + //Write data to file + if(dbCommentDate != null) + fileWriter.write(dbCommentDate + "\r\n"); + + fileWriter.write(dataProcessor.processDataForSave().toString()); + } + } catch (IOException e) { + e.printStackTrace(); + } finally { + closeResources(bufferedReader, fileWriter); + } + } + } + + if(flagsFound == null || flagsFound.size() == 0) { + return null; + } else { + return flagsFound; + } + } + + private void closeResources(BufferedReader bufferedReader, FileWriter fileWriter) { + if(bufferedReader != null) { + try { + bufferedReader.close(); + } + catch (IOException e) { + e.printStackTrace(); + } + } + + if (fileWriter != null) { + try { + fileWriter.close(); + } + catch (IOException e) { + e.printStackTrace(); + } + } + } + + private Integer getPlayerRank(String playerName, List statsList) { + if (statsList == null) { + return null; + } + + int currentPos = 1; + + for (PlayerStat stat : statsList) { + if (stat.name.equalsIgnoreCase(playerName)) { + return currentPos; + } + + currentPos++; + } + + return null; + } + + private int putStat(List statList, String playerName, int statValue) { + statList.add(new PlayerStat(playerName, statValue)); + return statValue; + } + + private static class SkillComparator implements Comparator { + @Override + public int compare(PlayerStat o1, PlayerStat o2) { + return (o2.statVal - o1.statVal); + } + } + + private PlayerProfile loadFromLine(@NotNull String[] character) { + Map skills = getSkillMapFromLine(character); // Skill levels + Map skillsXp = new EnumMap<>(PrimarySkillType.class); // Skill & XP + Map skillsDATS = new EnumMap<>(SuperAbilityType.class); // Ability & Cooldown + Map uniquePlayerDataMap = new EnumMap<>(UniqueDataType.class); + int scoreboardTipsShown; + long lastLogin; + + String username = character[USERNAME_INDEX]; + + tryLoadSkillFloatValuesFromRawData(skillsXp, character, PrimarySkillType.TAMING, EXP_TAMING, username); + tryLoadSkillFloatValuesFromRawData(skillsXp, character, PrimarySkillType.MINING, EXP_MINING, username); + tryLoadSkillFloatValuesFromRawData(skillsXp, character, PrimarySkillType.REPAIR, EXP_REPAIR, username); + tryLoadSkillFloatValuesFromRawData(skillsXp, character, PrimarySkillType.WOODCUTTING, EXP_WOODCUTTING, username); + tryLoadSkillFloatValuesFromRawData(skillsXp, character, PrimarySkillType.UNARMED, EXP_UNARMED, username); + tryLoadSkillFloatValuesFromRawData(skillsXp, character, PrimarySkillType.HERBALISM, EXP_HERBALISM, username); + tryLoadSkillFloatValuesFromRawData(skillsXp, character, PrimarySkillType.EXCAVATION, EXP_EXCAVATION, username); + tryLoadSkillFloatValuesFromRawData(skillsXp, character, PrimarySkillType.ARCHERY, EXP_ARCHERY, username); + tryLoadSkillFloatValuesFromRawData(skillsXp, character, PrimarySkillType.SWORDS, EXP_SWORDS, username); + tryLoadSkillFloatValuesFromRawData(skillsXp, character, PrimarySkillType.AXES, EXP_AXES, username); + tryLoadSkillFloatValuesFromRawData(skillsXp, character, PrimarySkillType.ACROBATICS, EXP_ACROBATICS, username); + tryLoadSkillFloatValuesFromRawData(skillsXp, character, PrimarySkillType.FISHING, EXP_FISHING, username); + tryLoadSkillFloatValuesFromRawData(skillsXp, character, PrimarySkillType.ALCHEMY, EXP_ALCHEMY, username); + + // Taming - Unused + tryLoadSkillCooldownFromRawData(skillsDATS, character, SuperAbilityType.SUPER_BREAKER, COOLDOWN_SUPER_BREAKER, username); + // Repair - Unused + tryLoadSkillCooldownFromRawData(skillsDATS, character, SuperAbilityType.TREE_FELLER, COOLDOWN_TREE_FELLER, username); + tryLoadSkillCooldownFromRawData(skillsDATS, character, SuperAbilityType.BERSERK, COOLDOWN_BERSERK, username); + tryLoadSkillCooldownFromRawData(skillsDATS, character, SuperAbilityType.GREEN_TERRA, COOLDOWN_GREEN_TERRA, username); + tryLoadSkillCooldownFromRawData(skillsDATS, character, SuperAbilityType.GIGA_DRILL_BREAKER, COOLDOWN_GIGA_DRILL_BREAKER, username); + // Archery - Unused + tryLoadSkillCooldownFromRawData(skillsDATS, character, SuperAbilityType.SERRATED_STRIKES, COOLDOWN_SERRATED_STRIKES, username); + tryLoadSkillCooldownFromRawData(skillsDATS, character, SuperAbilityType.SKULL_SPLITTER, COOLDOWN_SKULL_SPLITTER, username); + // Acrobatics - Unused + tryLoadSkillCooldownFromRawData(skillsDATS, character, SuperAbilityType.BLAST_MINING, COOLDOWN_BLAST_MINING, username); + + UUID uuid; + try { + uuid = UUID.fromString(character[UUID_INDEX]); + } + catch (Exception e) { + uuid = null; + } + + try { + scoreboardTipsShown = Integer.parseInt(character[SCOREBOARD_TIPS]); + } + catch (Exception e) { + scoreboardTipsShown = 0; + } + + try { + uniquePlayerDataMap.put(UniqueDataType.CHIMAERA_WING_DATS, Integer.valueOf(character[COOLDOWN_CHIMAERA_WING])); + } + catch (Exception e) { + uniquePlayerDataMap.put(UniqueDataType.CHIMAERA_WING_DATS, 0); + } + + try { + lastLogin = Long.parseLong(character[OVERHAUL_LAST_LOGIN]); + } catch (Exception e) { + lastLogin = -1; + } + + return new PlayerProfile(username, uuid, skills, skillsXp, skillsDATS, scoreboardTipsShown, uniquePlayerDataMap, lastLogin); + } + + private void tryLoadSkillCooldownFromRawData(@NotNull Map cooldownMap, @NotNull String[] character, @NotNull SuperAbilityType superAbilityType, int cooldownSuperBreaker, @NotNull String userName) { + try { + cooldownMap.put(superAbilityType, Integer.valueOf(character[cooldownSuperBreaker])); + } catch (NumberFormatException e) { + logger.severe("Data corruption when trying to load the value for skill "+superAbilityType+" for player named " + userName+ " setting value to zero"); + e.printStackTrace(); + } + } + + private void tryLoadSkillFloatValuesFromRawData(@NotNull Map skillMap, @NotNull String[] character, @NotNull PrimarySkillType primarySkillType, int index, @NotNull String userName) { + try { + float valueFromString = Integer.parseInt(character[index]); + skillMap.put(primarySkillType, valueFromString); + } catch (NumberFormatException e) { + skillMap.put(primarySkillType, 0F); + logger.severe("Data corruption when trying to load the value for skill "+primarySkillType+" for player named " + userName+ " setting value to zero"); + e.printStackTrace(); + } + } + + private void tryLoadSkillIntValuesFromRawData(@NotNull Map skillMap, @NotNull String[] character, @NotNull PrimarySkillType primarySkillType, int index, @NotNull String userName) { + try { + int valueFromString = Integer.parseInt(character[index]); + skillMap.put(primarySkillType, valueFromString); + } catch (NumberFormatException e) { + skillMap.put(primarySkillType, 0); + logger.severe("Data corruption when trying to load the value for skill "+primarySkillType+" for player named " + userName+ " setting value to zero"); + e.printStackTrace(); + } + } + + private @NotNull Map getSkillMapFromLine(@NotNull String[] character) { + EnumMap skills = new EnumMap<>(PrimarySkillType.class); // Skill & Level + String username = character[USERNAME_INDEX]; + + tryLoadSkillIntValuesFromRawData(skills, character, PrimarySkillType.ACROBATICS, SKILLS_ACROBATICS, username); + tryLoadSkillIntValuesFromRawData(skills, character, PrimarySkillType.TAMING, SKILLS_TAMING, username); + tryLoadSkillIntValuesFromRawData(skills, character, PrimarySkillType.MINING, SKILLS_MINING, username); + tryLoadSkillIntValuesFromRawData(skills, character, PrimarySkillType.REPAIR, SKILLS_REPAIR, username); + tryLoadSkillIntValuesFromRawData(skills, character, PrimarySkillType.WOODCUTTING, SKILLS_WOODCUTTING, username); + tryLoadSkillIntValuesFromRawData(skills, character, PrimarySkillType.UNARMED, SKILLS_UNARMED, username); + tryLoadSkillIntValuesFromRawData(skills, character, PrimarySkillType.HERBALISM, SKILLS_HERBALISM, username); + tryLoadSkillIntValuesFromRawData(skills, character, PrimarySkillType.EXCAVATION, SKILLS_EXCAVATION, username); + tryLoadSkillIntValuesFromRawData(skills, character, PrimarySkillType.ARCHERY, SKILLS_ARCHERY, username); + tryLoadSkillIntValuesFromRawData(skills, character, PrimarySkillType.SWORDS, SKILLS_SWORDS, username); + tryLoadSkillIntValuesFromRawData(skills, character, PrimarySkillType.AXES, SKILLS_AXES, username); + tryLoadSkillIntValuesFromRawData(skills, character, PrimarySkillType.FISHING, SKILLS_FISHING, username); + tryLoadSkillIntValuesFromRawData(skills, character, PrimarySkillType.ALCHEMY, SKILLS_ALCHEMY, username); + + return skills; + } + + public DatabaseType getDatabaseType() { + return DatabaseType.FLATFILE; + } + + public @NotNull File getUsersFile() { + return usersFile; + } + + @Override + public void onDisable() { } +} diff --git a/src/main/java/com/gmail/nossr50/database/FlatfileDatabaseManager.java b/src/main/java/com/gmail/nossr50/database/FlatfileDatabaseManager.java deleted file mode 100644 index c9e305a14..000000000 --- a/src/main/java/com/gmail/nossr50/database/FlatfileDatabaseManager.java +++ /dev/null @@ -1,1363 +0,0 @@ -package com.gmail.nossr50.database; - -import com.gmail.nossr50.config.AdvancedConfig; -import com.gmail.nossr50.config.Config; -import com.gmail.nossr50.datatypes.MobHealthbarType; -import com.gmail.nossr50.datatypes.database.DatabaseType; -import com.gmail.nossr50.datatypes.database.PlayerStat; -import com.gmail.nossr50.datatypes.database.UpgradeType; -import com.gmail.nossr50.datatypes.player.PlayerProfile; -import com.gmail.nossr50.datatypes.player.UniqueDataType; -import com.gmail.nossr50.datatypes.skills.PrimarySkillType; -import com.gmail.nossr50.datatypes.skills.SuperAbilityType; -import com.gmail.nossr50.mcMMO; -import com.gmail.nossr50.runnables.database.UUIDUpdateAsyncTask; -import com.gmail.nossr50.util.Misc; -import com.gmail.nossr50.util.StringUtils; -import org.bukkit.OfflinePlayer; - -import java.io.*; -import java.util.*; - -public final class FlatfileDatabaseManager implements DatabaseManager { - private final HashMap> playerStatHash = new HashMap>(); - private final List powerLevels = new ArrayList(); - private long lastUpdate = 0; - - private final long UPDATE_WAIT_TIME = 600000L; // 10 minutes - private final File usersFile; - private static final Object fileWritingLock = new Object(); - - protected FlatfileDatabaseManager() { - usersFile = new File(mcMMO.getUsersFilePath()); - checkStructure(); - updateLeaderboards(); - - if (mcMMO.getUpgradeManager().shouldUpgrade(UpgradeType.ADD_UUIDS)) { - new UUIDUpdateAsyncTask(mcMMO.p, getStoredUsers()).runTaskAsynchronously(mcMMO.p); - } - } - - public void purgePowerlessUsers() { - int purgedUsers = 0; - - mcMMO.p.getLogger().info("Purging powerless users..."); - - BufferedReader in = null; - FileWriter out = null; - String usersFilePath = mcMMO.getUsersFilePath(); - - // This code is O(n) instead of O(n²) - synchronized (fileWritingLock) { - try { - in = new BufferedReader(new FileReader(usersFilePath)); - StringBuilder writer = new StringBuilder(); - String line; - - while ((line = in.readLine()) != null) { - String[] character = line.split(":"); - Map skills = getSkillMapFromLine(character); - - boolean powerless = true; - for (int skill : skills.values()) { - if (skill != 0) { - powerless = false; - break; - } - } - - // If they're still around, rewrite them to the file. - if (!powerless) { - writer.append(line).append("\r\n"); - } - else { - purgedUsers++; - } - } - - // Write the new file - out = new FileWriter(usersFilePath); - out.write(writer.toString()); - } - catch (IOException e) { - mcMMO.p.getLogger().severe("Exception while reading " + usersFilePath + " (Are you sure you formatted it correctly?)" + e.toString()); - } - finally { - if (in != null) { - try { - in.close(); - } - catch (IOException e) { - // Ignore - } - } - if (out != null) { - try { - out.close(); - } - catch (IOException e) { - // Ignore - } - } - } - } - - mcMMO.p.getLogger().info("Purged " + purgedUsers + " users from the database."); - } - - public void purgeOldUsers() { - int removedPlayers = 0; - long currentTime = System.currentTimeMillis(); - - mcMMO.p.getLogger().info("Purging old users..."); - - BufferedReader in = null; - FileWriter out = null; - String usersFilePath = mcMMO.getUsersFilePath(); - - // This code is O(n) instead of O(n²) - synchronized (fileWritingLock) { - try { - in = new BufferedReader(new FileReader(usersFilePath)); - StringBuilder writer = new StringBuilder(); - String line; - - while ((line = in.readLine()) != null) { - String[] character = line.split(":"); - String name = character[USERNAME]; - long lastPlayed = 0; - boolean rewrite = false; - try { - lastPlayed = Long.parseLong(character[37]) * Misc.TIME_CONVERSION_FACTOR; - } - catch (NumberFormatException e) { - e.printStackTrace(); - } - if (lastPlayed == 0) { - OfflinePlayer player = mcMMO.p.getServer().getOfflinePlayer(name); - lastPlayed = player.getLastPlayed(); - rewrite = true; - } - - if (currentTime - lastPlayed > PURGE_TIME) { - removedPlayers++; - } - else { - if (rewrite) { - // Rewrite their data with a valid time - character[37] = Long.toString(lastPlayed); - String newLine = org.apache.commons.lang.StringUtils.join(character, ":"); - writer.append(newLine).append("\r\n"); - } - else { - writer.append(line).append("\r\n"); - } - } - } - - // Write the new file - out = new FileWriter(usersFilePath); - out.write(writer.toString()); - } - catch (IOException e) { - mcMMO.p.getLogger().severe("Exception while reading " + usersFilePath + " (Are you sure you formatted it correctly?)" + e.toString()); - } - finally { - if (in != null) { - try { - in.close(); - } - catch (IOException e) { - // Ignore - } - } - if (out != null) { - try { - out.close(); - } - catch (IOException e) { - // Ignore - } - } - } - } - - mcMMO.p.getLogger().info("Purged " + removedPlayers + " users from the database."); - } - - public boolean removeUser(String playerName, UUID uuid) { - //NOTE: UUID is unused for FlatFile for this interface implementation - boolean worked = false; - - BufferedReader in = null; - FileWriter out = null; - String usersFilePath = mcMMO.getUsersFilePath(); - - synchronized (fileWritingLock) { - try { - in = new BufferedReader(new FileReader(usersFilePath)); - StringBuilder writer = new StringBuilder(); - String line; - - while ((line = in.readLine()) != null) { - // Write out the same file but when we get to the player we want to remove, we skip his line. - if (!worked && line.split(":")[USERNAME].equalsIgnoreCase(playerName)) { - mcMMO.p.getLogger().info("User found, removing..."); - worked = true; - continue; // Skip the player - } - - writer.append(line).append("\r\n"); - } - - out = new FileWriter(usersFilePath); // Write out the new file - out.write(writer.toString()); - } - catch (Exception e) { - mcMMO.p.getLogger().severe("Exception while reading " + usersFilePath + " (Are you sure you formatted it correctly?)" + e.toString()); - } - finally { - if (in != null) { - try { - in.close(); - } - catch (IOException e) { - // Ignore - } - } - if (out != null) { - try { - out.close(); - } - catch (IOException e) { - // Ignore - } - } - } - } - - Misc.profileCleanup(playerName); - - return worked; - } - - @Override - public void cleanupUser(UUID uuid) { - //Not used in FlatFile - } - - public boolean saveUser(PlayerProfile profile) { - String playerName = profile.getPlayerName(); - UUID uuid = profile.getUniqueId(); - - BufferedReader in = null; - FileWriter out = null; - String usersFilePath = mcMMO.getUsersFilePath(); - - synchronized (fileWritingLock) { - try { - // Open the file - in = new BufferedReader(new FileReader(usersFilePath)); - StringBuilder writer = new StringBuilder(); - String line; - - boolean wroteUser = false; - // While not at the end of the file - while ((line = in.readLine()) != null) { - // Read the line in and copy it to the output if it's not the player we want to edit - String[] character = line.split(":"); - if (!(uuid != null && character[UUID_INDEX].equalsIgnoreCase(uuid.toString())) && !character[USERNAME].equalsIgnoreCase(playerName)) { - writer.append(line).append("\r\n"); - } - else { - // Otherwise write the new player information - writeUserToLine(profile, playerName, uuid, writer); - wroteUser = true; - } - } - - /* - * If we couldn't find the user in the DB we need to add him - */ - if(!wroteUser) - { - writeUserToLine(profile, playerName, uuid, writer); - } - - // Write the new file - out = new FileWriter(usersFilePath); - out.write(writer.toString()); - return true; - } - catch (Exception e) { - e.printStackTrace(); - return false; - } - finally { - if (in != null) { - try { - in.close(); - } - catch (IOException e) { - // Ignore - } - } - if (out != null) { - try { - out.close(); - } - catch (IOException e) { - // Ignore - } - } - } - } - } - - private void writeUserToLine(PlayerProfile profile, String playerName, UUID uuid, StringBuilder writer) { - writer.append(playerName).append(":"); - writer.append(profile.getSkillLevel(PrimarySkillType.MINING)).append(":"); - writer.append(":"); - writer.append(":"); - writer.append(profile.getSkillXpLevel(PrimarySkillType.MINING)).append(":"); - writer.append(profile.getSkillLevel(PrimarySkillType.WOODCUTTING)).append(":"); - writer.append(profile.getSkillXpLevel(PrimarySkillType.WOODCUTTING)).append(":"); - writer.append(profile.getSkillLevel(PrimarySkillType.REPAIR)).append(":"); - writer.append(profile.getSkillLevel(PrimarySkillType.UNARMED)).append(":"); - writer.append(profile.getSkillLevel(PrimarySkillType.HERBALISM)).append(":"); - writer.append(profile.getSkillLevel(PrimarySkillType.EXCAVATION)).append(":"); - writer.append(profile.getSkillLevel(PrimarySkillType.ARCHERY)).append(":"); - writer.append(profile.getSkillLevel(PrimarySkillType.SWORDS)).append(":"); - writer.append(profile.getSkillLevel(PrimarySkillType.AXES)).append(":"); - writer.append(profile.getSkillLevel(PrimarySkillType.ACROBATICS)).append(":"); - writer.append(profile.getSkillXpLevel(PrimarySkillType.REPAIR)).append(":"); - writer.append(profile.getSkillXpLevel(PrimarySkillType.UNARMED)).append(":"); - writer.append(profile.getSkillXpLevel(PrimarySkillType.HERBALISM)).append(":"); - writer.append(profile.getSkillXpLevel(PrimarySkillType.EXCAVATION)).append(":"); - writer.append(profile.getSkillXpLevel(PrimarySkillType.ARCHERY)).append(":"); - writer.append(profile.getSkillXpLevel(PrimarySkillType.SWORDS)).append(":"); - writer.append(profile.getSkillXpLevel(PrimarySkillType.AXES)).append(":"); - writer.append(profile.getSkillXpLevel(PrimarySkillType.ACROBATICS)).append(":"); - writer.append(":"); - writer.append(profile.getSkillLevel(PrimarySkillType.TAMING)).append(":"); - writer.append(profile.getSkillXpLevel(PrimarySkillType.TAMING)).append(":"); - writer.append((int) profile.getAbilityDATS(SuperAbilityType.BERSERK)).append(":"); - writer.append((int) profile.getAbilityDATS(SuperAbilityType.GIGA_DRILL_BREAKER)).append(":"); - writer.append((int) profile.getAbilityDATS(SuperAbilityType.TREE_FELLER)).append(":"); - writer.append((int) profile.getAbilityDATS(SuperAbilityType.GREEN_TERRA)).append(":"); - writer.append((int) profile.getAbilityDATS(SuperAbilityType.SERRATED_STRIKES)).append(":"); - writer.append((int) profile.getAbilityDATS(SuperAbilityType.SKULL_SPLITTER)).append(":"); - writer.append((int) profile.getAbilityDATS(SuperAbilityType.SUPER_BREAKER)).append(":"); - writer.append(":"); - writer.append(profile.getSkillLevel(PrimarySkillType.FISHING)).append(":"); - writer.append(profile.getSkillXpLevel(PrimarySkillType.FISHING)).append(":"); - writer.append((int) profile.getAbilityDATS(SuperAbilityType.BLAST_MINING)).append(":"); - writer.append(System.currentTimeMillis() / Misc.TIME_CONVERSION_FACTOR).append(":"); - MobHealthbarType mobHealthbarType = profile.getMobHealthbarType(); - writer.append(mobHealthbarType == null ? Config.getInstance().getMobHealthbarDefault().toString() : mobHealthbarType.toString()).append(":"); - writer.append(profile.getSkillLevel(PrimarySkillType.ALCHEMY)).append(":"); - writer.append(profile.getSkillXpLevel(PrimarySkillType.ALCHEMY)).append(":"); - writer.append(uuid != null ? uuid.toString() : "NULL").append(":"); - writer.append(profile.getScoreboardTipsShown()).append(":"); - writer.append(profile.getUniqueData(UniqueDataType.CHIMAERA_WING_DATS)).append(":"); - writer.append("\r\n"); - } - - public List readLeaderboard(PrimarySkillType skill, int pageNumber, int statsPerPage) { - updateLeaderboards(); - List statsList = skill == null ? powerLevels : playerStatHash.get(skill); - int fromIndex = (Math.max(pageNumber, 1) - 1) * statsPerPage; - - return statsList.subList(Math.min(fromIndex, statsList.size()), Math.min(fromIndex + statsPerPage, statsList.size())); - } - - public Map readRank(String playerName) { - updateLeaderboards(); - - Map skills = new HashMap(); - - for (PrimarySkillType skill : PrimarySkillType.NON_CHILD_SKILLS) { - skills.put(skill, getPlayerRank(playerName, playerStatHash.get(skill))); - } - - skills.put(null, getPlayerRank(playerName, powerLevels)); - - return skills; - } - - public void newUser(String playerName, UUID uuid) { - BufferedWriter out = null; - synchronized (fileWritingLock) { - try { - // Open the file to write the player - out = new BufferedWriter(new FileWriter(mcMMO.getUsersFilePath(), true)); - - String startingLevel = AdvancedConfig.getInstance().getStartingLevel() + ":"; - - // Add the player to the end - out.append(playerName).append(":"); - out.append(startingLevel); // Mining - out.append(":"); - out.append(":"); - out.append("0:"); // Xp - out.append(startingLevel); // Woodcutting - out.append("0:"); // WoodCuttingXp - out.append(startingLevel); // Repair - out.append(startingLevel); // Unarmed - out.append(startingLevel); // Herbalism - out.append(startingLevel); // Excavation - out.append(startingLevel); // Archery - out.append(startingLevel); // Swords - out.append(startingLevel); // Axes - out.append(startingLevel); // Acrobatics - out.append("0:"); // RepairXp - out.append("0:"); // UnarmedXp - out.append("0:"); // HerbalismXp - out.append("0:"); // ExcavationXp - out.append("0:"); // ArcheryXp - out.append("0:"); // SwordsXp - out.append("0:"); // AxesXp - out.append("0:"); // AcrobaticsXp - out.append(":"); - out.append(startingLevel); // Taming - out.append("0:"); // TamingXp - out.append("0:"); // DATS - out.append("0:"); // DATS - out.append("0:"); // DATS - out.append("0:"); // DATS - out.append("0:"); // DATS - out.append("0:"); // DATS - out.append("0:"); // DATS - out.append(":"); - out.append(startingLevel); // Fishing - out.append("0:"); // FishingXp - out.append("0:"); // Blast Mining - out.append(String.valueOf(System.currentTimeMillis() / Misc.TIME_CONVERSION_FACTOR)).append(":"); // LastLogin - out.append(Config.getInstance().getMobHealthbarDefault().toString()).append(":"); // Mob Healthbar HUD - out.append(startingLevel); // Alchemy - out.append("0:"); // AlchemyXp - out.append(uuid != null ? uuid.toString() : "NULL").append(":"); // UUID - out.append("0:"); // Scoreboard tips shown - // Add more in the same format as the line above - - out.newLine(); - } - catch (Exception e) { - e.printStackTrace(); - } - finally { - if (out != null) { - try { - out.close(); - } - catch (IOException e) { - // Ignore - } - } - } - } - } - - @Deprecated - public PlayerProfile loadPlayerProfile(String playerName, boolean create) { - return loadPlayerProfile(playerName, null, false); - } - - public PlayerProfile loadPlayerProfile(UUID uuid) { - return loadPlayerProfile("", uuid, false); - } - - public PlayerProfile loadPlayerProfile(String playerName, UUID uuid, boolean create) { - BufferedReader in = null; - String usersFilePath = mcMMO.getUsersFilePath(); - - synchronized (fileWritingLock) { - try { - // Open the user file - in = new BufferedReader(new FileReader(usersFilePath)); - String line; - - while ((line = in.readLine()) != null) { - // Find if the line contains the player we want. - String[] character = line.split(":"); - - // Compare names because we don't have a valid uuid for that player even - // if input uuid is not null - if (character[UUID_INDEX].equalsIgnoreCase("NULL")) { - if (!character[USERNAME].equalsIgnoreCase(playerName)) { - continue; - } - } - // If input uuid is not null then we should compare uuids - else if ((uuid != null && !character[UUID_INDEX].equalsIgnoreCase(uuid.toString())) || (uuid == null && !character[USERNAME].equalsIgnoreCase(playerName))) { - continue; - } - - // Update playerName in database after name change - if (!character[USERNAME].equalsIgnoreCase(playerName)) { - mcMMO.p.debug("Name change detected: " + character[USERNAME] + " => " + playerName); - character[USERNAME] = playerName; - } - - return loadFromLine(character); - } - - // Didn't find the player, create a new one - if (create) { - if (uuid == null) { - newUser(playerName, uuid); - return new PlayerProfile(playerName, true); - } - - newUser(playerName, uuid); - return new PlayerProfile(playerName, uuid, true); - } - } - catch (Exception e) { - e.printStackTrace(); - } - finally { - // I have no idea why it's necessary to inline tryClose() here, but it removes - // a resource leak warning, and I'm trusting the compiler on this one. - if (in != null) { - try { - in.close(); - } - catch (IOException e) { - // Ignore - } - } - } - } - - // Return unloaded profile - if (uuid == null) { - return new PlayerProfile(playerName); - } - - return new PlayerProfile(playerName, uuid); - } - - public void convertUsers(DatabaseManager destination) { - BufferedReader in = null; - String usersFilePath = mcMMO.getUsersFilePath(); - int convertedUsers = 0; - long startMillis = System.currentTimeMillis(); - - synchronized (fileWritingLock) { - try { - // Open the user file - in = new BufferedReader(new FileReader(usersFilePath)); - String line; - - while ((line = in.readLine()) != null) { - String[] character = line.split(":"); - - try { - destination.saveUser(loadFromLine(character)); - } - catch (Exception e) { - e.printStackTrace(); - } - convertedUsers++; - Misc.printProgress(convertedUsers, progressInterval, startMillis); - } - } - catch (Exception e) { - e.printStackTrace(); - } - finally { - if (in != null) { - try { - in.close(); - } - catch (IOException e) { - // Ignore - } - } - } - } - } - - public boolean saveUserUUID(String userName, UUID uuid) { - boolean worked = false; - - int i = 0; - BufferedReader in = null; - FileWriter out = null; - String usersFilePath = mcMMO.getUsersFilePath(); - - synchronized (fileWritingLock) { - try { - in = new BufferedReader(new FileReader(usersFilePath)); - StringBuilder writer = new StringBuilder(); - String line; - - while ((line = in.readLine()) != null) { - String[] character = line.split(":"); - if (!worked && character[USERNAME].equalsIgnoreCase(userName)) { - if (character.length < 42) { - mcMMO.p.getLogger().severe("Could not update UUID for " + userName + "!"); - mcMMO.p.getLogger().severe("Database entry is invalid."); - continue; - } - - line = line.replace(character[UUID_INDEX], uuid.toString()); - worked = true; - } - - i++; - writer.append(line).append("\r\n"); - } - - out = new FileWriter(usersFilePath); // Write out the new file - out.write(writer.toString()); - } - catch (Exception e) { - mcMMO.p.getLogger().severe("Exception while reading " + usersFilePath + " (Are you sure you formatted it correctly?)" + e.toString()); - } - finally { - mcMMO.p.getLogger().info(i + " entries written while saving UUID for " + userName); - if (in != null) { - try { - in.close(); - } - catch (IOException e) { - // Ignore - } - } - if (out != null) { - try { - out.close(); - } - catch (IOException e) { - // Ignore - } - } - } - } - - return worked; - } - - public boolean saveUserUUIDs(Map fetchedUUIDs) { - BufferedReader in = null; - FileWriter out = null; - String usersFilePath = mcMMO.getUsersFilePath(); - int i = 0; - - synchronized (fileWritingLock) { - try { - in = new BufferedReader(new FileReader(usersFilePath)); - StringBuilder writer = new StringBuilder(); - String line; - - while (((line = in.readLine()) != null)) { - String[] character = line.split(":"); - if (!fetchedUUIDs.isEmpty() && fetchedUUIDs.containsKey(character[USERNAME])) { - if (character.length < 42) { - mcMMO.p.getLogger().severe("Could not update UUID for " + character[USERNAME] + "!"); - mcMMO.p.getLogger().severe("Database entry is invalid."); - continue; - } - - character[UUID_INDEX] = fetchedUUIDs.remove(character[USERNAME]).toString(); - line = new StringBuilder(org.apache.commons.lang.StringUtils.join(character, ":")).append(":").toString(); - } - - i++; - writer.append(line).append("\r\n"); - } - - out = new FileWriter(usersFilePath); // Write out the new file - out.write(writer.toString()); - } - catch (Exception e) { - mcMMO.p.getLogger().severe("Exception while reading " + usersFilePath + " (Are you sure you formatted it correctly?)" + e.toString()); - } - finally { - mcMMO.p.getLogger().info(i + " entries written while saving UUID batch"); - if (in != null) { - try { - in.close(); - } - catch (IOException e) { - // Ignore - } - } - if (out != null) { - try { - out.close(); - } - catch (IOException e) { - // Ignore - } - } - } - } - - return true; - } - - public List getStoredUsers() { - ArrayList users = new ArrayList(); - BufferedReader in = null; - String usersFilePath = mcMMO.getUsersFilePath(); - - synchronized (fileWritingLock) { - try { - // Open the user file - in = new BufferedReader(new FileReader(usersFilePath)); - String line; - - while ((line = in.readLine()) != null) { - String[] character = line.split(":"); - users.add(character[USERNAME]); - } - } - catch (Exception e) { - e.printStackTrace(); - } - finally { - if (in != null) { - try { - in.close(); - } - catch (IOException e) { - // Ignore - } - } - } - } - return users; - } - - /** - * Update the leader boards. - */ - private void updateLeaderboards() { - // Only update FFS leaderboards every 10 minutes.. this puts a lot of strain on the server (depending on the size of the database) and should not be done frequently - if (System.currentTimeMillis() < lastUpdate + UPDATE_WAIT_TIME) { - return; - } - - String usersFilePath = mcMMO.getUsersFilePath(); - lastUpdate = System.currentTimeMillis(); // Log when the last update was run - powerLevels.clear(); // Clear old values from the power levels - - // Initialize lists - List mining = new ArrayList(); - List woodcutting = new ArrayList(); - List herbalism = new ArrayList(); - List excavation = new ArrayList(); - List acrobatics = new ArrayList(); - List repair = new ArrayList(); - List swords = new ArrayList(); - List axes = new ArrayList(); - List archery = new ArrayList(); - List unarmed = new ArrayList(); - List taming = new ArrayList(); - List fishing = new ArrayList(); - List alchemy = new ArrayList(); - - BufferedReader in = null; - String playerName = null; - // Read from the FlatFile database and fill our arrays with information - synchronized (fileWritingLock) { - try { - in = new BufferedReader(new FileReader(usersFilePath)); - String line; - - while ((line = in.readLine()) != null) { - String[] data = line.split(":"); - playerName = data[USERNAME]; - int powerLevel = 0; - - Map skills = getSkillMapFromLine(data); - - powerLevel += putStat(acrobatics, playerName, skills.get(PrimarySkillType.ACROBATICS)); - powerLevel += putStat(alchemy, playerName, skills.get(PrimarySkillType.ALCHEMY)); - powerLevel += putStat(archery, playerName, skills.get(PrimarySkillType.ARCHERY)); - powerLevel += putStat(axes, playerName, skills.get(PrimarySkillType.AXES)); - powerLevel += putStat(excavation, playerName, skills.get(PrimarySkillType.EXCAVATION)); - powerLevel += putStat(fishing, playerName, skills.get(PrimarySkillType.FISHING)); - powerLevel += putStat(herbalism, playerName, skills.get(PrimarySkillType.HERBALISM)); - powerLevel += putStat(mining, playerName, skills.get(PrimarySkillType.MINING)); - powerLevel += putStat(repair, playerName, skills.get(PrimarySkillType.REPAIR)); - powerLevel += putStat(swords, playerName, skills.get(PrimarySkillType.SWORDS)); - powerLevel += putStat(taming, playerName, skills.get(PrimarySkillType.TAMING)); - powerLevel += putStat(unarmed, playerName, skills.get(PrimarySkillType.UNARMED)); - powerLevel += putStat(woodcutting, playerName, skills.get(PrimarySkillType.WOODCUTTING)); - - putStat(powerLevels, playerName, powerLevel); - } - } - catch (Exception e) { - mcMMO.p.getLogger().severe("Exception while reading " + usersFilePath + " during user " + playerName + " (Are you sure you formatted it correctly?) " + e.toString()); - } - finally { - if (in != null) { - try { - in.close(); - } - catch (IOException e) { - // Ignore - } - } - } - } - - SkillComparator c = new SkillComparator(); - - Collections.sort(mining, c); - Collections.sort(woodcutting, c); - Collections.sort(repair, c); - Collections.sort(unarmed, c); - Collections.sort(herbalism, c); - Collections.sort(excavation, c); - Collections.sort(archery, c); - Collections.sort(swords, c); - Collections.sort(axes, c); - Collections.sort(acrobatics, c); - Collections.sort(taming, c); - Collections.sort(fishing, c); - Collections.sort(alchemy, c); - Collections.sort(powerLevels, c); - - playerStatHash.put(PrimarySkillType.MINING, mining); - playerStatHash.put(PrimarySkillType.WOODCUTTING, woodcutting); - playerStatHash.put(PrimarySkillType.REPAIR, repair); - playerStatHash.put(PrimarySkillType.UNARMED, unarmed); - playerStatHash.put(PrimarySkillType.HERBALISM, herbalism); - playerStatHash.put(PrimarySkillType.EXCAVATION, excavation); - playerStatHash.put(PrimarySkillType.ARCHERY, archery); - playerStatHash.put(PrimarySkillType.SWORDS, swords); - playerStatHash.put(PrimarySkillType.AXES, axes); - playerStatHash.put(PrimarySkillType.ACROBATICS, acrobatics); - playerStatHash.put(PrimarySkillType.TAMING, taming); - playerStatHash.put(PrimarySkillType.FISHING, fishing); - playerStatHash.put(PrimarySkillType.ALCHEMY, alchemy); - } - - /** - * Checks that the file is present and valid - */ - private void checkStructure() { - if (usersFile.exists()) { - BufferedReader in = null; - FileWriter out = null; - String usersFilePath = mcMMO.getUsersFilePath(); - - synchronized (fileWritingLock) { - try { - in = new BufferedReader(new FileReader(usersFilePath)); - StringBuilder writer = new StringBuilder(); - String line; - HashSet usernames = new HashSet(); - HashSet players = new HashSet(); - - while ((line = in.readLine()) != null) { - // Remove empty lines from the file - if (line.isEmpty()) { - continue; - } - - // Length checks depend on last character being ':' - if (line.charAt(line.length() - 1) != ':') { - line = line.concat(":"); - } - boolean updated = false; - String[] character = line.split(":"); - - // Prevent the same username from being present multiple times - if (!usernames.add(character[USERNAME])) { - character[USERNAME] = "_INVALID_OLD_USERNAME_'"; - updated = true; - if (character.length < UUID_INDEX + 1 || character[UUID_INDEX].equals("NULL")) { - continue; - } - } - - // Prevent the same player from being present multiple times - if (character.length >= 42 && (!character[UUID_INDEX].isEmpty() && !character[UUID_INDEX].equals("NULL") && !players.add(character[UUID_INDEX]))) { - continue; - } - - if (character.length < 33) { - // Before Version 1.0 - Drop - mcMMO.p.getLogger().warning("Dropping malformed or before version 1.0 line from database - " + line); - continue; - } - - String oldVersion = null; - - if (character.length > 33 && !character[33].isEmpty()) { - // Removal of Spout Support - // Version 1.4.07-dev2 - // commit 7bac0e2ca5143bce84dc160617fed97f0b1cb968 - character[33] = ""; - if (oldVersion == null) { - oldVersion = "1.4.07"; - } - updated = true; - } - - if (Config.getInstance().getTruncateSkills()) { - for (PrimarySkillType skill : PrimarySkillType.NON_CHILD_SKILLS) { - int index = getSkillIndex(skill); - if (index >= character.length) { - continue; - } - int cap = Config.getInstance().getLevelCap(skill); - if (Integer.valueOf(character[index]) > cap) { - mcMMO.p.getLogger().warning("Truncating " + skill.getName() + " to configured max level for player " + character[USERNAME]); - character[index] = cap + ""; - updated = true; - } - } - } - - // If they're valid, rewrite them to the file. - if (!updated && character.length == 43) { - writer.append(line).append("\r\n"); - continue; - } - - if (character.length <= 33) { - // Introduction of HUDType - // Version 1.1.06 - // commit 78f79213cdd7190cd11ae54526f3b4ea42078e8a - character = Arrays.copyOf(character, character.length + 1); - character[character.length - 1] = ""; - oldVersion = "1.1.06"; - } - - if (character.length <= 35) { - // Introduction of Fishing - // Version 1.2.00 - // commit a814b57311bc7734661109f0e77fc8bab3a0bd29 - character = Arrays.copyOf(character, character.length + 2); - character[character.length - 1] = "0"; - character[character.length - 2] = "0"; - if (oldVersion == null) { - oldVersion = "1.2.00"; - } - } - if (character.length <= 36) { - // Introduction of Blast Mining cooldowns - // Version 1.3.00-dev - // commit fadbaf429d6b4764b8f1ad0efaa524a090e82ef5 - character = Arrays.copyOf(character, character.length + 1); - character[character.length - 1] = "0"; - if (oldVersion == null) { - oldVersion = "1.3.00"; - } - } - if (character.length <= 37) { - // Making old-purge work with flatfile - // Version 1.4.00-dev - // commmit 3f6c07ba6aaf44e388cc3b882cac3d8f51d0ac28 - // XXX Cannot create an OfflinePlayer at startup, use 0 and fix in purge - character = Arrays.copyOf(character, character.length + 1); - character[character.length - 1] = "0"; - if (oldVersion == null) { - oldVersion = "1.4.00"; - } - } - if (character.length <= 38) { - // Addition of mob healthbars - // Version 1.4.06 - // commit da29185b7dc7e0d992754bba555576d48fa08aa6 - character = Arrays.copyOf(character, character.length + 1); - character[character.length - 1] = Config.getInstance().getMobHealthbarDefault().toString(); - if (oldVersion == null) { - oldVersion = "1.4.06"; - } - } - if (character.length <= 39) { - // Addition of Alchemy - // Version 1.4.08 - character = Arrays.copyOf(character, character.length + 2); - character[character.length - 1] = "0"; - character[character.length - 2] = "0"; - if (oldVersion == null) { - oldVersion = "1.4.08"; - } - } - if (character.length <= 41) { - // Addition of UUIDs - // Version 1.5.01 - // Add a value because otherwise it gets removed - character = Arrays.copyOf(character, character.length + 1); - character[character.length - 1] = "NULL"; - if (oldVersion == null) { - oldVersion = "1.5.01"; - } - } - if (character.length <= 42) { - // Addition of scoreboard tips auto disable - // Version 1.5.02 - character = Arrays.copyOf(character, character.length + 1); - character[character.length - 1] = "0"; - if (oldVersion == null) { - oldVersion = "1.5.02"; - } - } - - boolean corrupted = false; - - for (int i = 0; i < character.length; i++) { - if (character[i].isEmpty() && !(i == 2 || i == 3 || i == 23 || i == 33 || i == 41)) { - corrupted = true; - if (i == 37) { - character[i] = String.valueOf(System.currentTimeMillis() / Misc.TIME_CONVERSION_FACTOR); - } - else if (i == 38) { - character[i] = Config.getInstance().getMobHealthbarDefault().toString(); - } - else { - character[i] = "0"; - } - } - - if (StringUtils.isInt(character[i]) && i == 38) { - corrupted = true; - character[i] = Config.getInstance().getMobHealthbarDefault().toString(); - } - - if (!StringUtils.isInt(character[i]) && !(i == 0 || i == 2 || i == 3 || i == 23 || i == 33 || i == 38 || i == 41)) { - corrupted = true; - character[i] = "0"; - } - } - - if (corrupted) { - mcMMO.p.debug("Updating corrupted database line for player " + character[USERNAME]); - } - - if (oldVersion != null) { - mcMMO.p.debug("Updating database line from before version " + oldVersion + " for player " + character[USERNAME]); - } - - updated |= corrupted; - updated |= oldVersion != null; - - if (Config.getInstance().getTruncateSkills()) { - Map skills = getSkillMapFromLine(character); - for (PrimarySkillType skill : PrimarySkillType.NON_CHILD_SKILLS) { - int cap = Config.getInstance().getLevelCap(skill); - if (skills.get(skill) > cap) { - updated = true; - } - } - } - - if (updated) { - line = new StringBuilder(org.apache.commons.lang.StringUtils.join(character, ":")).append(":").toString(); - } - - writer.append(line).append("\r\n"); - } - - // Write the new file - out = new FileWriter(usersFilePath); - out.write(writer.toString()); - } - catch (IOException e) { - mcMMO.p.getLogger().severe("Exception while reading " + usersFilePath + " (Are you sure you formatted it correctly?)" + e.toString()); - } - finally { - if (in != null) { - try { - in.close(); - } - catch (IOException e) { - // Ignore - } - } - if (out != null) { - try { - out.close(); - } - catch (IOException e) { - // Ignore - } - } - } - } - - mcMMO.getUpgradeManager().setUpgradeCompleted(UpgradeType.ADD_FISHING); - mcMMO.getUpgradeManager().setUpgradeCompleted(UpgradeType.ADD_BLAST_MINING_COOLDOWN); - mcMMO.getUpgradeManager().setUpgradeCompleted(UpgradeType.ADD_SQL_INDEXES); - mcMMO.getUpgradeManager().setUpgradeCompleted(UpgradeType.ADD_MOB_HEALTHBARS); - mcMMO.getUpgradeManager().setUpgradeCompleted(UpgradeType.DROP_SQL_PARTY_NAMES); - mcMMO.getUpgradeManager().setUpgradeCompleted(UpgradeType.DROP_SPOUT); - mcMMO.getUpgradeManager().setUpgradeCompleted(UpgradeType.ADD_ALCHEMY); - return; - } - - usersFile.getParentFile().mkdir(); - - try { - mcMMO.p.debug("Creating mcmmo.users file..."); - new File(mcMMO.getUsersFilePath()).createNewFile(); - } - catch (IOException e) { - e.printStackTrace(); - } - } - - private Integer getPlayerRank(String playerName, List statsList) { - if (statsList == null) { - return null; - } - - int currentPos = 1; - - for (PlayerStat stat : statsList) { - if (stat.name.equalsIgnoreCase(playerName)) { - return currentPos; - } - - currentPos++; - } - - return null; - } - - private int putStat(List statList, String playerName, int statValue) { - statList.add(new PlayerStat(playerName, statValue)); - return statValue; - } - - private class SkillComparator implements Comparator { - @Override - public int compare(PlayerStat o1, PlayerStat o2) { - return (o2.statVal - o1.statVal); - } - } - - private PlayerProfile loadFromLine(String[] character) { - Map skills = getSkillMapFromLine(character); // Skill levels - Map skillsXp = new EnumMap(PrimarySkillType.class); // Skill & XP - Map skillsDATS = new EnumMap(SuperAbilityType.class); // Ability & Cooldown - Map uniquePlayerDataMap = new EnumMap(UniqueDataType.class); - MobHealthbarType mobHealthbarType; - int scoreboardTipsShown; - - // TODO on updates, put new values in a try{} ? - - skillsXp.put(PrimarySkillType.TAMING, (float) Integer.valueOf(character[EXP_TAMING])); - skillsXp.put(PrimarySkillType.MINING, (float) Integer.valueOf(character[EXP_MINING])); - skillsXp.put(PrimarySkillType.REPAIR, (float) Integer.valueOf(character[EXP_REPAIR])); - skillsXp.put(PrimarySkillType.WOODCUTTING, (float) Integer.valueOf(character[EXP_WOODCUTTING])); - skillsXp.put(PrimarySkillType.UNARMED, (float) Integer.valueOf(character[EXP_UNARMED])); - skillsXp.put(PrimarySkillType.HERBALISM, (float) Integer.valueOf(character[EXP_HERBALISM])); - skillsXp.put(PrimarySkillType.EXCAVATION, (float) Integer.valueOf(character[EXP_EXCAVATION])); - skillsXp.put(PrimarySkillType.ARCHERY, (float) Integer.valueOf(character[EXP_ARCHERY])); - skillsXp.put(PrimarySkillType.SWORDS, (float) Integer.valueOf(character[EXP_SWORDS])); - skillsXp.put(PrimarySkillType.AXES, (float) Integer.valueOf(character[EXP_AXES])); - skillsXp.put(PrimarySkillType.ACROBATICS, (float) Integer.valueOf(character[EXP_ACROBATICS])); - skillsXp.put(PrimarySkillType.FISHING, (float) Integer.valueOf(character[EXP_FISHING])); - skillsXp.put(PrimarySkillType.ALCHEMY, (float) Integer.valueOf(character[EXP_ALCHEMY])); - - // Taming - Unused - skillsDATS.put(SuperAbilityType.SUPER_BREAKER, Integer.valueOf(character[COOLDOWN_SUPER_BREAKER])); - // Repair - Unused - skillsDATS.put(SuperAbilityType.TREE_FELLER, Integer.valueOf(character[COOLDOWN_TREE_FELLER])); - skillsDATS.put(SuperAbilityType.BERSERK, Integer.valueOf(character[COOLDOWN_BERSERK])); - skillsDATS.put(SuperAbilityType.GREEN_TERRA, Integer.valueOf(character[COOLDOWN_GREEN_TERRA])); - skillsDATS.put(SuperAbilityType.GIGA_DRILL_BREAKER, Integer.valueOf(character[COOLDOWN_GIGA_DRILL_BREAKER])); - // Archery - Unused - skillsDATS.put(SuperAbilityType.SERRATED_STRIKES, Integer.valueOf(character[COOLDOWN_SERRATED_STRIKES])); - skillsDATS.put(SuperAbilityType.SKULL_SPLITTER, Integer.valueOf(character[COOLDOWN_SKULL_SPLITTER])); - // Acrobatics - Unused - skillsDATS.put(SuperAbilityType.BLAST_MINING, Integer.valueOf(character[COOLDOWN_BLAST_MINING])); - - try { - mobHealthbarType = MobHealthbarType.valueOf(character[HEALTHBAR]); - } - catch (Exception e) { - mobHealthbarType = Config.getInstance().getMobHealthbarDefault(); - } - - UUID uuid; - try { - uuid = UUID.fromString(character[UUID_INDEX]); - } - catch (Exception e) { - uuid = null; - } - - try { - scoreboardTipsShown = Integer.valueOf(character[SCOREBOARD_TIPS]); - } - catch (Exception e) { - scoreboardTipsShown = 0; - } - - try { - uniquePlayerDataMap.put(UniqueDataType.CHIMAERA_WING_DATS, Integer.valueOf(character[COOLDOWN_CHIMAERA_WING])); - } - catch (Exception e) { - uniquePlayerDataMap.put(UniqueDataType.CHIMAERA_WING_DATS, 0); - } - - return new PlayerProfile(character[USERNAME], uuid, skills, skillsXp, skillsDATS, mobHealthbarType, scoreboardTipsShown, uniquePlayerDataMap); - } - - private Map getSkillMapFromLine(String[] character) { - Map skills = new EnumMap(PrimarySkillType.class); // Skill & Level - - skills.put(PrimarySkillType.TAMING, Integer.valueOf(character[SKILLS_TAMING])); - skills.put(PrimarySkillType.MINING, Integer.valueOf(character[SKILLS_MINING])); - skills.put(PrimarySkillType.REPAIR, Integer.valueOf(character[SKILLS_REPAIR])); - skills.put(PrimarySkillType.WOODCUTTING, Integer.valueOf(character[SKILLS_WOODCUTTING])); - skills.put(PrimarySkillType.UNARMED, Integer.valueOf(character[SKILLS_UNARMED])); - skills.put(PrimarySkillType.HERBALISM, Integer.valueOf(character[SKILLS_HERBALISM])); - skills.put(PrimarySkillType.EXCAVATION, Integer.valueOf(character[SKILLS_EXCAVATION])); - skills.put(PrimarySkillType.ARCHERY, Integer.valueOf(character[SKILLS_ARCHERY])); - skills.put(PrimarySkillType.SWORDS, Integer.valueOf(character[SKILLS_SWORDS])); - skills.put(PrimarySkillType.AXES, Integer.valueOf(character[SKILLS_AXES])); - skills.put(PrimarySkillType.ACROBATICS, Integer.valueOf(character[SKILLS_ACROBATICS])); - skills.put(PrimarySkillType.FISHING, Integer.valueOf(character[SKILLS_FISHING])); - skills.put(PrimarySkillType.ALCHEMY, Integer.valueOf(character[SKILLS_ALCHEMY])); - - return skills; - } - - public DatabaseType getDatabaseType() { - return DatabaseType.FLATFILE; - } - - @Override - public void onDisable() { } - - private int getSkillIndex(PrimarySkillType skill) { - switch (skill) { - case ACROBATICS: - return SKILLS_ACROBATICS; - case ALCHEMY: - return SKILLS_ALCHEMY; - case ARCHERY: - return SKILLS_ARCHERY; - case AXES: - return SKILLS_AXES; - case EXCAVATION: - return SKILLS_EXCAVATION; - case FISHING: - return SKILLS_FISHING; - case HERBALISM: - return SKILLS_HERBALISM; - case MINING: - return SKILLS_MINING; - case REPAIR: - return SKILLS_REPAIR; - case SWORDS: - return SKILLS_SWORDS; - case TAMING: - return SKILLS_TAMING; - case UNARMED: - return SKILLS_UNARMED; - case WOODCUTTING: - return SKILLS_WOODCUTTING; - default: - throw new RuntimeException("Primary Skills only"); - - } - } - - public static int USERNAME = 0; - public static int SKILLS_MINING = 1; - public static int EXP_MINING = 4; - public static int SKILLS_WOODCUTTING = 5; - public static int EXP_WOODCUTTING = 6; - public static int SKILLS_REPAIR = 7; - public static int SKILLS_UNARMED = 8; - public static int SKILLS_HERBALISM = 9; - public static int SKILLS_EXCAVATION = 10; - public static int SKILLS_ARCHERY = 11; - public static int SKILLS_SWORDS = 12; - public static int SKILLS_AXES = 13; - public static int SKILLS_ACROBATICS = 14; - public static int EXP_REPAIR = 15; - public static int EXP_UNARMED = 16; - public static int EXP_HERBALISM = 17; - public static int EXP_EXCAVATION = 18; - public static int EXP_ARCHERY = 19; - public static int EXP_SWORDS = 20; - public static int EXP_AXES = 21; - public static int EXP_ACROBATICS = 22; - public static int SKILLS_TAMING = 24; - public static int EXP_TAMING = 25; - public static int COOLDOWN_BERSERK = 26; - public static int COOLDOWN_GIGA_DRILL_BREAKER = 27; - public static int COOLDOWN_TREE_FELLER = 28; - public static int COOLDOWN_GREEN_TERRA = 29; - public static int COOLDOWN_SERRATED_STRIKES = 30; - public static int COOLDOWN_SKULL_SPLITTER = 31; - public static int COOLDOWN_SUPER_BREAKER = 32; - public static int SKILLS_FISHING = 34; - public static int EXP_FISHING = 35; - public static int COOLDOWN_BLAST_MINING = 36; - public static int LAST_LOGIN = 37; - public static int HEALTHBAR = 38; - public static int SKILLS_ALCHEMY = 39; - public static int EXP_ALCHEMY = 40; - public static int UUID_INDEX = 41; - public static int SCOREBOARD_TIPS = 42; - public static int COOLDOWN_CHIMAERA_WING = 43; - - public void resetMobHealthSettings() { - BufferedReader in = null; - FileWriter out = null; - String usersFilePath = mcMMO.getUsersFilePath(); - - synchronized (fileWritingLock) { - try { - in = new BufferedReader(new FileReader(usersFilePath)); - StringBuilder writer = new StringBuilder(); - String line; - - while ((line = in.readLine()) != null) { - // Remove empty lines from the file - if (line.isEmpty()) { - continue; - } - String[] character = line.split(":"); - - character[HEALTHBAR] = Config.getInstance().getMobHealthbarDefault().toString(); - - line = new StringBuilder(org.apache.commons.lang.StringUtils.join(character, ":")).append(":").toString(); - - writer.append(line).append("\r\n"); - } - - // Write the new file - out = new FileWriter(usersFilePath); - out.write(writer.toString()); - } - catch (IOException e) { - mcMMO.p.getLogger().severe("Exception while reading " + usersFilePath + " (Are you sure you formatted it correctly?)" + e.toString()); - } - finally { - if (in != null) { - try { - in.close(); - } - catch (IOException e) { - // Ignore - } - } - if (out != null) { - try { - out.close(); - } - catch (IOException e) { - // Ignore - } - } - } - } - } -} diff --git a/src/main/java/com/gmail/nossr50/database/SQLDatabaseManager.java b/src/main/java/com/gmail/nossr50/database/SQLDatabaseManager.java index 8fdff41d8..413d9d49c 100644 --- a/src/main/java/com/gmail/nossr50/database/SQLDatabaseManager.java +++ b/src/main/java/com/gmail/nossr50/database/SQLDatabaseManager.java @@ -1,7 +1,6 @@ package com.gmail.nossr50.database; -import com.gmail.nossr50.config.AdvancedConfig; -import com.gmail.nossr50.config.Config; +import com.gmail.nossr50.api.exceptions.InvalidSkillException; import com.gmail.nossr50.datatypes.MobHealthbarType; import com.gmail.nossr50.datatypes.database.DatabaseType; import com.gmail.nossr50.datatypes.database.PlayerStat; @@ -13,9 +12,14 @@ import com.gmail.nossr50.datatypes.skills.SuperAbilityType; import com.gmail.nossr50.mcMMO; import com.gmail.nossr50.runnables.database.UUIDUpdateAsyncTask; import com.gmail.nossr50.util.Misc; +import com.gmail.nossr50.util.skills.SkillTools; import org.apache.tomcat.jdbc.pool.DataSource; import org.apache.tomcat.jdbc.pool.PoolProperties; +import org.bukkit.OfflinePlayer; +import org.bukkit.entity.Player; import org.bukkit.scheduler.BukkitRunnable; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; import java.sql.*; import java.util.*; @@ -23,9 +27,14 @@ import java.util.concurrent.locks.ReentrantLock; public final class SQLDatabaseManager implements DatabaseManager { private static final String ALL_QUERY_VERSION = "total"; - private String tablePrefix = Config.getInstance().getMySQLTablePrefix(); + public static final String MOBHEALTHBAR_VARCHAR = "VARCHAR(50)"; + public static final String UUID_VARCHAR = "VARCHAR(36)"; + public static final String USER_VARCHAR = "VARCHAR(40)"; + public static final int CHILD_SKILLS_SIZE = 2; + public static final String LEGACY_DRIVER_PATH = "com.mysql.jdbc.Driver"; + private final String tablePrefix = mcMMO.p.getGeneralConfig().getMySQLTablePrefix(); - private final Map cachedUserIDs = new HashMap(); + private final Map cachedUserIDs = new HashMap<>(); private DataSource miscPool; private DataSource loadPool; @@ -33,13 +42,17 @@ public final class SQLDatabaseManager implements DatabaseManager { private boolean debug = false; - private ReentrantLock massUpdateLock = new ReentrantLock(); + private final ReentrantLock massUpdateLock = new ReentrantLock(); + + private final String CHARSET_SQL = "utf8mb4"; //This is compliant with UTF-8 while "utf8" is not, confusing but this is how it is. + private String driverPath = "com.mysql.cj.jdbc.Driver"; //modern driver protected SQLDatabaseManager() { - String connectionString = "jdbc:mysql://" + Config.getInstance().getMySQLServerName() - + ":" + Config.getInstance().getMySQLServerPort() + "/" + Config.getInstance().getMySQLDatabaseName(); + String connectionString = "jdbc:mysql://" + mcMMO.p.getGeneralConfig().getMySQLServerName() + + ":" + mcMMO.p.getGeneralConfig().getMySQLServerPort() + "/" + mcMMO.p.getGeneralConfig().getMySQLDatabaseName(); - if(Config.getInstance().getMySQLSSL()) + if(!mcMMO.getCompatibilityManager().getMinecraftGameVersion().isAtLeast(1, 17, 0) //Temporary hack for SQL and 1.17 support + && mcMMO.p.getGeneralConfig().getMySQLSSL()) connectionString += "?verifyServerCertificate=false"+ "&useSSL=true"+ @@ -48,26 +61,36 @@ public final class SQLDatabaseManager implements DatabaseManager { connectionString+= "?useSSL=false"; + if(mcMMO.p.getGeneralConfig().getMySQLPublicKeyRetrieval()) { + connectionString+= + "&allowPublicKeyRetrieval=true"; + } + try { // Force driver to load if not yet loaded - Class.forName("com.mysql.jdbc.Driver"); - } - catch (ClassNotFoundException e) { - e.printStackTrace(); - return; + Class.forName(driverPath); + } catch (ClassNotFoundException e) { + try { + driverPath = LEGACY_DRIVER_PATH; //fall on deprecated path if new path isn't found + Class.forName(driverPath); + } catch (ClassNotFoundException ex) { + e.printStackTrace(); + ex.printStackTrace(); + mcMMO.p.getLogger().severe("Neither driver found"); + return; + } //throw e; // aborts onEnable() Riking if you want to do this, fully implement it. } - debug = Config.getInstance().getMySQLDebug(); - + debug = mcMMO.p.getGeneralConfig().getMySQLDebug(); PoolProperties poolProperties = new PoolProperties(); - poolProperties.setDriverClassName("com.mysql.jdbc.Driver"); + poolProperties.setDriverClassName(driverPath); poolProperties.setUrl(connectionString); - poolProperties.setUsername(Config.getInstance().getMySQLUserName()); - poolProperties.setPassword(Config.getInstance().getMySQLUserPassword()); - poolProperties.setMaxIdle(Config.getInstance().getMySQLMaxPoolSize(PoolIdentifier.MISC)); - poolProperties.setMaxActive(Config.getInstance().getMySQLMaxConnections(PoolIdentifier.MISC)); + poolProperties.setUsername(mcMMO.p.getGeneralConfig().getMySQLUserName()); + poolProperties.setPassword(mcMMO.p.getGeneralConfig().getMySQLUserPassword()); + poolProperties.setMaxIdle(mcMMO.p.getGeneralConfig().getMySQLMaxPoolSize(PoolIdentifier.MISC)); + poolProperties.setMaxActive(mcMMO.p.getGeneralConfig().getMySQLMaxConnections(PoolIdentifier.MISC)); poolProperties.setInitialSize(0); poolProperties.setMaxWait(-1); poolProperties.setRemoveAbandoned(true); @@ -77,13 +100,13 @@ public final class SQLDatabaseManager implements DatabaseManager { poolProperties.setValidationInterval(30000); miscPool = new DataSource(poolProperties); poolProperties = new PoolProperties(); - poolProperties.setDriverClassName("com.mysql.jdbc.Driver"); + poolProperties.setDriverClassName(driverPath); poolProperties.setUrl(connectionString); - poolProperties.setUsername(Config.getInstance().getMySQLUserName()); - poolProperties.setPassword(Config.getInstance().getMySQLUserPassword()); + poolProperties.setUsername(mcMMO.p.getGeneralConfig().getMySQLUserName()); + poolProperties.setPassword(mcMMO.p.getGeneralConfig().getMySQLUserPassword()); poolProperties.setInitialSize(0); - poolProperties.setMaxIdle(Config.getInstance().getMySQLMaxPoolSize(PoolIdentifier.SAVE)); - poolProperties.setMaxActive(Config.getInstance().getMySQLMaxConnections(PoolIdentifier.SAVE)); + poolProperties.setMaxIdle(mcMMO.p.getGeneralConfig().getMySQLMaxPoolSize(PoolIdentifier.SAVE)); + poolProperties.setMaxActive(mcMMO.p.getGeneralConfig().getMySQLMaxConnections(PoolIdentifier.SAVE)); poolProperties.setMaxWait(-1); poolProperties.setRemoveAbandoned(true); poolProperties.setRemoveAbandonedTimeout(60); @@ -92,13 +115,13 @@ public final class SQLDatabaseManager implements DatabaseManager { poolProperties.setValidationInterval(30000); savePool = new DataSource(poolProperties); poolProperties = new PoolProperties(); - poolProperties.setDriverClassName("com.mysql.jdbc.Driver"); + poolProperties.setDriverClassName(driverPath); poolProperties.setUrl(connectionString); - poolProperties.setUsername(Config.getInstance().getMySQLUserName()); - poolProperties.setPassword(Config.getInstance().getMySQLUserPassword()); + poolProperties.setUsername(mcMMO.p.getGeneralConfig().getMySQLUserName()); + poolProperties.setPassword(mcMMO.p.getGeneralConfig().getMySQLUserPassword()); poolProperties.setInitialSize(0); - poolProperties.setMaxIdle(Config.getInstance().getMySQLMaxPoolSize(PoolIdentifier.LOAD)); - poolProperties.setMaxActive(Config.getInstance().getMySQLMaxConnections(PoolIdentifier.LOAD)); + poolProperties.setMaxIdle(mcMMO.p.getGeneralConfig().getMySQLMaxPoolSize(PoolIdentifier.LOAD)); + poolProperties.setMaxActive(mcMMO.p.getGeneralConfig().getMySQLMaxConnections(PoolIdentifier.LOAD)); poolProperties.setMaxWait(-1); poolProperties.setRemoveAbandoned(true); poolProperties.setRemoveAbandonedTimeout(60); @@ -110,7 +133,7 @@ public final class SQLDatabaseManager implements DatabaseManager { checkStructure(); } - public void purgePowerlessUsers() { + public int purgePowerlessUsers() { massUpdateLock.lock(); mcMMO.p.getLogger().info("Purging powerless users..."); @@ -143,11 +166,12 @@ public final class SQLDatabaseManager implements DatabaseManager { } mcMMO.p.getLogger().info("Purged " + purged + " users from the database."); + return purged; } public void purgeOldUsers() { massUpdateLock.lock(); - mcMMO.p.getLogger().info("Purging inactive users older than " + (PURGE_TIME / 2630000000L) + " months..."); + mcMMO.p.getLogger().info("Purging inactive users older than " + (mcMMO.p.getPurgeTime() / 2630000000L) + " months..."); Connection connection = null; Statement statement = null; @@ -162,12 +186,11 @@ public final class SQLDatabaseManager implements DatabaseManager { "JOIN " + tablePrefix + "huds h ON (u.id = h.user_id) " + "JOIN " + tablePrefix + "skills s ON (u.id = s.user_id) " + "JOIN " + tablePrefix + "cooldowns c ON (u.id = c.user_id) " + - "WHERE ((UNIX_TIMESTAMP() - lastlogin) > " + PURGE_TIME + ")"); + "WHERE ((UNIX_TIMESTAMP() - lastlogin) > " + mcMMO.p.getPurgeTime() + ")"); } catch (SQLException ex) { printErrors(ex); - } - finally { + } finally { tryClose(statement); tryClose(connection); massUpdateLock.unlock(); @@ -214,8 +237,7 @@ public final class SQLDatabaseManager implements DatabaseManager { } public void cleanupUser(UUID uuid) { - if(cachedUserIDs.containsKey(uuid)) - cachedUserIDs.remove(uuid); + cachedUserIDs.remove(uuid); } public boolean saveUser(PlayerProfile profile) { @@ -264,7 +286,7 @@ public final class SQLDatabaseManager implements DatabaseManager { statement.setInt(12, profile.getSkillLevel(PrimarySkillType.FISHING)); statement.setInt(13, profile.getSkillLevel(PrimarySkillType.ALCHEMY)); int total = 0; - for (PrimarySkillType primarySkillType : PrimarySkillType.NON_CHILD_SKILLS) + for (PrimarySkillType primarySkillType : SkillTools.NON_CHILD_SKILLS) total += profile.getSkillLevel(primarySkillType); statement.setInt(14, total); statement.setInt(15, id); @@ -323,7 +345,7 @@ public final class SQLDatabaseManager implements DatabaseManager { } statement = connection.prepareStatement("UPDATE " + tablePrefix + "huds SET mobhealthbar = ?, scoreboardtips = ? WHERE user_id = ?"); - statement.setString(1, profile.getMobHealthbarType() == null ? Config.getInstance().getMobHealthbarDefault().name() : profile.getMobHealthbarType().name()); + statement.setString(1, MobHealthbarType.HEARTS.name()); statement.setInt(2, profile.getScoreboardTipsShown()); statement.setInt(3, id); success = (statement.executeUpdate() != 0); @@ -344,8 +366,15 @@ public final class SQLDatabaseManager implements DatabaseManager { return success; } - public List readLeaderboard(PrimarySkillType skill, int pageNumber, int statsPerPage) { - List stats = new ArrayList(); + public @NotNull List readLeaderboard(@Nullable PrimarySkillType skill, int pageNumber, int statsPerPage) throws InvalidSkillException { + List stats = new ArrayList<>(); + + //Fix for a plugin that people are using that is throwing SQL errors + if(skill != null && SkillTools.isChildSkill(skill)) { + mcMMO.p.getLogger().severe("A plugin hooking into mcMMO is being naughty with our database commands, update all plugins that hook into mcMMO and contact their devs!"); + throw new InvalidSkillException("A plugin hooking into mcMMO that you are using is attempting to read leaderboard skills for child skills, child skills do not have leaderboards! This is NOT an mcMMO error!"); + } + String query = skill == null ? ALL_QUERY_VERSION : skill.name().toLowerCase(Locale.ENGLISH); ResultSet resultSet = null; @@ -360,13 +389,13 @@ public final class SQLDatabaseManager implements DatabaseManager { resultSet = statement.executeQuery(); while (resultSet.next()) { - ArrayList column = new ArrayList(); + ArrayList column = new ArrayList<>(); for (int i = 1; i <= resultSet.getMetaData().getColumnCount(); i++) { column.add(resultSet.getString(i)); } - stats.add(new PlayerStat(column.get(1), Integer.valueOf(column.get(0)))); + stats.add(new PlayerStat(column.get(1), Integer.parseInt(column.get(0)))); } } catch (SQLException ex) { @@ -382,7 +411,7 @@ public final class SQLDatabaseManager implements DatabaseManager { } public Map readRank(String playerName) { - Map skills = new HashMap(); + Map skills = new HashMap<>(); ResultSet resultSet = null; PreparedStatement statement = null; @@ -390,7 +419,7 @@ public final class SQLDatabaseManager implements DatabaseManager { try { connection = getConnection(PoolIdentifier.MISC); - for (PrimarySkillType primarySkillType : PrimarySkillType.NON_CHILD_SKILLS) { + for (PrimarySkillType primarySkillType : SkillTools.NON_CHILD_SKILLS) { String skillName = primarySkillType.name().toLowerCase(Locale.ENGLISH); // Get count of all users with higher skill level than player String sql = "SELECT COUNT(*) AS 'rank' FROM " + tablePrefix + "users JOIN " + tablePrefix + "skills ON user_id = id WHERE " + skillName + " > 0 " + @@ -477,19 +506,37 @@ public final class SQLDatabaseManager implements DatabaseManager { return skills; } - public void newUser(String playerName, UUID uuid) { + public @NotNull PlayerProfile newUser(String playerName, UUID uuid) { Connection connection = null; try { connection = getConnection(PoolIdentifier.MISC); newUser(connection, playerName, uuid); - } - catch (SQLException ex) { + } catch (SQLException ex) { printErrors(ex); - } - finally { + } finally { tryClose(connection); } + + return new PlayerProfile(playerName, uuid, true, mcMMO.p.getAdvancedConfig().getStartingLevel()); + } + + @Override + public @NotNull PlayerProfile newUser(@NotNull Player player) { + try { + Connection connection = getConnection(PoolIdentifier.SAVE); + int id = newUser(connection, player.getName(), player.getUniqueId()); + + if (id == -1) { + return new PlayerProfile(player.getName(), player.getUniqueId(), false, mcMMO.p.getAdvancedConfig().getStartingLevel()); + } else { + return loadPlayerProfile(player); + } + } catch (SQLException e) { + e.printStackTrace(); + } + + return new PlayerProfile(player.getName(), player.getUniqueId(), false, mcMMO.p.getAdvancedConfig().getStartingLevel()); } private int newUser(Connection connection, String playerName, UUID uuid) { @@ -530,20 +577,35 @@ public final class SQLDatabaseManager implements DatabaseManager { return -1; } - @Deprecated - public PlayerProfile loadPlayerProfile(String playerName, boolean create) { - return loadPlayerProfile(playerName, null, false, true); + public @NotNull PlayerProfile loadPlayerProfile(@NotNull String playerName) { + try { + return loadPlayerFromDB(null, playerName); + } catch (RuntimeException e) { + e.printStackTrace(); + return new PlayerProfile(playerName, false, mcMMO.p.getAdvancedConfig().getStartingLevel()); + } } - public PlayerProfile loadPlayerProfile(UUID uuid) { - return loadPlayerProfile("", uuid, false, true); + @Override + public @NotNull PlayerProfile loadPlayerProfile(@NotNull OfflinePlayer offlinePlayer) { + return loadPlayerFromDB(offlinePlayer.getUniqueId(), offlinePlayer.getName()); } - public PlayerProfile loadPlayerProfile(String playerName, UUID uuid, boolean create) { - return loadPlayerProfile(playerName, uuid, create, true); + public @NotNull PlayerProfile loadPlayerProfile(@NotNull UUID uuid, @Nullable String playerName) { + return loadPlayerFromDB(uuid, playerName); } - private PlayerProfile loadPlayerProfile(String playerName, UUID uuid, boolean create, boolean retry) { + @Override + public @NotNull PlayerProfile loadPlayerProfile(@NotNull UUID uuid) { + return loadPlayerFromDB(uuid, null); + } + + + private PlayerProfile loadPlayerFromDB(@Nullable UUID uuid, @Nullable String playerName) throws RuntimeException { + if(uuid == null && playerName == null) { + throw new RuntimeException("Error looking up player, both UUID and playerName are null and one must not be."); + } + PreparedStatement statement = null; Connection connection = null; ResultSet resultSet = null; @@ -553,16 +615,8 @@ public final class SQLDatabaseManager implements DatabaseManager { int id = getUserID(connection, playerName, uuid); if (id == -1) { - // There is no such user - if (create) { - id = newUser(connection, playerName, uuid); - create = false; - if (id == -1) { - return new PlayerProfile(playerName, false); - } - } else { - return new PlayerProfile(playerName, false); - } + // There is no such user + return new PlayerProfile(playerName, mcMMO.p.getAdvancedConfig().getStartingLevel()); } // There is such a user writeMissingRows(connection, id); @@ -590,7 +644,10 @@ public final class SQLDatabaseManager implements DatabaseManager { resultSet.close(); statement.close(); - if (!playerName.isEmpty() && !playerName.equalsIgnoreCase(name) && uuid != null) { + if (playerName != null + && !playerName.isEmpty() + && !playerName.equalsIgnoreCase(name) + && uuid != null) { statement = connection.prepareStatement( "UPDATE `" + tablePrefix + "users` " + "SET user = ? " @@ -627,15 +684,8 @@ public final class SQLDatabaseManager implements DatabaseManager { tryClose(connection); } - // Problem, nothing was returned - - // return unloaded profile - if (!retry) { - return new PlayerProfile(playerName, false); - } - - // Retry, and abort on re-failure - return loadPlayerProfile(playerName, uuid, create, false); + //Return empty profile + return new PlayerProfile(playerName, mcMMO.p.getAdvancedConfig().getStartingLevel()); } public void convertUsers(DatabaseManager destination) { @@ -752,7 +802,7 @@ public final class SQLDatabaseManager implements DatabaseManager { } public List getStoredUsers() { - ArrayList users = new ArrayList(); + ArrayList users = new ArrayList<>(); Statement statement = null; Connection connection = null; @@ -793,7 +843,7 @@ public final class SQLDatabaseManager implements DatabaseManager { statement = connection.prepareStatement("SELECT table_name FROM INFORMATION_SCHEMA.TABLES" + " WHERE table_schema = ?" + " AND table_name = ?"); - statement.setString(1, Config.getInstance().getMySQLDatabaseName()); + statement.setString(1, mcMMO.p.getGeneralConfig().getMySQLDatabaseName()); statement.setString(2, tablePrefix + "users"); resultSet = statement.executeQuery(); if (!resultSet.next()) { @@ -805,25 +855,25 @@ public final class SQLDatabaseManager implements DatabaseManager { + "`lastlogin` int(32) unsigned NOT NULL," + "PRIMARY KEY (`id`)," + "INDEX(`user`(20) ASC)," - + "UNIQUE KEY `uuid` (`uuid`)) DEFAULT CHARSET=latin1 AUTO_INCREMENT=1;"); + + "UNIQUE KEY `uuid` (`uuid`)) DEFAULT CHARSET=" + CHARSET_SQL + " AUTO_INCREMENT=1;"); tryClose(createStatement); } tryClose(resultSet); - statement.setString(1, Config.getInstance().getMySQLDatabaseName()); + statement.setString(1, mcMMO.p.getGeneralConfig().getMySQLDatabaseName()); statement.setString(2, tablePrefix + "huds"); resultSet = statement.executeQuery(); if (!resultSet.next()) { createStatement = connection.createStatement(); createStatement.executeUpdate("CREATE TABLE IF NOT EXISTS `" + tablePrefix + "huds` (" + "`user_id` int(10) unsigned NOT NULL," - + "`mobhealthbar` varchar(50) NOT NULL DEFAULT '" + Config.getInstance().getMobHealthbarDefault() + "'," + + "`mobhealthbar` varchar(50) NOT NULL DEFAULT '" + mcMMO.p.getGeneralConfig().getMobHealthbarDefault() + "'," + "`scoreboardtips` int(10) NOT NULL DEFAULT '0'," + "PRIMARY KEY (`user_id`)) " - + "DEFAULT CHARSET=latin1;"); + + "DEFAULT CHARSET=" + CHARSET_SQL + ";"); tryClose(createStatement); } tryClose(resultSet); - statement.setString(1, Config.getInstance().getMySQLDatabaseName()); + statement.setString(1, mcMMO.p.getGeneralConfig().getMySQLDatabaseName()); statement.setString(2, tablePrefix + "cooldowns"); resultSet = statement.executeQuery(); if (!resultSet.next()) { @@ -844,16 +894,16 @@ public final class SQLDatabaseManager implements DatabaseManager { + "`blast_mining` int(32) unsigned NOT NULL DEFAULT '0'," + "`chimaera_wing` int(32) unsigned NOT NULL DEFAULT '0'," + "PRIMARY KEY (`user_id`)) " - + "DEFAULT CHARSET=latin1;"); + + "DEFAULT CHARSET=" + CHARSET_SQL + ";"); tryClose(createStatement); } tryClose(resultSet); - statement.setString(1, Config.getInstance().getMySQLDatabaseName()); + statement.setString(1, mcMMO.p.getGeneralConfig().getMySQLDatabaseName()); statement.setString(2, tablePrefix + "skills"); resultSet = statement.executeQuery(); if (!resultSet.next()) { - String startingLevel = "'" + AdvancedConfig.getInstance().getStartingLevel() + "'"; - String totalLevel = "'" + (AdvancedConfig.getInstance().getStartingLevel() * (PrimarySkillType.values().length - PrimarySkillType.CHILD_SKILLS.size())) + "'"; + String startingLevel = "'" + mcMMO.p.getAdvancedConfig().getStartingLevel() + "'"; + String totalLevel = "'" + (mcMMO.p.getAdvancedConfig().getStartingLevel() * (PrimarySkillType.values().length - CHILD_SKILLS_SIZE)) + "'"; createStatement = connection.createStatement(); createStatement.executeUpdate("CREATE TABLE IF NOT EXISTS `" + tablePrefix + "skills` (" + "`user_id` int(10) unsigned NOT NULL," @@ -872,11 +922,11 @@ public final class SQLDatabaseManager implements DatabaseManager { + "`alchemy` int(10) unsigned NOT NULL DEFAULT "+startingLevel+"," + "`total` int(10) unsigned NOT NULL DEFAULT "+totalLevel+"," + "PRIMARY KEY (`user_id`)) " - + "DEFAULT CHARSET=latin1;"); + + "DEFAULT CHARSET=" + CHARSET_SQL + ";"); tryClose(createStatement); } tryClose(resultSet); - statement.setString(1, Config.getInstance().getMySQLDatabaseName()); + statement.setString(1, mcMMO.p.getGeneralConfig().getMySQLDatabaseName()); statement.setString(2, tablePrefix + "experience"); resultSet = statement.executeQuery(); if (!resultSet.next()) { @@ -897,7 +947,7 @@ public final class SQLDatabaseManager implements DatabaseManager { + "`fishing` int(10) unsigned NOT NULL DEFAULT '0'," + "`alchemy` int(10) unsigned NOT NULL DEFAULT '0'," + "PRIMARY KEY (`user_id`)) " - + "DEFAULT CHARSET=latin1;"); + + "DEFAULT CHARSET=" + CHARSET_SQL + ";"); tryClose(createStatement); } tryClose(resultSet); @@ -907,9 +957,9 @@ public final class SQLDatabaseManager implements DatabaseManager { checkDatabaseStructure(connection, updateType); } - if (Config.getInstance().getTruncateSkills()) { - for (PrimarySkillType skill : PrimarySkillType.NON_CHILD_SKILLS) { - int cap = Config.getInstance().getLevelCap(skill); + if (mcMMO.p.getGeneralConfig().getTruncateSkills()) { + for (PrimarySkillType skill : SkillTools.NON_CHILD_SKILLS) { + int cap = mcMMO.p.getSkillTools().getLevelCap(skill); if (cap != Integer.MAX_VALUE) { statement = connection.prepareStatement("UPDATE `" + tablePrefix + "skills` SET `" + skill.name().toLowerCase(Locale.ENGLISH) + "` = " + cap + " WHERE `" + skill.name().toLowerCase(Locale.ENGLISH) + "` > " + cap); statement.executeUpdate(); @@ -982,7 +1032,7 @@ public final class SQLDatabaseManager implements DatabaseManager { break; case ADD_SQL_INDEXES: - checkUpgradeAddSQLIndexes(statement); +// checkUpgradeAddSQLIndexes(statement); break; case ADD_MOB_HEALTHBARS: @@ -1020,12 +1070,14 @@ public final class SQLDatabaseManager implements DatabaseManager { checkUpgradeAddUniqueChimaeraWing(statement); break; + case SQL_CHARSET_UTF8MB4: + updateCharacterSet(statement); + break; + default: break; } - - mcMMO.getUpgradeManager().setUpgradeCompleted(upgrade); } catch (SQLException ex) { printErrors(ex); @@ -1056,7 +1108,7 @@ public final class SQLDatabaseManager implements DatabaseManager { statement = connection.prepareStatement("INSERT IGNORE INTO " + tablePrefix + "huds (user_id, mobhealthbar, scoreboardtips) VALUES (?, ?, ?)"); statement.setInt(1, id); - statement.setString(2, Config.getInstance().getMobHealthbarDefault().name()); + statement.setString(2, mcMMO.p.getGeneralConfig().getMobHealthbarDefault().name()); statement.setInt(3, 0); statement.execute(); statement.close(); @@ -1072,8 +1124,8 @@ public final class SQLDatabaseManager implements DatabaseManager { private PlayerProfile loadFromResult(String playerName, ResultSet result) throws SQLException { Map skills = new EnumMap(PrimarySkillType.class); // Skill & Level Map skillsXp = new EnumMap(PrimarySkillType.class); // Skill & XP - Map skillsDATS = new EnumMap(SuperAbilityType.class); // Ability & Cooldown - Map uniqueData = new EnumMap(UniqueDataType.class); //Chimaera wing cooldown and other misc info + Map skillsDATS = new EnumMap<>(SuperAbilityType.class); // Ability & Cooldown + Map uniqueData = new EnumMap<>(UniqueDataType.class); //Chimaera wing cooldown and other misc info MobHealthbarType mobHealthbarType; UUID uuid; int scoreboardTipsShown; @@ -1126,14 +1178,6 @@ public final class SQLDatabaseManager implements DatabaseManager { skillsDATS.put(SuperAbilityType.BLAST_MINING, result.getInt(OFFSET_DATS + 12)); uniqueData.put(UniqueDataType.CHIMAERA_WING_DATS, result.getInt(OFFSET_DATS + 13)); - - try { - mobHealthbarType = MobHealthbarType.valueOf(result.getString(OFFSET_OTHER + 1)); - } - catch (Exception e) { - mobHealthbarType = Config.getInstance().getMobHealthbarDefault(); - } - try { scoreboardTipsShown = result.getInt(OFFSET_OTHER + 2); } @@ -1148,7 +1192,7 @@ public final class SQLDatabaseManager implements DatabaseManager { uuid = null; } - return new PlayerProfile(playerName, uuid, skills, skillsXp, skillsDATS, mobHealthbarType, scoreboardTipsShown, uniqueData); + return new PlayerProfile(playerName, uuid, skills, skillsXp, skillsDATS, scoreboardTipsShown, uniqueData, null); } private void printErrors(SQLException ex) { @@ -1182,6 +1226,7 @@ public final class SQLDatabaseManager implements DatabaseManager { statement.execute("ALTER TABLE `" + tablePrefix + "users` " + "DROP INDEX `user`," + "ADD INDEX `user` (`user`(20) ASC)"); + mcMMO.getUpgradeManager().setUpgradeCompleted(UpgradeType.DROP_NAME_UNIQUENESS); } catch (SQLException ex) { ex.printStackTrace(); } finally { @@ -1192,6 +1237,7 @@ public final class SQLDatabaseManager implements DatabaseManager { private void checkUpgradeAddAlchemy(final Statement statement) throws SQLException { try { statement.executeQuery("SELECT `alchemy` FROM `" + tablePrefix + "skills` LIMIT 1"); + mcMMO.getUpgradeManager().setUpgradeCompleted(UpgradeType.ADD_ALCHEMY); } catch (SQLException ex) { mcMMO.p.getLogger().info("Updating mcMMO MySQL tables for Alchemy..."); @@ -1203,6 +1249,7 @@ public final class SQLDatabaseManager implements DatabaseManager { private void checkUpgradeAddBlastMiningCooldown(final Statement statement) throws SQLException { try { statement.executeQuery("SELECT `blast_mining` FROM `" + tablePrefix + "cooldowns` LIMIT 1"); + mcMMO.getUpgradeManager().setUpgradeCompleted(UpgradeType.ADD_BLAST_MINING_COOLDOWN); } catch (SQLException ex) { mcMMO.p.getLogger().info("Updating mcMMO MySQL tables for Blast Mining..."); @@ -1213,6 +1260,7 @@ public final class SQLDatabaseManager implements DatabaseManager { private void checkUpgradeAddUniqueChimaeraWing(final Statement statement) throws SQLException { try { statement.executeQuery("SELECT `chimaera_wing` FROM `" + tablePrefix + "cooldowns` LIMIT 1"); + mcMMO.getUpgradeManager().setUpgradeCompleted(UpgradeType.ADD_UNIQUE_PLAYER_DATA); } catch (SQLException ex) { mcMMO.p.getLogger().info("Updating mcMMO MySQL tables for Chimaera Wing..."); @@ -1223,6 +1271,7 @@ public final class SQLDatabaseManager implements DatabaseManager { private void checkUpgradeAddFishing(final Statement statement) throws SQLException { try { statement.executeQuery("SELECT `fishing` FROM `" + tablePrefix + "skills` LIMIT 1"); + mcMMO.getUpgradeManager().setUpgradeCompleted(UpgradeType.ADD_FISHING); } catch (SQLException ex) { mcMMO.p.getLogger().info("Updating mcMMO MySQL tables for Fishing..."); @@ -1234,16 +1283,18 @@ public final class SQLDatabaseManager implements DatabaseManager { private void checkUpgradeAddMobHealthbars(final Statement statement) throws SQLException { try { statement.executeQuery("SELECT `mobhealthbar` FROM `" + tablePrefix + "huds` LIMIT 1"); + mcMMO.getUpgradeManager().setUpgradeCompleted(UpgradeType.ADD_MOB_HEALTHBARS); } catch (SQLException ex) { mcMMO.p.getLogger().info("Updating mcMMO MySQL tables for mob healthbars..."); - statement.executeUpdate("ALTER TABLE `" + tablePrefix + "huds` ADD `mobhealthbar` varchar(50) NOT NULL DEFAULT '" + Config.getInstance().getMobHealthbarDefault() + "'"); + statement.executeUpdate("ALTER TABLE `" + tablePrefix + "huds` ADD `mobhealthbar` varchar(50) NOT NULL DEFAULT '" + mcMMO.p.getGeneralConfig().getMobHealthbarDefault() + "'"); } } private void checkUpgradeAddScoreboardTips(final Statement statement) throws SQLException { try { statement.executeQuery("SELECT `scoreboardtips` FROM `" + tablePrefix + "huds` LIMIT 1"); + mcMMO.getUpgradeManager().setUpgradeCompleted(UpgradeType.ADD_SCOREBOARD_TIPS); } catch (SQLException ex) { mcMMO.p.getLogger().info("Updating mcMMO MySQL tables for scoreboard tips..."); @@ -1258,10 +1309,10 @@ public final class SQLDatabaseManager implements DatabaseManager { resultSet = statement.executeQuery("SHOW INDEX FROM `" + tablePrefix + "skills` WHERE `Key_name` LIKE 'idx\\_%'"); resultSet.last(); - if (resultSet.getRow() != PrimarySkillType.NON_CHILD_SKILLS.size()) { + if (resultSet.getRow() != SkillTools.NON_CHILD_SKILLS.size()) { mcMMO.p.getLogger().info("Indexing tables, this may take a while on larger databases"); - for (PrimarySkillType skill : PrimarySkillType.NON_CHILD_SKILLS) { + for (PrimarySkillType skill : SkillTools.NON_CHILD_SKILLS) { String skill_name = skill.name().toLowerCase(Locale.ENGLISH); try { @@ -1272,6 +1323,8 @@ public final class SQLDatabaseManager implements DatabaseManager { } } } + + mcMMO.getUpgradeManager().setUpgradeCompleted(UpgradeType.ADD_SQL_INDEXES); } catch (SQLException ex) { printErrors(ex); @@ -1301,7 +1354,11 @@ public final class SQLDatabaseManager implements DatabaseManager { mcMMO.p.getLogger().info("Adding UUIDs to mcMMO MySQL user table..."); statement.executeUpdate("ALTER TABLE `" + tablePrefix + "users` ADD `uuid` varchar(36) NULL DEFAULT NULL"); statement.executeUpdate("ALTER TABLE `" + tablePrefix + "users` ADD UNIQUE INDEX `uuid` (`uuid`) USING BTREE"); + + new GetUUIDUpdatesRequired().runTaskLaterAsynchronously(mcMMO.p, 100); // wait until after first purge } + + mcMMO.getUpgradeManager().setUpgradeCompleted(UpgradeType.ADD_UUIDS); } catch (SQLException ex) { printErrors(ex); @@ -1309,14 +1366,12 @@ public final class SQLDatabaseManager implements DatabaseManager { finally { tryClose(resultSet); } - - new GetUUIDUpdatesRequired().runTaskLaterAsynchronously(mcMMO.p, 100); // wait until after first purge } private class GetUUIDUpdatesRequired extends BukkitRunnable { public void run() { massUpdateLock.lock(); - List names = new ArrayList(); + List names = new ArrayList<>(); Connection connection = null; Statement statement = null; ResultSet resultSet = null; @@ -1338,7 +1393,9 @@ public final class SQLDatabaseManager implements DatabaseManager { } if (!names.isEmpty()) { - new UUIDUpdateAsyncTask(mcMMO.p, names).run(); + UUIDUpdateAsyncTask updateTask = new UUIDUpdateAsyncTask(mcMMO.p, names); + updateTask.start(); + updateTask.waitUntilFinished(); } } finally { massUpdateLock.unlock(); @@ -1366,6 +1423,8 @@ public final class SQLDatabaseManager implements DatabaseManager { mcMMO.p.getLogger().info("Removing party name from users table..."); statement.executeUpdate("ALTER TABLE `" + tablePrefix + "users` DROP COLUMN `party`"); } + + mcMMO.getUpgradeManager().setUpgradeCompleted(UpgradeType.DROP_SQL_PARTY_NAMES); } catch (SQLException ex) { printErrors(ex); @@ -1401,6 +1460,8 @@ public final class SQLDatabaseManager implements DatabaseManager { statement.executeUpdate("ALTER TABLE `" + tablePrefix + "skills` ADD INDEX `idx_total` (`total`) USING BTREE"); connection.commit(); } + + mcMMO.getUpgradeManager().setUpgradeCompleted(UpgradeType.ADD_SKILL_TOTAL); } catch (SQLException ex) { printErrors(ex); @@ -1432,6 +1493,8 @@ public final class SQLDatabaseManager implements DatabaseManager { mcMMO.p.getLogger().info("Removing Spout HUD type from huds table..."); statement.executeUpdate("ALTER TABLE `" + tablePrefix + "huds` DROP COLUMN `hudtype`"); } + + mcMMO.getUpgradeManager().setUpgradeCompleted(UpgradeType.DROP_SPOUT); } catch (SQLException ex) { printErrors(ex); @@ -1486,9 +1549,8 @@ public final class SQLDatabaseManager implements DatabaseManager { resultSet = statement.executeQuery(); if (resultSet.next()) { - int id = resultSet.getInt("id"); - return id; + return resultSet.getInt("id"); } } catch (SQLException ex) { @@ -1534,7 +1596,7 @@ public final class SQLDatabaseManager implements DatabaseManager { try { connection = getConnection(PoolIdentifier.MISC); statement = connection.prepareStatement("UPDATE " + tablePrefix + "huds SET mobhealthbar = ?"); - statement.setString(1, Config.getInstance().getMobHealthbarDefault().toString()); + statement.setString(1, mcMMO.p.getGeneralConfig().getMobHealthbarDefault().toString()); statement.executeUpdate(); } catch (SQLException ex) { @@ -1545,4 +1607,67 @@ public final class SQLDatabaseManager implements DatabaseManager { tryClose(connection); } } + + private void updateCharacterSet(@NotNull Statement statement) { + //TODO: Could check the tables for being latin1 before executing queries but it seems moot because it is likely the same computational effort + /* + The following columns were set to use latin1 historically (now utf8mb4) + column user in users + column uuid in users + + column mobhealthbar in huds + */ + + //Alter users table + mcMMO.p.getLogger().info("SQL Converting tables from latin1 to utf8mb4"); + + //Update "user" column + try { + mcMMO.p.getLogger().info("Updating user column to new encoding"); + statement.executeUpdate(getUpdateUserInUsersTableSQLQuery()); + + //Update "uuid" column + mcMMO.p.getLogger().info("Updating user column to new encoding"); + statement.executeUpdate(getUpdateUUIDInUsersTableSQLQuery()); + + //Update "mobhealthbar" column + mcMMO.p.getLogger().info("Updating mobhealthbar column to new encoding"); + statement.executeUpdate(getUpdateMobHealthBarInHudsTableSQLQuery()); + + mcMMO.getUpgradeManager().setUpgradeCompleted(UpgradeType.SQL_CHARSET_UTF8MB4); + + } catch (SQLException e) { + e.printStackTrace(); + } + } + + @NotNull + private String getUpdateUserInUsersTableSQLQuery() { + return "ALTER TABLE\n" + + " " + tablePrefix + "users\n" + + " CHANGE user user\n" + + " " + USER_VARCHAR + "\n" + + " CHARACTER SET utf8mb4\n" + + " COLLATE utf8mb4_unicode_ci;"; + } + + @NotNull + private String getUpdateUUIDInUsersTableSQLQuery() { + return "ALTER TABLE\n" + + " " + tablePrefix + "users\n" + + " CHANGE uuid uuid\n" + + " " + UUID_VARCHAR + "\n" + + " CHARACTER SET utf8mb4\n" + + " COLLATE utf8mb4_unicode_ci;"; + } + + @NotNull + private String getUpdateMobHealthBarInHudsTableSQLQuery() { + return "ALTER TABLE\n" + + " " + tablePrefix + "huds\n" + + " CHANGE mobhealthbar mobhealthbar\n" + + " " + MOBHEALTHBAR_VARCHAR + "\n" + + " CHARACTER SET utf8mb4\n" + + " COLLATE utf8mb4_unicode_ci;"; + } } diff --git a/src/main/java/com/gmail/nossr50/database/UserQuery.java b/src/main/java/com/gmail/nossr50/database/UserQuery.java new file mode 100644 index 000000000..4c6b5e730 --- /dev/null +++ b/src/main/java/com/gmail/nossr50/database/UserQuery.java @@ -0,0 +1,7 @@ +package com.gmail.nossr50.database; + +import org.jetbrains.annotations.NotNull; + +public interface UserQuery { + @NotNull UserQueryType getType(); +} diff --git a/src/main/java/com/gmail/nossr50/database/UserQueryFull.java b/src/main/java/com/gmail/nossr50/database/UserQueryFull.java new file mode 100644 index 000000000..47a3e965a --- /dev/null +++ b/src/main/java/com/gmail/nossr50/database/UserQueryFull.java @@ -0,0 +1,31 @@ +package com.gmail.nossr50.database; + +import org.jetbrains.annotations.NotNull; + +import java.util.UUID; + +public class UserQueryFull implements UserQueryUUID, UserQueryName { + + private final @NotNull String name; + private final @NotNull UUID uuid; + + public UserQueryFull(@NotNull String name, @NotNull UUID uuid) { + this.name = name; + this.uuid = uuid; + } + + @Override + public @NotNull UserQueryType getType() { + return UserQueryType.UUID_AND_NAME; + } + + @Override + public @NotNull String getName() { + return name; + } + + @Override + public @NotNull UUID getUUID() { + return uuid; + } +} diff --git a/src/main/java/com/gmail/nossr50/database/UserQueryName.java b/src/main/java/com/gmail/nossr50/database/UserQueryName.java new file mode 100644 index 000000000..60604101c --- /dev/null +++ b/src/main/java/com/gmail/nossr50/database/UserQueryName.java @@ -0,0 +1,7 @@ +package com.gmail.nossr50.database; + +import org.jetbrains.annotations.NotNull; + +public interface UserQueryName extends UserQuery { + @NotNull String getName(); +} diff --git a/src/main/java/com/gmail/nossr50/database/UserQueryNameImpl.java b/src/main/java/com/gmail/nossr50/database/UserQueryNameImpl.java new file mode 100644 index 000000000..fe7abf910 --- /dev/null +++ b/src/main/java/com/gmail/nossr50/database/UserQueryNameImpl.java @@ -0,0 +1,20 @@ +package com.gmail.nossr50.database; + +import org.jetbrains.annotations.NotNull; + +public class UserQueryNameImpl implements UserQueryName { + private final @NotNull String name; + + public UserQueryNameImpl(@NotNull String name) { + this.name = name; + } + + @Override + public @NotNull UserQueryType getType() { + return UserQueryType.NAME; + } + + public @NotNull String getName() { + return name; + } +} diff --git a/src/main/java/com/gmail/nossr50/database/UserQueryType.java b/src/main/java/com/gmail/nossr50/database/UserQueryType.java new file mode 100644 index 000000000..588dd76b0 --- /dev/null +++ b/src/main/java/com/gmail/nossr50/database/UserQueryType.java @@ -0,0 +1,7 @@ +package com.gmail.nossr50.database; + +public enum UserQueryType { + UUID_AND_NAME, + UUID, + NAME +} diff --git a/src/main/java/com/gmail/nossr50/database/UserQueryUUID.java b/src/main/java/com/gmail/nossr50/database/UserQueryUUID.java new file mode 100644 index 000000000..192997f90 --- /dev/null +++ b/src/main/java/com/gmail/nossr50/database/UserQueryUUID.java @@ -0,0 +1,11 @@ +package com.gmail.nossr50.database; + +import org.jetbrains.annotations.NotNull; + +import java.util.UUID; + +public interface UserQueryUUID extends UserQuery { + + @NotNull UUID getUUID(); + +} diff --git a/src/main/java/com/gmail/nossr50/database/UserQueryUUIDImpl.java b/src/main/java/com/gmail/nossr50/database/UserQueryUUIDImpl.java new file mode 100644 index 000000000..49ad038f5 --- /dev/null +++ b/src/main/java/com/gmail/nossr50/database/UserQueryUUIDImpl.java @@ -0,0 +1,23 @@ +package com.gmail.nossr50.database; + +import org.jetbrains.annotations.NotNull; + +import java.util.UUID; + +public class UserQueryUUIDImpl implements UserQueryUUID { + private final @NotNull UUID uuid; + + public UserQueryUUIDImpl(@NotNull UUID uuid) { + this.uuid = uuid; + } + + @Override + public @NotNull UserQueryType getType() { + return UserQueryType.UUID; + } + + @Override + public @NotNull UUID getUUID() { + return uuid; + } +} diff --git a/src/main/java/com/gmail/nossr50/database/flatfile/BadCategorizedFlatFileData.java b/src/main/java/com/gmail/nossr50/database/flatfile/BadCategorizedFlatFileData.java new file mode 100644 index 000000000..fbeaf9c2d --- /dev/null +++ b/src/main/java/com/gmail/nossr50/database/flatfile/BadCategorizedFlatFileData.java @@ -0,0 +1,42 @@ +package com.gmail.nossr50.database.flatfile; + +import com.gmail.nossr50.database.FlatFileDataFlag; +import com.google.common.base.Objects; +import org.jetbrains.annotations.NotNull; + +import java.util.Arrays; +import java.util.HashSet; + +public class BadCategorizedFlatFileData extends CategorizedFlatFileData { + private final boolean[] badDataIndexes; + + protected BadCategorizedFlatFileData(int uniqueProcessingId, @NotNull HashSet dataFlags, @NotNull String[] splitData, boolean[] badDataIndexes) { + super(uniqueProcessingId, dataFlags, splitData); + this.badDataIndexes = badDataIndexes; + } + + public boolean[] getBadDataIndexes() { + return badDataIndexes; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + if (!super.equals(o)) return false; + BadCategorizedFlatFileData that = (BadCategorizedFlatFileData) o; + return Objects.equal(badDataIndexes, that.badDataIndexes); + } + + @Override + public int hashCode() { + return Objects.hashCode(super.hashCode(), badDataIndexes); + } + + @Override + public String toString() { + return "BadCategorizedFlatFileData{" + + "badDataIndexes=" + Arrays.toString(badDataIndexes) + + '}'; + } +} diff --git a/src/main/java/com/gmail/nossr50/database/flatfile/CategorizedFlatFileData.java b/src/main/java/com/gmail/nossr50/database/flatfile/CategorizedFlatFileData.java new file mode 100644 index 000000000..500be9c4f --- /dev/null +++ b/src/main/java/com/gmail/nossr50/database/flatfile/CategorizedFlatFileData.java @@ -0,0 +1,58 @@ +package com.gmail.nossr50.database.flatfile; + +import com.gmail.nossr50.database.FlatFileDataFlag; +import com.google.common.base.Objects; +import org.jetbrains.annotations.NotNull; + +import java.util.HashSet; +import java.util.Set; + +public class CategorizedFlatFileData implements FlatFileDataContainer { + private final @NotNull Set dataFlags; + private final @NotNull String[] splitData; + private final int uniqueProcessingId; + + public CategorizedFlatFileData(int uniqueProcessingId, @NotNull HashSet dataFlags, @NotNull String[] splitData) { + this.uniqueProcessingId = uniqueProcessingId; + this.dataFlags = dataFlags; + this.splitData = splitData; + } + + public @NotNull Set getDataFlags() { + return dataFlags; + } + + public @NotNull String[] getSplitData() { + return splitData; + } + + public int getUniqueProcessingId() { + return uniqueProcessingId; + } + + public boolean isHealthyData() { + return dataFlags.size() == 0; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + CategorizedFlatFileData that = (CategorizedFlatFileData) o; + return uniqueProcessingId == that.uniqueProcessingId && Objects.equal(dataFlags, that.dataFlags) && Objects.equal(splitData, that.splitData); + } + + @Override + public int hashCode() { + return Objects.hashCode(dataFlags, splitData, uniqueProcessingId); + } + + @Override + public String toString() { + return "CategorizedFlatFileData{" + + "dataFlags=" + dataFlags + + ", stringDataRepresentation='" + splitData + '\'' + + ", uniqueProcessingId=" + uniqueProcessingId + + '}'; + } +} diff --git a/src/main/java/com/gmail/nossr50/database/flatfile/FlatFileDataBuilder.java b/src/main/java/com/gmail/nossr50/database/flatfile/FlatFileDataBuilder.java new file mode 100644 index 000000000..ed048d5e1 --- /dev/null +++ b/src/main/java/com/gmail/nossr50/database/flatfile/FlatFileDataBuilder.java @@ -0,0 +1,42 @@ +package com.gmail.nossr50.database.flatfile; + +import com.gmail.nossr50.database.FlatFileDataFlag; +import org.jetbrains.annotations.NotNull; + +import java.util.HashSet; + +public class FlatFileDataBuilder { + private final @NotNull HashSet dataFlags; + private @NotNull String[] splitStringData; + private final int uniqueProcessingId; + private boolean[] badDataValues; + + public FlatFileDataBuilder(@NotNull String[] splitStringData, int uniqueProcessingId) { + this.uniqueProcessingId = uniqueProcessingId; + this.splitStringData = splitStringData; + dataFlags = new HashSet<>(); + } + + public @NotNull FlatFileDataBuilder appendFlag(@NotNull FlatFileDataFlag dataFlag) { + dataFlags.add(dataFlag); + return this; + } + + public @NotNull FlatFileDataBuilder appendBadDataValues(boolean[] badDataValues) { + this.badDataValues = badDataValues; + return this; + } + + public @NotNull FlatFileDataContainer build() { + if(dataFlags.contains(FlatFileDataFlag.BAD_VALUES)) { + return new BadCategorizedFlatFileData(uniqueProcessingId, dataFlags, splitStringData, badDataValues); + } + + return new CategorizedFlatFileData(uniqueProcessingId, dataFlags, splitStringData); + } + + public @NotNull FlatFileDataBuilder setSplitStringData(@NotNull String[] splitStringData) { + this.splitStringData = splitStringData; + return this; + } +} diff --git a/src/main/java/com/gmail/nossr50/database/flatfile/FlatFileDataContainer.java b/src/main/java/com/gmail/nossr50/database/flatfile/FlatFileDataContainer.java new file mode 100644 index 000000000..e2fb2336c --- /dev/null +++ b/src/main/java/com/gmail/nossr50/database/flatfile/FlatFileDataContainer.java @@ -0,0 +1,21 @@ +package com.gmail.nossr50.database.flatfile; + +import com.gmail.nossr50.database.FlatFileDataFlag; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +import java.util.Set; + +public interface FlatFileDataContainer { + default @Nullable Set getDataFlags() { + return null; + } + + @NotNull String[] getSplitData(); + + int getUniqueProcessingId(); + + default boolean isHealthyData() { + return getDataFlags() == null || getDataFlags().size() == 0; + } +} diff --git a/src/main/java/com/gmail/nossr50/database/flatfile/FlatFileDataUtil.java b/src/main/java/com/gmail/nossr50/database/flatfile/FlatFileDataUtil.java new file mode 100644 index 000000000..e4048cdf0 --- /dev/null +++ b/src/main/java/com/gmail/nossr50/database/flatfile/FlatFileDataUtil.java @@ -0,0 +1,116 @@ +package com.gmail.nossr50.database.flatfile; + +import com.gmail.nossr50.database.FlatFileDataFlag; +import com.gmail.nossr50.database.FlatFileDatabaseManager; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +import static com.gmail.nossr50.database.FlatFileDatabaseManager.*; + +public class FlatFileDataUtil { + + public static @Nullable String[] getPreparedSaveDataLine(@NotNull FlatFileDataContainer dataContainer) { + if(dataContainer.getDataFlags() == null) { + return dataContainer.getSplitData(); + } + + //Data of this type is not salvageable + //TODO: Test that we ignore the things we are supposed to ignore + //TODO: Should we even keep track of the bad data or just not even build data containers for it? Making containers for it is only really useful for debugging.. well I suppose operations are typically async so it shouldn't matter + if(dataContainer.getDataFlags().contains(FlatFileDataFlag.CORRUPTED_OR_UNRECOGNIZABLE) + || dataContainer.getDataFlags().contains(FlatFileDataFlag.DUPLICATE_UUID) //For now we will not try to fix any issues with UUIDs + || dataContainer.getDataFlags().contains(FlatFileDataFlag.BAD_UUID_DATA) //For now we will not try to fix any issues with UUIDs + || dataContainer.getDataFlags().contains(FlatFileDataFlag.TOO_INCOMPLETE)) { + return null; + } + + String[] splitData; + + /* + * First fix the bad data values if they exist + */ + if(dataContainer instanceof BadCategorizedFlatFileData) { + BadCategorizedFlatFileData badData = (BadCategorizedFlatFileData) dataContainer; + splitData = repairBadData(dataContainer.getSplitData(), badData.getBadDataIndexes()); + } else { + splitData = dataContainer.getSplitData(); + } + + //Make sure we have as many values as we are supposed to + assert splitData.length == FlatFileDatabaseManager.DATA_ENTRY_COUNT; + return splitData; + } + + public static @NotNull String[] repairBadData(@NotNull String[] splitData, boolean[] badDataValues) { + for(int i = 0; i < FlatFileDatabaseManager.DATA_ENTRY_COUNT; i++) { + if(badDataValues[i]) { + //This data value was marked as bad so we zero initialize it + splitData[i] = getZeroInitialisedData(i, 0); + } + } + + return splitData; + } + + /** + * @param index "zero" Initialization will depend on what the index is for + * @return the "zero" initialized data corresponding to the index + */ + public static @NotNull String getZeroInitialisedData(int index, int startingLevel) throws IndexOutOfBoundsException { + switch(index) { + case USERNAME_INDEX: + return LEGACY_INVALID_OLD_USERNAME; //We'll keep using this value for legacy compatibility reasons (not sure if needed but don't care) + case 2: //Assumption: Used to be for something, no longer used + case 3: //Assumption: Used to be for something, no longer used + case 23: //Assumption: Used to be used for something, no longer used + case 33: //Assumption: Used to be used for something, no longer used + case LEGACY_LAST_LOGIN: + case HEALTHBAR: + return "IGNORED"; + case SKILLS_MINING: + case SKILLS_REPAIR: + case SKILLS_UNARMED: + case SKILLS_HERBALISM: + case SKILLS_EXCAVATION: + case SKILLS_ARCHERY: + case SKILLS_SWORDS: + case SKILLS_AXES: + case SKILLS_WOODCUTTING: + case SKILLS_ACROBATICS: + case SKILLS_TAMING: + case SKILLS_FISHING: + case SKILLS_ALCHEMY: + return String.valueOf(startingLevel); + case OVERHAUL_LAST_LOGIN: + return String.valueOf(-1L); + case COOLDOWN_BERSERK: + case COOLDOWN_GIGA_DRILL_BREAKER: + case COOLDOWN_TREE_FELLER: + case COOLDOWN_GREEN_TERRA: + case COOLDOWN_SERRATED_STRIKES: + case COOLDOWN_SKULL_SPLITTER: + case COOLDOWN_SUPER_BREAKER: + case COOLDOWN_BLAST_MINING: + case SCOREBOARD_TIPS: + case COOLDOWN_CHIMAERA_WING: + case EXP_MINING: + case EXP_WOODCUTTING: + case EXP_REPAIR: + case EXP_UNARMED: + case EXP_HERBALISM: + case EXP_EXCAVATION: + case EXP_ARCHERY: + case EXP_SWORDS: + case EXP_AXES: + case EXP_ACROBATICS: + case EXP_TAMING: + case EXP_FISHING: + case EXP_ALCHEMY: + return "0"; + case UUID_INDEX: + throw new IndexOutOfBoundsException(); //TODO: Add UUID recovery? Might not even be worth it. + } + + throw new IndexOutOfBoundsException(); + } +} diff --git a/src/main/java/com/gmail/nossr50/database/flatfile/LeaderboardStatus.java b/src/main/java/com/gmail/nossr50/database/flatfile/LeaderboardStatus.java new file mode 100644 index 000000000..9b3313d99 --- /dev/null +++ b/src/main/java/com/gmail/nossr50/database/flatfile/LeaderboardStatus.java @@ -0,0 +1,7 @@ +package com.gmail.nossr50.database.flatfile; + +public enum LeaderboardStatus { + TOO_SOON_TO_UPDATE, + UPDATED, + FAILED +} diff --git a/src/main/java/com/gmail/nossr50/datatypes/BlockLocationHistory.java b/src/main/java/com/gmail/nossr50/datatypes/BlockLocationHistory.java new file mode 100644 index 000000000..6674cd020 --- /dev/null +++ b/src/main/java/com/gmail/nossr50/datatypes/BlockLocationHistory.java @@ -0,0 +1,41 @@ +package com.gmail.nossr50.datatypes; + +import com.google.common.collect.HashMultiset; +import org.bukkit.Location; + +import java.util.LinkedList; + +/** + * This class works with the assumption that you only pass in Block Locations. If locations have differing pitch/yaw, the logic breaks + */ +public class BlockLocationHistory { + private final LinkedList limitedSizeOrderedList = new LinkedList<>(); + private final HashMultiset lookup = HashMultiset.create(); + private final int maxSize; + + public BlockLocationHistory(int maxSize) { + this.maxSize = maxSize; + } + + /** + * Adds a block location to the history. If the history memory would exceed the max size, it will remove the least recently added block location + * + * @param newItem + */ + public void add(Location newItem) { + limitedSizeOrderedList.addFirst(newItem); + lookup.add(newItem); + if (limitedSizeOrderedList.size() > maxSize) + lookup.remove(limitedSizeOrderedList.removeLast()); + } + + /** + * Returns true if the block location is in the recorded history + * + * @param targetLoc the block location to search for + * @return true if the block location is in the recorded history + */ + public boolean contains(Location targetLoc) { + return lookup.contains(targetLoc); + } +} diff --git a/src/main/java/com/gmail/nossr50/datatypes/BlockSnapshot.java b/src/main/java/com/gmail/nossr50/datatypes/BlockSnapshot.java index 83e572b41..ca60cc4a8 100644 --- a/src/main/java/com/gmail/nossr50/datatypes/BlockSnapshot.java +++ b/src/main/java/com/gmail/nossr50/datatypes/BlockSnapshot.java @@ -9,7 +9,7 @@ import org.bukkit.block.Block; */ public class BlockSnapshot { private final Material oldType; - private Block blockRef; + private final Block blockRef; public BlockSnapshot(Material oldType, Block blockRef) { this.oldType = oldType; diff --git a/src/main/java/com/gmail/nossr50/datatypes/LevelUpBroadcastPredicate.java b/src/main/java/com/gmail/nossr50/datatypes/LevelUpBroadcastPredicate.java new file mode 100644 index 000000000..51ab29a14 --- /dev/null +++ b/src/main/java/com/gmail/nossr50/datatypes/LevelUpBroadcastPredicate.java @@ -0,0 +1,99 @@ +package com.gmail.nossr50.datatypes; + +import com.gmail.nossr50.datatypes.party.Party; +import com.gmail.nossr50.datatypes.player.McMMOPlayer; +import com.gmail.nossr50.mcMMO; +import com.gmail.nossr50.util.Misc; +import com.gmail.nossr50.util.player.UserManager; +import org.bukkit.command.CommandSender; +import org.bukkit.entity.Player; +import org.jetbrains.annotations.NotNull; + +import java.util.function.Predicate; + +//TODO: Allow for offline players to broadcast +public class LevelUpBroadcastPredicate implements Predicate { + + private final @NotNull T broadcaster; + + public LevelUpBroadcastPredicate(@NotNull T broadcaster) { + this.broadcaster = broadcaster; + } + + @Override + public boolean test(@NotNull T t) { + Player broadcastingPlayer = (Player) broadcaster; //Always a player no need to check cast + + //Broadcaster should be online + if(!broadcastingPlayer.isOnline()) { + return false; + } + + McMMOPlayer mmoBroadcastingPlayer = UserManager.getPlayer(broadcastingPlayer); + + if(mmoBroadcastingPlayer == null) { + //This should never be null, but just in case... + mcMMO.p.getLogger().severe("McMMOPlayer was null for broadcaster in LevelUpBroadcastPredicate when it should never be null!"); + return false; + } + + if(t instanceof Player) { + Player listeningPlayer = (Player) t; + + //Party Member Check + if(mcMMO.p.getGeneralConfig().isLevelUpBroadcastsPartyMembersOnly()) { + McMMOPlayer mmoListeningPlayer = UserManager.getPlayer(listeningPlayer); + + if(mmoListeningPlayer == null) { + return false; //No profile so therefor no party + } + + Party playerWhoLeveledParty = mmoBroadcastingPlayer.getParty(); + Party broadcastRecipientParty = mmoListeningPlayer.getParty(); + + if(playerWhoLeveledParty == null || broadcastRecipientParty == null) { + return false; //No party on either player when being in the same party is required + } + + if(!playerWhoLeveledParty.equals(broadcastRecipientParty)) { + return false; //Not in the same party when it is required + } + } + + //Same world check + if(isLevelUpBroadcastsSameWorldOnly()) { + if(!mmoBroadcastingPlayer.getPlayer().getWorld().equals(listeningPlayer.getWorld())) { + return false; //Not in the same world when its required + } + + //Distance checks + if(mcMMO.p.getGeneralConfig().shouldLevelUpBroadcastsRestrictDistance()) { + if(!Misc.isNear(mmoBroadcastingPlayer.getPlayer().getLocation(), listeningPlayer.getLocation(), mcMMO.p.getGeneralConfig().getLevelUpBroadcastRadius())) { + return false; + } + } + } + + //Visibility checks + if(!listeningPlayer.canSee(mmoBroadcastingPlayer.getPlayer())) { + return false; //Player who leveled should be invisible to this player so don't send the message + } + + return true; + } else { + //Send out to console + return mcMMO.p.getGeneralConfig().shouldLevelUpBroadcastToConsole(); + } + } + + private static boolean isLevelUpBroadcastsSameWorldOnly() { + return mcMMO.p.getGeneralConfig().isLevelUpBroadcastsSameWorldOnly(); + } + + @Override + public String toString() { + return "LevelUpBroadcastPredicate{" + + "broadcaster=" + broadcaster + + '}'; + } +} diff --git a/src/main/java/com/gmail/nossr50/datatypes/LimitedSizeList.java b/src/main/java/com/gmail/nossr50/datatypes/LimitedSizeList.java deleted file mode 100644 index c57b4996f..000000000 --- a/src/main/java/com/gmail/nossr50/datatypes/LimitedSizeList.java +++ /dev/null @@ -1,57 +0,0 @@ -package com.gmail.nossr50.datatypes; - - -import org.bukkit.Location; - -public class LimitedSizeList { - public Location[] limitedSizeOrderedList; - private final int size; - - - 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; - } -} diff --git a/src/main/java/com/gmail/nossr50/datatypes/MobHealthbarType.java b/src/main/java/com/gmail/nossr50/datatypes/MobHealthbarType.java index 3c67df798..e46eb7af5 100644 --- a/src/main/java/com/gmail/nossr50/datatypes/MobHealthbarType.java +++ b/src/main/java/com/gmail/nossr50/datatypes/MobHealthbarType.java @@ -3,5 +3,5 @@ package com.gmail.nossr50.datatypes; public enum MobHealthbarType { HEARTS, BAR, - DISABLED; + DISABLED } \ No newline at end of file diff --git a/src/main/java/com/gmail/nossr50/datatypes/PowerLevelUpBroadcastPredicate.java b/src/main/java/com/gmail/nossr50/datatypes/PowerLevelUpBroadcastPredicate.java new file mode 100644 index 000000000..b50d731eb --- /dev/null +++ b/src/main/java/com/gmail/nossr50/datatypes/PowerLevelUpBroadcastPredicate.java @@ -0,0 +1,99 @@ +package com.gmail.nossr50.datatypes; + +import com.gmail.nossr50.datatypes.party.Party; +import com.gmail.nossr50.datatypes.player.McMMOPlayer; +import com.gmail.nossr50.mcMMO; +import com.gmail.nossr50.util.Misc; +import com.gmail.nossr50.util.player.UserManager; +import org.bukkit.command.CommandSender; +import org.bukkit.entity.Player; +import org.jetbrains.annotations.NotNull; + +import java.util.function.Predicate; + +//TODO: Allow for offline players to broadcast +public class PowerLevelUpBroadcastPredicate implements Predicate { + + private final @NotNull T broadcaster; + + public PowerLevelUpBroadcastPredicate(@NotNull T broadcaster) { + this.broadcaster = broadcaster; + } + + @Override + public boolean test(@NotNull T t) { + Player broadcastingPlayer = (Player) broadcaster; //Always a player no need to check cast + + //Broadcaster should be online + if(!broadcastingPlayer.isOnline()) { + return false; + } + + McMMOPlayer mmoBroadcastingPlayer = UserManager.getPlayer(broadcastingPlayer); + + if(mmoBroadcastingPlayer == null) { + //This should never be null, but just in case... + mcMMO.p.getLogger().severe("McMMOPlayer was null for broadcaster in LevelUpBroadcastPredicate when it should never be null!"); + return false; + } + + if(t instanceof Player) { + Player listeningPlayer = (Player) t; + + //Party Member Check + if(mcMMO.p.getGeneralConfig().isPowerLevelUpBroadcastsPartyMembersOnly()) { + McMMOPlayer mmoListeningPlayer = UserManager.getPlayer(listeningPlayer); + + if(mmoListeningPlayer == null) { + return false; //No profile so therefor no party + } + + Party playerWhoLeveledParty = mmoBroadcastingPlayer.getParty(); + Party broadcastRecipientParty = mmoListeningPlayer.getParty(); + + if(playerWhoLeveledParty == null || broadcastRecipientParty == null) { + return false; //No party on either player when being in the same party is required + } + + if(!playerWhoLeveledParty.equals(broadcastRecipientParty)) { + return false; //Not in the same party when it is required + } + } + + //Same world check + if(isPowerLevelUpBroadcastsSameWorldOnly()) { + if(!mmoBroadcastingPlayer.getPlayer().getWorld().equals(listeningPlayer.getWorld())) { + return false; //Not in the same world when its required + } + + //Distance checks + if(mcMMO.p.getGeneralConfig().shouldPowerLevelUpBroadcastsRestrictDistance()) { + if(!Misc.isNear(mmoBroadcastingPlayer.getPlayer().getLocation(), listeningPlayer.getLocation(), mcMMO.p.getGeneralConfig().getPowerLevelUpBroadcastRadius())) { + return false; + } + } + } + + //Visibility checks + if(!listeningPlayer.canSee(mmoBroadcastingPlayer.getPlayer())) { + return false; //Player who leveled should be invisible to this player so don't send the message + } + + return true; + } else { + //Send out to console + return mcMMO.p.getGeneralConfig().shouldPowerLevelUpBroadcastToConsole(); + } + } + + private static boolean isPowerLevelUpBroadcastsSameWorldOnly() { + return mcMMO.p.getGeneralConfig().isPowerLevelUpBroadcastsSameWorldOnly(); + } + + @Override + public String toString() { + return "PowerLevelUpBroadcastPredicate{" + + "broadcaster=" + broadcaster + + '}'; + } +} diff --git a/src/main/java/com/gmail/nossr50/datatypes/chat/ChatMode.java b/src/main/java/com/gmail/nossr50/datatypes/chat/ChatChannel.java similarity index 60% rename from src/main/java/com/gmail/nossr50/datatypes/chat/ChatMode.java rename to src/main/java/com/gmail/nossr50/datatypes/chat/ChatChannel.java index 1596faf2a..f6edfa5f0 100644 --- a/src/main/java/com/gmail/nossr50/datatypes/chat/ChatMode.java +++ b/src/main/java/com/gmail/nossr50/datatypes/chat/ChatChannel.java @@ -1,15 +1,18 @@ package com.gmail.nossr50.datatypes.chat; import com.gmail.nossr50.locale.LocaleLoader; +import org.jetbrains.annotations.Nullable; -public enum ChatMode { +public enum ChatChannel { ADMIN(LocaleLoader.getString("Commands.AdminChat.On"), LocaleLoader.getString("Commands.AdminChat.Off")), - PARTY(LocaleLoader.getString("Commands.Party.Chat.On"), LocaleLoader.getString("Commands.Party.Chat.Off")); + PARTY(LocaleLoader.getString("Commands.Party.Chat.On"), LocaleLoader.getString("Commands.Party.Chat.Off")), + PARTY_OFFICER(null, null), + NONE(null, null); - private String enabledMessage; - private String disabledMessage; + private final String enabledMessage; + private final String disabledMessage; - private ChatMode(String enabledMessage, String disabledMessage) { + ChatChannel(@Nullable String enabledMessage, @Nullable String disabledMessage) { this.enabledMessage = enabledMessage; this.disabledMessage = disabledMessage; } diff --git a/src/main/java/com/gmail/nossr50/datatypes/database/UpgradeType.java b/src/main/java/com/gmail/nossr50/datatypes/database/UpgradeType.java index c09864811..13faa75b7 100644 --- a/src/main/java/com/gmail/nossr50/datatypes/database/UpgradeType.java +++ b/src/main/java/com/gmail/nossr50/datatypes/database/UpgradeType.java @@ -14,4 +14,8 @@ public enum UpgradeType { DROP_NAME_UNIQUENESS, ADD_SKILL_TOTAL, ADD_UNIQUE_PLAYER_DATA, + FIX_SPELLING_NETHERITE_SALVAGE, + FIX_SPELLING_NETHERITE_REPAIR, + FIX_NETHERITE_SALVAGE_QUANTITIES, + SQL_CHARSET_UTF8MB4 } diff --git a/src/main/java/com/gmail/nossr50/datatypes/experience/SkillXpGain.java b/src/main/java/com/gmail/nossr50/datatypes/experience/SkillXpGain.java index a6d645f39..3ffb1cd94 100644 --- a/src/main/java/com/gmail/nossr50/datatypes/experience/SkillXpGain.java +++ b/src/main/java/com/gmail/nossr50/datatypes/experience/SkillXpGain.java @@ -2,6 +2,7 @@ package com.gmail.nossr50.datatypes.experience; import com.gmail.nossr50.config.experience.ExperienceConfig; import com.gmail.nossr50.datatypes.skills.PrimarySkillType; +import org.jetbrains.annotations.NotNull; import java.util.concurrent.Delayed; import java.util.concurrent.TimeUnit; @@ -40,7 +41,7 @@ public class SkillXpGain implements Delayed { } @Override - public int compareTo(Delayed other) { + public int compareTo(@NotNull Delayed other) { if (other instanceof SkillXpGain) { // Use more efficient method if possible (private fields) return this.compareTo((SkillXpGain) other); diff --git a/src/main/java/com/gmail/nossr50/datatypes/interactions/NotificationType.java b/src/main/java/com/gmail/nossr50/datatypes/interactions/NotificationType.java index 339621547..406dbe92f 100644 --- a/src/main/java/com/gmail/nossr50/datatypes/interactions/NotificationType.java +++ b/src/main/java/com/gmail/nossr50/datatypes/interactions/NotificationType.java @@ -1,5 +1,7 @@ package com.gmail.nossr50.datatypes.interactions; +import org.jetbrains.annotations.NotNull; + /** * This class helps define the types of information interactions we will have with players */ @@ -23,14 +25,14 @@ public enum NotificationType { CHAT_ONLY("ChatOnly"), PARTY_MESSAGE("PartyMessage"); - final String niceName; + private final String niceName; - NotificationType(String niceName) - { + NotificationType(@NotNull String niceName) { this.niceName = niceName; } @Override - public String toString() { + public @NotNull String toString() { return niceName; - }} + } +} diff --git a/src/main/java/com/gmail/nossr50/datatypes/json/McMMOUrl.java b/src/main/java/com/gmail/nossr50/datatypes/json/McMMOUrl.java index 4f4886aeb..8d9d4e634 100644 --- a/src/main/java/com/gmail/nossr50/datatypes/json/McMMOUrl.java +++ b/src/main/java/com/gmail/nossr50/datatypes/json/McMMOUrl.java @@ -6,7 +6,7 @@ public class McMMOUrl { public static final String urlPatreon = "https://www.patreon.com/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 final String urlTranslate = "https://translate.mcmmo.org/"; public static String getUrl(McMMOWebLinks webLinks) { diff --git a/src/main/java/com/gmail/nossr50/datatypes/json/McMMOWebLinks.java b/src/main/java/com/gmail/nossr50/datatypes/json/McMMOWebLinks.java index 0dbad85db..9648883fb 100644 --- a/src/main/java/com/gmail/nossr50/datatypes/json/McMMOWebLinks.java +++ b/src/main/java/com/gmail/nossr50/datatypes/json/McMMOWebLinks.java @@ -1,7 +1,7 @@ package com.gmail.nossr50.datatypes.json; import com.gmail.nossr50.locale.LocaleLoader; -import com.gmail.nossr50.util.StringUtils; +import com.gmail.nossr50.util.text.StringUtils; public enum McMMOWebLinks { WEBSITE, diff --git a/src/main/java/com/gmail/nossr50/datatypes/meta/RuptureTaskMeta.java b/src/main/java/com/gmail/nossr50/datatypes/meta/RuptureTaskMeta.java new file mode 100644 index 000000000..b484ce8cd --- /dev/null +++ b/src/main/java/com/gmail/nossr50/datatypes/meta/RuptureTaskMeta.java @@ -0,0 +1,25 @@ +package com.gmail.nossr50.datatypes.meta; + +import com.gmail.nossr50.runnables.skills.RuptureTask; +import org.bukkit.metadata.FixedMetadataValue; +import org.bukkit.plugin.Plugin; +import org.jetbrains.annotations.NotNull; + +public class RuptureTaskMeta extends FixedMetadataValue { + + private final @NotNull RuptureTask ruptureTask; + /** + * Initializes a FixedMetadataValue with an Object + * + * @param owningPlugin the {@link Plugin} that created this metadata value + * @param ruptureTask the value assigned to this metadata value + */ + public RuptureTaskMeta(@NotNull Plugin owningPlugin, @NotNull RuptureTask ruptureTask) { + super(owningPlugin, ruptureTask); + this.ruptureTask = ruptureTask; + } + + public @NotNull RuptureTask getRuptureTimerTask() { + return ruptureTask; + } +} diff --git a/src/main/java/com/gmail/nossr50/datatypes/meta/SuperAbilityToolMeta.java b/src/main/java/com/gmail/nossr50/datatypes/meta/SuperAbilityToolMeta.java new file mode 100644 index 000000000..b66f8dfef --- /dev/null +++ b/src/main/java/com/gmail/nossr50/datatypes/meta/SuperAbilityToolMeta.java @@ -0,0 +1,14 @@ +package com.gmail.nossr50.datatypes.meta; + +import com.gmail.nossr50.mcMMO; +import org.bukkit.metadata.FixedMetadataValue; + +/** + * Stores the original dig speed of a tool, also marks the tool as boosted by super abilities + */ +public class SuperAbilityToolMeta extends FixedMetadataValue { + + public SuperAbilityToolMeta(int value, mcMMO plugin) { + super(plugin, value); + } +} diff --git a/src/main/java/com/gmail/nossr50/datatypes/meta/UUIDMeta.java b/src/main/java/com/gmail/nossr50/datatypes/meta/UUIDMeta.java new file mode 100644 index 000000000..3ba795def --- /dev/null +++ b/src/main/java/com/gmail/nossr50/datatypes/meta/UUIDMeta.java @@ -0,0 +1,20 @@ +package com.gmail.nossr50.datatypes.meta; + +import org.bukkit.metadata.FixedMetadataValue; +import org.bukkit.plugin.Plugin; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +import java.util.UUID; + +public class UUIDMeta extends FixedMetadataValue { + /** + * Initializes a FixedMetadataValue with an Object + * + * @param owningPlugin the {@link Plugin} that created this metadata value + * @param value the value assigned to this metadata value + */ + public UUIDMeta(@NotNull Plugin owningPlugin, @Nullable UUID value) { + super(owningPlugin, value); + } +} diff --git a/src/main/java/com/gmail/nossr50/datatypes/mods/CustomBlock.java b/src/main/java/com/gmail/nossr50/datatypes/mods/CustomBlock.java index 65e9d6121..924c66415 100644 --- a/src/main/java/com/gmail/nossr50/datatypes/mods/CustomBlock.java +++ b/src/main/java/com/gmail/nossr50/datatypes/mods/CustomBlock.java @@ -1,9 +1,9 @@ package com.gmail.nossr50.datatypes.mods; public class CustomBlock { - private int xpGain; - private boolean canDoubleDrop; - private int smeltingXpGain; + private final int xpGain; + private final boolean canDoubleDrop; + private final int smeltingXpGain; public CustomBlock(int xpGain, boolean canDoubleDrop, int smeltingXpGain) { this.xpGain = xpGain; diff --git a/src/main/java/com/gmail/nossr50/datatypes/mods/CustomEntity.java b/src/main/java/com/gmail/nossr50/datatypes/mods/CustomEntity.java index 2d89d1547..c1b8fc118 100644 --- a/src/main/java/com/gmail/nossr50/datatypes/mods/CustomEntity.java +++ b/src/main/java/com/gmail/nossr50/datatypes/mods/CustomEntity.java @@ -3,12 +3,12 @@ package com.gmail.nossr50.datatypes.mods; import org.bukkit.inventory.ItemStack; public class CustomEntity { - private double xpMultiplier; - private boolean canBeTamed; - private int tamingXP; - private boolean canBeSummoned; - private ItemStack callOfTheWildItem; - private int callOfTheWildAmount; + private final double xpMultiplier; + private final boolean canBeTamed; + private final int tamingXP; + private final boolean canBeSummoned; + private final ItemStack callOfTheWildItem; + private final int callOfTheWildAmount; public CustomEntity(double xpMultiplier, boolean canBeTamed, int tamingXP, boolean canBeSummoned, ItemStack callOfTheWildItem, int callOfTheWildAmount) { this.xpMultiplier = xpMultiplier; diff --git a/src/main/java/com/gmail/nossr50/datatypes/mods/CustomTool.java b/src/main/java/com/gmail/nossr50/datatypes/mods/CustomTool.java index 93c24dfab..af02f90b4 100644 --- a/src/main/java/com/gmail/nossr50/datatypes/mods/CustomTool.java +++ b/src/main/java/com/gmail/nossr50/datatypes/mods/CustomTool.java @@ -1,9 +1,9 @@ package com.gmail.nossr50.datatypes.mods; public class CustomTool { - private double xpMultiplier; - private boolean abilityEnabled; - private int tier; + private final double xpMultiplier; + private final boolean abilityEnabled; + private final int tier; public CustomTool(int tier, boolean abilityEnabled, double xpMultiplier) { this.xpMultiplier = xpMultiplier; diff --git a/src/main/java/com/gmail/nossr50/datatypes/party/ItemShareType.java b/src/main/java/com/gmail/nossr50/datatypes/party/ItemShareType.java index faa1b6599..270421f14 100644 --- a/src/main/java/com/gmail/nossr50/datatypes/party/ItemShareType.java +++ b/src/main/java/com/gmail/nossr50/datatypes/party/ItemShareType.java @@ -2,7 +2,7 @@ package com.gmail.nossr50.datatypes.party; import com.gmail.nossr50.locale.LocaleLoader; import com.gmail.nossr50.util.ItemUtils; -import com.gmail.nossr50.util.StringUtils; +import com.gmail.nossr50.util.text.StringUtils; import org.bukkit.inventory.ItemStack; public enum ItemShareType { diff --git a/src/main/java/com/gmail/nossr50/datatypes/party/Party.java b/src/main/java/com/gmail/nossr50/datatypes/party/Party.java index 6629adc2d..edf661791 100644 --- a/src/main/java/com/gmail/nossr50/datatypes/party/Party.java +++ b/src/main/java/com/gmail/nossr50/datatypes/party/Party.java @@ -1,6 +1,6 @@ package com.gmail.nossr50.datatypes.party; -import com.gmail.nossr50.config.Config; +import com.gmail.nossr50.chat.SamePartyPredicate; import com.gmail.nossr50.config.experience.ExperienceConfig; import com.gmail.nossr50.datatypes.experience.FormulaType; import com.gmail.nossr50.datatypes.player.McMMOPlayer; @@ -9,30 +9,26 @@ import com.gmail.nossr50.mcMMO; import com.gmail.nossr50.party.PartyManager; import com.gmail.nossr50.util.EventUtils; import com.gmail.nossr50.util.Misc; -import com.gmail.nossr50.util.player.UserManager; import com.gmail.nossr50.util.sounds.SoundManager; import com.gmail.nossr50.util.sounds.SoundType; import org.bukkit.Bukkit; import org.bukkit.ChatColor; +import org.bukkit.OfflinePlayer; import org.bukkit.command.CommandSender; import org.bukkit.entity.Player; +import org.jetbrains.annotations.NotNull; import java.text.DecimalFormat; import java.util.ArrayList; import java.util.LinkedHashMap; import java.util.List; import java.util.UUID; -import java.util.stream.Collectors; +import java.util.function.Predicate; public class Party { -// private static final String ONLINE_PLAYER_PREFIX = "★"; -// private static final String ONLINE_PLAYER_PREFIX = "●" + ChatColor.RESET; - private static final String ONLINE_PLAYER_PREFIX = "⬤"; -// private static final String OFFLINE_PLAYER_PREFIX = "☆"; - private static final String OFFLINE_PLAYER_PREFIX = "○"; -// private static final String OFFLINE_PLAYER_PREFIX = "⭕" + ChatColor.RESET; - private final LinkedHashMap members = new LinkedHashMap(); - private final List onlineMembers = new ArrayList(); + private final @NotNull Predicate samePartyPredicate; + private final LinkedHashMap members = new LinkedHashMap<>(); + private final List onlineMembers = new ArrayList<>(); private PartyLeader leader; private String name; @@ -53,6 +49,7 @@ public class Party { public Party(String name) { this.name = name; + samePartyPredicate = new SamePartyPredicate<>(this); } public Party(PartyLeader leader, String name) { @@ -60,6 +57,7 @@ public class Party { this.name = name; this.locked = true; this.level = 0; + samePartyPredicate = new SamePartyPredicate<>(this); } public Party(PartyLeader leader, String name, String password) { @@ -68,6 +66,7 @@ public class Party { this.password = password; this.locked = true; this.level = 0; + samePartyPredicate = new SamePartyPredicate<>(this); } public Party(PartyLeader leader, String name, String password, boolean locked) { @@ -76,6 +75,7 @@ public class Party { this.password = password; this.locked = locked; this.level = 0; + samePartyPredicate = new SamePartyPredicate<>(this); } public LinkedHashMap getMembers() { @@ -101,7 +101,7 @@ public class Party { public List getOnlinePlayerNames(CommandSender sender) { Player player = sender instanceof Player ? (Player) sender : null; - List onlinePlayerNames = new ArrayList(); + List onlinePlayerNames = new ArrayList<>(); for (Player onlinePlayer : getOnlineMembers()) { if (player != null && player.canSee(onlinePlayer)) { @@ -141,7 +141,7 @@ public class Party { } public List getItemShareCategories() { - List shareCategories = new ArrayList(); + List shareCategories = new ArrayList<>(); for (ItemShareType shareType : ItemShareType.values()) { if (sharingDrops(shareType)) { @@ -203,7 +203,7 @@ public class Party { public int getXpToLevel() { FormulaType formulaType = ExperienceConfig.getInstance().getFormulaType(); - return (mcMMO.getFormulaManager().getXPtoNextLevel(level, formulaType)) * (getOnlineMembers().size() + Config.getInstance().getPartyXpCurveMultiplier()); + return (mcMMO.getFormulaManager().getXPtoNextLevel(level, formulaType)) * (getOnlineMembers().size() + mcMMO.p.getGeneralConfig().getPartyXpCurveMultiplier()); } public String getXpToLevelPercentage() { @@ -242,24 +242,24 @@ public class Party { return; } - if (!Config.getInstance().getPartyInformAllMembers()) { + if (!mcMMO.p.getGeneralConfig().getPartyInformAllMembers()) { Player leader = mcMMO.p.getServer().getPlayer(this.leader.getUniqueId()); if (leader != null) { leader.sendMessage(LocaleLoader.getString("Party.LevelUp", levelsGained, getLevel())); - if (Config.getInstance().getLevelUpSoundsEnabled()) { + if (mcMMO.p.getGeneralConfig().getLevelUpSoundsEnabled()) { SoundManager.sendSound(leader, leader.getLocation(), SoundType.LEVEL_UP); } } - return; + } else { + PartyManager.informPartyMembersLevelUp(this, levelsGained, getLevel()); } - PartyManager.informPartyMembersLevelUp(this, levelsGained, getLevel()); } public boolean hasReachedLevelCap() { - return Config.getInstance().getPartyLevelCap() < getLevel() + 1; + return mcMMO.p.getGeneralConfig().getPartyLevelCap() < getLevel() + 1; } public void setXpShareMode(ShareMode xpShareMode) { @@ -323,16 +323,15 @@ public class Party { break; default: - return; } } public boolean hasMember(String memberName) { - return this.getMembers().values().contains(memberName); + return this.getMembers().values().stream().anyMatch(memberName::equalsIgnoreCase); } public boolean hasMember(UUID uuid) { - return this.getMembers().keySet().contains(uuid); + return this.getMembers().containsKey(uuid); } /** @@ -344,168 +343,34 @@ public class Party { */ public String createMembersList(Player player) { StringBuilder memberList = new StringBuilder(); + List coloredNames = new ArrayList<>(); - List onlineMembers = members.keySet().stream() - .filter(x -> Bukkit.getOfflinePlayer(x).isOnline()) - .collect(Collectors.toList()); + for(UUID playerUUID : members.keySet()) { + OfflinePlayer offlinePlayer = Bukkit.getOfflinePlayer(playerUUID); - List offlineMembers = members.keySet().stream() - .filter(x -> !Bukkit.getOfflinePlayer(x).isOnline()) - .collect(Collectors.toList()); - - ArrayList visiblePartyList = new ArrayList<>(); - boolean isPartyLeaderOfflineOrHidden = false; - ArrayList offlineOrHiddenPartyList = new ArrayList<>(); - - for(UUID onlineMember : onlineMembers) - { - Player onlinePlayer = Bukkit.getPlayer(onlineMember); - - if(!isNotSamePerson(player.getUniqueId(), onlineMember) || player.canSee(onlinePlayer)) - { - visiblePartyList.add(onlineMember); + if(offlinePlayer.isOnline() && player.canSee((Player) offlinePlayer)) { + ChatColor onlineColor = leader.getUniqueId().equals(playerUUID) ? ChatColor.GOLD : ChatColor.GREEN; + coloredNames.add(onlineColor + offlinePlayer.getName()); } else { - //Party leader and cannot be seen by this player - if(isNotSamePerson(leader.getUniqueId(), player.getUniqueId()) && onlineMember == leader.getUniqueId()) - isPartyLeaderOfflineOrHidden = true; - - offlineOrHiddenPartyList.add(onlineMember); + coloredNames.add(ChatColor.DARK_GRAY + members.get(playerUUID)); } } - if(offlineMembers.contains(leader.getUniqueId())) - isPartyLeaderOfflineOrHidden = true; - - //Add all the actually offline members - offlineOrHiddenPartyList.addAll(offlineMembers); - - /* BUILD THE PARTY LIST WITH FORMATTING */ - - String partyLeaderPrefix = - /*ChatColor.WHITE - + "[" - +*/ ChatColor.GOLD - + "♕" - /*+ ChatColor.WHITE - + "]"*/ - + ChatColor.RESET; - - //First add the party leader - memberList.append(partyLeaderPrefix); - - List nearbyPlayerList = getNearMembers(UserManager.getPlayer(player)); - - boolean useDisplayNames = Config.getInstance().getPartyDisplayNames(); - - if(isPartyLeaderOfflineOrHidden) - { - if(isNotSamePerson(player.getUniqueId(), leader.getUniqueId())) - applyOnlineAndRangeFormatting(memberList, false, false); - - memberList.append(ChatColor.GRAY) - .append(leader.getPlayerName()); - } - else { - if(isNotSamePerson(leader.getUniqueId(), player.getUniqueId())) - applyOnlineAndRangeFormatting(memberList, true, nearbyPlayerList.contains(Bukkit.getPlayer(leader.getUniqueId()))); - - if(useDisplayNames) { - memberList.append(leader.getPlayerName()); - } else { - memberList.append(ChatColor.GOLD) - .append(Bukkit.getOfflinePlayer(leader.getUniqueId())); - } - } - - //Space - memberList.append(" "); - - //Now do online members - for(UUID onlinePlayerUUID : visiblePartyList) - { - if(onlinePlayerUUID == leader.getUniqueId()) - continue; - - if(isNotSamePerson(onlinePlayerUUID, player.getUniqueId())) - applyOnlineAndRangeFormatting(memberList, true, nearbyPlayerList.contains(Bukkit.getPlayer(onlinePlayerUUID))); - - if(useDisplayNames) - { - memberList.append(Bukkit.getPlayer(onlinePlayerUUID).getDisplayName()); - } - else - { - //Color allies green, players dark aqua - memberList.append(ChatColor.GREEN) - .append(Bukkit.getPlayer(onlinePlayerUUID).getName()); - } - - memberList.append(" ").append(ChatColor.RESET); - } - - for(UUID offlineOrHiddenPlayer : offlineOrHiddenPartyList) - { - if(offlineOrHiddenPlayer == leader.getUniqueId()) - continue; - - applyOnlineAndRangeFormatting(memberList, false, false); - - memberList.append(ChatColor.GRAY) - .append(Bukkit.getOfflinePlayer(offlineOrHiddenPlayer).getName()) - .append(" ").append(ChatColor.RESET); - } - - -// for (Player otherPlayer : this.getVisibleMembers(player)) { -// String memberName = otherPlayer.getName(); -// -// if (this.getLeader().getUniqueId().equals(otherPlayer.getUniqueId())) { -// memberList.append(ChatColor.GOLD); -// -// if (otherPlayer == null) { -// memberName = memberName.substring(0, 1) + ChatColor.GRAY + ChatColor.ITALIC + "" + memberName.substring(1); -// } -// } -// else if (otherPlayer != null) { -// memberList.append(ChatColor.WHITE); -// } -// else { -// memberList.append(ChatColor.GRAY); -// } -// -// if (player.getName().equalsIgnoreCase(otherPlayer.getName())) { -// memberList.append(ChatColor.ITALIC); -// } -// -// memberList.append(memberName).append(ChatColor.RESET).append(" "); -// } - + buildChatMessage(memberList, coloredNames.toArray(new String[0])); return memberList.toString(); } - private boolean isNotSamePerson(UUID onlinePlayerUUID, UUID uniqueId) { - return onlinePlayerUUID != uniqueId; - } - - private void applyOnlineAndRangeFormatting(StringBuilder stringBuilder, boolean isVisibleOrOnline, boolean isNear) - { - if(isVisibleOrOnline) - { - if(isNear) - { - stringBuilder.append(ChatColor.GREEN); + private void buildChatMessage(@NotNull StringBuilder stringBuilder, String @NotNull [] names) { + for(int i = 0; i < names.length; i++) { + if(i + 1 >= names.length) { + stringBuilder + .append(names[i]); } else { - stringBuilder.append(ChatColor.GRAY); + stringBuilder + .append(names[i]) + .append(" "); } - -// stringBuilder.append(ChatColor.BOLD); - stringBuilder.append(ONLINE_PLAYER_PREFIX); - } else { - stringBuilder.append(ChatColor.GRAY); - stringBuilder.append(OFFLINE_PLAYER_PREFIX); } - - stringBuilder.append(ChatColor.RESET); } /** @@ -515,12 +380,12 @@ public class Party { * @return the near party members */ public List getNearMembers(McMMOPlayer mcMMOPlayer) { - List nearMembers = new ArrayList(); + List nearMembers = new ArrayList<>(); Party party = mcMMOPlayer.getParty(); if (party != null) { Player player = mcMMOPlayer.getPlayer(); - double range = Config.getInstance().getPartyShareRange(); + double range = mcMMO.p.getGeneralConfig().getPartyShareRange(); for (Player member : party.getOnlineMembers()) { if (!player.equals(member) && member.isValid() && Misc.isNear(player.getLocation(), member.getLocation(), range)) { @@ -550,4 +415,8 @@ public class Party { return this.getName().equals(other.getName()); } + + public @NotNull Predicate getSamePartyPredicate() { + return samePartyPredicate; + } } diff --git a/src/main/java/com/gmail/nossr50/datatypes/party/PartyFeature.java b/src/main/java/com/gmail/nossr50/datatypes/party/PartyFeature.java index 55fa2688f..b50bfe852 100644 --- a/src/main/java/com/gmail/nossr50/datatypes/party/PartyFeature.java +++ b/src/main/java/com/gmail/nossr50/datatypes/party/PartyFeature.java @@ -1,10 +1,10 @@ package com.gmail.nossr50.datatypes.party; import com.gmail.nossr50.commands.party.PartySubcommandType; -import com.gmail.nossr50.config.Config; import com.gmail.nossr50.locale.LocaleLoader; +import com.gmail.nossr50.mcMMO; import com.gmail.nossr50.util.Permissions; -import com.gmail.nossr50.util.StringUtils; +import com.gmail.nossr50.util.text.StringUtils; import org.bukkit.entity.Player; public enum PartyFeature { @@ -19,7 +19,7 @@ public enum PartyFeature { } public String getFeatureLockedLocaleString() { - return LocaleLoader.getString("Ability.Generic.Template.Lock", LocaleLoader.getString("Party.Feature.Locked." + StringUtils.getPrettyPartyFeatureString(this).replace(" ", ""), Config.getInstance().getPartyFeatureUnlockLevel(this))); + return LocaleLoader.getString("Ability.Generic.Template.Lock", LocaleLoader.getString("Party.Feature.Locked." + StringUtils.getPrettyPartyFeatureString(this).replace(" ", ""), mcMMO.p.getGeneralConfig().getPartyFeatureUnlockLevel(this))); } public boolean hasPermission(Player player) { diff --git a/src/main/java/com/gmail/nossr50/datatypes/party/PartyLeader.java b/src/main/java/com/gmail/nossr50/datatypes/party/PartyLeader.java index 3292b3723..4317b83df 100644 --- a/src/main/java/com/gmail/nossr50/datatypes/party/PartyLeader.java +++ b/src/main/java/com/gmail/nossr50/datatypes/party/PartyLeader.java @@ -3,8 +3,8 @@ package com.gmail.nossr50.datatypes.party; import java.util.UUID; public class PartyLeader { - private UUID uuid; - private String playerName; + private final UUID uuid; + private final String playerName; public PartyLeader(UUID uuid, String playerName) { this.uuid = uuid; diff --git a/src/main/java/com/gmail/nossr50/datatypes/party/PartyTeleportRecord.java b/src/main/java/com/gmail/nossr50/datatypes/party/PartyTeleportRecord.java index 50c2f8fee..17d815a6b 100644 --- a/src/main/java/com/gmail/nossr50/datatypes/party/PartyTeleportRecord.java +++ b/src/main/java/com/gmail/nossr50/datatypes/party/PartyTeleportRecord.java @@ -1,6 +1,6 @@ package com.gmail.nossr50.datatypes.party; -import com.gmail.nossr50.config.Config; +import com.gmail.nossr50.mcMMO; import com.gmail.nossr50.util.Misc; import org.bukkit.entity.Player; @@ -12,7 +12,7 @@ public class PartyTeleportRecord { public PartyTeleportRecord() { requestor = null; enabled = true; - confirmRequired = Config.getInstance().getPTPCommandConfirmRequired(); + confirmRequired = mcMMO.p.getGeneralConfig().getPTPCommandConfirmRequired(); timeout = 0; lastUse = 0; } diff --git a/src/main/java/com/gmail/nossr50/datatypes/player/McMMOPlayer.java b/src/main/java/com/gmail/nossr50/datatypes/player/McMMOPlayer.java index d6da1bb03..3e0b6018f 100644 --- a/src/main/java/com/gmail/nossr50/datatypes/player/McMMOPlayer.java +++ b/src/main/java/com/gmail/nossr50/datatypes/player/McMMOPlayer.java @@ -1,25 +1,28 @@ package com.gmail.nossr50.datatypes.player; -import com.gmail.nossr50.config.AdvancedConfig; -import com.gmail.nossr50.config.Config; +import com.gmail.nossr50.api.exceptions.InvalidSkillException; +import com.gmail.nossr50.chat.author.PlayerAuthor; +import com.gmail.nossr50.config.ChatConfig; import com.gmail.nossr50.config.WorldBlacklist; import com.gmail.nossr50.config.experience.ExperienceConfig; -import com.gmail.nossr50.datatypes.chat.ChatMode; +import com.gmail.nossr50.datatypes.chat.ChatChannel; import com.gmail.nossr50.datatypes.experience.XPGainReason; import com.gmail.nossr50.datatypes.experience.XPGainSource; import com.gmail.nossr50.datatypes.interactions.NotificationType; +import com.gmail.nossr50.datatypes.meta.RuptureTaskMeta; import com.gmail.nossr50.datatypes.mods.CustomTool; import com.gmail.nossr50.datatypes.party.Party; import com.gmail.nossr50.datatypes.party.PartyTeleportRecord; import com.gmail.nossr50.datatypes.skills.PrimarySkillType; +import com.gmail.nossr50.datatypes.skills.SubSkillType; import com.gmail.nossr50.datatypes.skills.SuperAbilityType; import com.gmail.nossr50.datatypes.skills.ToolType; +import com.gmail.nossr50.events.experience.McMMOPlayerPreXpGainEvent; import com.gmail.nossr50.locale.LocaleLoader; import com.gmail.nossr50.mcMMO; import com.gmail.nossr50.party.PartyManager; import com.gmail.nossr50.party.ShareHandler; import com.gmail.nossr50.runnables.skills.AbilityDisableTask; -import com.gmail.nossr50.runnables.skills.BleedTimerTask; import com.gmail.nossr50.runnables.skills.ToolLowerTask; import com.gmail.nossr50.skills.SkillManager; import com.gmail.nossr50.skills.acrobatics.AcrobaticsManager; @@ -38,38 +41,46 @@ import com.gmail.nossr50.skills.swords.SwordsManager; import com.gmail.nossr50.skills.taming.TamingManager; import com.gmail.nossr50.skills.unarmed.UnarmedManager; import com.gmail.nossr50.skills.woodcutting.WoodcuttingManager; -import com.gmail.nossr50.util.EventUtils; -import com.gmail.nossr50.util.Misc; -import com.gmail.nossr50.util.Permissions; +import com.gmail.nossr50.util.*; import com.gmail.nossr50.util.experience.ExperienceBarManager; import com.gmail.nossr50.util.player.NotificationManager; import com.gmail.nossr50.util.player.UserManager; import com.gmail.nossr50.util.scoreboards.ScoreboardManager; -import com.gmail.nossr50.util.skills.ParticleEffectUtils; import com.gmail.nossr50.util.skills.PerksUtils; import com.gmail.nossr50.util.skills.RankUtils; +import com.gmail.nossr50.util.skills.SkillTools; import com.gmail.nossr50.util.skills.SkillUtils; import com.gmail.nossr50.util.sounds.SoundManager; import com.gmail.nossr50.util.sounds.SoundType; -import org.apache.commons.lang.Validate; +import net.kyori.adventure.identity.Identified; +import net.kyori.adventure.identity.Identity; +import org.bukkit.Bukkit; import org.bukkit.GameMode; import org.bukkit.Location; +import org.bukkit.block.Block; import org.bukkit.entity.Player; import org.bukkit.inventory.ItemStack; import org.bukkit.metadata.FixedMetadataValue; import org.bukkit.plugin.Plugin; +import org.checkerframework.checker.nullness.qual.NonNull; +import org.jetbrains.annotations.NotNull; -import java.util.HashMap; +import java.util.EnumMap; import java.util.Map; import java.util.Set; import java.util.UUID; -public class McMMOPlayer { - private Player player; - private PlayerProfile profile; +public class McMMOPlayer implements Identified { + private final @NotNull Identity identity; - private final Map skillManagers = new HashMap(); - private ExperienceBarManager experienceBarManager; + //Hacky fix for now, redesign later + private final @NotNull PlayerAuthor playerAuthor; + + private final Player player; + private final PlayerProfile profile; + + private final Map skillManagers = new EnumMap(PrimarySkillType.class); + private final ExperienceBarManager experienceBarManager; private Party party; private Party invite; @@ -78,8 +89,6 @@ public class McMMOPlayer { private PartyTeleportRecord ptpRecord; - private boolean partyChatMode; - private boolean adminChatMode; private boolean displaySkillNotifications = true; private boolean debugMode; @@ -87,10 +96,12 @@ public class McMMOPlayer { private boolean godMode; private boolean chatSpy = false; //Off by default - private final Map abilityMode = new HashMap(); - private final Map abilityInformed = new HashMap(); + private ChatChannel chatChannel; - private final Map toolMode = new HashMap(); + private final Map abilityMode = new EnumMap(SuperAbilityType.class); + private final Map abilityInformed = new EnumMap(SuperAbilityType.class); + + private final Map toolMode = new EnumMap(ToolType.class); private int recentlyHurt; private int respawnATS; @@ -102,11 +113,14 @@ public class McMMOPlayer { private boolean isUsingUnarmed; private final FixedMetadataValue playerMetadata; - private String playerName; + private final String playerName; + + private PrimarySkillType lastSkillShownScoreboard = PrimarySkillType.values()[0]; public McMMOPlayer(Player player, PlayerProfile profile) { this.playerName = player.getName(); UUID uuid = player.getUniqueId(); + identity = Identity.identity(uuid); this.player = player; playerMetadata = new FixedMetadataValue(mcMMO.p, playerName); @@ -116,20 +130,7 @@ public class McMMOPlayer { 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(); - mcMMO.p.getPluginLoader().disablePlugin(mcMMO.p); - } + initSkillManagers(); for (SuperAbilityType superAbilityType : SuperAbilityType.values()) { abilityMode.put(superAbilityType, false); @@ -144,6 +145,77 @@ public class McMMOPlayer { debugMode = false; //Debug mode helps solve support issues, players can toggle it on or off attackStrength = 1.0D; + + this.playerAuthor = new PlayerAuthor(player); + + this.chatChannel = ChatChannel.NONE; + + if(ChatConfig.getInstance().isSpyingAutomatic() && Permissions.adminChatSpy(getPlayer())) { + chatSpy = true; + } + } + + private void initSkillManagers() { + for(PrimarySkillType primarySkillType : PrimarySkillType.values()) { + try { + initManager(primarySkillType); + } catch (InvalidSkillException e) { + e.printStackTrace(); + } + } + } + + //TODO: Add test + private void initManager(PrimarySkillType primarySkillType) throws InvalidSkillException { + switch(primarySkillType) { + case ACROBATICS: + skillManagers.put(primarySkillType, new AcrobaticsManager(this)); + break; + case ALCHEMY: + skillManagers.put(primarySkillType, new AlchemyManager(this)); + break; + case ARCHERY: + skillManagers.put(primarySkillType, new ArcheryManager(this)); + break; + case AXES: + skillManagers.put(primarySkillType, new AxesManager(this)); + break; + case EXCAVATION: + skillManagers.put(primarySkillType, new ExcavationManager(this)); + break; + case FISHING: + skillManagers.put(primarySkillType, new FishingManager(this)); + break; + case HERBALISM: + skillManagers.put(primarySkillType, new HerbalismManager(this)); + break; + case MINING: + skillManagers.put(primarySkillType, new MiningManager(this)); + break; + case REPAIR: + skillManagers.put(primarySkillType, new RepairManager(this)); + break; + case SALVAGE: + skillManagers.put(primarySkillType, new SalvageManager(this)); + break; + case SMELTING: + skillManagers.put(primarySkillType, new SmeltingManager(this)); + break; + case SWORDS: + skillManagers.put(primarySkillType, new SwordsManager(this)); + break; + case TAMING: + skillManagers.put(primarySkillType, new TamingManager(this)); + break; + case UNARMED: + skillManagers.put(primarySkillType, new UnarmedManager(this)); + break; + case WOODCUTTING: + skillManagers.put(primarySkillType, new WoodcuttingManager(this)); + break; + default: + throw new InvalidSkillException("The skill named has no manager! Contact the devs!"); + } } public String getPlayerName() { @@ -154,22 +226,32 @@ public class McMMOPlayer { return attackStrength; } - public void setAttackStrength(double attackStrength) { - this.attackStrength = attackStrength; - } +// public void setAttackStrength(double attackStrength) { +// this.attackStrength = attackStrength; +// } /*public void hideXpBar(PrimarySkillType primarySkillType) { experienceBarManager.hideExperienceBar(primarySkillType); }*/ + public @NotNull PrimarySkillType getLastSkillShownScoreboard() { + return lastSkillShownScoreboard; + } + + public void setLastSkillShownScoreboard(PrimarySkillType primarySkillType) { + this.lastSkillShownScoreboard = primarySkillType; + } + public void processPostXpEvent(PrimarySkillType primarySkillType, Plugin plugin, XPGainSource xpGainSource) { //Check if they've reached the power level cap just now if(hasReachedPowerLevelCap()) { - NotificationManager.sendPlayerInformationChatOnly(player, "LevelCap.PowerLevel", String.valueOf(Config.getInstance().getPowerLevelCap())); + NotificationManager.sendPlayerInformationChatOnly(player, "LevelCap.PowerLevel", String.valueOf(mcMMO.p.getGeneralConfig().getPowerLevelCap())); } else if(hasReachedLevelCap(primarySkillType)) { - NotificationManager.sendPlayerInformationChatOnly(player, "LevelCap.Skill", String.valueOf(Config.getInstance().getLevelCap(primarySkillType)), primarySkillType.getName()); + NotificationManager.sendPlayerInformationChatOnly(player, "LevelCap.Skill", + String.valueOf(mcMMO.p.getSkillTools().getLevelCap(primarySkillType)), + mcMMO.p.getSkillTools().getLocalizedSkillName(primarySkillType)); } //Updates from Party sources @@ -190,23 +272,26 @@ public class McMMOPlayer { public void updateXPBar(PrimarySkillType primarySkillType, Plugin plugin) { - //Skill Unlock Notifications - - if(primarySkillType.isChildSkill()) - return; - //XP BAR UPDATES experienceBarManager.updateExperienceBar(primarySkillType, plugin); } public double getProgressInCurrentSkillLevel(PrimarySkillType primarySkillType) { + if(SkillTools.isChildSkill(primarySkillType)) { + return 1.0D; + } + double currentXP = profile.getSkillXpLevel(primarySkillType); double maxXP = profile.getXpToLevel(primarySkillType); return (currentXP / maxXP); } + public ExperienceBarManager getExperienceBarManager() { + return experienceBarManager; + } + public AcrobaticsManager getAcrobaticsManager() { return (AcrobaticsManager) skillManagers.get(PrimarySkillType.ACROBATICS); } @@ -482,9 +567,9 @@ public class McMMOPlayer { public int getPowerLevel() { int powerLevel = 0; - for (PrimarySkillType type : PrimarySkillType.NON_CHILD_SKILLS) { - if (type.getPermissions(player)) { - powerLevel += getSkillLevel(type); + for (PrimarySkillType primarySkillType : SkillTools.NON_CHILD_SKILLS) { + if (mcMMO.p.getSkillTools().doesPlayerHaveSkillPermission(player, primarySkillType)) { + powerLevel += getSkillLevel(primarySkillType); } } @@ -501,7 +586,7 @@ public class McMMOPlayer { if(hasReachedPowerLevelCap()) return true; - return getSkillLevel(primarySkillType) >= Config.getInstance().getLevelCap(primarySkillType); + return getSkillLevel(primarySkillType) >= mcMMO.p.getSkillTools().getLevelCap(primarySkillType); } /** @@ -510,7 +595,7 @@ public class McMMOPlayer { * @return true if they have reached the power level cap */ public boolean hasReachedPowerLevelCap() { - return this.getPowerLevel() >= Config.getInstance().getPowerLevelCap(); + return this.getPowerLevel() >= mcMMO.p.getGeneralConfig().getPowerLevelCap(); } /** @@ -520,18 +605,16 @@ public class McMMOPlayer { * @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) { + if(xp <= 0) { return; } - if (skill.isChildSkill()) { + if (SkillTools.isChildSkill(skill)) { Set parentSkills = FamilyTree.getParents(skill); float splitXp = xp / parentSkills.size(); for (PrimarySkillType parentSkill : parentSkills) { - if (parentSkill.getPermissions(player)) { + if (mcMMO.p.getSkillTools().doesPlayerHaveSkillPermission(player, parentSkill)) { beginXpGain(parentSkill, splitXp, xpGainReason, xpGainSource); } } @@ -559,11 +642,11 @@ public class McMMOPlayer { applyXpGain(skill, modifyXpGain(skill, xp), xpGainReason, xpGainSource); - if (party == null) { + if (party == null || party.hasReachedLevelCap()) { return; } - if (!Config.getInstance().getPartyXpNearMembersNeeded() || !PartyManager.getNearMembers(this).isEmpty()) { + if (!mcMMO.p.getGeneralConfig().getPartyXpNearMembersNeeded() || !PartyManager.getNearMembers(this).isEmpty()) { party.applyXpGain(modifyXpGain(skill, xp)); } } @@ -575,11 +658,15 @@ public class McMMOPlayer { * @param xp Experience amount to add */ public void applyXpGain(PrimarySkillType primarySkillType, float xp, XPGainReason xpGainReason, XPGainSource xpGainSource) { - if (!primarySkillType.getPermissions(player)) { + if (!mcMMO.p.getSkillTools().doesPlayerHaveSkillPermission(player, primarySkillType)) { return; } - if (primarySkillType.isChildSkill()) { + final McMMOPlayerPreXpGainEvent mcMMOPlayerPreXpGainEvent = new McMMOPlayerPreXpGainEvent(player, primarySkillType, xp, xpGainReason); + Bukkit.getPluginManager().callEvent(mcMMOPlayerPreXpGainEvent); + xp = mcMMOPlayerPreXpGainEvent.getXpGained(); + + if (SkillTools.isChildSkill(primarySkillType)) { Set parentSkills = FamilyTree.getParents(primarySkillType); for (PrimarySkillType parentSkill : parentSkills) { @@ -624,11 +711,11 @@ public class McMMOPlayer { levelsGained++; } - if (EventUtils.tryLevelChangeEvent(player, primarySkillType, levelsGained, xpRemoved, true, xpGainReason)) { + if (EventUtils.tryLevelChangeEvent(this, primarySkillType, levelsGained, xpRemoved, true, xpGainReason)) { return; } - if (Config.getInstance().getLevelUpSoundsEnabled()) { + if (mcMMO.p.getGeneralConfig().getLevelUpSoundsEnabled()) { SoundManager.sendSound(player, player.getLocation(), SoundType.LEVEL_UP); } @@ -735,73 +822,6 @@ public class McMMOPlayer { 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; } @@ -814,13 +834,15 @@ public class McMMOPlayer { * @return Modified experience */ private float modifyXpGain(PrimarySkillType primarySkillType, float xp) { - if ((primarySkillType.getMaxLevel() <= getSkillLevel(primarySkillType)) || (Config.getInstance().getPowerLevelCap() <= getPowerLevel())) { + //TODO: A rare situation can occur where the default Power Level cap can prevent a player with one skill edited to something silly like Integer.MAX_VALUE from gaining XP in any skill, we may need to represent power level with another data type + if ((mcMMO.p.getSkillTools().getLevelCap(primarySkillType) <= getSkillLevel(primarySkillType)) + || (mcMMO.p.getGeneralConfig().getPowerLevelCap() <= getPowerLevel())) { return 0; } - xp = (float) (xp / primarySkillType.getXpModifier() * ExperienceConfig.getInstance().getExperienceGainsGlobalMultiplier()); + xp = (float) (xp / ExperienceConfig.getInstance().getFormulaSkillModifier(primarySkillType) * ExperienceConfig.getInstance().getExperienceGainsGlobalMultiplier()); - if (Config.getInstance().getToolModsEnabled()) { + if (mcMMO.p.getGeneralConfig().getToolModsEnabled()) { CustomTool tool = mcMMO.getModManager().getTool(player.getInventory().getItemInMainHand()); if (tool != null) { @@ -849,35 +871,36 @@ public class McMMOPlayer { /** * Check to see if an ability can be activated. * - * @param skill The skill the ability is based on + * @param primarySkillType The skill the ability is based on */ - public void checkAbilityActivation(PrimarySkillType skill) { - ToolType tool = skill.getTool(); - SuperAbilityType ability = skill.getAbility(); + public void checkAbilityActivation(PrimarySkillType primarySkillType) { + ToolType tool = mcMMO.p.getSkillTools().getPrimarySkillToolType(primarySkillType); + SuperAbilityType superAbilityType = mcMMO.p.getSkillTools().getSuperAbility(primarySkillType); + SubSkillType subSkillType = superAbilityType.getSubSkillTypeDefinition(); - if (getAbilityMode(ability) || !ability.getPermissions(player)) { + if (getAbilityMode(superAbilityType) || !superAbilityType.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())) + if(!RankUtils.hasUnlockedSubskill(player, subSkillType)) { - int diff = RankUtils.getSuperAbilityUnlockRequirement(skill.getAbility()) - getSkillLevel(skill); + int diff = RankUtils.getSuperAbilityUnlockRequirement(superAbilityType) - getSkillLevel(primarySkillType); //Inform the player they are not yet skilled enough - NotificationManager.sendPlayerInformation(player, NotificationType.ABILITY_COOLDOWN, "Skills.AbilityGateRequirementFail", String.valueOf(diff), skill.getName()); + NotificationManager.sendPlayerInformation(player, NotificationType.ABILITY_COOLDOWN, "Skills.AbilityGateRequirementFail", String.valueOf(diff), mcMMO.p.getSkillTools().getLocalizedSkillName(primarySkillType)); return; } - int timeRemaining = calculateTimeRemaining(ability); + int timeRemaining = calculateTimeRemaining(superAbilityType); 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) { + if (primarySkillType == PrimarySkillType.WOODCUTTING || primarySkillType == PrimarySkillType.AXES) { NotificationManager.sendPlayerInformation(player, NotificationType.ABILITY_COOLDOWN, "Skills.TooTired", String.valueOf(timeRemaining)); //SoundManager.sendSound(player, player.getLocation(), SoundType.TIRED); } @@ -885,52 +908,58 @@ public class McMMOPlayer { return; } - if (EventUtils.callPlayerAbilityActivateEvent(player, skill).isCancelled()) { + if (EventUtils.callPlayerAbilityActivateEvent(player, primarySkillType).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 abilityLengthVar = mcMMO.p.getAdvancedConfig().getAbilityLength(); + int abilityLengthCap = mcMMO.p.getAdvancedConfig().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()); + ticks = PerksUtils.handleActivationPerks(player, 2 + (Math.min(abilityLengthCap, getSkillLevel(primarySkillType)) / abilityLengthVar), superAbilityType.getMaxLength()); } else { - ticks = PerksUtils.handleActivationPerks(player, 2 + (getSkillLevel(skill) / abilityLengthVar), ability.getMaxLength()); + ticks = PerksUtils.handleActivationPerks(player, 2 + (getSkillLevel(primarySkillType) / abilityLengthVar), superAbilityType.getMaxLength()); } - // Notify people that ability has been activated - ParticleEffectUtils.playAbilityEnabledEffect(player); - if (useChatNotifications()) { - NotificationManager.sendPlayerInformation(player, NotificationType.SUPER_ABILITY, ability.getAbilityOn()); + NotificationManager.sendPlayerInformation(player, NotificationType.SUPER_ABILITY, superAbilityType.getAbilityOn()); //player.sendMessage(ability.getAbilityOn()); } - SkillUtils.sendSkillMessage(player, NotificationType.SUPER_ABILITY_ALERT_OTHERS, ability.getAbilityPlayer()); + if (mcMMO.p.getAdvancedConfig().sendAbilityNotificationToOtherPlayers()) { + SkillUtils.sendSkillMessage(player, NotificationType.SUPER_ABILITY_ALERT_OTHERS, superAbilityType.getAbilityPlayer()); + } //Sounds SoundManager.worldSendSound(player.getWorld(), player.getLocation(), SoundType.ABILITY_ACTIVATED_GENERIC); + //If the current item is still buffed somehow, remove it to prevent enchantments from stacking. + if (superAbilityType == SuperAbilityType.SUPER_BREAKER || superAbilityType == SuperAbilityType.GIGA_DRILL_BREAKER) + SkillUtils.removeAbilityBuff(player.getInventory().getItemInMainHand()); // Enable the ability - profile.setAbilityDATS(ability, System.currentTimeMillis() + (ticks * Misc.TIME_CONVERSION_FACTOR)); - setAbilityMode(ability, true); + profile.setAbilityDATS(superAbilityType, System.currentTimeMillis() + (ticks * Misc.TIME_CONVERSION_FACTOR)); + setAbilityMode(superAbilityType, true); - if (ability == SuperAbilityType.SUPER_BREAKER || ability == SuperAbilityType.GIGA_DRILL_BREAKER) { + if (superAbilityType == SuperAbilityType.SUPER_BREAKER || superAbilityType == SuperAbilityType.GIGA_DRILL_BREAKER) { SkillUtils.handleAbilitySpeedIncrease(player); } setToolPreparationMode(tool, false); - new AbilityDisableTask(this, ability).runTaskLater(mcMMO.p, ticks * Misc.TICK_CONVERSION_FACTOR); + new AbilityDisableTask(this, superAbilityType).runTaskLater(mcMMO.p, ticks * Misc.TICK_CONVERSION_FACTOR); } - public void processAbilityActivation(PrimarySkillType skill) { - if (Config.getInstance().getAbilitiesOnlyActivateWhenSneaking() && !player.isSneaking()) { + public void processAbilityActivation(@NotNull PrimarySkillType primarySkillType) { + if (!mcMMO.p.getSkillTools().doesPlayerHaveSkillPermission(getPlayer(), primarySkillType)) { + return; + } + + if (mcMMO.p.getGeneralConfig().getAbilitiesOnlyActivateWhenSneaking() && !player.isSneaking()) { return; } @@ -950,25 +979,36 @@ public class McMMOPlayer { } } - SuperAbilityType ability = skill.getAbility(); - ToolType tool = skill.getTool(); + SuperAbilityType ability = mcMMO.p.getSkillTools().getSuperAbility(primarySkillType); + ToolType tool = mcMMO.p.getSkillTools().getPrimarySkillToolType(primarySkillType); /* * 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) { + if (primarySkillType != PrimarySkillType.WOODCUTTING && primarySkillType != PrimarySkillType.AXES) { int timeRemaining = calculateTimeRemaining(ability); - if (!getAbilityMode(ability) && timeRemaining > 0) { + if (isAbilityOnCooldown(ability)) { NotificationManager.sendPlayerInformation(player, NotificationType.ABILITY_COOLDOWN, "Skills.TooTired", String.valueOf(timeRemaining)); return; } } - if (Config.getInstance().getAbilityMessagesEnabled()) { - NotificationManager.sendPlayerInformation(player, NotificationType.TOOL, tool.getRaiseTool()); + if (mcMMO.p.getGeneralConfig().getAbilityMessagesEnabled()) { + /* + * + * IF THE TOOL IS AN AXE + * + */ + if(tool == ToolType.AXE) { + processAxeToolMessages(); + } else { + NotificationManager.sendPlayerInformation(player, NotificationType.TOOL, tool.getRaiseTool()); + } + + //Send Sound SoundManager.sendSound(player, player.getLocation(), SoundType.TOOL_READY); } @@ -977,6 +1017,53 @@ public class McMMOPlayer { } } + public void processAxeToolMessages() { + Block rayCast = player.getTargetBlock(null, 100); + + /* + * IF BOTH TREE FELLER & SKULL SPLITTER ARE ON CD + */ + if(isAbilityOnCooldown(SuperAbilityType.TREE_FELLER) && isAbilityOnCooldown(SuperAbilityType.SKULL_SPLITTER)) { + tooTiredMultiple(PrimarySkillType.WOODCUTTING, SubSkillType.WOODCUTTING_TREE_FELLER, SuperAbilityType.TREE_FELLER, SubSkillType.AXES_SKULL_SPLITTER, SuperAbilityType.SKULL_SPLITTER); + /* + * IF TREE FELLER IS ON CD + * AND PLAYER IS LOOKING AT TREE + */ + } else if(isAbilityOnCooldown(SuperAbilityType.TREE_FELLER) + && BlockUtils.isPartOfTree(rayCast)) { + raiseToolWithCooldowns(SubSkillType.WOODCUTTING_TREE_FELLER, SuperAbilityType.TREE_FELLER); + + /* + * IF SKULL SPLITTER IS ON CD + */ + } else if(isAbilityOnCooldown(SuperAbilityType.SKULL_SPLITTER)) { + raiseToolWithCooldowns(SubSkillType.AXES_SKULL_SPLITTER, SuperAbilityType.SKULL_SPLITTER); + } else { + NotificationManager.sendPlayerInformation(player, NotificationType.TOOL, ToolType.AXE.getRaiseTool()); + } + } + + private void tooTiredMultiple(PrimarySkillType primarySkillType, SubSkillType aSubSkill, SuperAbilityType aSuperAbility, SubSkillType bSubSkill, SuperAbilityType bSuperAbility) { + String aSuperAbilityCD = LocaleLoader.getString("Skills.TooTired.Named", aSubSkill.getLocaleName(), String.valueOf(calculateTimeRemaining(aSuperAbility))); + String bSuperAbilityCD = LocaleLoader.getString("Skills.TooTired.Named", bSubSkill.getLocaleName(), String.valueOf(calculateTimeRemaining(bSuperAbility))); + String allCDStr = aSuperAbilityCD + ", " + bSuperAbilityCD; + + NotificationManager.sendPlayerInformation(player, NotificationType.TOOL, "Skills.TooTired.Extra", + mcMMO.p.getSkillTools().getLocalizedSkillName(primarySkillType), + allCDStr); + } + + private void raiseToolWithCooldowns(SubSkillType subSkillType, SuperAbilityType superAbilityType) { + NotificationManager.sendPlayerInformation(player, NotificationType.TOOL, + "Axes.Ability.Ready.Extra", + subSkillType.getLocaleName(), + String.valueOf(calculateTimeRemaining(superAbilityType))); + } + + public boolean isAbilityOnCooldown(SuperAbilityType ability) { + return !getAbilityMode(ability) && calculateTimeRemaining(ability) > 0; + } + /** * Calculate the time remaining until the ability's cooldown expires. * @@ -1047,7 +1134,15 @@ public class McMMOPlayer { */ public void logout(boolean syncSave) { Player thisPlayer = getPlayer(); - BleedTimerTask.bleedOut(getPlayer()); + if(getPlayer().hasMetadata(MetadataConstants.METADATA_KEY_RUPTURE)) { + RuptureTaskMeta ruptureTaskMeta = (RuptureTaskMeta) getPlayer().getMetadata(MetadataConstants.METADATA_KEY_RUPTURE).get(0); + + //Punish a logout + ruptureTaskMeta.getRuptureTimerTask().endRupture(); + ruptureTaskMeta.getRuptureTimerTask().endRupture(); + ruptureTaskMeta.getRuptureTimerTask().endRupture(); + } + cleanup(); if (syncSave) { @@ -1058,7 +1153,7 @@ public class McMMOPlayer { UserManager.remove(thisPlayer); - if(Config.getInstance().getScoreboardsEnabled()) + if(mcMMO.p.getGeneralConfig().getScoreboardsEnabled()) ScoreboardManager.teardownPlayer(thisPlayer); if (inParty()) { @@ -1079,4 +1174,35 @@ public class McMMOPlayer { resetAbilityMode(); getTamingManager().cleanupAllSummons(); } + + /** + * For use with Adventure API (Kyori lib) + * @return this players identity + */ + @Override + public @NonNull Identity identity() { + return identity; + } + + + /** + * The {@link com.gmail.nossr50.chat.author.Author} for this player, used by mcMMO chat + * @return the {@link com.gmail.nossr50.chat.author.Author} for this player + */ + public @NotNull PlayerAuthor getPlayerAuthor() { + return playerAuthor; + } + + public @NotNull ChatChannel getChatChannel() { + return chatChannel; + } + + /** + * Change the chat channel for a player + * This does not inform the player + * @param chatChannel new chat channel + */ + public void setChatMode(@NotNull ChatChannel chatChannel) { + this.chatChannel = chatChannel; + } } diff --git a/src/main/java/com/gmail/nossr50/datatypes/player/PlayerProfile.java b/src/main/java/com/gmail/nossr50/datatypes/player/PlayerProfile.java index a9582c095..7f383ed61 100644 --- a/src/main/java/com/gmail/nossr50/datatypes/player/PlayerProfile.java +++ b/src/main/java/com/gmail/nossr50/datatypes/player/PlayerProfile.java @@ -1,9 +1,6 @@ package com.gmail.nossr50.datatypes.player; -import com.gmail.nossr50.config.AdvancedConfig; -import com.gmail.nossr50.config.Config; import com.gmail.nossr50.config.experience.ExperienceConfig; -import com.gmail.nossr50.datatypes.MobHealthbarType; import com.gmail.nossr50.datatypes.experience.FormulaType; import com.gmail.nossr50.datatypes.experience.SkillXpGain; import com.gmail.nossr50.datatypes.skills.PrimarySkillType; @@ -12,9 +9,12 @@ import com.gmail.nossr50.mcMMO; import com.gmail.nossr50.runnables.player.PlayerProfileSaveTask; import com.gmail.nossr50.skills.child.FamilyTree; import com.gmail.nossr50.util.player.UserManager; +import com.gmail.nossr50.util.skills.SkillTools; import com.google.common.collect.ImmutableMap; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; -import java.util.HashMap; +import java.util.EnumMap; import java.util.Map; import java.util.Set; import java.util.UUID; @@ -22,65 +22,75 @@ import java.util.concurrent.DelayQueue; public class PlayerProfile { private final String playerName; - private UUID uuid; + private @Nullable UUID uuid; private boolean loaded; private volatile boolean changed; /* HUDs */ - private MobHealthbarType mobHealthbarType; private int scoreboardTipsShown; private int saveAttempts = 0; + private @Nullable Long lastLogin; + /* Skill Data */ - private final Map skills = new HashMap(); // Skill & Level - private final Map skillsXp = new HashMap(); // Skill & XP - private final Map abilityDATS = new HashMap(); // Ability & Cooldown - private final Map uniquePlayerData = new HashMap<>(); //Misc data that doesn't fit into other categories (chimaera wing, etc..) + private final Map skills = new EnumMap<>(PrimarySkillType.class); // Skill & Level + private final Map skillsXp = new EnumMap<>(PrimarySkillType.class); // Skill & XP + private final Map abilityDATS = new EnumMap(SuperAbilityType.class); // Ability & Cooldown + private final Map uniquePlayerData = new EnumMap(UniqueDataType.class); //Misc data that doesn't fit into other categories (chimaera wing, etc..) // Store previous XP gains for diminished returns - private DelayQueue gainedSkillsXp = new DelayQueue(); - private HashMap rollingSkillsXp = new HashMap(); + private final DelayQueue gainedSkillsXp = new DelayQueue<>(); + private final Map rollingSkillsXp = new EnumMap(PrimarySkillType.class); @Deprecated public PlayerProfile(String playerName) { - this(playerName, null); + this(playerName, null, 0); } + @Deprecated public PlayerProfile(String playerName, UUID uuid) { + this(playerName, uuid, 0); + } + + @Deprecated + public PlayerProfile(String playerName, int startingLevel) { + this(playerName, null, startingLevel); + } + + public PlayerProfile(String playerName, @Nullable UUID uuid, int startingLevel) { this.uuid = uuid; this.playerName = playerName; - mobHealthbarType = Config.getInstance().getMobHealthbarDefault(); scoreboardTipsShown = 0; for (SuperAbilityType superAbilityType : SuperAbilityType.values()) { abilityDATS.put(superAbilityType, 0); } - for (PrimarySkillType primarySkillType : PrimarySkillType.NON_CHILD_SKILLS) { - skills.put(primarySkillType, AdvancedConfig.getInstance().getStartingLevel()); + for (PrimarySkillType primarySkillType : SkillTools.NON_CHILD_SKILLS) { + skills.put(primarySkillType, startingLevel); skillsXp.put(primarySkillType, 0F); } //Misc Cooldowns uniquePlayerData.put(UniqueDataType.CHIMAERA_WING_DATS, 0); //Chimaera wing + lastLogin = System.currentTimeMillis(); } @Deprecated - public PlayerProfile(String playerName, boolean isLoaded) { - this(playerName); + public PlayerProfile(@NotNull String playerName, boolean isLoaded, int startingLvl) { + this(playerName, startingLvl); this.loaded = isLoaded; } - public PlayerProfile(String playerName, UUID uuid, boolean isLoaded) { - this(playerName, uuid); + public PlayerProfile(@NotNull String playerName, UUID uuid, boolean isLoaded, int startingLvl) { + this(playerName, uuid, startingLvl); this.loaded = isLoaded; } - public PlayerProfile(String playerName, UUID uuid, Map levelData, Map xpData, Map cooldownData, MobHealthbarType mobHealthbarType, int scoreboardTipsShown, Map uniqueProfileData) { + public PlayerProfile(@NotNull String playerName, @Nullable UUID uuid, Map levelData, Map xpData, Map cooldownData, int scoreboardTipsShown, Map uniqueProfileData, @Nullable Long lastLogin) { this.playerName = playerName; this.uuid = uuid; - this.mobHealthbarType = mobHealthbarType; this.scoreboardTipsShown = scoreboardTipsShown; skills.putAll(levelData); @@ -89,16 +99,15 @@ public class PlayerProfile { uniquePlayerData.putAll(uniqueProfileData); loaded = true; + + if(lastLogin != null) + this.lastLogin = lastLogin; } public void scheduleAsyncSave() { new PlayerProfileSaveTask(this, false).runTaskAsynchronously(mcMMO.p); } - public void scheduleSyncSave() { - new PlayerProfileSaveTask(this, true).runTask(mcMMO.p); - } - public void scheduleAsyncSaveDelay() { new PlayerProfileSaveTask(this, false).runTaskLaterAsynchronously(mcMMO.p, 20); } @@ -115,14 +124,13 @@ public class PlayerProfile { } // TODO should this part be synchronized? - PlayerProfile profileCopy = new PlayerProfile(playerName, uuid, ImmutableMap.copyOf(skills), ImmutableMap.copyOf(skillsXp), ImmutableMap.copyOf(abilityDATS), mobHealthbarType, scoreboardTipsShown, ImmutableMap.copyOf(uniquePlayerData)); + PlayerProfile profileCopy = new PlayerProfile(playerName, uuid, ImmutableMap.copyOf(skills), ImmutableMap.copyOf(skillsXp), ImmutableMap.copyOf(abilityDATS), scoreboardTipsShown, ImmutableMap.copyOf(uniquePlayerData), lastLogin); changed = !mcMMO.getDatabaseManager().saveUser(profileCopy); if (changed) { mcMMO.p.getLogger().severe("PlayerProfile saving failed for player: " + playerName + " " + uuid); - if(saveAttempts > 0) - { + if(saveAttempts > 0) { mcMMO.p.getLogger().severe("Attempted to save profile for player "+getPlayerName() + " resulted in failure. "+saveAttempts+" have been made so far."); } @@ -131,12 +139,12 @@ public class PlayerProfile { { saveAttempts++; - if(useSync) - scheduleSyncSave(); //Execute sync saves immediately + //Back out of async saving if we detect a server shutdown, this is not always going to be caught + if(mcMMO.isServerShutdownExecuted() || useSync) + new PlayerProfileSaveTask(this, true).runTask(mcMMO.p); else - scheduleAsyncSaveDelay(); + scheduleAsyncSave(); - return; } else { mcMMO.p.getLogger().severe("mcMMO has failed to save the profile for " +getPlayerName()+" numerous times." + @@ -149,6 +157,23 @@ public class PlayerProfile { } } + /** + * Get this users last login, will return current java.lang.System#currentTimeMillis() if it doesn't exist + * @return the last login + * @deprecated This is only function for FlatFileDB atm and its only here for unit testing right now + */ + @Deprecated + public @NotNull Long getLastLogin() { + if(lastLogin == null) + return -1L; + else + return lastLogin; + } + + public void updateLastLogin() { + this.lastLogin = System.currentTimeMillis(); + } + public String getPlayerName() { return playerName; } @@ -167,20 +192,6 @@ public class PlayerProfile { return loaded; } - /* - * Mob Healthbars - */ - - public MobHealthbarType getMobHealthbarType() { - return mobHealthbarType; - } - - public void setMobHealthbarType(MobHealthbarType mobHealthbarType) { - markProfileDirty(); - - this.mobHealthbarType = mobHealthbarType; - } - /** * Marks the profile as "dirty" which flags a profile to be saved in the next save operation */ @@ -248,9 +259,7 @@ public class PlayerProfile { protected void resetCooldowns() { markProfileDirty(); - for (SuperAbilityType ability : abilityDATS.keySet()) { - abilityDATS.put(ability, 0); - } + abilityDATS.replaceAll((a, v) -> 0); } /* @@ -258,7 +267,7 @@ public class PlayerProfile { */ public int getSkillLevel(PrimarySkillType skill) { - return skill.isChildSkill() ? getChildSkillLevel(skill) : skills.get(skill); + return SkillTools.isChildSkill(skill) ? getChildSkillLevel(skill) : skills.get(skill); } public float getSkillXpLevelRaw(PrimarySkillType skill) { @@ -266,11 +275,15 @@ public class PlayerProfile { } public int getSkillXpLevel(PrimarySkillType skill) { + if(SkillTools.isChildSkill(skill)) { + return 0; + } + return (int) Math.floor(getSkillXpLevelRaw(skill)); } public void setSkillXpLevel(PrimarySkillType skill, float xpLevel) { - if (skill.isChildSkill()) { + if (SkillTools.isChildSkill(skill)) { return; } @@ -297,7 +310,7 @@ public class PlayerProfile { * @param xp Amount of xp to remove */ public void removeXp(PrimarySkillType skill, int xp) { - if (skill.isChildSkill()) { + if (SkillTools.isChildSkill(skill)) { return; } @@ -307,7 +320,7 @@ public class PlayerProfile { } public void removeXp(PrimarySkillType skill, float xp) { - if (skill.isChildSkill()) { + if (SkillTools.isChildSkill(skill)) { return; } @@ -323,7 +336,7 @@ public class PlayerProfile { * @param level New level value for the skill */ public void modifySkill(PrimarySkillType skill, int level) { - if (skill.isChildSkill()) { + if (SkillTools.isChildSkill(skill)) { return; } @@ -356,7 +369,7 @@ public class PlayerProfile { public void addXp(PrimarySkillType skill, float xp) { markProfileDirty(); - if (skill.isChildSkill()) { + if (SkillTools.isChildSkill(skill)) { Set parentSkills = FamilyTree.getParents(skill); float dividedXP = (xp / parentSkills.size()); @@ -415,6 +428,10 @@ public class PlayerProfile { * @return the total amount of Xp until next level */ public int getXpToLevel(PrimarySkillType primarySkillType) { + if(SkillTools.isChildSkill(primarySkillType)) { + return 0; + } + int level = (ExperienceConfig.getInstance().getCumulativeCurveEnabled()) ? UserManager.getPlayer(playerName).getPowerLevel() : skills.get(primarySkillType); FormulaType formulaType = ExperienceConfig.getInstance().getFormulaType(); @@ -426,7 +443,7 @@ public class PlayerProfile { int sum = 0; for (PrimarySkillType parent : parents) { - sum += Math.min(getSkillLevel(parent), parent.getMaxLevel()); + sum += Math.min(getSkillLevel(parent), mcMMO.p.getSkillTools().getLevelCap(parent)); } return sum / parents.size(); diff --git a/src/main/java/com/gmail/nossr50/datatypes/skills/ItemType.java b/src/main/java/com/gmail/nossr50/datatypes/skills/ItemType.java index f0d786d73..b6f99cc4f 100644 --- a/src/main/java/com/gmail/nossr50/datatypes/skills/ItemType.java +++ b/src/main/java/com/gmail/nossr50/datatypes/skills/ItemType.java @@ -3,5 +3,5 @@ package com.gmail.nossr50.datatypes.skills; public enum ItemType { ARMOR, TOOL, - OTHER; + OTHER } diff --git a/src/main/java/com/gmail/nossr50/datatypes/skills/MaterialType.java b/src/main/java/com/gmail/nossr50/datatypes/skills/MaterialType.java index 2e6157a1f..26e0f17d9 100644 --- a/src/main/java/com/gmail/nossr50/datatypes/skills/MaterialType.java +++ b/src/main/java/com/gmail/nossr50/datatypes/skills/MaterialType.java @@ -10,7 +10,7 @@ public enum MaterialType { IRON, GOLD, DIAMOND, - NETHER, + NETHERITE, OTHER; public Material getDefaultMaterial() { @@ -36,11 +36,11 @@ public enum MaterialType { case DIAMOND: return Material.DIAMOND; - case NETHER: - if(Material.getMaterial("netherite_scrap") != null) - return Material.getMaterial("netherite_scrap"); + case NETHERITE: + if(Material.getMaterial("NETHERITE_SCRAP") != null) + return Material.getMaterial("NETHERITE_SCRAP"); else - return Material.GOLD_INGOT; + return Material.DIAMOND; case OTHER: default: diff --git a/src/main/java/com/gmail/nossr50/datatypes/skills/PrimarySkillType.java b/src/main/java/com/gmail/nossr50/datatypes/skills/PrimarySkillType.java index 75fd7540f..22ab7f4a6 100644 --- a/src/main/java/com/gmail/nossr50/datatypes/skills/PrimarySkillType.java +++ b/src/main/java/com/gmail/nossr50/datatypes/skills/PrimarySkillType.java @@ -1,252 +1,251 @@ package com.gmail.nossr50.datatypes.skills; -import com.gmail.nossr50.config.Config; -import com.gmail.nossr50.config.experience.ExperienceConfig; -import com.gmail.nossr50.locale.LocaleLoader; +import com.gmail.nossr50.config.GeneralConfig; import com.gmail.nossr50.mcMMO; -import com.gmail.nossr50.skills.SkillManager; -import com.gmail.nossr50.skills.acrobatics.AcrobaticsManager; -import com.gmail.nossr50.skills.alchemy.AlchemyManager; -import com.gmail.nossr50.skills.archery.ArcheryManager; -import com.gmail.nossr50.skills.axes.AxesManager; -import com.gmail.nossr50.skills.excavation.ExcavationManager; -import com.gmail.nossr50.skills.fishing.FishingManager; -import com.gmail.nossr50.skills.herbalism.HerbalismManager; -import com.gmail.nossr50.skills.mining.MiningManager; -import com.gmail.nossr50.skills.repair.RepairManager; -import com.gmail.nossr50.skills.salvage.SalvageManager; -import com.gmail.nossr50.skills.smelting.SmeltingManager; -import com.gmail.nossr50.skills.swords.SwordsManager; -import com.gmail.nossr50.skills.taming.TamingManager; -import com.gmail.nossr50.skills.unarmed.UnarmedManager; -import com.gmail.nossr50.skills.woodcutting.WoodcuttingManager; import com.gmail.nossr50.util.Permissions; -import com.gmail.nossr50.util.StringUtils; -import com.gmail.nossr50.util.skills.RankUtils; -import com.google.common.collect.ImmutableList; -import org.bukkit.Color; +import com.gmail.nossr50.util.skills.SkillTools; import org.bukkit.entity.Entity; import org.bukkit.entity.Player; -import org.bukkit.entity.Tameable; +import org.jetbrains.annotations.NotNull; import java.util.ArrayList; -import java.util.Collections; import java.util.List; public enum PrimarySkillType { - ACROBATICS(AcrobaticsManager.class, Color.WHITE, - ImmutableList.of(SubSkillType.ACROBATICS_DODGE, SubSkillType.ACROBATICS_ROLL)), - ALCHEMY(AlchemyManager.class, Color.FUCHSIA, - ImmutableList.of(SubSkillType.ALCHEMY_CATALYSIS, SubSkillType.ALCHEMY_CONCOCTIONS)), - ARCHERY(ArcheryManager.class, Color.MAROON, - ImmutableList.of(SubSkillType.ARCHERY_DAZE, SubSkillType.ARCHERY_ARCHERY_LIMIT_BREAK, SubSkillType.ARCHERY_ARROW_RETRIEVAL, SubSkillType.ARCHERY_SKILL_SHOT)), - AXES(AxesManager.class, Color.AQUA, SuperAbilityType.SKULL_SPLITTER, ToolType.AXE, - ImmutableList.of(SubSkillType.AXES_SKULL_SPLITTER, SubSkillType.AXES_AXES_LIMIT_BREAK, SubSkillType.AXES_ARMOR_IMPACT, SubSkillType.AXES_AXE_MASTERY, SubSkillType.AXES_CRITICAL_STRIKES, SubSkillType.AXES_GREATER_IMPACT)), - EXCAVATION(ExcavationManager.class, Color.fromRGB(139, 69, 19), SuperAbilityType.GIGA_DRILL_BREAKER, ToolType.SHOVEL, - ImmutableList.of(SubSkillType.EXCAVATION_GIGA_DRILL_BREAKER, SubSkillType.EXCAVATION_ARCHAEOLOGY)), - FISHING(FishingManager.class, Color.NAVY, - ImmutableList.of(SubSkillType.FISHING_FISHERMANS_DIET, SubSkillType.FISHING_TREASURE_HUNTER, SubSkillType.FISHING_ICE_FISHING, SubSkillType.FISHING_MAGIC_HUNTER, SubSkillType.FISHING_MASTER_ANGLER, SubSkillType.FISHING_SHAKE)), - HERBALISM(HerbalismManager.class, Color.GREEN, SuperAbilityType.GREEN_TERRA, ToolType.HOE, - ImmutableList.of(SubSkillType.HERBALISM_GREEN_TERRA, SubSkillType.HERBALISM_FARMERS_DIET, SubSkillType.HERBALISM_GREEN_THUMB, SubSkillType.HERBALISM_DOUBLE_DROPS, SubSkillType.HERBALISM_HYLIAN_LUCK, SubSkillType.HERBALISM_SHROOM_THUMB)), - MINING(MiningManager.class, Color.GRAY, SuperAbilityType.SUPER_BREAKER, ToolType.PICKAXE, - ImmutableList.of(SubSkillType.MINING_SUPER_BREAKER, SubSkillType.MINING_DEMOLITIONS_EXPERTISE, SubSkillType.MINING_BIGGER_BOMBS, SubSkillType.MINING_BLAST_MINING, SubSkillType.MINING_DOUBLE_DROPS)), - REPAIR(RepairManager.class, Color.SILVER, - ImmutableList.of(SubSkillType.REPAIR_ARCANE_FORGING, SubSkillType.REPAIR_REPAIR_MASTERY, SubSkillType.REPAIR_SUPER_REPAIR)), - SALVAGE(SalvageManager.class, Color.ORANGE, - ImmutableList.of(SubSkillType.SALVAGE_SCRAP_COLLECTOR, SubSkillType.SALVAGE_ARCANE_SALVAGE)), - SMELTING(SmeltingManager.class, Color.YELLOW, - ImmutableList.of(SubSkillType.SMELTING_UNDERSTANDING_THE_ART, /*SubSkillType.SMELTING_FLUX_MINING,*/ SubSkillType.SMELTING_FUEL_EFFICIENCY, SubSkillType.SMELTING_SECOND_SMELT)), - SWORDS(SwordsManager.class, Color.fromRGB(178, 34, 34), SuperAbilityType.SERRATED_STRIKES, ToolType.SWORD, - ImmutableList.of(SubSkillType.SWORDS_SERRATED_STRIKES, SubSkillType.SWORDS_SWORDS_LIMIT_BREAK, SubSkillType.SWORDS_STAB, SubSkillType.SWORDS_RUPTURE, SubSkillType.SWORDS_COUNTER_ATTACK)), - TAMING(TamingManager.class, Color.PURPLE, - ImmutableList.of(SubSkillType.TAMING_BEAST_LORE, SubSkillType.TAMING_CALL_OF_THE_WILD, SubSkillType.TAMING_ENVIRONMENTALLY_AWARE, SubSkillType.TAMING_FAST_FOOD_SERVICE, SubSkillType.TAMING_GORE, SubSkillType.TAMING_HOLY_HOUND, SubSkillType.TAMING_SHARPENED_CLAWS, SubSkillType.TAMING_SHOCK_PROOF, SubSkillType.TAMING_THICK_FUR, SubSkillType.TAMING_PUMMEL)), - UNARMED(UnarmedManager.class, Color.BLACK, SuperAbilityType.BERSERK, ToolType.FISTS, - ImmutableList.of(SubSkillType.UNARMED_BERSERK, SubSkillType.UNARMED_UNARMED_LIMIT_BREAK, SubSkillType.UNARMED_BLOCK_CRACKER, SubSkillType.UNARMED_ARROW_DEFLECT, SubSkillType.UNARMED_DISARM, SubSkillType.UNARMED_IRON_ARM_STYLE, SubSkillType.UNARMED_IRON_GRIP)), - WOODCUTTING(WoodcuttingManager.class, Color.OLIVE, SuperAbilityType.TREE_FELLER, ToolType.AXE, - ImmutableList.of(SubSkillType.WOODCUTTING_LEAF_BLOWER, SubSkillType.WOODCUTTING_TREE_FELLER, SubSkillType.WOODCUTTING_HARVEST_LUMBER)); + ACROBATICS, + ALCHEMY, + ARCHERY, + AXES, + EXCAVATION, + FISHING, + HERBALISM, + MINING, + REPAIR, + SALVAGE, + SMELTING, + SWORDS, + TAMING, + UNARMED, + WOODCUTTING; +// boolean issueWarning = true; - private Class managerClass; - private Color skillColor; - private SuperAbilityType ability; - private ToolType tool; - private List subSkillTypes; + /* + * Everything below here will be removed in 2.2 (Tridents & Crossbows) + * Everything below here will be removed in 2.2 (Tridents & Crossbows) + * Everything below here will be removed in 2.2 (Tridents & Crossbows) + * Everything below here will be removed in 2.2 (Tridents & Crossbows) + * Everything below here will be removed in 2.2 (Tridents & Crossbows) + * Everything below here will be removed in 2.2 (Tridents & Crossbows) + * Everything below here will be removed in 2.2 (Tridents & Crossbows) + * Everything below here will be removed in 2.2 (Tridents & Crossbows) + * Everything below here will be removed in 2.2 (Tridents & Crossbows) + * Everything below here will be removed in 2.2 (Tridents & Crossbows) + * Everything below here will be removed in 2.2 (Tridents & Crossbows) + * Everything below here will be removed in 2.2 (Tridents & Crossbows) + * Everything below here will be removed in 2.2 (Tridents & Crossbows) + * Everything below here will be removed in 2.2 (Tridents & Crossbows) + * Everything below here will be removed in 2.2 (Tridents & Crossbows) + * Everything below here will be removed in 2.2 (Tridents & Crossbows) + */ - public static final List SKILL_NAMES; - public static final List SUBSKILL_NAMES; - public static final List CHILD_SKILLS; - public static final List NON_CHILD_SKILLS; +// private void processWarning() { +// if(issueWarning) { +// StackTraceElement[] stackTraceElements = Thread.currentThread().getStackTrace(); +// Bukkit.getScheduler().scheduleSyncDelayedTask(mcMMO.p, () -> { +// mcMMO.p.getLogger().severe("A plugin that hooks into mcMMO via the mcMMO API is using soon to be deprecated API calls. Contact the plugin author and inform them to update their code before it breaks."); +// mcMMO.p.getLogger().severe("Deprecation Call from: " + stackTraceElements[2].toString()); +// mcMMO.p.getLogger().severe("This warning will not repeat itself. Nothing is broken for now, but in the future it will be."); +// }); +// +// issueWarning = !issueWarning; +// } +// } - public static final List COMBAT_SKILLS = ImmutableList.of(ARCHERY, AXES, SWORDS, TAMING, UNARMED); - public static final List GATHERING_SKILLS = ImmutableList.of(EXCAVATION, FISHING, HERBALISM, MINING, WOODCUTTING); - public static final List MISC_SKILLS = ImmutableList.of(ACROBATICS, ALCHEMY, REPAIR, SALVAGE, SMELTING); - - static { - List childSkills = new ArrayList(); - List nonChildSkills = new ArrayList(); - ArrayList names = new ArrayList(); - ArrayList subSkillNames = new ArrayList<>(); - - for (PrimarySkillType skill : values()) { - if (skill.isChildSkill()) { - childSkills.add(skill); - } - else { - nonChildSkills.add(skill); - } - - for(SubSkillType subSkillType : skill.subSkillTypes) - { - subSkillNames.add(subSkillType.getNiceNameNoSpaces(subSkillType)); - } - names.add(skill.getName()); - } - - Collections.sort(names); - SKILL_NAMES = ImmutableList.copyOf(names); - SUBSKILL_NAMES = ImmutableList.copyOf(subSkillNames); - - CHILD_SKILLS = ImmutableList.copyOf(childSkills); - NON_CHILD_SKILLS = ImmutableList.copyOf(nonChildSkills); - } - - private PrimarySkillType(Class managerClass, Color skillColor, List subSkillTypes) { - this(managerClass, skillColor, null, null, subSkillTypes); - } - - private PrimarySkillType(Class managerClass, Color skillColor, SuperAbilityType ability, ToolType tool, List subSkillTypes) { - this.managerClass = managerClass; - this.skillColor = skillColor; - this.ability = ability; - this.tool = tool; - this.subSkillTypes = subSkillTypes; - } - - public Class getManagerClass() { - return managerClass; - } - - public SuperAbilityType getAbility() { - return ability; + /** + * WARNING: Being removed in an upcoming update, you should be using mcMMO.getSkillTools() instead + * @return the max level of this skill + * @see SkillTools#getLevelCap(com.gmail.nossr50.datatypes.skills.PrimarySkillType) + * @deprecated this is being removed in an upcoming update, you should be using mcMMO.getSkillTools() instead + */ + @Deprecated + public int getMaxLevel() { + return mcMMO.p.getSkillTools().getLevelCap(this); } /** - * Get the max level of this skill. - * + * WARNING: Being removed in an upcoming update, you should be using mcMMO.getSkillTools() instead * @return the max level of this skill + * @see SkillTools#isSuperAbilityUnlocked(com.gmail.nossr50.datatypes.skills.PrimarySkillType, org.bukkit.entity.Player) + * @deprecated this is being removed in an upcoming update, you should be using mcMMO.getSkillTools() instead */ - public int getMaxLevel() { - return Config.getInstance().getLevelCap(this); + @Deprecated + public boolean isSuperAbilityUnlocked(@NotNull Player player) { + return mcMMO.p.getSkillTools().isSuperAbilityUnlocked(this, player); } - public boolean isSuperAbilityUnlocked(Player player) { return RankUtils.getRank(player, getAbility().getSubSkillTypeDefinition()) >= 1; } - + /** + * WARNING: Being removed in an upcoming update, you should be using mcMMO.getSkillTools() instead + * @return the max level of this skill + * @see SkillTools#getPVPEnabled(com.gmail.nossr50.datatypes.skills.PrimarySkillType) + * @deprecated this is being removed in an upcoming update, you should be using mcMMO.getSkillTools() instead + */ + @Deprecated public boolean getPVPEnabled() { - return Config.getInstance().getPVPEnabled(this); + return mcMMO.p.getSkillTools().getPVPEnabled(this); } + /** + * WARNING: Being removed in an upcoming update, you should be using mcMMO.getSkillTools() instead + * @return the max level of this skill + * @see SkillTools#getPVEEnabled(com.gmail.nossr50.datatypes.skills.PrimarySkillType) + * @deprecated this is being removed in an upcoming update, you should be using mcMMO.getSkillTools() instead + */ + @Deprecated public boolean getPVEEnabled() { - return Config.getInstance().getPVEEnabled(this); + return mcMMO.p.getSkillTools().getPVEEnabled(this); } + /** + * WARNING: Being removed in an upcoming update, you should be using mcMMO.getSkillTools() instead + * @return the max level of this skill + * @see GeneralConfig#getDoubleDropsDisabled(com.gmail.nossr50.datatypes.skills.PrimarySkillType) + * @deprecated this is being removed in an upcoming update, you should be using mcMMO.getSkillTools() instead + */ + @Deprecated public boolean getDoubleDropsDisabled() { - return Config.getInstance().getDoubleDropsDisabled(this); + return mcMMO.p.getGeneralConfig().getDoubleDropsDisabled(this); } + /** + * WARNING: Being removed in an upcoming update, you should be using mcMMO.getSkillTools() instead + * @return the max level of this skill + * @see SkillTools#getHardcoreStatLossEnabled(com.gmail.nossr50.datatypes.skills.PrimarySkillType) + * @deprecated this is being removed in an upcoming update, you should be using mcMMO.getSkillTools() instead + */ + @Deprecated public boolean getHardcoreStatLossEnabled() { - return Config.getInstance().getHardcoreStatLossEnabled(this); - } - - public void setHardcoreStatLossEnabled(boolean enable) { - Config.getInstance().setHardcoreStatLossEnabled(this, enable); + return mcMMO.p.getSkillTools().getHardcoreStatLossEnabled(this); } + /** + * WARNING: Being removed in an upcoming update, you should be using mcMMO.getSkillTools() instead + * @return the max level of this skill + * @see SkillTools#getHardcoreVampirismEnabled(com.gmail.nossr50.datatypes.skills.PrimarySkillType) + * @deprecated this is being removed in an upcoming update, you should be using mcMMO.getSkillTools() instead + */ + @Deprecated public boolean getHardcoreVampirismEnabled() { - return Config.getInstance().getHardcoreVampirismEnabled(this); - } - - public void setHardcoreVampirismEnabled(boolean enable) { - Config.getInstance().setHardcoreVampirismEnabled(this, enable); + return mcMMO.p.getSkillTools().getHardcoreVampirismEnabled(this); } + /** + * WARNING: Being removed in an upcoming update, you should be using mcMMO.getSkillTools() instead + * @return the max level of this skill + * @see SkillTools#getPrimarySkillToolType(com.gmail.nossr50.datatypes.skills.PrimarySkillType) + * @deprecated this is being removed in an upcoming update, you should be using mcMMO.getSkillTools() instead + */ + @Deprecated public ToolType getTool() { - return tool; + return mcMMO.p.getSkillTools().getPrimarySkillToolType(this); } + /** + * WARNING: Being removed in an upcoming update, you should be using mcMMO.getSkillTools() instead + * @return the max level of this skill + * @see SkillTools#getSubSkills(com.gmail.nossr50.datatypes.skills.PrimarySkillType) + * @deprecated this is being removed in an upcoming update, you should be using mcMMO.getSkillTools() instead + */ + @Deprecated public List getSkillAbilities() { - return subSkillTypes; + return new ArrayList<>(mcMMO.p.getSkillTools().getSubSkills(this)); } + /** + * WARNING: Being removed in an upcoming update, you should be using mcMMO.getSkillTools() instead + * @return the max level of this skill + * @see SkillTools#getXpModifier(com.gmail.nossr50.datatypes.skills.PrimarySkillType) + * @deprecated this is being removed in an upcoming update, you should be using mcMMO.getSkillTools() instead + */ + @Deprecated public double getXpModifier() { - return ExperienceConfig.getInstance().getFormulaSkillModifier(this); + return mcMMO.p.getSkillTools().getXpModifier(this); } + /** + * WARNING: Being removed in an upcoming update, you should be using mcMMO.getSkillTools() instead + * @return the max level of this skill + * @see SkillTools#matchSkill(java.lang.String) + * @deprecated this is being removed in an upcoming update, you should be using mcMMO.getSkillTools() instead + */ + @Deprecated public static PrimarySkillType getSkill(String skillName) { - if (!Config.getInstance().getLocale().equalsIgnoreCase("en_US")) { - for (PrimarySkillType type : values()) { - if (skillName.equalsIgnoreCase(LocaleLoader.getString(StringUtils.getCapitalized(type.name()) + ".SkillName"))) { - return type; - } - } - } - - for (PrimarySkillType type : values()) { - if (type.name().equalsIgnoreCase(skillName)) { - return type; - } - } - - if (!skillName.equalsIgnoreCase("all")) { - mcMMO.p.getLogger().warning("Invalid mcMMO skill (" + skillName + ")"); //TODO: Localize - } - - return null; + return mcMMO.p.getSkillTools().matchSkill(skillName); } - // TODO: This is a little "hacky", we probably need to add something to distinguish child skills in the enum, or to use another enum for them + /** + * WARNING: Being removed in an upcoming update, you should be using mcMMO.getSkillTools() instead + * @return the max level of this skill + * @see SkillTools#isChildSkill(com.gmail.nossr50.datatypes.skills.PrimarySkillType) + * @deprecated this is being removed in an upcoming update, you should be using mcMMO.getSkillTools() instead + */ + @Deprecated public boolean isChildSkill() { - switch (this) { - case SALVAGE: - case SMELTING: - return true; - - default: - return false; - } + return SkillTools.isChildSkill(this); } + /** + * WARNING: Being removed in an upcoming update, you should be using mcMMO.getSkillTools() instead + * @return the max level of this skill + * @see SkillTools#getPrimarySkillBySubSkill(com.gmail.nossr50.datatypes.skills.SubSkillType) + * @deprecated this is being removed in an upcoming update, you should be using mcMMO.getSkillTools() instead + */ + @Deprecated public static PrimarySkillType bySecondaryAbility(SubSkillType subSkillType) { - for (PrimarySkillType type : values()) { - if (type.getSkillAbilities().contains(subSkillType)) { - return type; - } - } - return null; + return mcMMO.p.getSkillTools().getPrimarySkillBySubSkill(subSkillType); } - public static PrimarySkillType byAbility(SuperAbilityType ability) { - for (PrimarySkillType type : values()) { - if (type.getAbility() == ability) { - return type; - } - } - - return null; + /** + * WARNING: Being removed in an upcoming update, you should be using mcMMO.getSkillTools() instead + * @return the max level of this skill + * @see SkillTools#getPrimarySkillBySuperAbility(com.gmail.nossr50.datatypes.skills.SuperAbilityType) + * @deprecated this is being removed in an upcoming update, you should be using mcMMO.getSkillTools() instead + */ + @Deprecated + public static PrimarySkillType byAbility(SuperAbilityType superAbilityType) { + return mcMMO.p.getSkillTools().getPrimarySkillBySuperAbility(superAbilityType); } + /** + * WARNING: Being removed in an upcoming update, you should be using mcMMO.getSkillTools() instead + * @return the max level of this skill + * @see SkillTools#getLocalizedSkillName(com.gmail.nossr50.datatypes.skills.PrimarySkillType) + * @deprecated this is being removed in an upcoming update, you should be using mcMMO.getSkillTools() instead + */ + @Deprecated public String getName() { - return StringUtils.getCapitalized(LocaleLoader.getString(StringUtils.getCapitalized(this.toString()) + ".SkillName")); + return mcMMO.p.getSkillTools().getLocalizedSkillName(this); } + /** + * WARNING: Being removed in an upcoming update, you should be using mcMMO.getSkillTools() instead + * @return the max level of this skill + * @see Permissions#skillEnabled(org.bukkit.permissions.Permissible, com.gmail.nossr50.datatypes.skills.PrimarySkillType) + * @deprecated this is being removed in an upcoming update + */ + @Deprecated public boolean getPermissions(Player player) { - return Permissions.skillEnabled(player, this); + return mcMMO.p.getSkillTools().doesPlayerHaveSkillPermission(player, this); } -/* public void celebrateLevelUp(Player player) { - ParticleEffectUtils.fireworkParticleShower(player, skillColor); - }*/ - + /** + * WARNING: Being removed in an upcoming update, you should be using mcMMO.getSkillTools() instead + * @return the max level of this skill + * @see SkillTools#canCombatSkillsTrigger(com.gmail.nossr50.datatypes.skills.PrimarySkillType, org.bukkit.entity.Entity) + * @deprecated this is being removed in an upcoming update, you should be using mcMMO.getSkillTools() instead + */ + @Deprecated public boolean shouldProcess(Entity target) { - return (target instanceof Player || (target instanceof Tameable && ((Tameable) target).isTamed())) ? getPVPEnabled() : getPVEEnabled(); + return mcMMO.p.getSkillTools().canCombatSkillsTrigger(this, target); } -} +} \ No newline at end of file diff --git a/src/main/java/com/gmail/nossr50/datatypes/skills/SubSkillType.java b/src/main/java/com/gmail/nossr50/datatypes/skills/SubSkillType.java index 1e67e9b38..fc3ad681f 100644 --- a/src/main/java/com/gmail/nossr50/datatypes/skills/SubSkillType.java +++ b/src/main/java/com/gmail/nossr50/datatypes/skills/SubSkillType.java @@ -1,7 +1,8 @@ package com.gmail.nossr50.datatypes.skills; import com.gmail.nossr50.locale.LocaleLoader; -import com.gmail.nossr50.util.StringUtils; +import com.gmail.nossr50.mcMMO; +import com.gmail.nossr50.util.text.StringUtils; import java.util.Locale; @@ -38,7 +39,7 @@ public enum SubSkillType { FISHING_FISHERMANS_DIET(5), FISHING_ICE_FISHING(1), FISHING_MAGIC_HUNTER(1), - FISHING_MASTER_ANGLER(1), + FISHING_MASTER_ANGLER(8), FISHING_TREASURE_HUNTER(8), FISHING_SHAKE(1), @@ -95,12 +96,13 @@ public enum SubSkillType { UNARMED_BERSERK(1), UNARMED_BLOCK_CRACKER, UNARMED_DISARM(1), - UNARMED_IRON_ARM_STYLE(5), + UNARMED_STEEL_ARM_STYLE(20), UNARMED_IRON_GRIP(1), UNARMED_UNARMED_LIMIT_BREAK(10), /* Woodcutting */ /* WOODCUTTING_BARK_SURGEON(3),*/ + WOODCUTTING_KNOCK_ON_WOOD(2), WOODCUTTING_HARVEST_LUMBER(1), WOODCUTTING_LEAF_BLOWER(1), /* WOODCUTTING_NATURES_BOUNTY(3), @@ -134,7 +136,7 @@ public enum SubSkillType { * If we add skills, those immutable lists need to be updated * @return */ - public PrimarySkillType getParentSkill() { return PrimarySkillType.bySecondaryAbility(this); } + public PrimarySkillType getParentSkill() { return mcMMO.p.getSkillTools().getPrimarySkillBySubSkill(this); } /** * Returns the root address for this skill in the advanced.yml file @@ -180,7 +182,7 @@ public enum SubSkillType { /* * Find where to begin our substring (after the prefix) */ - String endResult = ""; + StringBuilder endResult = new StringBuilder(); int subStringIndex = getSubStringIndex(subSkillName); /* @@ -189,24 +191,24 @@ public enum SubSkillType { String subskillNameWithoutPrefix = subSkillName.substring(subStringIndex); if(subskillNameWithoutPrefix.contains("_")) { - String splitStrings[] = subskillNameWithoutPrefix.split("_"); + String[] splitStrings = subskillNameWithoutPrefix.split("_"); for(String string : splitStrings) { - endResult += StringUtils.getCapitalized(string); + endResult.append(StringUtils.getCapitalized(string)); } } else { - endResult += StringUtils.getCapitalized(subskillNameWithoutPrefix); + endResult.append(StringUtils.getCapitalized(subskillNameWithoutPrefix)); } - return endResult; + return endResult.toString(); } public String getWikiName(String subSkillName) { /* * Find where to begin our substring (after the prefix) */ - String endResult = ""; + StringBuilder endResult = new StringBuilder(); int subStringIndex = getSubStringIndex(subSkillName); /* @@ -215,22 +217,22 @@ public enum SubSkillType { String subskillNameWithoutPrefix = subSkillName.substring(subStringIndex); if(subskillNameWithoutPrefix.contains("_")) { - String splitStrings[] = subskillNameWithoutPrefix.split("_"); + String[] splitStrings = subskillNameWithoutPrefix.split("_"); for(int i = 0; i < splitStrings.length; i++) { if(i+1 >= splitStrings.length) - endResult+=StringUtils.getCapitalized(splitStrings[i]); + endResult.append(StringUtils.getCapitalized(splitStrings[i])); else { - endResult += StringUtils.getCapitalized(splitStrings[i]); - endResult += "_"; + endResult.append(StringUtils.getCapitalized(splitStrings[i])); + endResult.append("_"); } } } else { - endResult += StringUtils.getCapitalized(subskillNameWithoutPrefix); + endResult.append(StringUtils.getCapitalized(subskillNameWithoutPrefix)); } - return endResult; + return endResult.toString(); } /** @@ -295,14 +297,12 @@ public enum SubSkillType { public String getLocaleStat(String... vars) { - String statMsg = LocaleLoader.getString("Ability.Generic.Template", (Object[]) vars); - return statMsg; + return LocaleLoader.getString("Ability.Generic.Template", (Object[]) vars); } public String getCustomLocaleStat(String... vars) { - String statMsg = LocaleLoader.getString("Ability.Generic.Template.Custom", (Object[]) vars); - return statMsg; + return LocaleLoader.getString("Ability.Generic.Template.Custom", (Object[]) vars); } private String getFromLocaleSubAddress(String s) { diff --git a/src/main/java/com/gmail/nossr50/datatypes/skills/SuperAbilityType.java b/src/main/java/com/gmail/nossr50/datatypes/skills/SuperAbilityType.java index 4aa3df817..6e4de8d78 100644 --- a/src/main/java/com/gmail/nossr50/datatypes/skills/SuperAbilityType.java +++ b/src/main/java/com/gmail/nossr50/datatypes/skills/SuperAbilityType.java @@ -1,10 +1,10 @@ package com.gmail.nossr50.datatypes.skills; -import com.gmail.nossr50.config.Config; +import com.gmail.nossr50.locale.LocaleLoader; import com.gmail.nossr50.mcMMO; import com.gmail.nossr50.util.BlockUtils; import com.gmail.nossr50.util.Permissions; -import com.gmail.nossr50.util.StringUtils; +import com.gmail.nossr50.util.text.StringUtils; import org.bukkit.Material; import org.bukkit.block.BlockState; import org.bukkit.entity.Player; @@ -15,49 +15,56 @@ public enum SuperAbilityType { "Unarmed.Skills.Berserk.Off", "Unarmed.Skills.Berserk.Other.On", "Unarmed.Skills.Berserk.Refresh", - "Unarmed.Skills.Berserk.Other.Off"), + "Unarmed.Skills.Berserk.Other.Off", + "Unarmed.SubSkill.Berserk.Name"), SUPER_BREAKER( "Mining.Skills.SuperBreaker.On", "Mining.Skills.SuperBreaker.Off", "Mining.Skills.SuperBreaker.Other.On", "Mining.Skills.SuperBreaker.Refresh", - "Mining.Skills.SuperBreaker.Other.Off"), + "Mining.Skills.SuperBreaker.Other.Off", + "Mining.SubSkill.SuperBreaker.Name"), GIGA_DRILL_BREAKER( "Excavation.Skills.GigaDrillBreaker.On", "Excavation.Skills.GigaDrillBreaker.Off", "Excavation.Skills.GigaDrillBreaker.Other.On", "Excavation.Skills.GigaDrillBreaker.Refresh", - "Excavation.Skills.GigaDrillBreaker.Other.Off"), + "Excavation.Skills.GigaDrillBreaker.Other.Off", + "Excavation.SubSkill.GigaDrillBreaker.Name"), GREEN_TERRA( "Herbalism.Skills.GTe.On", "Herbalism.Skills.GTe.Off", "Herbalism.Skills.GTe.Other.On", "Herbalism.Skills.GTe.Refresh", - "Herbalism.Skills.GTe.Other.Off"), + "Herbalism.Skills.GTe.Other.Off", + "Herbalism.SubSkill.GreenTerra.Name"), SKULL_SPLITTER( "Axes.Skills.SS.On", "Axes.Skills.SS.Off", "Axes.Skills.SS.Other.On", "Axes.Skills.SS.Refresh", - "Axes.Skills.SS.Other.Off"), + "Axes.Skills.SS.Other.Off", + "Axes.SubSkill.SkullSplitter.Name"), TREE_FELLER( "Woodcutting.Skills.TreeFeller.On", "Woodcutting.Skills.TreeFeller.Off", "Woodcutting.Skills.TreeFeller.Other.On", "Woodcutting.Skills.TreeFeller.Refresh", - "Woodcutting.Skills.TreeFeller.Other.Off"), + "Woodcutting.Skills.TreeFeller.Other.Off", + "Woodcutting.SubSkill.TreeFeller.Name"), SERRATED_STRIKES( "Swords.Skills.SS.On", "Swords.Skills.SS.Off", "Swords.Skills.SS.Other.On", "Swords.Skills.SS.Refresh", - "Swords.Skills.SS.Other.Off"), + "Swords.Skills.SS.Other.Off", + "Swords.SubSkill.SerratedStrikes.Name"), /** * Has cooldown - but has to share a skill with Super Breaker, so needs special treatment @@ -67,7 +74,8 @@ public enum SuperAbilityType { null, "Mining.Blast.Other.On", "Mining.Blast.Refresh", - null), + null, + "Mining.SubSkill.BlastMining.Name"), ; /* @@ -85,27 +93,29 @@ public enum SuperAbilityType { BLAST_MINING.subSkillTypeDefinition = SubSkillType.MINING_BLAST_MINING; } - private String abilityOn; - private String abilityOff; - private String abilityPlayer; - private String abilityRefresh; - private String abilityPlayerOff; + private final String abilityOn; + private final String abilityOff; + private final String abilityPlayer; + private final String abilityRefresh; + private final String abilityPlayerOff; private SubSkillType subSkillTypeDefinition; + private final String localizedName; - private SuperAbilityType(String abilityOn, String abilityOff, String abilityPlayer, String abilityRefresh, String abilityPlayerOff) { + SuperAbilityType(String abilityOn, String abilityOff, String abilityPlayer, String abilityRefresh, String abilityPlayerOff, String localizedName) { this.abilityOn = abilityOn; this.abilityOff = abilityOff; this.abilityPlayer = abilityPlayer; this.abilityRefresh = abilityRefresh; this.abilityPlayerOff = abilityPlayerOff; + this.localizedName = localizedName; } public int getCooldown() { - return Config.getInstance().getCooldown(this); + return mcMMO.p.getSkillTools().getSuperAbilityCooldown(this); } public int getMaxLength() { - return Config.getInstance().getMaxLength(this); + return mcMMO.p.getGeneralConfig().getMaxLength(this); } public String getAbilityOn() { @@ -132,6 +142,10 @@ public enum SuperAbilityType { return StringUtils.getPrettyAbilityString(this); } + public String getLocalizedName() { + return LocaleLoader.getString(localizedName); + } + @Override public String toString() { String baseString = name(); @@ -211,7 +225,7 @@ public enum SuperAbilityType { return BlockUtils.affectedBySuperBreaker(blockState); case TREE_FELLER: - return BlockUtils.isLog(blockState); + return BlockUtils.hasWoodcuttingXP(blockState); default: return false; diff --git a/src/main/java/com/gmail/nossr50/datatypes/skills/ToolType.java b/src/main/java/com/gmail/nossr50/datatypes/skills/ToolType.java index 2d50ebac4..9fdb444e9 100644 --- a/src/main/java/com/gmail/nossr50/datatypes/skills/ToolType.java +++ b/src/main/java/com/gmail/nossr50/datatypes/skills/ToolType.java @@ -12,10 +12,10 @@ public enum ToolType { SHOVEL("Excavation.Ability.Lower", "Excavation.Ability.Ready"), SWORD("Swords.Ability.Lower", "Swords.Ability.Ready"); - private String lowerTool; - private String raiseTool; + private final String lowerTool; + private final String raiseTool; - private ToolType(String lowerTool, String raiseTool) { + ToolType(String lowerTool, String raiseTool) { this.lowerTool = lowerTool; this.raiseTool = raiseTool; } diff --git a/src/main/java/com/gmail/nossr50/datatypes/skills/alchemy/AlchemyPotion.java b/src/main/java/com/gmail/nossr50/datatypes/skills/alchemy/AlchemyPotion.java index 1f522679a..c767004df 100644 --- a/src/main/java/com/gmail/nossr50/datatypes/skills/alchemy/AlchemyPotion.java +++ b/src/main/java/com/gmail/nossr50/datatypes/skills/alchemy/AlchemyPotion.java @@ -14,7 +14,7 @@ import java.util.Map; import java.util.Map.Entry; public class AlchemyPotion { - private Material material; + private final Material material; private PotionData data; private String name; private List lore; diff --git a/src/main/java/com/gmail/nossr50/datatypes/skills/alchemy/PotionStage.java b/src/main/java/com/gmail/nossr50/datatypes/skills/alchemy/PotionStage.java index 70da6d529..fe2778eed 100644 --- a/src/main/java/com/gmail/nossr50/datatypes/skills/alchemy/PotionStage.java +++ b/src/main/java/com/gmail/nossr50/datatypes/skills/alchemy/PotionStage.java @@ -16,7 +16,7 @@ public enum PotionStage { int numerical; - private PotionStage(int numerical) { + PotionStage(int numerical) { this.numerical = numerical; } diff --git a/src/main/java/com/gmail/nossr50/datatypes/skills/subskills/acrobatics/AcrobaticsSubSkill.java b/src/main/java/com/gmail/nossr50/datatypes/skills/subskills/acrobatics/AcrobaticsSubSkill.java index d692747b8..df479bb53 100644 --- a/src/main/java/com/gmail/nossr50/datatypes/skills/subskills/acrobatics/AcrobaticsSubSkill.java +++ b/src/main/java/com/gmail/nossr50/datatypes/skills/subskills/acrobatics/AcrobaticsSubSkill.java @@ -6,7 +6,7 @@ import com.gmail.nossr50.datatypes.skills.subskills.AbstractSubSkill; import com.gmail.nossr50.datatypes.skills.subskills.interfaces.InteractType; import com.gmail.nossr50.locale.LocaleLoader; import com.gmail.nossr50.mcMMO; -import com.gmail.nossr50.util.StringUtils; +import com.gmail.nossr50.util.text.StringUtils; import org.bukkit.event.Event; import org.bukkit.event.EventPriority; diff --git a/src/main/java/com/gmail/nossr50/datatypes/skills/subskills/acrobatics/Roll.java b/src/main/java/com/gmail/nossr50/datatypes/skills/subskills/acrobatics/Roll.java index eae0f6c7d..64a3a14fb 100644 --- a/src/main/java/com/gmail/nossr50/datatypes/skills/subskills/acrobatics/Roll.java +++ b/src/main/java/com/gmail/nossr50/datatypes/skills/subskills/acrobatics/Roll.java @@ -1,11 +1,11 @@ package com.gmail.nossr50.datatypes.skills.subskills.acrobatics; -import com.gmail.nossr50.config.AdvancedConfig; import com.gmail.nossr50.config.experience.ExperienceConfig; import com.gmail.nossr50.datatypes.experience.XPGainReason; import com.gmail.nossr50.datatypes.interactions.NotificationType; import com.gmail.nossr50.datatypes.player.McMMOPlayer; import com.gmail.nossr50.datatypes.player.PlayerProfile; +import com.gmail.nossr50.datatypes.skills.PrimarySkillType; import com.gmail.nossr50.datatypes.skills.SubSkillType; import com.gmail.nossr50.locale.LocaleLoader; import com.gmail.nossr50.mcMMO; @@ -22,7 +22,8 @@ import com.gmail.nossr50.util.skills.SkillActivationType; import com.gmail.nossr50.util.skills.SkillUtils; import com.gmail.nossr50.util.sounds.SoundManager; import com.gmail.nossr50.util.sounds.SoundType; -import net.md_5.bungee.api.chat.ComponentBuilder; +import net.kyori.adventure.text.Component; +import net.kyori.adventure.text.TextComponent; import org.bukkit.Location; import org.bukkit.Material; import org.bukkit.SoundCategory; @@ -65,31 +66,27 @@ public class Roll extends AcrobaticsSubSkill { if(!EventUtils.isRealPlayerDamaged(entityDamageEvent)) return false; - switch (entityDamageEvent.getCause()) { - case FALL: + if (entityDamageEvent.getCause() == EntityDamageEvent.DamageCause.FALL) {//Grab the player + McMMOPlayer mcMMOPlayer = EventUtils.getMcMMOPlayer(entityDamageEvent.getEntity()); - //Grab the player - McMMOPlayer mcMMOPlayer = EventUtils.getMcMMOPlayer(entityDamageEvent.getEntity()); + if (mcMMOPlayer == null) + return false; - if(mcMMOPlayer == null) - break; + /* + * Check for success + */ + Player player = (Player) ((EntityDamageEvent) event).getEntity(); + if (canRoll(player)) { + entityDamageEvent.setDamage(rollCheck(player, mcMMOPlayer, entityDamageEvent.getFinalDamage())); - /* - * Check for success - */ - Player player = (Player) ((EntityDamageEvent) event).getEntity(); - if (canRoll(player)) { - entityDamageEvent.setDamage(rollCheck(player, mcMMOPlayer, entityDamageEvent.getDamage())); - - if (entityDamageEvent.getFinalDamage() == 0) { - entityDamageEvent.setCancelled(true); - return true; - } + if (entityDamageEvent.getFinalDamage() == 0) { + entityDamageEvent.setCancelled(true); + return true; } - break; - - default: - break; + } else if(mcMMO.p.getSkillTools().doesPlayerHaveSkillPermission(player, PrimarySkillType.ACROBATICS)) { + //Give XP Anyways + SkillUtils.applyXpGain(mcMMOPlayer, getPrimarySkill(), calculateRollXP(player, ((EntityDamageEvent) event).getFinalDamage(), false), XPGainReason.PVE); + } } return false; @@ -123,7 +120,7 @@ public class Roll extends AcrobaticsSubSkill { * @param player target player */ @Override - public void addStats(ComponentBuilder componentBuilder, Player player) { + public void addStats(TextComponent.Builder componentBuilder, Player player) { String rollChance, rollChanceLucky, gracefulRollChance, gracefulRollChanceLucky; /* Values related to the player */ @@ -150,21 +147,21 @@ public class Roll extends AcrobaticsSubSkill { componentBuilder.append("\n");*/ //Acrobatics.SubSkill.Roll.Chance - componentBuilder.append(LocaleLoader.getString("Acrobatics.SubSkill.Roll.Chance", rollChance) + (isLucky ? LocaleLoader.getString("Perks.Lucky.Bonus", rollChanceLucky) : "")); - componentBuilder.append("\n"); - componentBuilder.append(LocaleLoader.getString("Acrobatics.SubSkill.Roll.GraceChance", gracefulRollChance) + (isLucky ? LocaleLoader.getString("Perks.Lucky.Bonus", gracefulRollChanceLucky) : "")); + componentBuilder.append(Component.text(LocaleLoader.getString("Acrobatics.SubSkill.Roll.Chance", rollChance) + (isLucky ? LocaleLoader.getString("Perks.Lucky.Bonus", rollChanceLucky) : ""))); + componentBuilder.append(Component.newline()); + componentBuilder.append(Component.text(LocaleLoader.getString("Acrobatics.SubSkill.Roll.GraceChance", gracefulRollChance) + (isLucky ? LocaleLoader.getString("Perks.Lucky.Bonus", gracefulRollChanceLucky) : ""))); //Activation Tips - componentBuilder.append("\n").append(LocaleLoader.getString("JSON.Hover.Tips")).append("\n"); - componentBuilder.append(getTips()); - componentBuilder.append("\n"); + componentBuilder.append(Component.newline()).append(Component.text(LocaleLoader.getString("JSON.Hover.Tips"))).append(Component.newline()); + componentBuilder.append(Component.text(getTips())); + componentBuilder.append(Component.newline()); //Advanced //Lucky Notice if(isLucky) { - componentBuilder.append(LocaleLoader.getString("JSON.JWrapper.Perks.Header")); - componentBuilder.append("\n"); - componentBuilder.append(LocaleLoader.getString("JSON.JWrapper.Perks.Lucky", "33")); + componentBuilder.append(Component.text(LocaleLoader.getString("JSON.JWrapper.Perks.Header"))); + componentBuilder.append(Component.newline()); + componentBuilder.append(Component.text(LocaleLoader.getString("JSON.JWrapper.Perks.Lucky", "33"))); } } @@ -202,7 +199,7 @@ public class Roll extends AcrobaticsSubSkill { return gracefulRollCheck(player, mcMMOPlayer, damage, skillLevel); } - double modifiedDamage = calculateModifiedRollDamage(damage, AdvancedConfig.getInstance().getRollDamageThreshold()); + double modifiedDamage = calculateModifiedRollDamage(damage, mcMMO.p.getAdvancedConfig().getRollDamageThreshold()); if (!isFatal(player, modifiedDamage) && RandomChanceUtil.isActivationSuccessful(SkillActivationType.RANDOM_LINEAR_100_SCALE_WITH_CAP, SubSkillType.ACROBATICS_ROLL, player)) { @@ -240,7 +237,7 @@ public class Roll extends AcrobaticsSubSkill { * @return the modified event damage if the ability was successful, the original event damage otherwise */ private double gracefulRollCheck(Player player, McMMOPlayer mcMMOPlayer, double damage, int skillLevel) { - double modifiedDamage = calculateModifiedRollDamage(damage, AdvancedConfig.getInstance().getRollDamageThreshold() * 2); + double modifiedDamage = calculateModifiedRollDamage(damage, mcMMO.p.getAdvancedConfig().getRollDamageThreshold() * 2); RandomChanceSkill rcs = new RandomChanceSkill(player, subSkillType); rcs.setSkillLevel(rcs.getSkillLevel() * 2); //Double the effective odds @@ -300,7 +297,7 @@ public class Roll extends AcrobaticsSubSkill { private float calculateRollXP(Player player, double damage, boolean isRoll) { //Clamp Damage to account for insane DRs - damage = Math.min(40, damage); + damage = Math.min(20, damage); ItemStack boots = player.getInventory().getBoots(); float xp = (float) (damage * (isRoll ? ExperienceConfig.getInstance().getRollXPModifier() : ExperienceConfig.getInstance().getFallXPModifier())); @@ -344,7 +341,7 @@ public class Roll extends AcrobaticsSubSkill { //player.sendMessage(getDescription()); //Player stats player.sendMessage(LocaleLoader.getString("Commands.MmoInfo.Stats", - LocaleLoader.getString("Acrobatics.SubSkill.Roll.Stats", getStats(player)[0], getStats(player)[1]))); + LocaleLoader.getString("Acrobatics.SubSkill.Roll.Stats", getStats(player)))); //Mechanics player.sendMessage(LocaleLoader.getString("Commands.MmoInfo.Mechanics")); @@ -364,6 +361,9 @@ public class Roll extends AcrobaticsSubSkill { //1 = chance to roll with grace at half max level //2 = level where maximum bonus is reached //3 = additive chance to succeed per level + //4 = damage threshold when rolling + //5 = damage threshold when rolling with grace + //6 = half of level where maximum bonus is reached /* Roll: # ChanceMax: Maximum chance of rolling when on or higher @@ -373,31 +373,34 @@ public class Roll extends AcrobaticsSubSkill { MaxBonusLevel: 100 DamageThreshold: 7.0 */ - double rollChanceHalfMax, graceChanceHalfMax, damageThreshold, chancePerLevel; - //Chance to roll at half max skill - RandomChanceSkill rollHalfMaxSkill = new RandomChanceSkill(null, subSkillType); - int halfMaxSkillValue = mcMMO.isRetroModeEnabled() ? 500 : 50; - rollHalfMaxSkill.setSkillLevel(halfMaxSkillValue); - - //Chance to graceful roll at full skill - RandomChanceSkill rollGraceHalfMaxSkill = new RandomChanceSkill(null, subSkillType); - rollGraceHalfMaxSkill.setSkillLevel(halfMaxSkillValue * 2); //Double the effective odds - - //Chance to roll per level - RandomChanceSkill rollOneSkillLevel = new RandomChanceSkill(null, subSkillType); - rollGraceHalfMaxSkill.setSkillLevel(1); //Level 1 skill - - //Chance Stat Calculations - rollChanceHalfMax = RandomChanceUtil.getRandomChanceExecutionChance(rollHalfMaxSkill); - graceChanceHalfMax = RandomChanceUtil.getRandomChanceExecutionChance(rollGraceHalfMaxSkill); - damageThreshold = AdvancedConfig.getInstance().getRollDamageThreshold(); - - chancePerLevel = RandomChanceUtil.getRandomChanceExecutionChance(rollOneSkillLevel); - - double maxLevel = AdvancedConfig.getInstance().getMaxBonusLevel(SubSkillType.ACROBATICS_ROLL); - - return LocaleLoader.getString("Acrobatics.SubSkill.Roll.Mechanics", rollChanceHalfMax, graceChanceHalfMax, maxLevel, chancePerLevel, damageThreshold, damageThreshold * 2); + return "Under Construction: This will work in a future update."; +// +// double rollChanceHalfMax, graceChanceHalfMax, damageThreshold, chancePerLevel; +// +// //Chance to roll at half max skill +// RandomChanceSkill rollHalfMaxSkill = new RandomChanceSkill(null, subSkillType); +// int halfMaxSkillValue = mcMMO.p.getAdvancedConfig().getMaxBonusLevel(SubSkillType.ACROBATICS_ROLL)/2; +// rollHalfMaxSkill.setSkillLevel(halfMaxSkillValue); +// +// //Chance to graceful roll at full skill +// RandomChanceSkill rollGraceHalfMaxSkill = new RandomChanceSkill(null, subSkillType); +// rollGraceHalfMaxSkill.setSkillLevel(halfMaxSkillValue * 2); //Double the effective odds +// +// //Chance to roll per level +// RandomChanceSkill rollOneSkillLevel = new RandomChanceSkill(null, subSkillType); +// rollGraceHalfMaxSkill.setSkillLevel(1); //Level 1 skill +// +// //Chance Stat Calculations +// rollChanceHalfMax = RandomChanceUtil.getRandomChanceExecutionChance(rollHalfMaxSkill); +// graceChanceHalfMax = RandomChanceUtil.getRandomChanceExecutionChance(rollGraceHalfMaxSkill); +// damageThreshold = mcMMO.p.getAdvancedConfig().getRollDamageThreshold(); +// +// chancePerLevel = RandomChanceUtil.getRandomChanceExecutionChance(rollOneSkillLevel); +// +// double maxLevel = mcMMO.p.getAdvancedConfig().getMaxBonusLevel(SubSkillType.ACROBATICS_ROLL); +// +// return LocaleLoader.getString("Acrobatics.SubSkill.Roll.Mechanics", rollChanceHalfMax, graceChanceHalfMax, maxLevel, chancePerLevel, damageThreshold, damageThreshold * 2,halfMaxSkillValue); } /** @@ -420,8 +423,7 @@ public class Roll extends AcrobaticsSubSkill { playerChanceRoll = RandomChanceUtil.getRandomChanceExecutionChance(roll); playerChanceGrace = RandomChanceUtil.getRandomChanceExecutionChance(graceful); - Double[] stats = { playerChanceRoll, playerChanceGrace }; //DEBUG - return stats; + return new Double[]{ playerChanceRoll, playerChanceGrace }; } public void addFallLocation(Player player) @@ -433,4 +435,5 @@ public class Roll extends AcrobaticsSubSkill { { return player.getLocation().getBlock().getLocation(); } -} \ No newline at end of file + +} diff --git a/src/main/java/com/gmail/nossr50/datatypes/skills/subskills/interfaces/Rank.java b/src/main/java/com/gmail/nossr50/datatypes/skills/subskills/interfaces/Rank.java index 7e6267f18..4729ae454 100644 --- a/src/main/java/com/gmail/nossr50/datatypes/skills/subskills/interfaces/Rank.java +++ b/src/main/java/com/gmail/nossr50/datatypes/skills/subskills/interfaces/Rank.java @@ -13,9 +13,9 @@ public interface Rank { */ boolean hasRanks(); - /** - * An sequential collection of rank level requirements - * @return level requirements + /* + An sequential collection of rank level requirements + @return level requirements */ //Collection getUnlockLevels(); } diff --git a/src/main/java/com/gmail/nossr50/datatypes/skills/subskills/interfaces/SubSkill.java b/src/main/java/com/gmail/nossr50/datatypes/skills/subskills/interfaces/SubSkill.java index 1bd26403d..1ca73bbdf 100644 --- a/src/main/java/com/gmail/nossr50/datatypes/skills/subskills/interfaces/SubSkill.java +++ b/src/main/java/com/gmail/nossr50/datatypes/skills/subskills/interfaces/SubSkill.java @@ -1,7 +1,7 @@ package com.gmail.nossr50.datatypes.skills.subskills.interfaces; import com.gmail.nossr50.datatypes.skills.interfaces.Skill; -import net.md_5.bungee.api.chat.ComponentBuilder; +import net.kyori.adventure.text.TextComponent; import org.bukkit.entity.Player; public interface SubSkill extends Skill { @@ -61,7 +61,7 @@ public interface SubSkill extends Skill { * @param componentBuilder target component builder * @param player owner of this skill */ - void addStats(ComponentBuilder componentBuilder, Player player); + void addStats(TextComponent.Builder componentBuilder, Player player); /** * Whether or not this subskill is enabled diff --git a/src/main/java/com/gmail/nossr50/datatypes/skills/subskills/taming/CallOfTheWildType.java b/src/main/java/com/gmail/nossr50/datatypes/skills/subskills/taming/CallOfTheWildType.java index 9a88fc295..9e1749adc 100644 --- a/src/main/java/com/gmail/nossr50/datatypes/skills/subskills/taming/CallOfTheWildType.java +++ b/src/main/java/com/gmail/nossr50/datatypes/skills/subskills/taming/CallOfTheWildType.java @@ -1,6 +1,6 @@ package com.gmail.nossr50.datatypes.skills.subskills.taming; -import com.gmail.nossr50.util.StringUtils; +import com.gmail.nossr50.util.text.StringUtils; import org.bukkit.entity.EntityType; public enum CallOfTheWildType { diff --git a/src/main/java/com/gmail/nossr50/datatypes/skills/subskills/taming/TamingSummon.java b/src/main/java/com/gmail/nossr50/datatypes/skills/subskills/taming/TamingSummon.java index ebb2a5690..f92155a6a 100644 --- a/src/main/java/com/gmail/nossr50/datatypes/skills/subskills/taming/TamingSummon.java +++ b/src/main/java/com/gmail/nossr50/datatypes/skills/subskills/taming/TamingSummon.java @@ -8,12 +8,12 @@ import org.bukkit.entity.EntityType; */ public class TamingSummon { - private Material itemType; - private int itemAmountRequired; - private int entitiesSummoned; - private int summonLifespan; - private int summonCap; - private CallOfTheWildType callOfTheWildType; + private final Material itemType; + private final int itemAmountRequired; + private final int entitiesSummoned; + private final int summonLifespan; + private final int summonCap; + private final CallOfTheWildType callOfTheWildType; private EntityType entityType; public TamingSummon(CallOfTheWildType callOfTheWildType, Material itemType, int itemAmountRequired, int entitiesSummoned, int summonLifespan, int summonCap) { diff --git a/src/main/java/com/gmail/nossr50/datatypes/treasure/EnchantmentWrapper.java b/src/main/java/com/gmail/nossr50/datatypes/treasure/EnchantmentWrapper.java new file mode 100644 index 000000000..c442b4179 --- /dev/null +++ b/src/main/java/com/gmail/nossr50/datatypes/treasure/EnchantmentWrapper.java @@ -0,0 +1,44 @@ +package com.gmail.nossr50.datatypes.treasure; + +import com.google.common.base.Objects; +import org.bukkit.enchantments.Enchantment; +import org.jetbrains.annotations.NotNull; + +public class EnchantmentWrapper { + private final @NotNull Enchantment enchantment; + private final int enchantmentLevel; + + public EnchantmentWrapper(@NotNull Enchantment enchantment, int enchantmentLevel) { + this.enchantment = enchantment; + this.enchantmentLevel = enchantmentLevel; + } + + public @NotNull Enchantment getEnchantment() { + return enchantment; + } + + public int getEnchantmentLevel() { + return enchantmentLevel; + } + + @Override + public String toString() { + return "EnchantmentWrapper{" + + "enchantment=" + enchantment + + ", enchantmentLevel=" + enchantmentLevel + + '}'; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + EnchantmentWrapper that = (EnchantmentWrapper) o; + return enchantmentLevel == that.enchantmentLevel && Objects.equal(enchantment, that.enchantment); + } + + @Override + public int hashCode() { + return Objects.hashCode(enchantment, enchantmentLevel); + } +} diff --git a/src/main/java/com/gmail/nossr50/datatypes/treasure/FishingTreasureBook.java b/src/main/java/com/gmail/nossr50/datatypes/treasure/FishingTreasureBook.java new file mode 100644 index 000000000..8f89f7484 --- /dev/null +++ b/src/main/java/com/gmail/nossr50/datatypes/treasure/FishingTreasureBook.java @@ -0,0 +1,76 @@ +package com.gmail.nossr50.datatypes.treasure; + +import com.gmail.nossr50.mcMMO; +import org.bukkit.enchantments.Enchantment; +import org.bukkit.inventory.ItemStack; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +import java.util.ArrayList; +import java.util.List; +import java.util.Set; + +public class FishingTreasureBook extends FishingTreasure { + private final @Nullable Set blackListedEnchantments; + private final @Nullable Set whiteListedEnchantments; + private final @NotNull List legalEnchantments; //TODO: Make immutable + + public FishingTreasureBook(@NotNull ItemStack enchantedBook, int xp, @Nullable Set blackListedEnchantments, @Nullable Set whiteListedEnchantments) { + super(enchantedBook, xp); + + this.blackListedEnchantments = blackListedEnchantments; + this.whiteListedEnchantments = whiteListedEnchantments; + this.legalEnchantments = new ArrayList<>(); + + initLegalEnchantments(); + } + + private void initLegalEnchantments() { + mcMMO.p.getLogger().info("Registering enchantments for Fishing Book..."); + + for(Enchantment enchantment : Enchantment.values()) { + if(isEnchantAllowed(enchantment)) { + addAllLegalEnchants(enchantment); + } + } + } + + /** + * Get all the enchantments which can drop for this book + * This list can be empty, but should in practice never be empty... + * + * @return all the enchantments that can drop for this book + */ + public @NotNull List getLegalEnchantments() { + return legalEnchantments; + } + + private @Nullable Set getBlacklistedEnchantments() { + return blackListedEnchantments; + } + + private @Nullable Set getWhitelistedEnchantments() { + return whiteListedEnchantments; + } + + private void addAllLegalEnchants(@NotNull Enchantment enchantment) { + int legalEnchantCap = enchantment.getMaxLevel(); + + for(int i = 0; i < legalEnchantCap; i++) { + int enchantLevel = i+1; + EnchantmentWrapper enchantmentWrapper = new EnchantmentWrapper(enchantment, enchantLevel); + legalEnchantments.add(enchantmentWrapper); +// mcMMO.p.getLogger().info("Fishing treasure book enchantment added: " + enchantmentWrapper); + } + } + + private boolean isEnchantAllowed(@NotNull Enchantment enchantment) { + if(whiteListedEnchantments != null && !whiteListedEnchantments.isEmpty()) { + return whiteListedEnchantments.contains(enchantment); + } else if(blackListedEnchantments != null && !blackListedEnchantments.isEmpty()) { + return !blackListedEnchantments.contains(enchantment); + } else { + return true; + } + } +} diff --git a/src/main/java/com/gmail/nossr50/datatypes/treasure/Rarity.java b/src/main/java/com/gmail/nossr50/datatypes/treasure/Rarity.java index 40cddb737..4666b32b1 100644 --- a/src/main/java/com/gmail/nossr50/datatypes/treasure/Rarity.java +++ b/src/main/java/com/gmail/nossr50/datatypes/treasure/Rarity.java @@ -1,14 +1,21 @@ package com.gmail.nossr50.datatypes.treasure; +import com.gmail.nossr50.mcMMO; +import org.jetbrains.annotations.NotNull; + public enum Rarity { - RECORD, + MYTHIC, LEGENDARY, EPIC, RARE, UNCOMMON, COMMON; - public static Rarity getRarity(String string) { + public static @NotNull Rarity getRarity(@NotNull String string) { + if(string.equalsIgnoreCase("Records")) { + mcMMO.p.getLogger().severe("Entries in fishing treasures have Records set as rarity, however Records was renamed to Mythic. Please update your treasures to read MYTHIC instead of RECORDS for rarity, or delete the config file to regenerate a new one."); + return Rarity.MYTHIC; //People that copy paste their configs will have Records interpretted as Mythic + } try { return valueOf(string); } diff --git a/src/main/java/com/gmail/nossr50/datatypes/treasure/Treasure.java b/src/main/java/com/gmail/nossr50/datatypes/treasure/Treasure.java index 04ce7cca7..013849de2 100644 --- a/src/main/java/com/gmail/nossr50/datatypes/treasure/Treasure.java +++ b/src/main/java/com/gmail/nossr50/datatypes/treasure/Treasure.java @@ -1,6 +1,5 @@ package com.gmail.nossr50.datatypes.treasure; -import com.gmail.nossr50.config.Config; import org.bukkit.inventory.ItemStack; public abstract class Treasure { @@ -41,10 +40,6 @@ public abstract class Treasure { } public int getDropLevel() { - //If they are in retro mode all requirements are scaled up by 10 - if(Config.getInstance().getIsRetroMode()) - return dropLevel * 10; - return dropLevel; } diff --git a/src/main/java/com/gmail/nossr50/events/McMMOReplaceVanillaTreasureEvent.java b/src/main/java/com/gmail/nossr50/events/McMMOReplaceVanillaTreasureEvent.java new file mode 100644 index 000000000..6553bf1c1 --- /dev/null +++ b/src/main/java/com/gmail/nossr50/events/McMMOReplaceVanillaTreasureEvent.java @@ -0,0 +1,41 @@ +package com.gmail.nossr50.events; + +import org.bukkit.entity.Item; +import org.bukkit.event.Event; +import org.bukkit.event.HandlerList; +import org.bukkit.inventory.ItemStack; +import org.jetbrains.annotations.NotNull; + +public class McMMOReplaceVanillaTreasureEvent extends Event { + private @NotNull ItemStack replacementItemStack; + private final @NotNull Item originalItem; + + public McMMOReplaceVanillaTreasureEvent(@NotNull Item originalItem, @NotNull ItemStack replacementItemStack) { + this.originalItem = originalItem; + this.replacementItemStack = replacementItemStack; + } + + /** Rest of file is required boilerplate for custom events **/ + private static final @NotNull HandlerList handlers = new HandlerList(); + + @Override + public @NotNull HandlerList getHandlers() { + return handlers; + } + + public static @NotNull HandlerList getHandlerList() { + return handlers; + } + + public @NotNull ItemStack getReplacementItemStack() { + return replacementItemStack; + } + + public void setReplacementItemStack(@NotNull ItemStack replacementItemStack) { + this.replacementItemStack = replacementItemStack; + } + + public @NotNull Item getOriginalItem() { + return originalItem; + } +} diff --git a/src/main/java/com/gmail/nossr50/events/chat/McMMOAdminChatEvent.java b/src/main/java/com/gmail/nossr50/events/chat/McMMOAdminChatEvent.java index 089a5917f..921fdd7fa 100644 --- a/src/main/java/com/gmail/nossr50/events/chat/McMMOAdminChatEvent.java +++ b/src/main/java/com/gmail/nossr50/events/chat/McMMOAdminChatEvent.java @@ -1,16 +1,14 @@ package com.gmail.nossr50.events.chat; +import com.gmail.nossr50.chat.message.AbstractChatMessage; import org.bukkit.plugin.Plugin; +import org.jetbrains.annotations.NotNull; /** * Called when a chat is sent to the admin chat channel */ public class McMMOAdminChatEvent extends McMMOChatEvent { - public McMMOAdminChatEvent(Plugin plugin, String sender, String displayName, String message) { - super(plugin, sender, displayName, message); - } - - public McMMOAdminChatEvent(Plugin plugin, String sender, String displayName, String message, boolean isAsync) { - super(plugin, sender, displayName, message, isAsync); + public McMMOAdminChatEvent(@NotNull Plugin plugin, @NotNull AbstractChatMessage chatMessage, boolean isAsync) { + super(plugin, chatMessage, isAsync); } } diff --git a/src/main/java/com/gmail/nossr50/events/chat/McMMOChatEvent.java b/src/main/java/com/gmail/nossr50/events/chat/McMMOChatEvent.java index 9c4f3ae68..5f9980398 100644 --- a/src/main/java/com/gmail/nossr50/events/chat/McMMOChatEvent.java +++ b/src/main/java/com/gmail/nossr50/events/chat/McMMOChatEvent.java @@ -1,72 +1,119 @@ package com.gmail.nossr50.events.chat; +import com.gmail.nossr50.chat.author.Author; +import com.gmail.nossr50.chat.message.AbstractChatMessage; +import com.gmail.nossr50.chat.message.ChatMessage; +import com.gmail.nossr50.datatypes.chat.ChatChannel; +import net.kyori.adventure.audience.Audience; +import net.kyori.adventure.text.Component; +import net.kyori.adventure.text.TextComponent; import org.bukkit.event.Cancellable; import org.bukkit.event.Event; import org.bukkit.event.HandlerList; import org.bukkit.plugin.Plugin; +import org.jetbrains.annotations.NotNull; public abstract class McMMOChatEvent extends Event implements Cancellable { private boolean cancelled; - private Plugin plugin; - private String sender; - private String displayName; - private String message; + protected final @NotNull Plugin plugin; + protected final @NotNull AbstractChatMessage chatMessage; - protected McMMOChatEvent(Plugin plugin, String sender, String displayName, String message) { - this.plugin = plugin; - this.sender = sender; - this.displayName = displayName; - this.message = message; - } - - protected McMMOChatEvent(Plugin plugin, String sender, String displayName, String message, boolean isAsync) { + protected McMMOChatEvent(@NotNull Plugin plugin, @NotNull AbstractChatMessage chatMessage, boolean isAsync) { super(isAsync); this.plugin = plugin; - this.sender = sender; - this.displayName = displayName; - this.message = message; + this.chatMessage = chatMessage; } /** - * @return The plugin responsible for this event, note this can be null + * The {@link Author} of this message + * + * @return the {@link Author} of this message */ - public Plugin getPlugin() { + public @NotNull Author getAuthor() { + return chatMessage.getAuthor(); + } + + /** + * The {@link Audience} for this message + * + * @return the {@link Audience} for this message + */ + public @NotNull Audience getAudience() { + return chatMessage.getAudience(); + } + + /** + * Set the {@link Audience} for this message + * + * @param audience target {@link Audience} + */ + public void setAudience(@NotNull Audience audience) { + chatMessage.setAudience(audience); + } + + /** + * @return The plugin responsible for this event + */ + public @NotNull Plugin getPlugin() { return plugin; } /** - * @return String name of the player who sent the chat, or "Console" + * The name of the author + * Will return the display name if mcMMO chat config is set to, otherwise returns the players Mojang registered nickname + * @return the author's name */ - public String getSender() { - return sender; + public @NotNull String getDisplayName(ChatChannel chatChannel) { + return getAuthor().getAuthoredName(chatChannel); } /** - * @return String display name of the player who sent the chat, or "Console" + * Don't use this method + * + * @return The raw message + * @deprecated use {@link #getComponentMessage()} instead */ - public String getDisplayName() { - return displayName; + @Deprecated + public @NotNull String getMessage() { + return chatMessage.rawMessage(); } /** - * @return String message that will be sent + * The original message typed by the player before any formatting + * The raw message is immutable + * + * @return the message as it was typed by the player, this is before any formatting */ - public String getMessage() { - return message; + public @NotNull String getRawMessage() { + return chatMessage.rawMessage(); } /** - * @param displayName String display name of the player who sent the chat + * The {@link TextComponent} as it will be sent to all players which should include formatting such as adding chat prefixes, player names, etc + * + * @return the message that will be sent to the {@link Audience} */ - public void setDisplayName(String displayName) { - this.displayName = displayName; + public @NotNull TextComponent getComponentMessage() { + return chatMessage.getChatMessage(); } /** - * @param message String message to be sent in chat + * This will be the final message sent to the audience, this should be the message after its been formatted and has had player names added to it etc + * + * @param chatMessage the new chat message */ - public void setMessage(String message) { - this.message = message; + public void setMessagePayload(@NotNull TextComponent chatMessage) { + this.chatMessage.setChatMessage(chatMessage); + } + + /** + * @param message Adjusts the final message sent to players in the party + * + * @deprecated use {{@link #setMessagePayload(TextComponent)}} + */ + @Deprecated + public void setMessage(@NotNull String message) { + chatMessage.setChatMessage(Component.text(message)); } /** Following are required for Cancellable **/ @@ -81,14 +128,22 @@ public abstract class McMMOChatEvent extends Event implements Cancellable { } /** Rest of file is required boilerplate for custom events **/ - private static final HandlerList handlers = new HandlerList(); + private static final @NotNull HandlerList handlers = new HandlerList(); @Override - public HandlerList getHandlers() { + public @NotNull HandlerList getHandlers() { return handlers; } - public static HandlerList getHandlerList() { + public static @NotNull HandlerList getHandlerList() { return handlers; } + + /** + * The {@link ChatMessage} + * @return the chat message + */ + public @NotNull ChatMessage getChatMessage() { + return chatMessage; + } } diff --git a/src/main/java/com/gmail/nossr50/events/chat/McMMOPartyChatEvent.java b/src/main/java/com/gmail/nossr50/events/chat/McMMOPartyChatEvent.java index ffa54f815..1f00c6763 100644 --- a/src/main/java/com/gmail/nossr50/events/chat/McMMOPartyChatEvent.java +++ b/src/main/java/com/gmail/nossr50/events/chat/McMMOPartyChatEvent.java @@ -1,27 +1,43 @@ package com.gmail.nossr50.events.chat; +import com.gmail.nossr50.chat.message.PartyChatMessage; +import com.gmail.nossr50.datatypes.party.Party; import org.bukkit.plugin.Plugin; +import org.jetbrains.annotations.NotNull; /** * Called when a chat is sent to a party channel */ public class McMMOPartyChatEvent extends McMMOChatEvent { - private String party; + private final @NotNull String party; //Not going to break the API to rename this for now + private final @NotNull Party targetParty; - public McMMOPartyChatEvent(Plugin plugin, String sender, String displayName, String party, String message) { - super(plugin, sender, displayName, message); - this.party = party; - } - - public McMMOPartyChatEvent(Plugin plugin, String sender, String displayName, String party, String message, boolean isAsync) { - super(plugin, sender, displayName, message, isAsync); - this.party = party; + public McMMOPartyChatEvent(@NotNull Plugin pluginRef, @NotNull PartyChatMessage chatMessage, @NotNull Party party, boolean isAsync) { + super(pluginRef, chatMessage, isAsync); + this.party = party.getName(); + this.targetParty = party; } /** * @return String name of the party the message will be sent to + * + * @deprecated this will be removed in the future */ - public String getParty() { + @Deprecated + public @NotNull String getParty() { return party; } + + public @NotNull PartyChatMessage getPartyChatMessage() { + return (PartyChatMessage) chatMessage; + } + + /** + * The authors party + * + * @return the party that this message will be delivered to + */ + public @NotNull Party getAuthorParty() { + return targetParty; + } } diff --git a/src/main/java/com/gmail/nossr50/events/experience/McMMOPlayerExperienceEvent.java b/src/main/java/com/gmail/nossr50/events/experience/McMMOPlayerExperienceEvent.java index 78592b03b..44ad7d078 100644 --- a/src/main/java/com/gmail/nossr50/events/experience/McMMOPlayerExperienceEvent.java +++ b/src/main/java/com/gmail/nossr50/events/experience/McMMOPlayerExperienceEvent.java @@ -7,6 +7,7 @@ import org.bukkit.entity.Player; import org.bukkit.event.Cancellable; import org.bukkit.event.HandlerList; import org.bukkit.event.player.PlayerEvent; +import org.jetbrains.annotations.NotNull; /** * Generic event for mcMMO experience events. @@ -28,7 +29,13 @@ public abstract class McMMOPlayerExperienceEvent extends PlayerEvent implements protected McMMOPlayerExperienceEvent(Player player, PrimarySkillType skill, XPGainReason xpGainReason) { super(player); this.skill = skill; - this.skillLevel = UserManager.getPlayer(player).getSkillLevel(skill); + + if(UserManager.getPlayer(player) != null) { + this.skillLevel = UserManager.getPlayer(player).getSkillLevel(skill); + } else { + this.skillLevel = 0; + } + this.xpGainReason = xpGainReason; } @@ -67,7 +74,7 @@ public abstract class McMMOPlayerExperienceEvent extends PlayerEvent implements private static final HandlerList handlers = new HandlerList(); @Override - public HandlerList getHandlers() { + public @NotNull HandlerList getHandlers() { return handlers; } diff --git a/src/main/java/com/gmail/nossr50/events/experience/McMMOPlayerLevelDownEvent.java b/src/main/java/com/gmail/nossr50/events/experience/McMMOPlayerLevelDownEvent.java index 3834726f8..6e512b338 100644 --- a/src/main/java/com/gmail/nossr50/events/experience/McMMOPlayerLevelDownEvent.java +++ b/src/main/java/com/gmail/nossr50/events/experience/McMMOPlayerLevelDownEvent.java @@ -4,6 +4,7 @@ import com.gmail.nossr50.datatypes.experience.XPGainReason; import com.gmail.nossr50.datatypes.skills.PrimarySkillType; import org.bukkit.entity.Player; import org.bukkit.event.HandlerList; +import org.jetbrains.annotations.NotNull; /** * Called when a user loses levels in a skill @@ -50,7 +51,7 @@ public class McMMOPlayerLevelDownEvent extends McMMOPlayerLevelChangeEvent { private static final HandlerList handlers = new HandlerList(); @Override - public HandlerList getHandlers() { + public @NotNull HandlerList getHandlers() { return handlers; } diff --git a/src/main/java/com/gmail/nossr50/events/experience/McMMOPlayerLevelUpEvent.java b/src/main/java/com/gmail/nossr50/events/experience/McMMOPlayerLevelUpEvent.java index 062dd4a2a..20badcf7c 100644 --- a/src/main/java/com/gmail/nossr50/events/experience/McMMOPlayerLevelUpEvent.java +++ b/src/main/java/com/gmail/nossr50/events/experience/McMMOPlayerLevelUpEvent.java @@ -4,6 +4,7 @@ import com.gmail.nossr50.datatypes.experience.XPGainReason; import com.gmail.nossr50.datatypes.skills.PrimarySkillType; import org.bukkit.entity.Player; import org.bukkit.event.HandlerList; +import org.jetbrains.annotations.NotNull; /** * Called when a user levels up in a skill @@ -50,7 +51,7 @@ public class McMMOPlayerLevelUpEvent extends McMMOPlayerLevelChangeEvent { private static final HandlerList handlers = new HandlerList(); @Override - public HandlerList getHandlers() { + public @NotNull HandlerList getHandlers() { return handlers; } diff --git a/src/main/java/com/gmail/nossr50/events/experience/McMMOPlayerPreXpGainEvent.java b/src/main/java/com/gmail/nossr50/events/experience/McMMOPlayerPreXpGainEvent.java new file mode 100644 index 000000000..849d7ab48 --- /dev/null +++ b/src/main/java/com/gmail/nossr50/events/experience/McMMOPlayerPreXpGainEvent.java @@ -0,0 +1,50 @@ +package com.gmail.nossr50.events.experience; + +import com.gmail.nossr50.datatypes.experience.XPGainReason; +import com.gmail.nossr50.datatypes.skills.PrimarySkillType; +import org.bukkit.entity.Player; +import org.bukkit.event.HandlerList; +import org.jetbrains.annotations.NotNull; + +/** + * Called when a player gains XP in a skill + */ +public class McMMOPlayerPreXpGainEvent extends McMMOPlayerExperienceEvent { + private float xpGained; + + @Deprecated + public McMMOPlayerPreXpGainEvent(Player player, PrimarySkillType skill, float xpGained) { + super(player, skill, XPGainReason.UNKNOWN); + this.xpGained = xpGained; + } + + public McMMOPlayerPreXpGainEvent(Player player, PrimarySkillType skill, float xpGained, XPGainReason xpGainReason) { + super(player, skill, xpGainReason); + this.xpGained = xpGained; + } + + /** + * @return int amount of experience gained in this event + */ + public int getXpGained() { + return (int) xpGained; + } + + /** + * @param xpGained int amount of experience gained in this event + */ + public void setXpGained(int xpGained) { + this.xpGained = xpGained; + } + + private static final HandlerList handlers = new HandlerList(); + + @Override + public @NotNull HandlerList getHandlers() { + return handlers; + } + + public static HandlerList getHandlerList() { + return handlers; + } +} diff --git a/src/main/java/com/gmail/nossr50/events/experience/McMMOPlayerXpGainEvent.java b/src/main/java/com/gmail/nossr50/events/experience/McMMOPlayerXpGainEvent.java index d789fde70..5cd0c73fa 100644 --- a/src/main/java/com/gmail/nossr50/events/experience/McMMOPlayerXpGainEvent.java +++ b/src/main/java/com/gmail/nossr50/events/experience/McMMOPlayerXpGainEvent.java @@ -4,6 +4,7 @@ import com.gmail.nossr50.datatypes.experience.XPGainReason; import com.gmail.nossr50.datatypes.skills.PrimarySkillType; import org.bukkit.entity.Player; import org.bukkit.event.HandlerList; +import org.jetbrains.annotations.NotNull; /** * Called when a player gains XP in a skill @@ -55,7 +56,7 @@ public class McMMOPlayerXpGainEvent extends McMMOPlayerExperienceEvent { private static final HandlerList handlers = new HandlerList(); @Override - public HandlerList getHandlers() { + public @NotNull HandlerList getHandlers() { return handlers; } diff --git a/src/main/java/com/gmail/nossr50/events/fake/FakeBlockBreakEvent.java b/src/main/java/com/gmail/nossr50/events/fake/FakeBlockBreakEvent.java index 7a2f7ab08..d94410544 100644 --- a/src/main/java/com/gmail/nossr50/events/fake/FakeBlockBreakEvent.java +++ b/src/main/java/com/gmail/nossr50/events/fake/FakeBlockBreakEvent.java @@ -7,7 +7,7 @@ import org.bukkit.event.block.BlockBreakEvent; /** * Called when mcMMO breaks a block due to a special ability. */ -public class FakeBlockBreakEvent extends BlockBreakEvent { +public class FakeBlockBreakEvent extends BlockBreakEvent implements FakeEvent { public FakeBlockBreakEvent(Block theBlock, Player player) { super(theBlock, player); } diff --git a/src/main/java/com/gmail/nossr50/events/fake/FakeBlockDamageEvent.java b/src/main/java/com/gmail/nossr50/events/fake/FakeBlockDamageEvent.java index 31dbb7a53..0e32ce00c 100644 --- a/src/main/java/com/gmail/nossr50/events/fake/FakeBlockDamageEvent.java +++ b/src/main/java/com/gmail/nossr50/events/fake/FakeBlockDamageEvent.java @@ -8,7 +8,7 @@ import org.bukkit.inventory.ItemStack; /** * Called when mcMMO damages a block due to a special ability. */ -public class FakeBlockDamageEvent extends BlockDamageEvent { +public class FakeBlockDamageEvent extends BlockDamageEvent implements FakeEvent { public FakeBlockDamageEvent(Player player, Block block, ItemStack itemInHand, boolean instaBreak) { super(player, block, itemInHand, instaBreak); } diff --git a/src/main/java/com/gmail/nossr50/events/fake/FakeBrewEvent.java b/src/main/java/com/gmail/nossr50/events/fake/FakeBrewEvent.java index e7ef73c3e..ea44f355a 100644 --- a/src/main/java/com/gmail/nossr50/events/fake/FakeBrewEvent.java +++ b/src/main/java/com/gmail/nossr50/events/fake/FakeBrewEvent.java @@ -3,9 +3,12 @@ package com.gmail.nossr50.events.fake; import org.bukkit.block.Block; import org.bukkit.event.inventory.BrewEvent; import org.bukkit.inventory.BrewerInventory; +import org.bukkit.inventory.ItemStack; -public class FakeBrewEvent extends BrewEvent { - public FakeBrewEvent(Block brewer, BrewerInventory contents, int fuelLevel) { - super(brewer, contents, fuelLevel); +import java.util.List; + +public class FakeBrewEvent extends BrewEvent implements FakeEvent { + public FakeBrewEvent(Block brewer, BrewerInventory contents, List results, int fuelLevel) { + super(brewer, contents, results, fuelLevel); } } diff --git a/src/main/java/com/gmail/nossr50/events/fake/FakeEntityDamageByEntityEvent.java b/src/main/java/com/gmail/nossr50/events/fake/FakeEntityDamageByEntityEvent.java index 840f039f6..51f2210da 100644 --- a/src/main/java/com/gmail/nossr50/events/fake/FakeEntityDamageByEntityEvent.java +++ b/src/main/java/com/gmail/nossr50/events/fake/FakeEntityDamageByEntityEvent.java @@ -1,9 +1,9 @@ package com.gmail.nossr50.events.fake; import com.google.common.base.Function; -import com.google.common.base.Functions; import org.bukkit.entity.Entity; import org.bukkit.event.entity.EntityDamageByEntityEvent; +import org.jetbrains.annotations.NotNull; import java.util.EnumMap; import java.util.Map; @@ -11,23 +11,23 @@ import java.util.Map; /** * Called when mcMMO applies damage from an entity due to special abilities. */ -public class FakeEntityDamageByEntityEvent extends EntityDamageByEntityEvent { +public class FakeEntityDamageByEntityEvent extends EntityDamageByEntityEvent implements FakeEvent { - public FakeEntityDamageByEntityEvent(Entity damager, Entity damagee, DamageCause cause, final Map modifiers) { + public FakeEntityDamageByEntityEvent(@NotNull Entity damager, @NotNull Entity damagee, @NotNull DamageCause cause, @NotNull final Map modifiers) { super(damager, damagee, cause, modifiers, getFunctionModifiers(modifiers)); } @Deprecated - public FakeEntityDamageByEntityEvent(Entity damager, Entity damagee, DamageCause cause, double damage) { + public FakeEntityDamageByEntityEvent(@NotNull Entity damager, @NotNull Entity damagee, @NotNull DamageCause cause, double damage) { super(damager, damagee, cause, damage); } - public static EnumMap> getFunctionModifiers(Map modifiers) { - EnumMap> modifierFunctions = new EnumMap>(DamageModifier.class); - Function ZERO = Functions.constant(-0.0); + @NotNull + public static EnumMap> getFunctionModifiers(@NotNull Map modifiers) { + EnumMap> modifierFunctions = new EnumMap<>(DamageModifier.class); for (DamageModifier modifier : modifiers.keySet()) { - modifierFunctions.put(modifier, ZERO); + modifierFunctions.put(modifier, (o -> -0.0)); } return modifierFunctions; diff --git a/src/main/java/com/gmail/nossr50/events/fake/FakeEntityDamageEvent.java b/src/main/java/com/gmail/nossr50/events/fake/FakeEntityDamageEvent.java index 0ec008672..df12fff94 100644 --- a/src/main/java/com/gmail/nossr50/events/fake/FakeEntityDamageEvent.java +++ b/src/main/java/com/gmail/nossr50/events/fake/FakeEntityDamageEvent.java @@ -11,7 +11,7 @@ import java.util.Map; /** * Called when mcMMO applies damage due to special abilities. */ -public class FakeEntityDamageEvent extends EntityDamageEvent { +public class FakeEntityDamageEvent extends EntityDamageEvent implements FakeEvent { public FakeEntityDamageEvent(Entity damagee, DamageCause cause, final Map modifiers) { super(damagee, cause, modifiers, getFunctionModifiers(modifiers)); @@ -23,7 +23,7 @@ public class FakeEntityDamageEvent extends EntityDamageEvent { } public static EnumMap> getFunctionModifiers(Map modifiers) { - EnumMap> modifierFunctions = new EnumMap>(DamageModifier.class); + EnumMap> modifierFunctions = new EnumMap<>(DamageModifier.class); Function ZERO = Functions.constant(-0.0); for (DamageModifier modifier : modifiers.keySet()) { diff --git a/src/main/java/com/gmail/nossr50/events/fake/FakeEntityTameEvent.java b/src/main/java/com/gmail/nossr50/events/fake/FakeEntityTameEvent.java index 46adfe737..29b6a5ce4 100644 --- a/src/main/java/com/gmail/nossr50/events/fake/FakeEntityTameEvent.java +++ b/src/main/java/com/gmail/nossr50/events/fake/FakeEntityTameEvent.java @@ -7,7 +7,7 @@ import org.bukkit.event.entity.EntityTameEvent; /** * Called when mcMMO tames an animal via Call of the Wild */ -public class FakeEntityTameEvent extends EntityTameEvent { +public class FakeEntityTameEvent extends EntityTameEvent implements FakeEvent { public FakeEntityTameEvent(LivingEntity entity, AnimalTamer owner) { super(entity, owner); } diff --git a/src/main/java/com/gmail/nossr50/events/fake/FakeEvent.java b/src/main/java/com/gmail/nossr50/events/fake/FakeEvent.java new file mode 100644 index 000000000..62e989326 --- /dev/null +++ b/src/main/java/com/gmail/nossr50/events/fake/FakeEvent.java @@ -0,0 +1,11 @@ +package com.gmail.nossr50.events.fake; + +import org.bukkit.event.Event; + +/** + * This interface marks an {@link Event} as "fake". + * This is just a handy way of checking if an {@link Event} is fake or not, maybe there + * will be methods suitable for this in the future. + * + */ +public interface FakeEvent {} diff --git a/src/main/java/com/gmail/nossr50/events/fake/FakePlayerAnimationEvent.java b/src/main/java/com/gmail/nossr50/events/fake/FakePlayerAnimationEvent.java index c6e2cbaab..075928bb4 100644 --- a/src/main/java/com/gmail/nossr50/events/fake/FakePlayerAnimationEvent.java +++ b/src/main/java/com/gmail/nossr50/events/fake/FakePlayerAnimationEvent.java @@ -6,7 +6,7 @@ import org.bukkit.event.player.PlayerAnimationEvent; /** * Called when handling extra drops to avoid issues with NoCheat. */ -public class FakePlayerAnimationEvent extends PlayerAnimationEvent { +public class FakePlayerAnimationEvent extends PlayerAnimationEvent implements FakeEvent { public FakePlayerAnimationEvent(Player player) { super(player); } diff --git a/src/main/java/com/gmail/nossr50/events/fake/FakePlayerFishEvent.java b/src/main/java/com/gmail/nossr50/events/fake/FakePlayerFishEvent.java index 235af9934..983d44071 100644 --- a/src/main/java/com/gmail/nossr50/events/fake/FakePlayerFishEvent.java +++ b/src/main/java/com/gmail/nossr50/events/fake/FakePlayerFishEvent.java @@ -5,7 +5,7 @@ import org.bukkit.entity.FishHook; import org.bukkit.entity.Player; import org.bukkit.event.player.PlayerFishEvent; -public class FakePlayerFishEvent extends PlayerFishEvent { +public class FakePlayerFishEvent extends PlayerFishEvent implements FakeEvent { public FakePlayerFishEvent(Player player, Entity entity, FishHook hookEntity, State state) { super(player, entity, hookEntity, state); } diff --git a/src/main/java/com/gmail/nossr50/events/hardcore/McMMOPlayerDeathPenaltyEvent.java b/src/main/java/com/gmail/nossr50/events/hardcore/McMMOPlayerDeathPenaltyEvent.java index bf723375a..7c4d3f08a 100644 --- a/src/main/java/com/gmail/nossr50/events/hardcore/McMMOPlayerDeathPenaltyEvent.java +++ b/src/main/java/com/gmail/nossr50/events/hardcore/McMMOPlayerDeathPenaltyEvent.java @@ -4,6 +4,7 @@ import org.bukkit.entity.Player; import org.bukkit.event.Cancellable; import org.bukkit.event.HandlerList; import org.bukkit.event.player.PlayerEvent; +import org.jetbrains.annotations.NotNull; import java.util.HashMap; @@ -57,7 +58,7 @@ public class McMMOPlayerDeathPenaltyEvent extends PlayerEvent implements Cancell private static final HandlerList handlers = new HandlerList(); @Override - public HandlerList getHandlers() { + public @NotNull HandlerList getHandlers() { return handlers; } diff --git a/src/main/java/com/gmail/nossr50/events/hardcore/McMMOPlayerPreDeathPenaltyEvent.java b/src/main/java/com/gmail/nossr50/events/hardcore/McMMOPlayerPreDeathPenaltyEvent.java index b831f0426..7bf355da0 100644 --- a/src/main/java/com/gmail/nossr50/events/hardcore/McMMOPlayerPreDeathPenaltyEvent.java +++ b/src/main/java/com/gmail/nossr50/events/hardcore/McMMOPlayerPreDeathPenaltyEvent.java @@ -4,6 +4,7 @@ import org.bukkit.entity.Player; import org.bukkit.event.Cancellable; import org.bukkit.event.HandlerList; import org.bukkit.event.player.PlayerEvent; +import org.jetbrains.annotations.NotNull; public class McMMOPlayerPreDeathPenaltyEvent extends PlayerEvent implements Cancellable { private boolean cancelled; @@ -28,7 +29,7 @@ public class McMMOPlayerPreDeathPenaltyEvent extends PlayerEvent implements Canc private static final HandlerList handlers = new HandlerList(); @Override - public HandlerList getHandlers() { + public @NotNull HandlerList getHandlers() { return handlers; } diff --git a/src/main/java/com/gmail/nossr50/events/hardcore/McMMOPlayerVampirismEvent.java b/src/main/java/com/gmail/nossr50/events/hardcore/McMMOPlayerVampirismEvent.java index 735094f67..8aa59d521 100644 --- a/src/main/java/com/gmail/nossr50/events/hardcore/McMMOPlayerVampirismEvent.java +++ b/src/main/java/com/gmail/nossr50/events/hardcore/McMMOPlayerVampirismEvent.java @@ -5,7 +5,7 @@ import org.bukkit.entity.Player; import java.util.HashMap; public class McMMOPlayerVampirismEvent extends McMMOPlayerDeathPenaltyEvent { - private boolean isVictim; + private final boolean isVictim; public McMMOPlayerVampirismEvent(Player player, boolean isVictim, HashMap levelChanged, HashMap experienceChanged) { super(player, levelChanged, experienceChanged); diff --git a/src/main/java/com/gmail/nossr50/events/items/McMMOItemSpawnEvent.java b/src/main/java/com/gmail/nossr50/events/items/McMMOItemSpawnEvent.java index b6d7dcb94..1249476d4 100644 --- a/src/main/java/com/gmail/nossr50/events/items/McMMOItemSpawnEvent.java +++ b/src/main/java/com/gmail/nossr50/events/items/McMMOItemSpawnEvent.java @@ -1,10 +1,14 @@ package com.gmail.nossr50.events.items; +import com.gmail.nossr50.api.ItemSpawnReason; import org.bukkit.Location; +import org.bukkit.entity.Player; import org.bukkit.event.Cancellable; import org.bukkit.event.Event; import org.bukkit.event.HandlerList; import org.bukkit.inventory.ItemStack; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; /** * Called when mcMMO is preparing to drop an item. @@ -13,38 +17,60 @@ public class McMMOItemSpawnEvent extends Event implements Cancellable { private Location location; private ItemStack itemStack; private boolean cancelled; + private final ItemSpawnReason itemSpawnReason; + private final Player player; - public McMMOItemSpawnEvent(Location location, ItemStack itemStack) { + public McMMOItemSpawnEvent(@NotNull Location location, @NotNull ItemStack itemStack, @NotNull ItemSpawnReason itemSpawnReason, @Nullable Player player) { this.location = location; this.itemStack = itemStack; + this.itemSpawnReason = itemSpawnReason; + this.player = player; this.cancelled = false; } + /** + * Get the associated player + * This can be null + * @return the associated player if one exists null otherwise + */ + public @Nullable Player getPlayer() { + return player; + } + + /** + * The reason an item is being spawned by mcMMO + * @see ItemSpawnReason + * @return the item drop reason + */ + public ItemSpawnReason getItemSpawnReason() { + return itemSpawnReason; + } + /** * @return Location where the item will be dropped */ - public Location getLocation() { + public @NotNull Location getLocation() { return location; } /** * @param location Location where to drop the item */ - public void setLocation(Location location) { + public void setLocation(@NotNull Location location) { this.location = location; } /** * @return ItemStack that will be dropped */ - public ItemStack getItemStack() { + public @NotNull ItemStack getItemStack() { return itemStack; } /** * @param itemStack ItemStack to drop */ - public void setItemStack(ItemStack itemStack) { + public void setItemStack(@NotNull ItemStack itemStack) { this.itemStack = itemStack; } @@ -60,14 +86,14 @@ public class McMMOItemSpawnEvent extends Event implements Cancellable { } /** Rest of file is required boilerplate for custom events **/ - private static final HandlerList handlers = new HandlerList(); + private static final @NotNull HandlerList handlers = new HandlerList(); @Override - public HandlerList getHandlers() { + public @NotNull HandlerList getHandlers() { return handlers; } - public static HandlerList getHandlerList() { + public static @NotNull HandlerList getHandlerList() { return handlers; } } diff --git a/src/main/java/com/gmail/nossr50/events/party/McMMOPartyAllianceChangeEvent.java b/src/main/java/com/gmail/nossr50/events/party/McMMOPartyAllianceChangeEvent.java index 1e126e501..68fc2db6f 100644 --- a/src/main/java/com/gmail/nossr50/events/party/McMMOPartyAllianceChangeEvent.java +++ b/src/main/java/com/gmail/nossr50/events/party/McMMOPartyAllianceChangeEvent.java @@ -4,11 +4,12 @@ import org.bukkit.entity.Player; import org.bukkit.event.Cancellable; import org.bukkit.event.HandlerList; import org.bukkit.event.player.PlayerEvent; +import org.jetbrains.annotations.NotNull; public class McMMOPartyAllianceChangeEvent extends PlayerEvent implements Cancellable { - private String oldAlly; - private String newAlly; - private EventReason reason; + private final String oldAlly; + private final String newAlly; + private final EventReason reason; private boolean cancelled; public McMMOPartyAllianceChangeEvent(Player player, String oldAlly, String newAlly, EventReason reason) { @@ -62,7 +63,7 @@ public class McMMOPartyAllianceChangeEvent extends PlayerEvent implements Cancel /** * Any reason that doesn't fit elsewhere. */ - CUSTOM; + CUSTOM } /** Following are required for Cancellable **/ @@ -80,7 +81,7 @@ public class McMMOPartyAllianceChangeEvent extends PlayerEvent implements Cancel private static final HandlerList handlers = new HandlerList(); @Override - public HandlerList getHandlers() { + public @NotNull HandlerList getHandlers() { return handlers; } diff --git a/src/main/java/com/gmail/nossr50/events/party/McMMOPartyChangeEvent.java b/src/main/java/com/gmail/nossr50/events/party/McMMOPartyChangeEvent.java index f2d3f537e..1f9b30696 100644 --- a/src/main/java/com/gmail/nossr50/events/party/McMMOPartyChangeEvent.java +++ b/src/main/java/com/gmail/nossr50/events/party/McMMOPartyChangeEvent.java @@ -4,14 +4,15 @@ import org.bukkit.entity.Player; import org.bukkit.event.Cancellable; import org.bukkit.event.HandlerList; import org.bukkit.event.player.PlayerEvent; +import org.jetbrains.annotations.NotNull; /** * Called when a player attempts to join, leave, or change parties. */ public class McMMOPartyChangeEvent extends PlayerEvent implements Cancellable { - private String oldParty; - private String newParty; - private EventReason reason; + private final String oldParty; + private final String newParty; + private final EventReason reason; private boolean cancelled; public McMMOPartyChangeEvent(Player player, String oldParty, String newParty, EventReason reason) { @@ -52,6 +53,16 @@ public class McMMOPartyChangeEvent extends PlayerEvent implements Cancellable { * A list of reasons why the event may have been fired */ public enum EventReason { + /** + * Created a party. + */ + CREATED_PARTY, + + /** + * Disbanded a party. + */ + DISBANDED_PARTY, + /** * Joined a party for the first time. */ @@ -75,7 +86,7 @@ public class McMMOPartyChangeEvent extends PlayerEvent implements Cancellable { /** * Any reason that doesn't fit elsewhere. */ - CUSTOM; + CUSTOM } /** Following are required for Cancellable **/ @@ -93,7 +104,7 @@ public class McMMOPartyChangeEvent extends PlayerEvent implements Cancellable { private static final HandlerList handlers = new HandlerList(); @Override - public HandlerList getHandlers() { + public @NotNull HandlerList getHandlers() { return handlers; } diff --git a/src/main/java/com/gmail/nossr50/events/party/McMMOPartyLevelUpEvent.java b/src/main/java/com/gmail/nossr50/events/party/McMMOPartyLevelUpEvent.java index 0fcdabd7a..ed42bf028 100644 --- a/src/main/java/com/gmail/nossr50/events/party/McMMOPartyLevelUpEvent.java +++ b/src/main/java/com/gmail/nossr50/events/party/McMMOPartyLevelUpEvent.java @@ -4,9 +4,10 @@ import com.gmail.nossr50.datatypes.party.Party; import org.bukkit.event.Cancellable; import org.bukkit.event.Event; import org.bukkit.event.HandlerList; +import org.jetbrains.annotations.NotNull; public class McMMOPartyLevelUpEvent extends Event implements Cancellable { - private Party party; + private final Party party; private int levelsChanged; private boolean cancelled; @@ -43,7 +44,7 @@ public class McMMOPartyLevelUpEvent extends Event implements Cancellable { private static final HandlerList handlers = new HandlerList(); @Override - public HandlerList getHandlers() { + public @NotNull HandlerList getHandlers() { return handlers; } diff --git a/src/main/java/com/gmail/nossr50/events/party/McMMOPartyTeleportEvent.java b/src/main/java/com/gmail/nossr50/events/party/McMMOPartyTeleportEvent.java index 9bc1fe1ee..322833de1 100644 --- a/src/main/java/com/gmail/nossr50/events/party/McMMOPartyTeleportEvent.java +++ b/src/main/java/com/gmail/nossr50/events/party/McMMOPartyTeleportEvent.java @@ -3,13 +3,14 @@ package com.gmail.nossr50.events.party; import org.bukkit.entity.Player; import org.bukkit.event.HandlerList; import org.bukkit.event.player.PlayerTeleportEvent; +import org.jetbrains.annotations.NotNull; /** * Called just before a player teleports using the /ptp command. */ public class McMMOPartyTeleportEvent extends PlayerTeleportEvent { - private String party; - private Player target; + private final String party; + private final Player target; public McMMOPartyTeleportEvent(Player player, Player target, String party) { super(player, player.getLocation(), target.getLocation(), TeleportCause.COMMAND); @@ -35,11 +36,11 @@ public class McMMOPartyTeleportEvent extends PlayerTeleportEvent { private static final HandlerList handlers = new HandlerList(); @Override - public HandlerList getHandlers() { + public @NotNull HandlerList getHandlers() { return handlers; } - public static HandlerList getHandlerList() { + public static @NotNull HandlerList getHandlerList() { return handlers; } } diff --git a/src/main/java/com/gmail/nossr50/events/party/McMMOPartyXpGainEvent.java b/src/main/java/com/gmail/nossr50/events/party/McMMOPartyXpGainEvent.java index 16dbd95a2..926588dcc 100644 --- a/src/main/java/com/gmail/nossr50/events/party/McMMOPartyXpGainEvent.java +++ b/src/main/java/com/gmail/nossr50/events/party/McMMOPartyXpGainEvent.java @@ -4,9 +4,10 @@ import com.gmail.nossr50.datatypes.party.Party; import org.bukkit.event.Cancellable; import org.bukkit.event.Event; import org.bukkit.event.HandlerList; +import org.jetbrains.annotations.NotNull; public class McMMOPartyXpGainEvent extends Event implements Cancellable { - private Party party; + private final Party party; private float xpGained; private boolean cancelled; @@ -65,7 +66,7 @@ public class McMMOPartyXpGainEvent extends Event implements Cancellable { private static final HandlerList handlers = new HandlerList(); @Override - public HandlerList getHandlers() { + public @NotNull HandlerList getHandlers() { return handlers; } diff --git a/src/main/java/com/gmail/nossr50/events/players/McMMOPlayerProfileLoadEvent.java b/src/main/java/com/gmail/nossr50/events/players/McMMOPlayerProfileLoadEvent.java index fa654014e..c16a520a8 100644 --- a/src/main/java/com/gmail/nossr50/events/players/McMMOPlayerProfileLoadEvent.java +++ b/src/main/java/com/gmail/nossr50/events/players/McMMOPlayerProfileLoadEvent.java @@ -6,11 +6,12 @@ import org.bukkit.entity.Player; import org.bukkit.event.Cancellable; import org.bukkit.event.Event; import org.bukkit.event.HandlerList; +import org.jetbrains.annotations.NotNull; public class McMMOPlayerProfileLoadEvent extends Event implements Cancellable { private boolean cancelled; - private PlayerProfile profile; - private Player player; + private final PlayerProfile profile; + private final Player player; public McMMOPlayerProfileLoadEvent(Player player, PlayerProfile profile){ super(!Bukkit.isPrimaryThread()); @@ -32,7 +33,7 @@ public class McMMOPlayerProfileLoadEvent extends Event implements Cancellable { private static final HandlerList handlers = new HandlerList(); @Override - public HandlerList getHandlers() { + public @NotNull HandlerList getHandlers() { return handlers; } diff --git a/src/main/java/com/gmail/nossr50/events/scoreboard/McMMOScoreboardEvent.java b/src/main/java/com/gmail/nossr50/events/scoreboard/McMMOScoreboardEvent.java index 44a22538b..e03a8a4f7 100644 --- a/src/main/java/com/gmail/nossr50/events/scoreboard/McMMOScoreboardEvent.java +++ b/src/main/java/com/gmail/nossr50/events/scoreboard/McMMOScoreboardEvent.java @@ -4,6 +4,7 @@ import org.bukkit.entity.Player; import org.bukkit.event.Event; import org.bukkit.event.HandlerList; import org.bukkit.scoreboard.Scoreboard; +import org.jetbrains.annotations.NotNull; /** * The parent class of all mcMMO scoreboard events @@ -25,7 +26,7 @@ abstract public class McMMOScoreboardEvent extends Event { this.targetPlayer = targetPlayer; } - /** GETTER & SETTER BOILERPLATE **/ + /* GETTER & SETTER BOILERPLATE **/ /** * This is the scoreboard the player will be assigned to after this event @@ -80,7 +81,7 @@ abstract public class McMMOScoreboardEvent extends Event { private static final HandlerList handlers = new HandlerList(); @Override - public HandlerList getHandlers() { + public @NotNull HandlerList getHandlers() { return handlers; } diff --git a/src/main/java/com/gmail/nossr50/events/skills/McMMOPlayerNotificationEvent.java b/src/main/java/com/gmail/nossr50/events/skills/McMMOPlayerNotificationEvent.java index 05ed0f510..1b0c17949 100644 --- a/src/main/java/com/gmail/nossr50/events/skills/McMMOPlayerNotificationEvent.java +++ b/src/main/java/com/gmail/nossr50/events/skills/McMMOPlayerNotificationEvent.java @@ -1,12 +1,13 @@ package com.gmail.nossr50.events.skills; import com.gmail.nossr50.datatypes.interactions.NotificationType; -import net.md_5.bungee.api.ChatMessageType; -import net.md_5.bungee.api.chat.TextComponent; +import com.gmail.nossr50.util.text.McMMOMessageType; +import net.kyori.adventure.text.Component; import org.bukkit.entity.Player; import org.bukkit.event.Cancellable; import org.bukkit.event.Event; import org.bukkit.event.HandlerList; +import org.jetbrains.annotations.NotNull; /** * This event is sent for when mcMMO informs a player about various important information @@ -21,12 +22,12 @@ public class McMMOPlayerNotificationEvent extends Event implements Cancellable { private boolean isMessageAlsoBeingSentToChat; private static final HandlerList handlers = new HandlerList(); - protected ChatMessageType chatMessageType; + protected McMMOMessageType chatMessageType; - protected TextComponent notificationTextComponent; + protected Component notificationTextComponent; protected final NotificationType notificationType; - public McMMOPlayerNotificationEvent(Player who, NotificationType notificationType, TextComponent notificationTextComponent, ChatMessageType chatMessageType, boolean isMessageAlsoBeingSentToChat) { + public McMMOPlayerNotificationEvent(Player who, NotificationType notificationType, Component notificationTextComponent, McMMOMessageType chatMessageType, boolean isMessageAlsoBeingSentToChat) { super(false); this.notificationType = notificationType; this.notificationTextComponent = notificationTextComponent; @@ -47,19 +48,19 @@ public class McMMOPlayerNotificationEvent extends Event implements Cancellable { isMessageAlsoBeingSentToChat = messageAlsoBeingSentToChat; } - public TextComponent getNotificationTextComponent() { + public Component getNotificationTextComponent() { return notificationTextComponent; } - public void setNotificationTextComponent(TextComponent notificationTextComponent) { + public void setNotificationTextComponent(Component notificationTextComponent) { this.notificationTextComponent = notificationTextComponent; } - public ChatMessageType getChatMessageType() { + public McMMOMessageType getChatMessageType() { return chatMessageType; } - public void setChatMessageType(ChatMessageType chatMessageType) { + public void setChatMessageType(McMMOMessageType chatMessageType) { this.chatMessageType = chatMessageType; } @@ -76,7 +77,7 @@ public class McMMOPlayerNotificationEvent extends Event implements Cancellable { */ @Override - public HandlerList getHandlers() { + public @NotNull HandlerList getHandlers() { return handlers; } diff --git a/src/main/java/com/gmail/nossr50/events/skills/McMMOPlayerSkillEvent.java b/src/main/java/com/gmail/nossr50/events/skills/McMMOPlayerSkillEvent.java index b9a5af433..e899ea528 100644 --- a/src/main/java/com/gmail/nossr50/events/skills/McMMOPlayerSkillEvent.java +++ b/src/main/java/com/gmail/nossr50/events/skills/McMMOPlayerSkillEvent.java @@ -5,6 +5,7 @@ import com.gmail.nossr50.util.player.UserManager; import org.bukkit.entity.Player; import org.bukkit.event.HandlerList; import org.bukkit.event.player.PlayerEvent; +import org.jetbrains.annotations.NotNull; /** * Generic event for mcMMO skill handling. @@ -37,7 +38,7 @@ public abstract class McMMOPlayerSkillEvent extends PlayerEvent { private static final HandlerList handlers = new HandlerList(); @Override - public HandlerList getHandlers() { + public @NotNull HandlerList getHandlers() { return handlers; } diff --git a/src/main/java/com/gmail/nossr50/events/skills/SkillActivationPerkEvent.java b/src/main/java/com/gmail/nossr50/events/skills/SkillActivationPerkEvent.java new file mode 100644 index 000000000..36848e6fa --- /dev/null +++ b/src/main/java/com/gmail/nossr50/events/skills/SkillActivationPerkEvent.java @@ -0,0 +1,50 @@ +package com.gmail.nossr50.events.skills; + +import org.bukkit.Bukkit; +import org.bukkit.entity.Player; +import org.bukkit.event.Event; +import org.bukkit.event.HandlerList; +import org.jetbrains.annotations.NotNull; + +public class SkillActivationPerkEvent extends Event { + + + + + private static final HandlerList handlers = new HandlerList(); + private final Player player; + private int ticks; + private final int maxTicks; + + public SkillActivationPerkEvent(Player player, int ticks, int maxTicks) { + super(!Bukkit.isPrimaryThread()); + this.player = player; + this.ticks = ticks; + this.maxTicks = maxTicks; + } + + public Player getPlayer() { + return player; + } + + public int getTicks() { + return ticks; + } + + public void setTicks(int ticks) { + this.ticks = ticks; + } + + public int getMaxTicks() { + return maxTicks; + } + + @Override + public @NotNull HandlerList getHandlers() { + return handlers; + } + + public static HandlerList getHandlerList() { + return handlers; + } +} diff --git a/src/main/java/com/gmail/nossr50/events/skills/abilities/McMMOPlayerAbilityEvent.java b/src/main/java/com/gmail/nossr50/events/skills/abilities/McMMOPlayerAbilityEvent.java index bb1fd5f3a..08d7dc2b2 100644 --- a/src/main/java/com/gmail/nossr50/events/skills/abilities/McMMOPlayerAbilityEvent.java +++ b/src/main/java/com/gmail/nossr50/events/skills/abilities/McMMOPlayerAbilityEvent.java @@ -3,14 +3,15 @@ package com.gmail.nossr50.events.skills.abilities; import com.gmail.nossr50.datatypes.skills.PrimarySkillType; import com.gmail.nossr50.datatypes.skills.SuperAbilityType; import com.gmail.nossr50.events.skills.McMMOPlayerSkillEvent; +import com.gmail.nossr50.mcMMO; import org.bukkit.entity.Player; public class McMMOPlayerAbilityEvent extends McMMOPlayerSkillEvent { - private SuperAbilityType ability; + private final SuperAbilityType ability; protected McMMOPlayerAbilityEvent(Player player, PrimarySkillType skill) { super(player, skill); - ability = skill.getAbility(); + ability = mcMMO.p.getSkillTools().getSuperAbility(skill); } public SuperAbilityType getAbility() { diff --git a/src/main/java/com/gmail/nossr50/events/skills/alchemy/McMMOPlayerBrewEvent.java b/src/main/java/com/gmail/nossr50/events/skills/alchemy/McMMOPlayerBrewEvent.java index 1611fc178..ca62829cb 100644 --- a/src/main/java/com/gmail/nossr50/events/skills/alchemy/McMMOPlayerBrewEvent.java +++ b/src/main/java/com/gmail/nossr50/events/skills/alchemy/McMMOPlayerBrewEvent.java @@ -9,7 +9,7 @@ import org.bukkit.entity.Player; import org.bukkit.event.Cancellable; public class McMMOPlayerBrewEvent extends McMMOPlayerSkillEvent implements Cancellable { - private BlockState brewingStand; + private final BlockState brewingStand; private boolean cancelled; diff --git a/src/main/java/com/gmail/nossr50/events/skills/fishing/McMMOPlayerMagicHunterEvent.java b/src/main/java/com/gmail/nossr50/events/skills/fishing/McMMOPlayerMagicHunterEvent.java index 8c993b5a4..decd27ad5 100644 --- a/src/main/java/com/gmail/nossr50/events/skills/fishing/McMMOPlayerMagicHunterEvent.java +++ b/src/main/java/com/gmail/nossr50/events/skills/fishing/McMMOPlayerMagicHunterEvent.java @@ -7,7 +7,7 @@ import org.bukkit.inventory.ItemStack; import java.util.Map; public class McMMOPlayerMagicHunterEvent extends McMMOPlayerFishingTreasureEvent { - private Map enchants; + private final Map enchants; public McMMOPlayerMagicHunterEvent(Player player, ItemStack treasure, int xp, Map enchants) { super(player, treasure, xp); diff --git a/src/main/java/com/gmail/nossr50/events/skills/repair/McMMOPlayerRepairCheckEvent.java b/src/main/java/com/gmail/nossr50/events/skills/repair/McMMOPlayerRepairCheckEvent.java index 638f8c202..fd4a02754 100644 --- a/src/main/java/com/gmail/nossr50/events/skills/repair/McMMOPlayerRepairCheckEvent.java +++ b/src/main/java/com/gmail/nossr50/events/skills/repair/McMMOPlayerRepairCheckEvent.java @@ -10,9 +10,9 @@ import org.bukkit.inventory.ItemStack; * Called just before a player repairs an object with mcMMO. */ public class McMMOPlayerRepairCheckEvent extends McMMOPlayerSkillEvent implements Cancellable { - private short repairAmount; - private ItemStack repairMaterial; - private ItemStack repairedObject; + private final short repairAmount; + private final ItemStack repairMaterial; + private final ItemStack repairedObject; private boolean cancelled; public McMMOPlayerRepairCheckEvent(Player player, short repairAmount, ItemStack repairMaterial, ItemStack repairedObject) { diff --git a/src/main/java/com/gmail/nossr50/events/skills/rupture/McMMOEntityDamageByRuptureEvent.java b/src/main/java/com/gmail/nossr50/events/skills/rupture/McMMOEntityDamageByRuptureEvent.java new file mode 100644 index 000000000..fd64ce27a --- /dev/null +++ b/src/main/java/com/gmail/nossr50/events/skills/rupture/McMMOEntityDamageByRuptureEvent.java @@ -0,0 +1,23 @@ +package com.gmail.nossr50.events.skills.rupture; + +import com.gmail.nossr50.datatypes.player.McMMOPlayer; +import com.google.common.collect.ImmutableMap; +import org.bukkit.entity.Entity; +import org.bukkit.event.entity.EntityDamageByEntityEvent; +import org.jetbrains.annotations.NotNull; + +import java.util.EnumMap; + +public class McMMOEntityDamageByRuptureEvent extends EntityDamageByEntityEvent { + private final McMMOPlayer mcMMODamager; + + public McMMOEntityDamageByRuptureEvent(@NotNull McMMOPlayer damager, @NotNull Entity damagee, double damage) { + super(damager.getPlayer(), damagee, DamageCause.CUSTOM, new EnumMap<>(ImmutableMap.of(DamageModifier.BASE, damage)), new EnumMap<>(ImmutableMap.of(DamageModifier.BASE, (o -> -0.0)))); + this.mcMMODamager = damager; + } + + @NotNull + public McMMOPlayer getMcMMODamager() { + return mcMMODamager; + } +} diff --git a/src/main/java/com/gmail/nossr50/events/skills/salvage/McMMOPlayerSalvageCheckEvent.java b/src/main/java/com/gmail/nossr50/events/skills/salvage/McMMOPlayerSalvageCheckEvent.java index 0a44c2621..6a8061763 100644 --- a/src/main/java/com/gmail/nossr50/events/skills/salvage/McMMOPlayerSalvageCheckEvent.java +++ b/src/main/java/com/gmail/nossr50/events/skills/salvage/McMMOPlayerSalvageCheckEvent.java @@ -10,9 +10,9 @@ import org.bukkit.inventory.ItemStack; * Called just before a player salvages an item with mcMMO. */ public class McMMOPlayerSalvageCheckEvent extends McMMOPlayerSkillEvent implements Cancellable { - private ItemStack salvageItem; - private ItemStack salvageResults; - private ItemStack enchantedBook; + private final ItemStack salvageItem; + private final ItemStack salvageResults; + private final ItemStack enchantedBook; private boolean cancelled; public McMMOPlayerSalvageCheckEvent(Player player, ItemStack salvageItem, ItemStack salvageResults, ItemStack enchantedBook) { diff --git a/src/main/java/com/gmail/nossr50/events/skills/secondaryabilities/SubSkillBlockEvent.java b/src/main/java/com/gmail/nossr50/events/skills/secondaryabilities/SubSkillBlockEvent.java new file mode 100644 index 000000000..69b730af5 --- /dev/null +++ b/src/main/java/com/gmail/nossr50/events/skills/secondaryabilities/SubSkillBlockEvent.java @@ -0,0 +1,23 @@ +package com.gmail.nossr50.events.skills.secondaryabilities; + +import com.gmail.nossr50.datatypes.skills.SubSkillType; +import org.bukkit.block.Block; +import org.bukkit.entity.Player; +import org.jetbrains.annotations.NotNull; + +public class SubSkillBlockEvent extends SubSkillEvent { + private final @NotNull Block block; + + public SubSkillBlockEvent(@NotNull Player player, @NotNull SubSkillType subSkillType, @NotNull Block block) { + super(player, subSkillType); + this.block = block; + } + + /** + * Get the block associated with this event + * @return the block associated with this event + */ + public @NotNull Block getBlock() { + return block; + } +} diff --git a/src/main/java/com/gmail/nossr50/events/skills/secondaryabilities/SubSkillEvent.java b/src/main/java/com/gmail/nossr50/events/skills/secondaryabilities/SubSkillEvent.java index ee4fbb873..7aefb003e 100644 --- a/src/main/java/com/gmail/nossr50/events/skills/secondaryabilities/SubSkillEvent.java +++ b/src/main/java/com/gmail/nossr50/events/skills/secondaryabilities/SubSkillEvent.java @@ -1,9 +1,9 @@ package com.gmail.nossr50.events.skills.secondaryabilities; -import com.gmail.nossr50.datatypes.skills.PrimarySkillType; import com.gmail.nossr50.datatypes.skills.SubSkillType; import com.gmail.nossr50.datatypes.skills.subskills.AbstractSubSkill; import com.gmail.nossr50.events.skills.McMMOPlayerSkillEvent; +import com.gmail.nossr50.mcMMO; import org.bukkit.entity.Player; import org.bukkit.event.Cancellable; @@ -20,7 +20,7 @@ public class SubSkillEvent extends McMMOPlayerSkillEvent implements Cancellable */ @Deprecated public SubSkillEvent(Player player, SubSkillType subSkillType) { - super(player, PrimarySkillType.bySecondaryAbility(subSkillType)); + super(player, mcMMO.p.getSkillTools().getPrimarySkillBySubSkill(subSkillType)); this.subSkillType = subSkillType; } @@ -33,7 +33,7 @@ public class SubSkillEvent extends McMMOPlayerSkillEvent implements Cancellable */ @Deprecated public SubSkillEvent(Player player, SubSkillType subSkillType, double resultModifier) { - super(player, PrimarySkillType.bySecondaryAbility(subSkillType)); + super(player, mcMMO.p.getSkillTools().getPrimarySkillBySubSkill(subSkillType)); this.subSkillType = subSkillType; this.resultModifier = resultModifier; } diff --git a/src/main/java/com/gmail/nossr50/events/skills/unarmed/McMMOPlayerDisarmEvent.java b/src/main/java/com/gmail/nossr50/events/skills/unarmed/McMMOPlayerDisarmEvent.java index 0859a37d1..7404aaa22 100644 --- a/src/main/java/com/gmail/nossr50/events/skills/unarmed/McMMOPlayerDisarmEvent.java +++ b/src/main/java/com/gmail/nossr50/events/skills/unarmed/McMMOPlayerDisarmEvent.java @@ -7,7 +7,7 @@ import org.bukkit.event.Cancellable; public class McMMOPlayerDisarmEvent extends McMMOPlayerSkillEvent implements Cancellable { private boolean cancelled; - private Player defender; + private final Player defender; public McMMOPlayerDisarmEvent(Player defender) { super(defender, PrimarySkillType.UNARMED); diff --git a/src/main/java/com/gmail/nossr50/listeners/BlockListener.java b/src/main/java/com/gmail/nossr50/listeners/BlockListener.java index c73e64f6a..d4da8e1a0 100644 --- a/src/main/java/com/gmail/nossr50/listeners/BlockListener.java +++ b/src/main/java/com/gmail/nossr50/listeners/BlockListener.java @@ -1,6 +1,6 @@ package com.gmail.nossr50.listeners; -import com.gmail.nossr50.config.Config; +import com.gmail.nossr50.api.ItemSpawnReason; import com.gmail.nossr50.config.HiddenConfig; import com.gmail.nossr50.config.WorldBlacklist; import com.gmail.nossr50.config.experience.ExperienceConfig; @@ -11,6 +11,7 @@ import com.gmail.nossr50.datatypes.skills.SuperAbilityType; import com.gmail.nossr50.datatypes.skills.ToolType; import com.gmail.nossr50.events.fake.FakeBlockBreakEvent; import com.gmail.nossr50.events.fake.FakeBlockDamageEvent; +import com.gmail.nossr50.events.fake.FakeEvent; import com.gmail.nossr50.mcMMO; import com.gmail.nossr50.skills.alchemy.Alchemy; import com.gmail.nossr50.skills.excavation.ExcavationManager; @@ -19,10 +20,7 @@ import com.gmail.nossr50.skills.mining.MiningManager; import com.gmail.nossr50.skills.repair.Repair; import com.gmail.nossr50.skills.salvage.Salvage; import com.gmail.nossr50.skills.woodcutting.WoodcuttingManager; -import com.gmail.nossr50.util.BlockUtils; -import com.gmail.nossr50.util.EventUtils; -import com.gmail.nossr50.util.ItemUtils; -import com.gmail.nossr50.util.Permissions; +import com.gmail.nossr50.util.*; import com.gmail.nossr50.util.player.UserManager; import com.gmail.nossr50.util.skills.SkillUtils; import com.gmail.nossr50.util.sounds.SoundManager; @@ -38,10 +36,8 @@ import org.bukkit.event.EventPriority; import org.bukkit.event.Listener; import org.bukkit.event.block.*; import org.bukkit.inventory.ItemStack; -import org.bukkit.metadata.MetadataValue; import java.util.HashSet; -import java.util.List; public class BlockListener implements Listener { private final mcMMO plugin; @@ -50,9 +46,16 @@ public class BlockListener implements Listener { this.plugin = plugin; } - @EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = true) + @EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = false) public void onBlockDropItemEvent(BlockDropItemEvent event) { + //Make sure we clean up metadata on these blocks + if(event.isCancelled()) { + if(event.getBlock().hasMetadata(MetadataConstants.METADATA_KEY_BONUS_DROPS)) + event.getBlock().removeMetadata(MetadataConstants.METADATA_KEY_BONUS_DROPS, plugin); + return; + } + //Track how many "things" are being dropped HashSet uniqueMaterials = new HashSet<>(); boolean dontRewardTE = false; //If we suspect TEs are mixed in with other things don't reward bonus drops for anything that isn't a block @@ -83,9 +86,9 @@ public class BlockListener implements Listener { continue; //TODO: Ignore this abomination its rewritten in 2.2 - if(!Config.getInstance().getDoubleDropsEnabled(PrimarySkillType.MINING, is.getType()) - && !Config.getInstance().getDoubleDropsEnabled(PrimarySkillType.HERBALISM, is.getType()) - && !Config.getInstance().getDoubleDropsEnabled(PrimarySkillType.WOODCUTTING, is.getType())) + if(!mcMMO.p.getGeneralConfig().getDoubleDropsEnabled(PrimarySkillType.MINING, is.getType()) + && !mcMMO.p.getGeneralConfig().getDoubleDropsEnabled(PrimarySkillType.HERBALISM, is.getType()) + && !mcMMO.p.getGeneralConfig().getDoubleDropsEnabled(PrimarySkillType.WOODCUTTING, is.getType())) continue; //If we suspect TEs might be duped only reward block @@ -95,19 +98,19 @@ public class BlockListener implements Listener { } } - if (event.getBlock().getMetadata(mcMMO.BONUS_DROPS_METAKEY).size() > 0) { - BonusDropMeta bonusDropMeta = (BonusDropMeta) event.getBlock().getMetadata(mcMMO.BONUS_DROPS_METAKEY).get(0); + if (event.getBlock().getMetadata(MetadataConstants.METADATA_KEY_BONUS_DROPS).size() > 0) { + BonusDropMeta bonusDropMeta = (BonusDropMeta) event.getBlock().getMetadata(MetadataConstants.METADATA_KEY_BONUS_DROPS).get(0); int bonusCount = bonusDropMeta.asInt(); for (int i = 0; i < bonusCount; i++) { - event.getBlock().getWorld().dropItemNaturally(event.getBlockState().getLocation(), is); + Misc.spawnItemNaturally(event.getPlayer(), event.getBlockState().getLocation(), is, ItemSpawnReason.BONUS_DROPS); } } } } - if(event.getBlock().hasMetadata(mcMMO.BONUS_DROPS_METAKEY)) - event.getBlock().removeMetadata(mcMMO.BONUS_DROPS_METAKEY, plugin); + if(event.getBlock().hasMetadata(MetadataConstants.METADATA_KEY_BONUS_DROPS)) + event.getBlock().removeMetadata(MetadataConstants.METADATA_KEY_BONUS_DROPS, plugin); } /** @@ -126,12 +129,11 @@ public class BlockListener implements Listener { } BlockFace direction = event.getDirection(); - Block movedBlock = event.getBlock(); - movedBlock = movedBlock.getRelative(direction, 2); + Block movedBlock; + for (Block block : event.getBlocks()) { + movedBlock = block.getRelative(direction); - for (Block b : event.getBlocks()) { - if (BlockUtils.shouldBeWatched(b.getState())) { - movedBlock = b.getRelative(direction); + if(BlockUtils.isWithinWorldBounds(movedBlock)) { mcMMO.getPlaceStore().setTrue(movedBlock); } } @@ -155,16 +157,22 @@ public class BlockListener implements Listener { // Get opposite direction so we get correct block BlockFace direction = event.getDirection(); Block movedBlock = event.getBlock().getRelative(direction); - mcMMO.getPlaceStore().setTrue(movedBlock); + + //Spigot makes bad things happen in its API + if(BlockUtils.isWithinWorldBounds(movedBlock)) { + mcMMO.getPlaceStore().setTrue(movedBlock); + } for (Block block : event.getBlocks()) { - movedBlock = block.getRelative(direction); - mcMMO.getPlaceStore().setTrue(movedBlock); + if(BlockUtils.isWithinWorldBounds(block)) { + mcMMO.getPlaceStore().setTrue(block.getRelative(direction)); + } } } /** * Monitor blocks formed by entities (snowmen) + * Does not seem to monitor stuff like a falling block creating a new block * * @param event The event to watch */ @@ -175,28 +183,37 @@ public class BlockListener implements Listener { if(WorldBlacklist.isWorldBlacklisted(event.getBlock().getWorld())) return; + BlockState blockState = event.getNewState(); - if(ExperienceConfig.getInstance().isSnowExploitPrevented() && BlockUtils.shouldBeWatched(blockState)) - { - mcMMO.getPlaceStore().setTrue(blockState.getBlock()); + if(ExperienceConfig.getInstance().isSnowExploitPrevented() && BlockUtils.shouldBeWatched(blockState)) { + Block block = blockState.getBlock(); + + if(BlockUtils.isWithinWorldBounds(block)) { + mcMMO.getPlaceStore().setTrue(block); + } } } + /* + * Does not monitor stuff like a falling block replacing a liquid + */ @EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true) public void onBlockFormEvent(BlockFormEvent event) { + World world = event.getBlock().getWorld(); + /* WORLD BLACKLIST CHECK */ - if(WorldBlacklist.isWorldBlacklisted(event.getBlock().getWorld())) + if(WorldBlacklist.isWorldBlacklisted(world)) return; - if(ExperienceConfig.getInstance().preventStoneLavaFarming()) - { - if(event.getNewState().getType() != Material.OBSIDIAN - && BlockUtils.shouldBeWatched(event.getNewState()) - && ExperienceConfig.getInstance().doesBlockGiveSkillXP(PrimarySkillType.MINING, event.getNewState().getBlockData())) - { - mcMMO.getPlaceStore().setTrue(event.getNewState()); + if(ExperienceConfig.getInstance().preventStoneLavaFarming()) { + BlockState newState = event.getNewState(); + + if(newState.getType() != Material.OBSIDIAN && ExperienceConfig.getInstance().doesBlockGiveSkillXP(PrimarySkillType.MINING, newState.getBlockData())) { + if(BlockUtils.isWithinWorldBounds(newState.getBlock())) { + mcMMO.getPlaceStore().setTrue(newState); + } } } } @@ -208,9 +225,24 @@ public class BlockListener implements Listener { */ @EventHandler(priority = EventPriority.MONITOR) public void onBlockPlace(BlockPlaceEvent event) { + BlockState blockState = event.getBlock().getState(); + Block block = blockState.getBlock(); + + /* Check if the blocks placed should be monitored so they do not give out XP in the future */ +// if (!Tag.LOGS.isTagged(event.getBlockReplacedState().getType()) || !Tag.LOGS.isTagged(event.getBlockPlaced().getType())) + /* WORLD BLACKLIST CHECK */ - if(WorldBlacklist.isWorldBlacklisted(event.getBlock().getWorld())) + if(WorldBlacklist.isWorldBlacklisted(block.getWorld())) { return; + } + + if(BlockUtils.isWithinWorldBounds(block)) { + //NOTE: BlockMultiPlace has its own logic so don't handle anything that would overlap + if (!(event instanceof BlockMultiPlaceEvent)) { + mcMMO.getPlaceStore().setTrue(blockState); + } + } + Player player = event.getPlayer(); @@ -218,24 +250,15 @@ public class BlockListener implements Listener { 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(mcMMOPlayer == null) return; - if (blockState.getType() == Repair.anvilMaterial && PrimarySkillType.REPAIR.getPermissions(player)) { + if (blockState.getType() == Repair.anvilMaterial && mcMMO.p.getSkillTools().doesPlayerHaveSkillPermission(player, PrimarySkillType.REPAIR)) { mcMMOPlayer.getRepairManager().placedAnvilCheck(); } - else if (blockState.getType() == Salvage.anvilMaterial && PrimarySkillType.SALVAGE.getPermissions(player)) { + else if (blockState.getType() == Salvage.anvilMaterial && mcMMO.p.getSkillTools().doesPlayerHaveSkillPermission(player, PrimarySkillType.SALVAGE)) { mcMMOPlayer.getSalvageManager().placedAnvilCheck(); } } @@ -247,41 +270,39 @@ public class BlockListener implements Listener { */ @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()) - { + for (BlockState replacedBlockState : event.getReplacedBlockStates()) { BlockState blockState = replacedBlockState.getBlock().getState(); + Block block = blockState.getBlock(); /* 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); + if(BlockUtils.isWithinWorldBounds(block)) { + //Updated: 10/5/2021 + //Note: For some reason Azalea trees trigger this event but no other tree does (as of 10/5/2021) but if this changes in the future we may need to update this + if(BlockUtils.isPartOfTree(event.getBlockPlaced())) { + return; + } + + //Track unnatural blocks + for(BlockState replacedStates : event.getReplacedBlockStates()) { + mcMMO.getPlaceStore().setTrue(replacedStates); + } } } } @EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true) - public void onBlockGrow(BlockGrowEvent event) - { + public void onBlockGrow(BlockGrowEvent event) { + Block block = event.getBlock(); + World world = block.getWorld(); + /* WORLD BLACKLIST CHECK */ - if(WorldBlacklist.isWorldBlacklisted(event.getBlock().getWorld())) + if(WorldBlacklist.isWorldBlacklisted(world)) return; - BlockState blockState = event.getBlock().getState(); - - if (!BlockUtils.shouldBeWatched(blockState)) { - return; + // Minecraft is dumb, the events still throw when a plant "grows" higher than the max block height. Even though no new block is created + if(BlockUtils.isWithinWorldBounds(block)) { + mcMMO.getPlaceStore().setFalse(block); } - - mcMMO.getPlaceStore().setFalse(blockState); } /** @@ -292,27 +313,33 @@ public class BlockListener implements Listener { @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; - } + Block block = event.getBlock(); if (event instanceof FakeBlockBreakEvent) { return; } - BlockState blockState = event.getBlock().getState(); - Location location = blockState.getLocation(); - - if (!BlockUtils.shouldBeWatched(blockState)) { + if(WorldBlacklist.isWorldBlacklisted(block.getWorld())) { + BlockUtils.cleanupBlockMetadata(block); return; } + /* WORLD GUARD MAIN FLAG CHECK */ + if(WorldGuardUtils.isWorldGuardLoaded()) + { + if(!WorldGuardManager.getInstance().hasMainFlag(event.getPlayer())) { + BlockUtils.cleanupBlockMetadata(block); + return; + } + } + + BlockState blockState = block.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(); @@ -321,14 +348,19 @@ public class BlockListener implements Listener { Player player = event.getPlayer(); if (!UserManager.hasPlayerDataKey(player) || player.getGameMode() == GameMode.CREATIVE) { + BlockUtils.cleanupBlockMetadata(block); return; } McMMOPlayer mcMMOPlayer = UserManager.getPlayer(player); //Check if profile is loaded - if(mcMMOPlayer == null) + if(mcMMOPlayer == null) { + /* Remove metadata from placed watched blocks */ + + BlockUtils.cleanupBlockMetadata(block); return; + } ItemStack heldItem = player.getInventory().getItemInMainHand(); @@ -345,7 +377,7 @@ public class BlockListener implements Listener { * 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)) { + if (mcMMO.p.getSkillTools().doesPlayerHaveSkillPermission(player, PrimarySkillType.HERBALISM)) { herbalismManager.processHerbalismBlockBreakEvent(event); } /* @@ -356,24 +388,29 @@ public class BlockListener implements Listener { } /* MINING */ - else if (BlockUtils.affectedBySuperBreaker(blockState) && ItemUtils.isPickaxe(heldItem) && PrimarySkillType.MINING.getPermissions(player) && !mcMMO.getPlaceStore().isTrue(blockState)) { + else if (BlockUtils.affectedBySuperBreaker(blockState) && ItemUtils.isPickaxe(heldItem) && mcMMO.p.getSkillTools().doesPlayerHaveSkillPermission(player, PrimarySkillType.MINING) && !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)) { + else if (BlockUtils.hasWoodcuttingXP(blockState) && ItemUtils.isAxe(heldItem) + && mcMMO.p.getSkillTools().doesPlayerHaveSkillPermission(player, PrimarySkillType.WOODCUTTING) && !mcMMO.getPlaceStore().isTrue(blockState)) { WoodcuttingManager woodcuttingManager = mcMMOPlayer.getWoodcuttingManager(); if (woodcuttingManager.canUseTreeFeller(heldItem)) { woodcuttingManager.processTreeFeller(blockState); } else { - woodcuttingManager.woodcuttingBlockCheck(blockState); + //Check for XP + woodcuttingManager.processWoodcuttingBlockXP(blockState); + + //Check for bonus drops + woodcuttingManager.processHarvestLumber(blockState); } } /* EXCAVATION */ - else if (BlockUtils.affectedByGigaDrillBreaker(blockState) && ItemUtils.isShovel(heldItem) && PrimarySkillType.EXCAVATION.getPermissions(player) && !mcMMO.getPlaceStore().isTrue(blockState)) { + else if (BlockUtils.affectedByGigaDrillBreaker(blockState) && ItemUtils.isShovel(heldItem) && mcMMO.p.getSkillTools().doesPlayerHaveSkillPermission(player, PrimarySkillType.EXCAVATION) && !mcMMO.getPlaceStore().isTrue(blockState)) { ExcavationManager excavationManager = mcMMOPlayer.getExcavationManager(); excavationManager.excavationBlockCheck(blockState); @@ -383,7 +420,7 @@ public class BlockListener implements Listener { } /* Remove metadata from placed watched blocks */ - mcMMO.getPlaceStore().setFalse(blockState); + BlockUtils.cleanupBlockMetadata(block); } /** @@ -393,6 +430,9 @@ public class BlockListener implements Listener { */ @EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = true) public void onBlockBreakHigher(BlockBreakEvent event) { + if(event instanceof FakeEvent) + return; + /* WORLD BLACKLIST CHECK */ if(WorldBlacklist.isWorldBlacklisted(event.getBlock().getWorld())) return; @@ -404,10 +444,6 @@ public class BlockListener implements Listener { return; } - if (event instanceof FakeBlockBreakEvent) { - return; - } - Player player = event.getPlayer(); if (!UserManager.hasPlayerDataKey(player) || player.getGameMode() == GameMode.CREATIVE) { @@ -497,7 +533,7 @@ public class BlockListener implements Listener { 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)) { + else if (mcMMOPlayer.getToolPreparationMode(ToolType.AXE) && ItemUtils.isAxe(heldItem) && BlockUtils.hasWoodcuttingXP(blockState) && Permissions.treeFeller(player)) { mcMMOPlayer.checkAbilityActivation(PrimarySkillType.WOODCUTTING); } else if (mcMMOPlayer.getToolPreparationMode(ToolType.PICKAXE) && ItemUtils.isPickaxe(heldItem) && BlockUtils.affectedBySuperBreaker(blockState) && Permissions.superBreaker(player)) { @@ -531,21 +567,11 @@ public class BlockListener implements Listener { * * 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) && Config.getInstance().getTreeFellerSoundsEnabled()) { + if (mcMMOPlayer.getAbilityMode(SuperAbilityType.TREE_FELLER) && BlockUtils.hasWoodcuttingXP(blockState) && mcMMO.p.getGeneralConfig().getTreeFellerSoundsEnabled()) { SoundManager.sendSound(player, blockState.getLocation(), SoundType.FIZZ); } } - private Player getPlayerFromFurnace(Block furnaceBlock) { - List 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. * @@ -596,7 +622,7 @@ public class BlockListener implements Listener { blockState.update(true); } } - else if (mcMMOPlayer.getAbilityMode(SuperAbilityType.BERSERK) && (heldItem.getType() == Material.AIR || Config.getInstance().getUnarmedItemsAsUnarmed())) { + else if (mcMMOPlayer.getAbilityMode(SuperAbilityType.BERSERK) && (heldItem.getType() == Material.AIR || mcMMO.p.getGeneralConfig().getUnarmedItemsAsUnarmed())) { if (mcMMOPlayer.getUnarmedManager().canUseBlockCracker() && BlockUtils.affectedByBlockCracker(blockState)) { if (EventUtils.simulateBlockBreak(block, player, true) && mcMMOPlayer.getUnarmedManager().blockCrackerCheck(blockState)) { blockState.update(); @@ -612,7 +638,7 @@ public class BlockListener implements Listener { } } } - else if (mcMMOPlayer.getWoodcuttingManager().canUseLeafBlower(heldItem) && BlockUtils.isLeaves(blockState) && EventUtils.simulateBlockBreak(block, player, true)) { + else if (mcMMOPlayer.getWoodcuttingManager().canUseLeafBlower(heldItem) && BlockUtils.isNonWoodPartOfTree(blockState) && EventUtils.simulateBlockBreak(block, player, true)) { event.setInstaBreak(true); SoundManager.sendSound(player, block.getLocation(), SoundType.POP); } @@ -629,7 +655,6 @@ public class BlockListener implements Listener { return; } - BlockState blockState = event.getBlock().getState(); ItemStack heldItem = player.getInventory().getItemInMainHand(); @@ -674,10 +699,10 @@ public class BlockListener implements Listener { if(blockState instanceof Furnace) { Furnace furnace = (Furnace) blockState; - if(furnace.hasMetadata(mcMMO.furnaceMetadataKey)) + if(mcMMO.getSmeltingTracker().isFurnaceOwned(furnace)) { player.sendMessage("[mcMMO DEBUG] This furnace has a registered owner"); - Player furnacePlayer = getPlayerFromFurnace(furnace.getBlock()); + OfflinePlayer furnacePlayer = mcMMO.getSmeltingTracker().getFurnaceOwner(furnace); if(furnacePlayer != null) { player.sendMessage("[mcMMO DEBUG] This furnace is owned by player "+furnacePlayer.getName()); @@ -701,7 +726,7 @@ public class BlockListener implements Listener { } } else { if ((mcMMOPlayer.getAbilityMode(SuperAbilityType.SUPER_BREAKER) && !BlockUtils.affectedBySuperBreaker(blockState)) || (mcMMOPlayer.getAbilityMode(SuperAbilityType.GIGA_DRILL_BREAKER) && !BlockUtils.affectedByGigaDrillBreaker(blockState))) { - SkillUtils.handleAbilitySpeedDecrease(player); + SkillUtils.removeAbilityBoostsFromInventory(player); } } } diff --git a/src/main/java/com/gmail/nossr50/listeners/ChunkListener.java b/src/main/java/com/gmail/nossr50/listeners/ChunkListener.java new file mode 100644 index 000000000..761516deb --- /dev/null +++ b/src/main/java/com/gmail/nossr50/listeners/ChunkListener.java @@ -0,0 +1,20 @@ +package com.gmail.nossr50.listeners; + +import com.gmail.nossr50.mcMMO; +import org.bukkit.entity.LivingEntity; +import org.bukkit.event.EventHandler; +import org.bukkit.event.Listener; +import org.bukkit.event.world.ChunkUnloadEvent; + +import java.util.List; + +public class ChunkListener implements Listener { + + @EventHandler(ignoreCancelled = true) + public void onChunkUnload(ChunkUnloadEvent event) { + List matchingEntities = mcMMO.getTransientEntityTracker().getAllTransientEntitiesInChunk(event.getChunk()); + for(LivingEntity livingEntity : matchingEntities) { + mcMMO.getTransientEntityTracker().removeSummon(livingEntity, null, false); + } + } +} diff --git a/src/main/java/com/gmail/nossr50/listeners/CommandListener.java b/src/main/java/com/gmail/nossr50/listeners/CommandListener.java new file mode 100644 index 000000000..484faa5bb --- /dev/null +++ b/src/main/java/com/gmail/nossr50/listeners/CommandListener.java @@ -0,0 +1,40 @@ +//package com.gmail.nossr50.listeners; +// +//import com.gmail.nossr50.datatypes.player.McMMOPlayer; +//import com.gmail.nossr50.datatypes.skills.SuperAbilityType; +//import com.gmail.nossr50.mcMMO; +//import com.gmail.nossr50.util.player.UserManager; +//import com.gmail.nossr50.util.skills.SkillUtils; +//import org.bukkit.Bukkit; +//import org.bukkit.entity.Player; +//import org.bukkit.event.EventHandler; +//import org.bukkit.event.EventPriority; +//import org.bukkit.event.Listener; +//import org.bukkit.event.player.PlayerCommandPreprocessEvent; +// +//public class CommandListener implements Listener { +// +// private final mcMMO pluginRef; +// +// public CommandListener(mcMMO plugin) { +// this.pluginRef = plugin; +// } +// +// @EventHandler(ignoreCancelled = true, priority = EventPriority.LOWEST) +// public void onPlayerCommandPreprocess(PlayerCommandPreprocessEvent event) { +// Player player = event.getPlayer(); +// +// SkillUtils.removeAbilityBoostsFromInventory(player); +// +// McMMOPlayer mmoPlayer = UserManager.getPlayer(player); +// +// if(mmoPlayer == null) +// return; +// +// Bukkit.getServer().getScheduler().runTaskLater(pluginRef, () -> { +// if(mmoPlayer.getAbilityMode(SuperAbilityType.GIGA_DRILL_BREAKER) || mmoPlayer.getAbilityMode(SuperAbilityType.SUPER_BREAKER)) { +// SkillUtils.handleAbilitySpeedIncrease(player); +// } +// }, 5); +// } +//} diff --git a/src/main/java/com/gmail/nossr50/listeners/EntityListener.java b/src/main/java/com/gmail/nossr50/listeners/EntityListener.java index ce6eb0b87..14a940763 100644 --- a/src/main/java/com/gmail/nossr50/listeners/EntityListener.java +++ b/src/main/java/com/gmail/nossr50/listeners/EntityListener.java @@ -1,7 +1,5 @@ package com.gmail.nossr50.listeners; -import com.gmail.nossr50.config.AdvancedConfig; -import com.gmail.nossr50.config.Config; import com.gmail.nossr50.config.WorldBlacklist; import com.gmail.nossr50.config.experience.ExperienceConfig; import com.gmail.nossr50.datatypes.player.McMMOPlayer; @@ -10,17 +8,19 @@ import com.gmail.nossr50.datatypes.skills.subskills.interfaces.InteractType; import com.gmail.nossr50.events.fake.FakeEntityDamageByEntityEvent; import com.gmail.nossr50.events.fake.FakeEntityDamageEvent; import com.gmail.nossr50.events.fake.FakeEntityTameEvent; +import com.gmail.nossr50.events.skills.rupture.McMMOEntityDamageByRuptureEvent; import com.gmail.nossr50.mcMMO; +import com.gmail.nossr50.metadata.MobMetaFlagType; +import com.gmail.nossr50.metadata.MobMetadataService; import com.gmail.nossr50.party.PartyManager; +import com.gmail.nossr50.runnables.TravelingBlockMetaCleanup; import com.gmail.nossr50.skills.archery.Archery; import com.gmail.nossr50.skills.mining.BlastMining; import com.gmail.nossr50.skills.mining.MiningManager; import com.gmail.nossr50.skills.taming.Taming; import com.gmail.nossr50.skills.taming.TamingManager; import com.gmail.nossr50.skills.unarmed.UnarmedManager; -import com.gmail.nossr50.util.BlockUtils; -import com.gmail.nossr50.util.Misc; -import com.gmail.nossr50.util.Permissions; +import com.gmail.nossr50.util.*; import com.gmail.nossr50.util.player.NotificationManager; import com.gmail.nossr50.util.player.UserManager; import com.gmail.nossr50.util.random.RandomChanceUtil; @@ -28,8 +28,8 @@ import com.gmail.nossr50.util.skills.CombatUtils; import com.gmail.nossr50.util.skills.SkillActivationType; import com.gmail.nossr50.worldguard.WorldGuardManager; import com.gmail.nossr50.worldguard.WorldGuardUtils; -import org.bukkit.Bukkit; import org.bukkit.Material; +import org.bukkit.NamespacedKey; import org.bukkit.OfflinePlayer; import org.bukkit.block.Block; import org.bukkit.enchantments.Enchantment; @@ -41,35 +41,72 @@ import org.bukkit.event.Listener; import org.bukkit.event.entity.*; import org.bukkit.event.entity.EntityDamageEvent.DamageCause; import org.bukkit.inventory.ItemStack; +import org.bukkit.inventory.meta.ItemMeta; import org.bukkit.inventory.meta.PotionMeta; import org.bukkit.metadata.FixedMetadataValue; import org.bukkit.potion.PotionEffect; import org.bukkit.potion.PotionEffectType; import org.bukkit.projectiles.ProjectileSource; +import org.jetbrains.annotations.NotNull; public class EntityListener implements Listener { - private final mcMMO plugin; + private final mcMMO pluginRef; + private final @NotNull MobMetadataService mobMetadataService; - public EntityListener(final mcMMO plugin) { - this.plugin = plugin; + /** + * We can use this {@link NamespacedKey} for {@link Enchantment} comparisons to + * check if a {@link Player} has a {@link Trident} enchanted with "Piercing". + */ + private final NamespacedKey piercingEnchantment = NamespacedKey.minecraft("piercing"); + + public EntityListener(final mcMMO pluginRef) { + this.pluginRef = pluginRef; + mobMetadataService = mcMMO.getMetadataService().getMobMetadataService(); } +// @EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = true) +// public void onBlockDropItemEvent(EntityDropItemEvent event) { +// if(event.getEntity() instanceof Block) { +// Block itemDispensingBlock = (Block) event.getEntity(); +// +// //Is it a berry bush? +// if(itemDispensingBlock.getType().toString().equalsIgnoreCase("sweet_berry_bush")) { +// //Berry Bush Time! +// if (event.getEntity().getMetadata(mcMMO.BONUS_DROPS_METAKEY).size() > 0) { +// Bukkit.broadcastMessage("Pop pop!"); +// BonusDropMeta bonusDropMeta = (BonusDropMeta) event.getEntity().getMetadata(mcMMO.BONUS_DROPS_METAKEY).get(0); +// int bonusCount = bonusDropMeta.asInt(); +// +// for (int i = 0; i < bonusCount; i++) { +// Misc.spawnItemNaturally(event.getEntity().getLocation(), event.getItemDrop().getItemStack(), ItemSpawnReason.BONUS_DROPS); +// } +// } +// } +// +// if(event.getEntity().hasMetadata(mcMMO.BONUS_DROPS_METAKEY)) +// event.getEntity().removeMetadata(mcMMO.BONUS_DROPS_METAKEY, pluginRef); +// } +// } + @EventHandler(priority = EventPriority.MONITOR) - public void onEntityTransform(EntityTransformEvent event) - { - //Transfer metadata keys from mob-spawned mobs to new mobs - if(event.getEntity().getMetadata(mcMMO.entityMetadataKey) != null || event.getEntity().getMetadata(mcMMO.entityMetadataKey).size() >= 1) - { - for(Entity entity : event.getTransformedEntities()) - { - entity.setMetadata(mcMMO.entityMetadataKey, mcMMO.metadataValue); + public void onEntityTransform(EntityTransformEvent event) { + if(event.getEntity() instanceof LivingEntity) { + LivingEntity livingEntity = (LivingEntity) event.getEntity(); + + //Transfer metadata keys from mob-spawned mobs to new mobs + if(mobMetadataService.hasMobFlags(livingEntity)) { + for(Entity entity : event.getTransformedEntities()) { + if(entity instanceof LivingEntity) { + LivingEntity transformedEntity = (LivingEntity) entity; + mobMetadataService.addMobFlags(livingEntity, transformedEntity); + } + } } } } @EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true) - public void onEntityTargetEntity(EntityTargetLivingEntityEvent event) - { + public void onEntityTargetEntity(EntityTargetLivingEntityEvent event) { if(!ExperienceConfig.getInstance().isEndermanEndermiteFarmingPrevented()) return; @@ -82,8 +119,13 @@ public class EntityListener implements Listener { //Prevent entities from giving XP if they target endermite if(event.getTarget() instanceof Endermite) { - if(!event.getEntity().hasMetadata(mcMMO.entityMetadataKey)) - event.getEntity().setMetadata(mcMMO.entityMetadataKey, mcMMO.metadataValue); + if(event.getEntity() instanceof Enderman) { + Enderman enderman = (Enderman) event.getEntity(); + + if(!mobMetadataService.hasMobFlag(MobMetaFlagType.EXPLOITED_ENDERMEN, enderman)) { + mobMetadataService.flagMetadata(MobMetaFlagType.EXPLOITED_ENDERMEN, enderman); + } + } } } @@ -103,24 +145,26 @@ public class EntityListener implements Listener { if(!WorldGuardManager.getInstance().hasMainFlag(player)) return; } + + Entity projectile = event.getProjectile(); + + //Should be noted that there are API changes regarding Arrow from 1.13.2 to current versions of the game + if (!(projectile instanceof Arrow)) { + return; + } + + ItemStack bow = event.getBow(); + + if (bow != null + && bow.containsEnchantment(Enchantment.ARROW_INFINITE)) { + projectile.setMetadata(MetadataConstants.METADATA_KEY_INF_ARROW, MetadataConstants.MCMMO_METADATA_VALUE); + } + + projectile.setMetadata(MetadataConstants.METADATA_KEY_BOW_FORCE, new FixedMetadataValue(pluginRef, Math.min(event.getForce() * mcMMO.p.getAdvancedConfig().getForceMultiplier(), 1.0))); + projectile.setMetadata(MetadataConstants.METADATA_KEY_ARROW_DISTANCE, new FixedMetadataValue(pluginRef, projectile.getLocation())); + //Cleanup metadata in 1 minute in case normal collection falls through + CombatUtils.delayArrowMetaCleanup((Projectile) projectile); } - - Entity projectile = event.getProjectile(); - - //Should be noted that there are API changes regarding Arrow from 1.13.2 to current versions of the game - if (!(projectile instanceof Arrow)) { - return; - } - - ItemStack bow = event.getBow(); - - if (bow != null - && bow.containsEnchantment(Enchantment.ARROW_INFINITE)) { - projectile.setMetadata(mcMMO.infiniteArrowKey, mcMMO.metadataValue); - } - - projectile.setMetadata(mcMMO.bowForceKey, new FixedMetadataValue(plugin, Math.min(event.getForce() * AdvancedConfig.getInstance().getForceMultiplier(), 1.0))); - projectile.setMetadata(mcMMO.arrowDistanceKey, new FixedMetadataValue(plugin, projectile.getLocation())); } @EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true) @@ -134,27 +178,31 @@ public class EntityListener implements Listener { Player player = (Player) event.getEntity().getShooter(); /* WORLD GUARD MAIN FLAG CHECK */ - if(WorldGuardUtils.isWorldGuardLoaded()) - { + if(WorldGuardUtils.isWorldGuardLoaded()) { if(!WorldGuardManager.getInstance().hasMainFlag(player)) return; } Projectile projectile = event.getEntity(); + EntityType entityType = projectile.getType(); - if(!(projectile instanceof Arrow)) - return; + if(entityType == EntityType.ARROW || entityType == EntityType.SPECTRAL_ARROW) { + CombatUtils.delayArrowMetaCleanup(projectile); //Cleans up metadata 1 minute from now in case other collection methods fall through - projectile.setMetadata(mcMMO.bowForceKey, new FixedMetadataValue(plugin, 1.0)); - projectile.setMetadata(mcMMO.arrowDistanceKey, new FixedMetadataValue(plugin, projectile.getLocation())); + if(!projectile.hasMetadata(MetadataConstants.METADATA_KEY_BOW_FORCE)) + projectile.setMetadata(MetadataConstants.METADATA_KEY_BOW_FORCE, new FixedMetadataValue(pluginRef, 1.0)); - for(Enchantment enchantment : player.getInventory().getItemInMainHand().getEnchantments().keySet()) { - if(enchantment.getName().equalsIgnoreCase("piercing")) + if(!projectile.hasMetadata(MetadataConstants.METADATA_KEY_ARROW_DISTANCE)) + projectile.setMetadata(MetadataConstants.METADATA_KEY_ARROW_DISTANCE, new FixedMetadataValue(pluginRef, projectile.getLocation())); + + //Check both hands + if(ItemUtils.doesPlayerHaveEnchantmentInHands(player, "piercing")) { return; - } + } - if (RandomChanceUtil.isActivationSuccessful(SkillActivationType.RANDOM_LINEAR_100_SCALE_WITH_CAP, SubSkillType.ARCHERY_ARROW_RETRIEVAL, player)) { - projectile.setMetadata(mcMMO.trackedArrow, mcMMO.metadataValue); + if (RandomChanceUtil.isActivationSuccessful(SkillActivationType.RANDOM_LINEAR_100_SCALE_WITH_CAP, SubSkillType.ARCHERY_ARROW_RETRIEVAL, player)) { + projectile.setMetadata(MetadataConstants.METADATA_KEY_TRACKED_ARROW, MetadataConstants.MCMMO_METADATA_VALUE); + } } } } @@ -172,31 +220,39 @@ public class EntityListener implements Listener { return; Block block = event.getBlock(); + Entity entity = event.getEntity(); + Material notYetReplacedType = block.getState().getType(); //because its from getState() this is the block that hasn't been changed yet, which is likely air/lava/water etc // When the event is fired for the falling block that changes back to a // normal block // event.getBlock().getType() returns AIR if (!BlockUtils.shouldBeWatched(block.getState()) - && block.getState().getType() != Material.WATER - && block.getType() != Material.AIR) { + && notYetReplacedType != Material.WATER && notYetReplacedType != Material.LAVA + && block.getType() != Material.AIR && block.getType() != Material.CAVE_AIR) { return; } + //I could just have it mark all blocks after this but it would potentially cause some really edge case consistency issues that no one would notice - Entity entity = event.getEntity(); - + /* + * This mess of code tries to avoid marking the moved block as true in our place store + * It's a headache to read but it works, I'm tempted to just remove it + */ if (entity instanceof FallingBlock || entity instanceof Enderman) { - boolean isTracked = entity.hasMetadata(mcMMO.entityMetadataKey); + boolean isTracked = entity.hasMetadata(MetadataConstants.METADATA_KEY_TRAVELING_BLOCK); if (mcMMO.getPlaceStore().isTrue(block) && !isTracked) { mcMMO.getPlaceStore().setFalse(block); - entity.setMetadata(mcMMO.entityMetadataKey, mcMMO.metadataValue); + entity.setMetadata(MetadataConstants.METADATA_KEY_TRAVELING_BLOCK, MetadataConstants.MCMMO_METADATA_VALUE); + TravelingBlockMetaCleanup metaCleanupTask = new TravelingBlockMetaCleanup(entity, pluginRef); + metaCleanupTask.runTaskTimer(pluginRef, 20, 20*60); //6000 ticks is 5 minutes } else if (isTracked) { mcMMO.getPlaceStore().setTrue(block); + entity.removeMetadata(MetadataConstants.METADATA_KEY_TRAVELING_BLOCK, pluginRef); } - } else if ((block.getType() == Material.REDSTONE_ORE)) { - return; + } else if ((block.getType() == Material.REDSTONE_ORE || block.getType().getKey().getKey().equalsIgnoreCase("deepslate_redstone_ore"))) { + //Redstone ore fire this event and should be ignored } else { if (mcMMO.getPlaceStore().isTrue(block)) { @@ -205,54 +261,6 @@ public class EntityListener implements Listener { } } - /*@EventHandler(priority = EventPriority.LOWEST, ignoreCancelled = true) - public void onEntityDamageDebugLowest(EntityDamageEvent event) - { - if(event instanceof FakeEntityDamageByEntityEvent) - return; - - if(event instanceof FakeEntityDamageEvent) - return; - - Bukkit.broadcastMessage(ChatColor.DARK_AQUA+"DMG Before Events: " - +ChatColor.RESET+event.getDamage()); - } - - @EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true) - public void onEntityDamageDebugMonitor(EntityDamageEvent event) - { - if(event instanceof FakeEntityDamageByEntityEvent) - return; - - if(event instanceof FakeEntityDamageEvent) - return; - - if(!(event.getEntity() instanceof LivingEntity)) - return; - - LivingEntity entity = (LivingEntity) event.getEntity(); - - double rawDamage = event.getDamage(); - double dmgAfterReduction = event.getFinalDamage(); - - Bukkit.broadcastMessage(ChatColor.GOLD+"DMG After Events: " - + event.getEntity().getName()+ChatColor.RESET - +"RawDMG["+rawDamage+"], " - +"FinalDMG=["+dmgAfterReduction+"]"); - - Bukkit.broadcastMessage( - event.getEntity().getName() - +ChatColor.GREEN - +" HP " - +ChatColor.RESET - +entity.getHealth() - +ChatColor.YELLOW - +" -> " - +ChatColor.RESET - +(entity.getHealth()-event.getFinalDamage())); - - Bukkit.broadcastMessage(""); - }*/ @EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = true) public void onEntityCombustByEntityEvent(EntityCombustByEntityEvent event) { @@ -264,13 +272,15 @@ public class EntityListener implements Listener { Projectile projectile = (Projectile) event.getCombuster(); if(projectile.getShooter() instanceof Player) { Player attacker = (Player) projectile.getShooter(); - if(checkParties(event, defender, attacker)) - return; + if(checkParties(event, defender, attacker)) { + event.setCancelled(true); + } } } else if(event.getCombuster() instanceof Player) { Player attacker = (Player) event.getCombuster(); - if(checkParties(event, defender, attacker)) - return; + if(checkParties(event, defender, attacker)) { + event.setCancelled(true); + } } } } @@ -283,6 +293,10 @@ public class EntityListener implements Listener { */ @EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = true) public void onEntityDamageByEntity(EntityDamageByEntityEvent event) { + if (event instanceof FakeEntityDamageByEntityEvent || event instanceof McMMOEntityDamageByRuptureEvent) { + return; + } + double damage = event.getFinalDamage(); Entity defender = event.getEntity(); Entity attacker = event.getDamager(); @@ -291,35 +305,31 @@ public class EntityListener implements Listener { { if(attacker instanceof Player) { - if(!WorldGuardManager.getInstance().hasMainFlag((Player) attacker)) + if(!WorldGuardManager.getInstance().hasMainFlag((Player) attacker)) { return; + } } else if(attacker instanceof Projectile) { Projectile projectile = (Projectile) attacker; if(projectile.getShooter() instanceof Player) { - if(!WorldGuardManager.getInstance().hasMainFlag((Player) projectile.getShooter())) + if(!WorldGuardManager.getInstance().hasMainFlag((Player) projectile.getShooter())) { return; + } } } } /* WORLD BLACKLIST CHECK */ - if(WorldBlacklist.isWorldBlacklisted(event.getEntity().getWorld())) - return; - - if (event instanceof FakeEntityDamageByEntityEvent) { + if(WorldBlacklist.isWorldBlacklisted(event.getEntity().getWorld())) { return; } // Don't process this event for marked entities, for players this is handled above, // However, for entities, we do not wanna cancel this event to allow plugins to observe changes // properly - if (defender.getMetadata(mcMMO.CUSTOM_DAMAGE_METAKEY).size() > 0) { - return; - } if (CombatUtils.isProcessingNoInvulnDamage()) { return; @@ -328,14 +338,9 @@ public class EntityListener implements Listener { if (event.getEntity() instanceof ArmorStand) { return; } - - if (event.getDamager().hasMetadata(mcMMO.funfettiMetadataKey)) - { - event.setCancelled(true); - return; - } - if (Misc.isNPCEntityExcludingVillagers(defender) || !defender.isValid() || !(defender instanceof LivingEntity)) { + + if ((ExperienceConfig.getInstance().isNPCInteractionPrevented() && Misc.isNPCEntityExcludingVillagers(defender)) || !defender.isValid() || !(defender instanceof LivingEntity)) { return; } @@ -345,7 +350,11 @@ public class EntityListener implements Listener { return; } - if (Misc.isNPCEntityExcludingVillagers(attacker)) { + if (ExperienceConfig.getInstance().isNPCInteractionPrevented() && Misc.isNPCEntityExcludingVillagers(attacker)) { + return; + } + + if (CombatUtils.hasIgnoreDamageMetadata(target)) { return; } @@ -367,7 +376,7 @@ public class EntityListener implements Listener { Player defendingPlayer = (Player) defender; Player attackingPlayer; - //If the attacker is a Player or a projectile beloning to a player + //If the attacker is a Player or a projectile belonging to a player if(attacker instanceof Projectile || attacker instanceof Player) { if(attacker instanceof Projectile) { Projectile projectile = (Projectile) attacker; @@ -388,7 +397,7 @@ public class EntityListener implements Listener { UnarmedManager unarmedManager = mcMMOPlayer.getUnarmedManager(); if (unarmedManager.canDeflect()) { - if (unarmedManager.deflectCheck()) { + if (projectile instanceof Arrow && unarmedManager.deflectCheck()) { event.setCancelled(true); return; } @@ -411,7 +420,6 @@ public class EntityListener implements Listener { } } - /* * This was put here to solve a plugin conflict with a mod called Project Korra * Project Korra sends out a damage event with exactly 0 damage @@ -421,12 +429,14 @@ public class EntityListener implements Listener { * Surprising this kind of thing * */ - if(damage <= 0) { - return; + if(mcMMO.isProjectKorraEnabled()) { + if(event.getFinalDamage() == 0) { + return; + } } CombatUtils.processCombatAttack(event, attacker, target); - CombatUtils.handleHealthbars(attacker, target, event.getFinalDamage(), plugin); + CombatUtils.handleHealthbars(attacker, target, event.getFinalDamage(), pluginRef); } @EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = false) @@ -435,13 +445,14 @@ public class EntityListener implements Listener { LivingEntity livingEntity = (LivingEntity) entityDamageEvent.getEntity(); if(entityDamageEvent.getFinalDamage() >= livingEntity.getHealth()) { - - /* - * This sets entity names back to whatever they are supposed to be - */ + //This sets entity names back to whatever they are supposed to be CombatUtils.fixNames(livingEntity); - } } + } + + if(entityDamageEvent.getDamager() instanceof Projectile) { + CombatUtils.cleanupArrowMetadata((Projectile) entityDamageEvent.getDamager()); + } } public boolean checkParties(Cancellable event, Player defendingPlayer, Player attackingPlayer) { @@ -456,7 +467,7 @@ public class EntityListener implements Listener { } //Party Friendly Fire - if(!Config.getInstance().getPartyFriendlyFire()) + if(!mcMMO.p.getGeneralConfig().getPartyFriendlyFire()) if ((PartyManager.inSameParty(defendingPlayer, attackingPlayer) || PartyManager.areAllies(defendingPlayer, attackingPlayer)) && !(Permissions.friendlyFire(attackingPlayer) @@ -479,6 +490,10 @@ public class EntityListener implements Listener { if(WorldBlacklist.isWorldBlacklisted(event.getEntity().getWorld())) return; + if(event.getEntity().hasMetadata(MetadataConstants.METADATA_KEY_EXPLOSION_FROM_RUPTURE)) { + event.getEntity().removeMetadata(MetadataConstants.METADATA_KEY_EXPLOSION_FROM_RUPTURE, mcMMO.p); + } + if(event.getEntity() instanceof Player) { Player player = (Player) event.getEntity(); @@ -494,7 +509,7 @@ public class EntityListener implements Listener { * Process Registered Interactions */ - InteractionManager.processEvent(event, plugin, InteractType.ON_ENTITY_DAMAGE); + InteractionManager.processEvent(event, pluginRef, InteractType.ON_ENTITY_DAMAGE); /* * Old code @@ -520,7 +535,7 @@ public class EntityListener implements Listener { } */ - if (Misc.isNPCEntityExcludingVillagers(entity) || !entity.isValid() || !(entity instanceof LivingEntity)) { + if ((ExperienceConfig.getInstance().isNPCInteractionPrevented() && Misc.isNPCEntityExcludingVillagers(entity)) || !entity.isValid() || !(entity instanceof LivingEntity)) { return; } @@ -587,6 +602,7 @@ public class EntityListener implements Listener { switch (cause) { case CONTACT: case FIRE: + case HOT_FLOOR: case LAVA: if (tamingManager.canUseEnvironmentallyAware()) { tamingManager.processEnvironmentallyAware(wolf, event.getDamage()); @@ -637,7 +653,6 @@ public class EntityListener implements Listener { return; default: - return; } } } @@ -651,29 +666,7 @@ public class EntityListener implements Listener { */ @EventHandler(priority = EventPriority.LOWEST) public void onEntityDeathLowest(EntityDeathEvent event) { - /* WORLD BLACKLIST CHECK */ - if(WorldBlacklist.isWorldBlacklisted(event.getEntity().getWorld())) - return; - - LivingEntity entity = event.getEntity(); - - if (Misc.isNPCEntityExcludingVillagers(entity)) { - return; - } - - if (entity.hasMetadata(mcMMO.customNameKey)) { - entity.setCustomName(entity.getMetadata(mcMMO.customNameKey).get(0).asString()); - entity.removeMetadata(mcMMO.customNameKey, plugin); - } - - if (entity.hasMetadata(mcMMO.customVisibleKey)) { - entity.setCustomNameVisible(entity.getMetadata(mcMMO.customVisibleKey).get(0).asBoolean()); - entity.removeMetadata(mcMMO.customVisibleKey, plugin); - } - - if (entity.hasMetadata(mcMMO.entityMetadataKey)) { - entity.removeMetadata(mcMMO.entityMetadataKey, plugin); - } + mcMMO.getTransientMetadataTools().cleanLivingEntityMetadata(event.getEntity()); } /** @@ -684,13 +677,18 @@ public class EntityListener implements Listener { */ @EventHandler(ignoreCancelled = true) public void onEntityDeath(EntityDeathEvent event) { - /* WORLD BLACKLIST CHECK */ - if(WorldBlacklist.isWorldBlacklisted(event.getEntity().getWorld())) - return; - LivingEntity entity = event.getEntity(); - if (Misc.isNPCEntityExcludingVillagers(entity)) { + if(mcMMO.getTransientEntityTracker().isTransientSummon(entity)) { + mcMMO.getTransientEntityTracker().removeSummon(entity, null, false); + } + + /* WORLD BLACKLIST CHECK */ + if(WorldBlacklist.isWorldBlacklisted(event.getEntity().getWorld())) { + return; + } + + if (ExperienceConfig.getInstance().isNPCInteractionPrevented() && Misc.isNPCEntityExcludingVillagers(entity)) { return; } @@ -709,34 +707,41 @@ public class EntityListener implements Listener { if(WorldBlacklist.isWorldBlacklisted(event.getEntity().getWorld())) return; - LivingEntity entity = event.getEntity(); + LivingEntity livingEntity = event.getEntity(); switch (event.getSpawnReason()) { case NETHER_PORTAL: + trackSpawnedAndPassengers(livingEntity, MobMetaFlagType.NETHER_PORTAL_MOB); + break; case SPAWNER: case SPAWNER_EGG: - entity.setMetadata(mcMMO.entityMetadataKey, mcMMO.metadataValue); - - Entity passenger = entity.getPassenger(); - - if (passenger != null) { - passenger.setMetadata(mcMMO.entityMetadataKey, mcMMO.metadataValue); - } - return; - + trackSpawnedAndPassengers(livingEntity, MobMetaFlagType.MOB_SPAWNER_MOB); + break; + case DISPENSE_EGG: + case EGG: + trackSpawnedAndPassengers(livingEntity, MobMetaFlagType.EGG_MOB); + break; case BREEDING: - entity.setMetadata(mcMMO.bredMetadataKey, mcMMO.metadataValue); - return; - + trackSpawnedAndPassengers(livingEntity, MobMetaFlagType.PLAYER_BRED_MOB); + break; default: - return; + } + } + + private void trackSpawnedAndPassengers(LivingEntity livingEntity, MobMetaFlagType mobMetaFlagType) { + mobMetadataService.flagMetadata(mobMetaFlagType, livingEntity); + + for(Entity passenger : livingEntity.getPassengers()) { + if(passenger != null) { + mobMetadataService.flagMetadata(mobMetaFlagType, livingEntity); + } } } @EventHandler(ignoreCancelled = true, priority = EventPriority.HIGHEST) public void onEntityBreed(EntityBreedEvent event) { if(ExperienceConfig.getInstance().isCOTWBreedingPrevented()) { - if(event.getFather().hasMetadata(mcMMO.COTW_TEMPORARY_SUMMON) || event.getMother().hasMetadata(mcMMO.COTW_TEMPORARY_SUMMON)) { + if(mobMetadataService.hasMobFlag(MobMetaFlagType.COTW_SUMMONED_MOB, event.getFather()) || mobMetadataService.hasMobFlag(MobMetaFlagType.COTW_SUMMONED_MOB, event.getMother())) { event.setCancelled(true); Animals mom = (Animals) event.getMother(); Animals father = (Animals) event.getFather(); @@ -751,7 +756,6 @@ public class EntityListener implements Listener { NotificationManager.sendPlayerInformationChatOnly(player, "Taming.Summon.COTW.BreedingDisallowed"); } } - } } @@ -769,13 +773,13 @@ public class EntityListener implements Listener { Entity entity = event.getEntity(); - if (!(entity instanceof TNTPrimed) || !entity.hasMetadata(mcMMO.tntMetadataKey)) { + if (!(entity instanceof TNTPrimed) || !entity.hasMetadata(MetadataConstants.METADATA_KEY_TRACKED_TNT)) { return; } // We can make this assumption because we (should) be the only ones // using this exact metadata - Player player = plugin.getServer().getPlayerExact(entity.getMetadata(mcMMO.tntMetadataKey).get(0).asString()); + Player player = pluginRef.getServer().getPlayerExact(entity.getMetadata(MetadataConstants.METADATA_KEY_TRACKED_TNT).get(0).asString()); if (!UserManager.hasPlayerDataKey(player)) { return; @@ -815,13 +819,13 @@ public class EntityListener implements Listener { Entity entity = event.getEntity(); - if (!(entity instanceof TNTPrimed) || !entity.hasMetadata(mcMMO.tntMetadataKey)) { + if (!(entity instanceof TNTPrimed) || !entity.hasMetadata(MetadataConstants.METADATA_KEY_TRACKED_TNT)) { return; } // We can make this assumption because we (should) be the only ones // using this exact metadata - Player player = plugin.getServer().getPlayerExact(entity.getMetadata(mcMMO.tntMetadataKey).get(0).asString()); + Player player = pluginRef.getServer().getPlayerExact(entity.getMetadata(MetadataConstants.METADATA_KEY_TRACKED_TNT).get(0).asString()); if (!UserManager.hasPlayerDataKey(player)) { return; @@ -910,6 +914,16 @@ public class EntityListener implements Listener { * is based on how 'common' the item is We can adjust this quite easily * if we find something is giving too much of a bonus */ + + //Hacky 1.17 support + if(foodInHand.getKey().getKey().equalsIgnoreCase("glow_berries")) { + if (Permissions.isSubSkillEnabled(player, SubSkillType.HERBALISM_FARMERS_DIET)) { + event.setFoodLevel(UserManager.getPlayer(player).getHerbalismManager().farmersDiet(newFoodLevel)); + } + + return; + } + switch (foodInHand) { case BAKED_POTATO: /* * RESTORES 3 HUNGER - RESTORES 5 1/2 HUNGER @ @@ -961,7 +975,6 @@ public class EntityListener implements Listener { return; default: - return; } } @@ -990,13 +1003,16 @@ public class EntityListener implements Listener { return; } - LivingEntity entity = event.getEntity(); + LivingEntity livingEntity = event.getEntity(); - if (!UserManager.hasPlayerDataKey(player) || Misc.isNPCEntityExcludingVillagers(entity) || entity.hasMetadata(mcMMO.entityMetadataKey)) { + if (!UserManager.hasPlayerDataKey(player) + || (ExperienceConfig.getInstance().isNPCInteractionPrevented() && Misc.isNPCEntityExcludingVillagers(livingEntity)) + || mobMetadataService.hasMobFlag(MobMetaFlagType.EGG_MOB, livingEntity) + || mobMetadataService.hasMobFlag(MobMetaFlagType.MOB_SPAWNER_MOB, livingEntity)) { return; } - entity.setMetadata(mcMMO.entityMetadataKey, mcMMO.metadataValue); + mobMetadataService.flagMetadata(MobMetaFlagType.PLAYER_TAMED_MOB, livingEntity); //Profile not loaded if(UserManager.getPlayer(player) == null) @@ -1004,7 +1020,7 @@ public class EntityListener implements Listener { return; } - UserManager.getPlayer(player).getTamingManager().awardTamingXP(entity); + UserManager.getPlayer(player).getTamingManager().awardTamingXP(livingEntity); } /** @@ -1062,7 +1078,13 @@ public class EntityListener implements Listener { if(WorldBlacklist.isWorldBlacklisted(event.getEntity().getWorld())) return; - for (PotionEffect effect : ((PotionMeta) event.getPotion().getItem().getItemMeta()).getCustomEffects()) { + ItemMeta meta = event.getPotion().getItem().getItemMeta(); + + if (meta == null) { + return; + } + + for (PotionEffect effect : ((PotionMeta) meta).getCustomEffects()) { if (!effect.getType().equals(PotionEffectType.SATURATION)) { return; } @@ -1073,15 +1095,6 @@ public class EntityListener implements Listener { } } } - - @EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true) - public void onPigZapEvent(PigZapEvent event) { - /* WORLD BLACKLIST CHECK */ - if(WorldBlacklist.isWorldBlacklisted(event.getEntity().getWorld())) - return; - if (event.getEntity().hasMetadata(mcMMO.entityMetadataKey)) { - event.getPigZombie().setMetadata(mcMMO.entityMetadataKey, mcMMO.metadataValue); - } - } + } diff --git a/src/main/java/com/gmail/nossr50/listeners/InteractionManager.java b/src/main/java/com/gmail/nossr50/listeners/InteractionManager.java index 43705073a..48a8faff2 100644 --- a/src/main/java/com/gmail/nossr50/listeners/InteractionManager.java +++ b/src/main/java/com/gmail/nossr50/listeners/InteractionManager.java @@ -39,8 +39,7 @@ public class InteractionManager { subSkillList.add(abstractSubSkill); //Init ArrayList - if(interactRegister.get(abstractSubSkill.getInteractType()) == null) - interactRegister.put(abstractSubSkill.getInteractType(), new ArrayList<>()); + interactRegister.computeIfAbsent(abstractSubSkill.getInteractType(), k -> new ArrayList<>()); //Registration array reference ArrayList arrayRef = interactRegister.get(abstractSubSkill.getInteractType()); @@ -51,10 +50,9 @@ public class InteractionManager { String lowerCaseName = abstractSubSkill.getConfigKeyName().toLowerCase(Locale.ENGLISH); //Register in name map - if(subSkillNameMap.get(lowerCaseName) == null) - subSkillNameMap.put(lowerCaseName, abstractSubSkill); + subSkillNameMap.putIfAbsent(lowerCaseName, abstractSubSkill); - System.out.println("[mcMMO] registered subskill: "+ abstractSubSkill.getConfigKeyName()); + mcMMO.p.getLogger().info("Registered subskill: "+ abstractSubSkill.getConfigKeyName()); } /** diff --git a/src/main/java/com/gmail/nossr50/listeners/InventoryListener.java b/src/main/java/com/gmail/nossr50/listeners/InventoryListener.java index 064f799c3..f675ec4f7 100644 --- a/src/main/java/com/gmail/nossr50/listeners/InventoryListener.java +++ b/src/main/java/com/gmail/nossr50/listeners/InventoryListener.java @@ -1,7 +1,7 @@ package com.gmail.nossr50.listeners; -import com.gmail.nossr50.config.Config; import com.gmail.nossr50.config.WorldBlacklist; +import com.gmail.nossr50.datatypes.player.McMMOPlayer; import com.gmail.nossr50.datatypes.skills.PrimarySkillType; import com.gmail.nossr50.datatypes.skills.SubSkillType; import com.gmail.nossr50.events.fake.FakeBrewEvent; @@ -10,13 +10,16 @@ import com.gmail.nossr50.runnables.player.PlayerUpdateInventoryTask; import com.gmail.nossr50.skills.alchemy.Alchemy; import com.gmail.nossr50.skills.alchemy.AlchemyPotionBrewer; import com.gmail.nossr50.util.ItemUtils; +import com.gmail.nossr50.util.MetadataConstants; import com.gmail.nossr50.util.Permissions; import com.gmail.nossr50.util.player.UserManager; import com.gmail.nossr50.util.skills.SkillUtils; import com.gmail.nossr50.worldguard.WorldGuardManager; import com.gmail.nossr50.worldguard.WorldGuardUtils; +import org.bukkit.Bukkit; import org.bukkit.Location; import org.bukkit.Material; +import org.bukkit.OfflinePlayer; import org.bukkit.block.Block; import org.bukkit.block.BlockState; import org.bukkit.block.BrewingStand; @@ -28,9 +31,6 @@ import org.bukkit.event.EventPriority; import org.bukkit.event.Listener; import org.bukkit.event.inventory.*; import org.bukkit.inventory.*; -import org.bukkit.metadata.MetadataValue; - -import java.util.List; public class InventoryListener implements Listener { private final mcMMO plugin; @@ -39,55 +39,6 @@ public class InventoryListener implements Listener { this.plugin = plugin; } - @EventHandler(priority = EventPriority.LOW, ignoreCancelled = true) - public void onInventoryOpen(InventoryOpenEvent event) { - /* WORLD BLACKLIST CHECK */ - if(WorldBlacklist.isWorldBlacklisted(event.getPlayer().getWorld())) - return; - - Block furnaceBlock = processInventoryOpenOrCloseEvent(event.getInventory()); - - if (furnaceBlock == null) { - return; - } - - HumanEntity player = event.getPlayer(); - - if (!UserManager.hasPlayerDataKey(player)) { - return; - } - - //Profile not loaded - if(UserManager.getPlayer((Player) player) == null) - { - return; - } - - if(!furnaceBlock.hasMetadata(mcMMO.furnaceMetadataKey) && furnaceBlock.getMetadata(mcMMO.furnaceMetadataKey).size() == 0) - furnaceBlock.setMetadata(mcMMO.furnaceMetadataKey, UserManager.getPlayer((Player) player).getPlayerMetadata()); - } - - @EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true) - public void onInventoryClose(InventoryCloseEvent event) { - /* WORLD BLACKLIST CHECK */ - if(WorldBlacklist.isWorldBlacklisted(event.getPlayer().getWorld())) - return; - - Block furnaceBlock = processInventoryOpenOrCloseEvent(event.getInventory()); - - if (furnaceBlock == null || furnaceBlock.hasMetadata(mcMMO.furnaceMetadataKey)) { - return; - } - - HumanEntity player = event.getPlayer(); - - if (!UserManager.hasPlayerDataKey(player)) { - return; - } - - furnaceBlock.removeMetadata(mcMMO.furnaceMetadataKey, plugin); - } - @EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = true) public void onFurnaceBurnEvent(FurnaceBurnEvent event) { /* WORLD BLACKLIST CHECK */ @@ -102,26 +53,43 @@ public class InventoryListener implements Listener { return; } - Player player = getPlayerFromFurnace(furnaceBlock); + Furnace furnace = (Furnace) furnaceState; - /* WORLD GUARD MAIN FLAG CHECK */ - if(WorldGuardUtils.isWorldGuardLoaded()) - { - if(!WorldGuardManager.getInstance().hasMainFlag(player)) - return; + OfflinePlayer offlinePlayer = mcMMO.getSmeltingTracker().getFurnaceOwner(furnace); + + if(offlinePlayer != null && offlinePlayer.isOnline()) { + + Player player = Bukkit.getPlayer(offlinePlayer.getUniqueId()); + + if(player != null) { + if (!Permissions.isSubSkillEnabled(player, SubSkillType.SMELTING_FUEL_EFFICIENCY)) { + return; + } + + //Profile doesn't exist + if(UserManager.getOfflinePlayer(offlinePlayer) == null) { + return; + } + + + boolean debugMode = player.isOnline() && UserManager.getPlayer(player).isDebugMode(); + + if(debugMode) { + player.sendMessage("FURNACE FUEL EFFICIENCY DEBUG REPORT"); + player.sendMessage("Furnace - "+furnace.hashCode()); + player.sendMessage("Furnace Type: "+furnaceBlock.getType().toString()); + player.sendMessage("Burn Length before Fuel Efficiency is applied - "+event.getBurnTime()); + } + + event.setBurnTime(UserManager.getPlayer(player).getSmeltingManager().fuelEfficiency(event.getBurnTime())); + + if(debugMode) { + player.sendMessage("New Furnace Burn Length (after applying fuel efficiency) "+event.getBurnTime()); + player.sendMessage(""); + } + } } - if (!UserManager.hasPlayerDataKey(player) || !Permissions.isSubSkillEnabled(player, SubSkillType.SMELTING_FUEL_EFFICIENCY)) { - return; - } - - //Profile not loaded - if(UserManager.getPlayer(player) == null) - { - return; - } - - event.setBurnTime(UserManager.getPlayer(player).getSmeltingManager().fuelEfficiency(event.getBurnTime())); } @EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = true) @@ -130,33 +98,28 @@ public class InventoryListener implements Listener { if(WorldBlacklist.isWorldBlacklisted(event.getBlock().getWorld())) return; - Block furnaceBlock = event.getBlock(); + BlockState blockState = event.getBlock().getState(); //Furnaces can only be cast from a BlockState not a Block ItemStack smelting = event.getSource(); if (!ItemUtils.isSmeltable(smelting)) { return; } - Player player = getPlayerFromFurnace(furnaceBlock); + if(blockState instanceof Furnace) { + Furnace furnace = (Furnace) blockState; + OfflinePlayer offlinePlayer = mcMMO.getSmeltingTracker().getFurnaceOwner(furnace); - /* WORLD GUARD MAIN FLAG CHECK */ - if(WorldGuardUtils.isWorldGuardLoaded()) - { - if(!WorldGuardManager.getInstance().hasMainFlag(player)) - return; + if(offlinePlayer != null) { + + McMMOPlayer offlineProfile = UserManager.getOfflinePlayer(offlinePlayer); + + //Profile doesn't exist + if(offlineProfile != null) { + //Process smelting + offlineProfile.getSmeltingManager().smeltProcessing(event, furnace); + } + } } - - if (!UserManager.hasPlayerDataKey(player) || !PrimarySkillType.SMELTING.getPermissions(player)) { - return; - } - - //Profile not loaded - if(UserManager.getPlayer(player) == null) - { - return; - } - - event.setResult(UserManager.getPlayer(player).getSmeltingManager().smeltProcessing(smelting, event.getResult())); } @EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = true) @@ -165,34 +128,36 @@ public class InventoryListener implements Listener { if(WorldBlacklist.isWorldBlacklisted(event.getPlayer().getWorld())) return; - Block furnaceBlock = event.getBlock(); + BlockState furnaceBlock = event.getBlock().getState(); if (!ItemUtils.isSmelted(new ItemStack(event.getItemType(), event.getItemAmount()))) { return; } - Player player = getPlayerFromFurnace(furnaceBlock); + Player player = event.getPlayer(); - /* WORLD GUARD MAIN FLAG CHECK */ - if(WorldGuardUtils.isWorldGuardLoaded()) - { - if(!WorldGuardManager.getInstance().hasMainFlag(player)) + if(furnaceBlock instanceof Furnace) { + /* WORLD GUARD MAIN FLAG CHECK */ + if(WorldGuardUtils.isWorldGuardLoaded()) + { + if(!WorldGuardManager.getInstance().hasMainFlag(player)) + return; + } + + if (!UserManager.hasPlayerDataKey(player) || !Permissions.vanillaXpBoost(player, PrimarySkillType.SMELTING)) { return; - } + } - if (!UserManager.hasPlayerDataKey(player) || !Permissions.vanillaXpBoost(player, PrimarySkillType.SMELTING)) { - return; - } + //Profile not loaded + if(UserManager.getPlayer(player) == null) + { + return; + } - //Profile not loaded - if(UserManager.getPlayer(player) == null) - { - return; + int xpToDrop = event.getExpToDrop(); + int exp = UserManager.getPlayer(player).getSmeltingManager().vanillaXPBoost(xpToDrop); + event.setExpToDrop(exp); } - - int xpToDrop = event.getExpToDrop(); - int exp = UserManager.getPlayer(player).getSmeltingManager().vanillaXPBoost(xpToDrop); - event.setExpToDrop(exp); } @EventHandler(priority = EventPriority.NORMAL, ignoreCancelled = true) @@ -201,25 +166,22 @@ public class InventoryListener implements Listener { if(WorldBlacklist.isWorldBlacklisted(event.getWhoClicked().getWorld())) return; + //We should never care to do processing if the player clicks outside the window +// if(isOutsideWindowClick(event)) +// return; + Inventory inventory = event.getInventory(); - if(event.getWhoClicked() instanceof Player) + Player player = ((Player) event.getWhoClicked()).getPlayer(); + + if(event.getInventory() instanceof FurnaceInventory) { - Player player = ((Player) event.getWhoClicked()).getPlayer(); - Block furnaceBlock = processInventoryOpenOrCloseEvent(event.getInventory()); + Furnace furnace = mcMMO.getSmeltingTracker().getFurnaceFromInventory(event.getInventory()); - if (furnaceBlock != null) + if (furnace != null) { - if (furnaceBlock.getMetadata(mcMMO.furnaceMetadataKey).size() > 0) - furnaceBlock.removeMetadata(mcMMO.furnaceMetadataKey, mcMMO.p); - - //Profile not loaded - if(UserManager.getPlayer(player) == null) - { - return; - } - - furnaceBlock.setMetadata(mcMMO.furnaceMetadataKey, UserManager.getPlayer(player).getPlayerMetadata()); + //Switch owners + mcMMO.getSmeltingTracker().processFurnaceOwnership(furnace, player); } } @@ -239,8 +201,6 @@ public class InventoryListener implements Listener { return; } - Player player = (Player) whoClicked; - /* WORLD GUARD MAIN FLAG CHECK */ if(WorldGuardUtils.isWorldGuardLoaded()) { @@ -280,7 +240,6 @@ public class InventoryListener implements Listener { AlchemyPotionBrewer.scheduleCheck(player, stand); return; default: - return; } } else if (slot == InventoryType.SlotType.FUEL) { @@ -326,6 +285,11 @@ public class InventoryListener implements Listener { } } + public boolean isOutsideWindowClick(InventoryClickEvent event) { + return event.getHotbarButton() == -1; + } + + @EventHandler(priority = EventPriority.NORMAL, ignoreCancelled = true) public void onInventoryDragEvent(InventoryDragEvent event) { /* WORLD BLACKLIST CHECK */ @@ -417,26 +381,37 @@ public class InventoryListener implements Listener { ItemStack item = event.getItem(); - if (Config.getInstance().getPreventHopperTransferIngredients() && item.getType() != Material.POTION && item.getType() != Material.SPLASH_POTION && item.getType() != Material.LINGERING_POTION) { + if (mcMMO.p.getGeneralConfig().getPreventHopperTransferIngredients() && item.getType() != Material.POTION && item.getType() != Material.SPLASH_POTION && item.getType() != Material.LINGERING_POTION) { event.setCancelled(true); return; } - if (Config.getInstance().getPreventHopperTransferBottles() && (item.getType() == Material.POTION || item.getType() == Material.SPLASH_POTION || item.getType() == Material.LINGERING_POTION)) { + if (mcMMO.p.getGeneralConfig().getPreventHopperTransferBottles() && (item.getType() == Material.POTION || item.getType() == Material.SPLASH_POTION || item.getType() == Material.LINGERING_POTION)) { event.setCancelled(true); return; } - if (Config.getInstance().getEnabledForHoppers() && AlchemyPotionBrewer.isValidIngredient(null, item)) { + if (mcMMO.p.getGeneralConfig().getEnabledForHoppers() && AlchemyPotionBrewer.isValidIngredient(null, item)) { AlchemyPotionBrewer.scheduleCheck(null, (BrewingStand) holder); } } @EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true) public void onInventoryClickEvent(InventoryClickEvent event) { + if(event.getCurrentItem() == null) { + return; + } + SkillUtils.removeAbilityBuff(event.getCurrentItem()); + if (event.getAction() == InventoryAction.HOTBAR_SWAP) { - SkillUtils.removeAbilityBuff(event.getWhoClicked().getInventory().getItem(event.getHotbarButton())); + if(isOutsideWindowClick(event)) + return; + + PlayerInventory playerInventory = event.getWhoClicked().getInventory(); + + if(playerInventory.getItem(event.getHotbarButton()) != null) + SkillUtils.removeAbilityBuff(playerInventory.getItem(event.getHotbarButton())); } } @@ -453,12 +428,13 @@ public class InventoryListener implements Listener { final HumanEntity whoClicked = event.getWhoClicked(); - if (!whoClicked.hasMetadata(mcMMO.playerDataKey)) { + if (!whoClicked.hasMetadata(MetadataConstants.METADATA_KEY_PLAYER_DATA)) { return; } ItemStack result = event.getRecipe().getResult(); + //TODO: what is the point of this if (!ItemUtils.isMcMMOItem(result)) { return; } @@ -475,27 +451,4 @@ public class InventoryListener implements Listener { new PlayerUpdateInventoryTask((Player) whoClicked).runTaskLater(plugin, 0); } - private Block processInventoryOpenOrCloseEvent(Inventory inventory) { - if (!(inventory instanceof FurnaceInventory)) { - return null; - } - - Furnace furnace = (Furnace) inventory.getHolder(); - - if (furnace == null) { - return null; - } - - return furnace.getBlock(); - } - - private Player getPlayerFromFurnace(Block furnaceBlock) { - List metadata = furnaceBlock.getMetadata(mcMMO.furnaceMetadataKey); - - if (metadata.isEmpty()) { - return null; - } - - return plugin.getServer().getPlayerExact(metadata.get(0).asString()); - } } diff --git a/src/main/java/com/gmail/nossr50/listeners/PlayerListener.java b/src/main/java/com/gmail/nossr50/listeners/PlayerListener.java index 4d00d009d..f1d53c47f 100644 --- a/src/main/java/com/gmail/nossr50/listeners/PlayerListener.java +++ b/src/main/java/com/gmail/nossr50/listeners/PlayerListener.java @@ -1,21 +1,18 @@ package com.gmail.nossr50.listeners; -import com.gmail.nossr50.chat.ChatManager; -import com.gmail.nossr50.chat.ChatManagerFactory; -import com.gmail.nossr50.chat.PartyChatManager; -import com.gmail.nossr50.config.Config; import com.gmail.nossr50.config.WorldBlacklist; import com.gmail.nossr50.config.experience.ExperienceConfig; -import com.gmail.nossr50.datatypes.chat.ChatMode; -import com.gmail.nossr50.datatypes.party.Party; +import com.gmail.nossr50.datatypes.chat.ChatChannel; import com.gmail.nossr50.datatypes.player.McMMOPlayer; import com.gmail.nossr50.datatypes.skills.PrimarySkillType; import com.gmail.nossr50.datatypes.skills.SubSkillType; import com.gmail.nossr50.datatypes.skills.subskills.taming.CallOfTheWildType; +import com.gmail.nossr50.events.McMMOReplaceVanillaTreasureEvent; import com.gmail.nossr50.events.fake.FakePlayerAnimationEvent; import com.gmail.nossr50.locale.LocaleLoader; import com.gmail.nossr50.mcMMO; import com.gmail.nossr50.party.ShareHandler; +import com.gmail.nossr50.runnables.MobHealthDisplayUpdaterTask; import com.gmail.nossr50.runnables.player.PlayerProfileLoadingTask; import com.gmail.nossr50.skills.fishing.FishingManager; import com.gmail.nossr50.skills.herbalism.HerbalismManager; @@ -39,6 +36,7 @@ import org.bukkit.GameMode; import org.bukkit.Material; import org.bukkit.block.Block; import org.bukkit.block.BlockState; +import org.bukkit.enchantments.Enchantment; import org.bukkit.entity.*; import org.bukkit.entity.minecart.PoweredMinecart; import org.bukkit.event.Event; @@ -46,11 +44,13 @@ import org.bukkit.event.EventHandler; import org.bukkit.event.EventPriority; import org.bukkit.event.Listener; import org.bukkit.event.block.Action; +import org.bukkit.event.entity.EntityDamageByEntityEvent; import org.bukkit.event.entity.EntityPickupItemEvent; import org.bukkit.event.entity.PlayerDeathEvent; import org.bukkit.event.player.*; import org.bukkit.inventory.EquipmentSlot; import org.bukkit.inventory.ItemStack; +import org.bukkit.scheduler.BukkitRunnable; import java.util.Locale; @@ -75,10 +75,12 @@ public class PlayerListener implements Listener { /* WORLD BLACKLIST CHECK */ if(WorldBlacklist.isWorldBlacklisted(event.getPlayer().getWorld())) { //Remove scoreboards - ScoreboardManager.teardownPlayer(event.getPlayer()); + if(mcMMO.p.getGeneralConfig().getScoreboardsEnabled()) { + ScoreboardManager.teardownPlayer(event.getPlayer()); + } return; - } else if(WorldBlacklist.isWorldBlacklisted(event.getFrom().getWorld())) { - //This only fires if they are traveling to a non-blacklisted world from a blacklisted world + } else if(WorldBlacklist.isWorldBlacklisted(event.getFrom().getWorld()) && mcMMO.p.getGeneralConfig().getScoreboardsEnabled()) { + //This only fires if they are travelling to a non-blacklisted world from a blacklisted world //Setup scoreboards ScoreboardManager.setupPlayer(event.getPlayer()); @@ -93,7 +95,7 @@ public class PlayerListener implements Listener { return; } - if (!UserManager.hasPlayerDataKey(player) || Config.getInstance().getXPAfterTeleportCooldown() <= 0 || event.getFrom().equals(event.getTo())) { + if (!UserManager.hasPlayerDataKey(player) || mcMMO.p.getGeneralConfig().getXPAfterTeleportCooldown() <= 0 || event.getFrom().equals(event.getTo())) { return; } @@ -105,36 +107,56 @@ public class PlayerListener implements Listener { UserManager.getPlayer(player).actualizeTeleportATS(); } + /** - * Handle PlayerDeathEvents at the lowest priority. + * Handle {@link EntityDamageByEntityEvent} at the highest priority. *

- * These events are used to modify the death message of a player when - * needed to correct issues potentially caused by the custom naming used - * for mob healthbars. + * This handler is used to clear the names of mobs with health bars to + * fix death messages showing mob health bars on death. * - * @param event The event to modify + * @param event the event to listen to */ - @EventHandler(priority = EventPriority.LOWEST, ignoreCancelled = true) - public void onPlayerDeathLowest(PlayerDeathEvent event) { - /* WORLD BLACKLIST CHECK */ - if(WorldBlacklist.isWorldBlacklisted(event.getEntity().getWorld())) + @EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = true) + public void onEntityDamageByEntityHighest(EntityDamageByEntityEvent event) { + // we only care about players as this is for fixing player death messages + if (!(event.getEntity() instanceof Player)) + return; + Player player = (Player) event.getEntity(); + + // get the attacker + LivingEntity attacker; + if (event.getDamager() instanceof LivingEntity) + attacker = (LivingEntity) event.getDamager(); + // attempt to find creator of a projectile + else if (event.getDamager() instanceof Projectile && ((Projectile) event.getDamager()).getShooter() instanceof LivingEntity) + attacker = (LivingEntity) ((Projectile) event.getDamager()).getShooter(); + else return; - String deathMessage = event.getDeathMessage(); - - /* WORLD GUARD MAIN FLAG CHECK */ - if(WorldGuardUtils.isWorldGuardLoaded()) - { - if(!WorldGuardManager.getInstance().hasMainFlag(event.getEntity())) - return; - } - - if (deathMessage == null) { + if (attacker instanceof HumanEntity) return; - } - Player player = event.getEntity(); - event.setDeathMessage(MobHealthbarUtils.fixDeathMessage(deathMessage, player)); + // world blacklist check + if (WorldBlacklist.isWorldBlacklisted(event.getEntity().getWorld())) + return; + // world guard main flag check + if (WorldGuardUtils.isWorldGuardLoaded() && !WorldGuardManager.getInstance().hasMainFlag((Player) event.getEntity())) + return; + + // we only want to handle player deaths + if ((player.getHealth() - event.getFinalDamage()) > 0) + return; + + // temporarily clear the mob's name + new MobHealthDisplayUpdaterTask(attacker).run(); + + // set the name back + new BukkitRunnable() { + @Override + public void run() { + MobHealthbarUtils.handleMobHealthbars(attacker, 0, mcMMO.p); + } + }.runTaskLater(mcMMO.p, 1); } /** @@ -162,7 +184,7 @@ public class PlayerListener implements Listener { Player killedPlayer = event.getEntity(); - if (!killedPlayer.hasMetadata(mcMMO.playerDataKey) || Permissions.hardcoreBypass(killedPlayer)) { + if (!killedPlayer.hasMetadata(MetadataConstants.METADATA_KEY_PLAYER_DATA) || Permissions.hardcoreBypass(killedPlayer)) { return; } @@ -190,6 +212,11 @@ public class PlayerListener implements Listener { } } + @EventHandler(priority = EventPriority.NORMAL, ignoreCancelled = false) + public void onPlayerDeathNormal(PlayerDeathEvent playerDeathEvent) { + SkillUtils.removeAbilityBoostsFromInventory(playerDeathEvent.getEntity()); + } + /** * Monitor PlayerChangedWorldEvents. *

@@ -245,7 +272,7 @@ public class PlayerListener implements Listener { ItemStack dropStack = drop.getItemStack(); if (ItemUtils.isSharable(dropStack)) { - drop.setMetadata(mcMMO.droppedItemKey, mcMMO.metadataValue); + drop.setMetadata(MetadataConstants.METADATA_KEY_TRACKED_ITEM, MetadataConstants.MCMMO_METADATA_VALUE); } SkillUtils.removeAbilityBuff(dropStack); @@ -259,7 +286,7 @@ public class PlayerListener implements Listener { * * @param event The event to modify */ - @EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = true) + @EventHandler(priority = EventPriority.HIGH, ignoreCancelled = true) public void onPlayerFishHighest(PlayerFishEvent event) { /* WORLD BLACKLIST CHECK */ if(WorldBlacklist.isWorldBlacklisted(event.getPlayer().getWorld())) @@ -274,7 +301,7 @@ public class PlayerListener implements Listener { return; } - if (!UserManager.hasPlayerDataKey(player) || !PrimarySkillType.FISHING.getPermissions(player)) { + if (!UserManager.hasPlayerDataKey(player) || !mcMMO.p.getSkillTools().doesPlayerHaveSkillPermission(player, PrimarySkillType.FISHING)) { return; } @@ -288,21 +315,31 @@ public class PlayerListener implements Listener { switch (event.getState()) { case CAUGHT_FISH: - //TODO Update to new API once available! Waiting for case CAUGHT_TREASURE: - Item fishingCatch = (Item) event.getCaught(); + //TODO Update to new API once available! Waiting for case CAUGHT_TREASURE + if(event.getCaught() != null) { + Item fishingCatch = (Item) event.getCaught(); - if (Config.getInstance(). getFishingOverrideTreasures() && - fishingCatch.getItemStack().getType() != Material.SALMON && - fishingCatch.getItemStack().getType() != Material.COD && - fishingCatch.getItemStack().getType() != Material.TROPICAL_FISH && - fishingCatch.getItemStack().getType() != Material.PUFFERFISH) { - fishingCatch.setItemStack(new ItemStack(Material.SALMON, 1)); - } + if (mcMMO.p.getGeneralConfig().getFishingOverrideTreasures() && + fishingCatch.getItemStack().getType() != Material.SALMON && + fishingCatch.getItemStack().getType() != Material.COD && + fishingCatch.getItemStack().getType() != Material.TROPICAL_FISH && + fishingCatch.getItemStack().getType() != Material.PUFFERFISH) { - if (Permissions.vanillaXpBoost(player, PrimarySkillType.FISHING)) { - //Don't modify XP below vanilla values - if(fishingManager.handleVanillaXpBoost(event.getExpToDrop()) > 1) - event.setExpToDrop(fishingManager.handleVanillaXpBoost(event.getExpToDrop())); + ItemStack replacementCatch = new ItemStack(Material.SALMON, 1); + + McMMOReplaceVanillaTreasureEvent replaceVanillaTreasureEvent = new McMMOReplaceVanillaTreasureEvent(fishingCatch, replacementCatch); + Bukkit.getPluginManager().callEvent(replaceVanillaTreasureEvent); + + //Replace + replacementCatch = replaceVanillaTreasureEvent.getReplacementItemStack(); + fishingCatch.setItemStack(replacementCatch); + } + + if (Permissions.vanillaXpBoost(player, PrimarySkillType.FISHING)) { + //Don't modify XP below vanilla values + if(fishingManager.handleVanillaXpBoost(event.getExpToDrop()) > 1) + event.setExpToDrop(fishingManager.handleVanillaXpBoost(event.getExpToDrop())); + } } return; @@ -318,7 +355,6 @@ public class PlayerListener implements Listener { return; default: - return; } } @@ -351,7 +387,7 @@ public class PlayerListener implements Listener { return; } - if (!UserManager.hasPlayerDataKey(player) || !PrimarySkillType.FISHING.getPermissions(player)) { + if (!UserManager.hasPlayerDataKey(player) || !mcMMO.p.getSkillTools().doesPlayerHaveSkillPermission(player, PrimarySkillType.FISHING)) { return; } @@ -367,7 +403,7 @@ public class PlayerListener implements Listener { //Track the hook if(ExperienceConfig.getInstance().isFishingExploitingPrevented()) { - if(event.getHook().getMetadata(mcMMO.FISH_HOOK_REF_METAKEY).size() == 0) + if(event.getHook().getMetadata(MetadataConstants.METADATA_KEY_FISH_HOOK_REF).size() == 0) { fishingManager.setFishHookReference(event.getHook()); } @@ -390,26 +426,40 @@ public class PlayerListener implements Listener { switch (event.getState()) { case FISHING: if (fishingManager.canMasterAngler()) { - fishingManager.masterAngler(event.getHook()); + int lureLevel = 0; + ItemStack inHand = player.getInventory().getItemInMainHand(); + + //Grab lure level + if(inHand != null && inHand.getType().getKey().getKey().equalsIgnoreCase("fishing_rod")) { + if(inHand.getItemMeta().hasEnchants()) { + for(Enchantment enchantment : inHand.getItemMeta().getEnchants().keySet()) { + if(enchantment.toString().toLowerCase().contains("lure")) { + lureLevel = inHand.getEnchantmentLevel(enchantment); + } + } + } + } + + fishingManager.masterAngler(event.getHook(), lureLevel); fishingManager.setFishingTarget(); } return; case CAUGHT_FISH: - if(ExperienceConfig.getInstance().isFishingExploitingPrevented()) - { - if(fishingManager.isExploitingFishing(event.getHook().getLocation().toVector())) - { - player.sendMessage(LocaleLoader.getString("Fishing.ScarcityTip", 3)); - event.setExpToDrop(0); - Item caughtItem = (Item) caught; - caughtItem.remove(); - return; - } - } + if(caught instanceof Item) { + if(ExperienceConfig.getInstance().isFishingExploitingPrevented()) { + if (fishingManager.isExploitingFishing(event.getHook().getLocation().toVector())) { + player.sendMessage(LocaleLoader.getString("Fishing.ScarcityTip", ExperienceConfig.getInstance().getFishingExploitingOptionMoveRange())); + event.setExpToDrop(0); + Item caughtItem = (Item) caught; + caughtItem.remove(); - fishingManager.handleFishing((Item) caught); - fishingManager.setFishingTarget(); - //fishingManager.setFishHookReference(null); + return; + } + } + + fishingManager.processFishing((Item) caught); + fishingManager.setFishingTarget(); + } return; case CAUGHT_ENTITY: if (fishingManager.canShake(caught)) { @@ -418,7 +468,6 @@ public class PlayerListener implements Listener { } return; default: - return; } } @@ -436,6 +485,10 @@ public class PlayerListener implements Listener { if(WorldBlacklist.isWorldBlacklisted(event.getEntity().getWorld())) return; + if(Misc.isNPCEntityExcludingVillagers(event.getEntity())) { + return; + } + if(event.getEntity() instanceof Player) { Player player = (Player) event.getEntity(); @@ -452,35 +505,32 @@ public class PlayerListener implements Listener { } //Profile not loaded - if(UserManager.getPlayer(player) == null) - { + McMMOPlayer mcMMOPlayer = UserManager.getPlayer(player); + if(mcMMOPlayer == null) { return; } - McMMOPlayer mcMMOPlayer = UserManager.getPlayer(player); - Item drop = event.getItem(); ItemStack dropStack = drop.getItemStack(); //Remove tracking - if(drop.hasMetadata(mcMMO.trackedArrow)) { - drop.removeMetadata(mcMMO.trackedArrow, mcMMO.p); + if(drop.hasMetadata(MetadataConstants.METADATA_KEY_TRACKED_ARROW)) { + drop.removeMetadata(MetadataConstants.METADATA_KEY_TRACKED_ARROW, mcMMO.p); } - if (drop.hasMetadata(mcMMO.disarmedItemKey)) { - if (!player.getName().equals(drop.getMetadata(mcMMO.disarmedItemKey).get(0).asString())) { + if (drop.hasMetadata(MetadataConstants.METADATA_KEY_DISARMED_ITEM)) { + if (!player.getName().equals(drop.getMetadata(MetadataConstants.METADATA_KEY_DISARMED_ITEM).get(0).asString())) { event.setCancelled(true); } return; } - if (!drop.hasMetadata(mcMMO.droppedItemKey) && mcMMOPlayer.inParty() && ItemUtils.isSharable(dropStack)) { + if (!drop.hasMetadata(MetadataConstants.METADATA_KEY_TRACKED_ITEM) && mcMMOPlayer.inParty() && ItemUtils.isSharable(dropStack)) { event.setCancelled(ShareHandler.handleItemShare(drop, mcMMOPlayer)); if (event.isCancelled()) { SoundManager.sendSound(player, player.getLocation(), SoundType.POP); - return; } } @@ -514,16 +564,16 @@ public class PlayerListener implements Listener { return; } + McMMOPlayer mcMMOPlayer = UserManager.getPlayer(player); + //Profile not loaded - if(UserManager.getPlayer(player) == null) - { + if(mcMMOPlayer == null) { return; } - McMMOPlayer mcMMOPlayer = UserManager.getPlayer(player); - //There's an issue with using Async saves on player quit - //Basically there are conditions in which an async task does not execute fast enough to save the data if the server shutdown shortly after this task was scheduled - mcMMOPlayer.logout(true); + //Use a sync save if the server is shutting down to avoid race conditions + mcMMOPlayer.logout(mcMMO.isServerShutdownExecuted()); + mcMMO.getTransientMetadataTools().cleanLivingEntityMetadata(event.getPlayer()); } /** @@ -542,11 +592,11 @@ public class PlayerListener implements Listener { //Delay loading for 3 seconds in case the player has a save task running, its hacky but it should do the trick new PlayerProfileLoadingTask(player).runTaskLaterAsynchronously(mcMMO.p, 60); - if (Config.getInstance().getMOTDEnabled() && Permissions.motd(player)) { + if (mcMMO.p.getGeneralConfig().getMOTDEnabled() && Permissions.motd(player)) { Motd.displayAll(player); } - if (plugin.isXPEventEnabled() && Config.getInstance().playerJoinEventInfo()) { + if (plugin.isXPEventEnabled() && mcMMO.p.getGeneralConfig().playerJoinEventInfo()) { player.sendMessage(LocaleLoader.getString("XPRate.Event", ExperienceConfig.getInstance().getExperienceGainsGlobalMultiplier())); } } @@ -597,20 +647,18 @@ public class PlayerListener implements Listener { return; } + if(event.getClickedBlock() == null) + return; + Block clickedBlock = event.getClickedBlock(); - if(clickedBlock != null) { - Material clickedBlockType = clickedBlock.getType(); - //The blacklist contains interactable blocks so its a convenient filter - if(clickedBlockType == Repair.anvilMaterial || clickedBlockType == Salvage.anvilMaterial) { - event.setUseItemInHand(Event.Result.ALLOW); + Material clickedBlockType = clickedBlock.getType(); + //The blacklist contains interactable blocks so its a convenient filter + if(clickedBlockType == Repair.anvilMaterial || clickedBlockType == Salvage.anvilMaterial) { + event.setUseItemInHand(Event.Result.ALLOW); - if(mcMMO.getMaterialMapStore().isToolActivationBlackListed(clickedBlockType)) { - event.setUseInteractedBlock(Event.Result.DENY); - } + if(!event.getPlayer().isSneaking() && mcMMO.getMaterialMapStore().isToolActivationBlackListed(clickedBlockType)) { + event.setUseInteractedBlock(Event.Result.DENY); } - - //Cancel the event to prevent vanilla functionality - //Only cancel if item in hand has durability } if (event.getHand() != EquipmentSlot.HAND || !UserManager.hasPlayerDataKey(player) || player.getGameMode() == GameMode.CREATIVE) { @@ -631,10 +679,10 @@ public class PlayerListener implements Listener { case RIGHT_CLICK_BLOCK: Material type = clickedBlock.getType(); - if (!Config.getInstance().getAbilitiesOnlyActivateWhenSneaking() || player.isSneaking()) { + if (!mcMMO.p.getGeneralConfig().getAbilitiesOnlyActivateWhenSneaking() || player.isSneaking()) { /* REPAIR CHECKS */ if (type == Repair.anvilMaterial - && PrimarySkillType.REPAIR.getPermissions(player) + && mcMMO.p.getSkillTools().doesPlayerHaveSkillPermission(player, PrimarySkillType.REPAIR) && mcMMO.getRepairableManager().isRepairable(heldItem) && heldItem.getAmount() <= 1) { RepairManager repairManager = mcMMOPlayer.getRepairManager(); @@ -648,7 +696,7 @@ public class PlayerListener implements Listener { } /* SALVAGE CHECKS */ else if (type == Salvage.anvilMaterial - && PrimarySkillType.SALVAGE.getPermissions(player) + && mcMMO.p.getSkillTools().doesPlayerHaveSkillPermission(player, PrimarySkillType.SALVAGE) && RankUtils.hasUnlockedSubskill(player, SubSkillType.SALVAGE_SCRAP_COLLECTOR) && mcMMO.getSalvageableManager().isSalvageable(heldItem) && heldItem.getAmount() <= 1) { @@ -657,7 +705,7 @@ public class PlayerListener implements Listener { // Make sure the player knows what he's doing when trying to salvage an enchanted item if (salvageManager.checkConfirmation(true)) { - SkillUtils.handleAbilitySpeedDecrease(player); + SkillUtils.removeAbilityBoostsFromInventory(player); salvageManager.handleSalvage(clickedBlock.getLocation(), heldItem); player.updateInventory(); } @@ -679,9 +727,9 @@ public class PlayerListener implements Listener { case LEFT_CLICK_BLOCK: type = clickedBlock.getType(); - if (!Config.getInstance().getAbilitiesOnlyActivateWhenSneaking() || player.isSneaking()) { + if (!mcMMO.p.getGeneralConfig().getAbilitiesOnlyActivateWhenSneaking() || player.isSneaking()) { /* REPAIR CHECKS */ - if (type == Repair.anvilMaterial && PrimarySkillType.REPAIR.getPermissions(player) && mcMMO.getRepairableManager().isRepairable(heldItem)) { + if (type == Repair.anvilMaterial && mcMMO.p.getSkillTools().doesPlayerHaveSkillPermission(player, PrimarySkillType.REPAIR) && mcMMO.getRepairableManager().isRepairable(heldItem)) { RepairManager repairManager = mcMMOPlayer.getRepairManager(); // Cancel repairing an enchanted item @@ -691,7 +739,7 @@ public class PlayerListener implements Listener { } } /* SALVAGE CHECKS */ - else if (type == Salvage.anvilMaterial && PrimarySkillType.SALVAGE.getPermissions(player) && mcMMO.getSalvageableManager().isSalvageable(heldItem)) { + else if (type == Salvage.anvilMaterial && mcMMO.p.getSkillTools().doesPlayerHaveSkillPermission(player, PrimarySkillType.SALVAGE) && mcMMO.getSalvageableManager().isSalvageable(heldItem)) { SalvageManager salvageManager = mcMMOPlayer.getSalvageManager(); // Cancel salvaging an enchanted item @@ -751,10 +799,9 @@ public class PlayerListener implements Listener { if(player.isInsideVehicle() && (player.getVehicle() instanceof Minecart || player.getVehicle() instanceof PoweredMinecart)) { player.getVehicle().eject(); - player.setVelocity(player.getEyeLocation().getDirection().multiply(10)); } - mcMMOPlayer.getFishingManager().setFishingRodCastTimestamp(); + //mcMMOPlayer.getFishingManager().setFishingRodCastTimestamp(); } } @@ -763,13 +810,17 @@ public class PlayerListener implements Listener { if(player.getInventory().getItemInOffHand().getType() != Material.AIR && !player.isInsideVehicle() && !player.isSneaking()) { break; } - + + //Hmm + if(event.getClickedBlock() == null) + return; + Block block = event.getClickedBlock(); BlockState blockState = block.getState(); /* ACTIVATION & ITEM CHECKS */ if (BlockUtils.canActivateTools(blockState)) { - if (Config.getInstance().getAbilitiesEnabled()) { + if (mcMMO.p.getGeneralConfig().getAbilitiesEnabled()) { if (BlockUtils.canActivateHerbalism(blockState)) { mcMMOPlayer.processAbilityActivation(PrimarySkillType.HERBALISM); } @@ -785,35 +836,47 @@ public class PlayerListener implements Listener { ChimaeraWing.activationCheck(player); } - /* GREEN THUMB CHECK */ HerbalismManager herbalismManager = mcMMOPlayer.getHerbalismManager(); - if (heldItem.getType() == Material.BONE_MEAL) { - switch (blockState.getType()) { - case BEETROOTS: - case CARROT: - case COCOA: - case WHEAT: - case NETHER_WART_BLOCK: - case POTATO: - mcMMO.getPlaceStore().setFalse(blockState); + FakePlayerAnimationEvent fakeSwing = new FakePlayerAnimationEvent(event.getPlayer()); //PlayerAnimationEvent compat + if(!event.isCancelled() || event.useInteractedBlock() != Event.Result.DENY) { + //TODO: Is this code to set false from bone meal even needed? I'll have to double check later. + if (heldItem.getType() == Material.BONE_MEAL) { + switch (blockState.getType()) { + case BEETROOTS: + case CARROT: + case COCOA: + case WHEAT: + case NETHER_WART_BLOCK: + case POTATO: + mcMMO.getPlaceStore().setFalse(blockState); + break; + } } - } - FakePlayerAnimationEvent fakeSwing = new FakePlayerAnimationEvent(event.getPlayer()); //PlayerAnimationEvent compat - if (herbalismManager.canGreenThumbBlock(blockState)) { - Bukkit.getPluginManager().callEvent(fakeSwing); - player.getInventory().setItemInMainHand(new ItemStack(Material.WHEAT_SEEDS, heldItem.getAmount() - 1)); - if (herbalismManager.processGreenThumbBlocks(blockState) && EventUtils.simulateBlockBreak(block, player, false)) { - blockState.update(true); + if (herbalismManager.canGreenThumbBlock(blockState)) { + //call event for Green Thumb Block + if(!EventUtils.callSubSkillBlockEvent(player, SubSkillType.HERBALISM_GREEN_THUMB, block).isCancelled()) { + Bukkit.getPluginManager().callEvent(fakeSwing); + player.getInventory().getItemInMainHand().setAmount(heldItem.getAmount() - 1); + player.updateInventory(); + if (herbalismManager.processGreenThumbBlocks(blockState) && EventUtils.simulateBlockBreak(block, player, false)) { + blockState.update(true); + } + } } - } - /* SHROOM THUMB CHECK */ - else if (herbalismManager.canUseShroomThumb(blockState)) { - Bukkit.getPluginManager().callEvent(fakeSwing); - event.setCancelled(true); - if (herbalismManager.processShroomThumb(blockState) && EventUtils.simulateBlockBreak(block, player, false)) { - blockState.update(true); + /* SHROOM THUMB CHECK */ + else if (herbalismManager.canUseShroomThumb(blockState)) { + if(!EventUtils.callSubSkillBlockEvent(player, SubSkillType.HERBALISM_SHROOM_THUMB, block).isCancelled()) { + Bukkit.getPluginManager().callEvent(fakeSwing); + event.setCancelled(true); + if (herbalismManager.processShroomThumb(blockState) + && EventUtils.simulateBlockBreak(block, player, false)) { + blockState.update(true); + } + } + } else { + herbalismManager.processBerryBushHarvesting(blockState); } } break; @@ -822,9 +885,9 @@ public class PlayerListener implements Listener { if(player.getInventory().getItemInOffHand().getType() != Material.AIR && !player.isInsideVehicle() && !player.isSneaking()) { break; } - + /* ACTIVATION CHECKS */ - if (Config.getInstance().getAbilitiesEnabled()) { + if (mcMMO.p.getGeneralConfig().getAbilitiesEnabled()) { mcMMOPlayer.processAbilityActivation(PrimarySkillType.AXES); mcMMOPlayer.processAbilityActivation(PrimarySkillType.EXCAVATION); mcMMOPlayer.processAbilityActivation(PrimarySkillType.HERBALISM); @@ -856,13 +919,13 @@ public class PlayerListener implements Listener { Material type = heldItem.getType(); TamingManager tamingManager = mcMMOPlayer.getTamingManager(); - if (type == Config.getInstance().getTamingCOTWMaterial(CallOfTheWildType.WOLF.getConfigEntityTypeEntry())) { + if (type == mcMMO.p.getGeneralConfig().getTamingCOTWMaterial(CallOfTheWildType.WOLF.getConfigEntityTypeEntry())) { tamingManager.summonWolf(); } - else if (type == Config.getInstance().getTamingCOTWMaterial(CallOfTheWildType.CAT.getConfigEntityTypeEntry())) { + else if (type == mcMMO.p.getGeneralConfig().getTamingCOTWMaterial(CallOfTheWildType.CAT.getConfigEntityTypeEntry())) { tamingManager.summonOcelot(); } - else if (type == Config.getInstance().getTamingCOTWMaterial(CallOfTheWildType.HORSE.getConfigEntityTypeEntry())) { + else if (type == mcMMO.p.getGeneralConfig().getTamingCOTWMaterial(CallOfTheWildType.HORSE.getConfigEntityTypeEntry())) { tamingManager.summonHorse(); } @@ -882,7 +945,7 @@ public class PlayerListener implements Listener { public void onPlayerChat(AsyncPlayerChatEvent event) { Player player = event.getPlayer(); - if (Misc.isNPCEntityExcludingVillagers(player) || !UserManager.hasPlayerDataKey(player)) { + if ((ExperienceConfig.getInstance().isNPCInteractionPrevented() && Misc.isNPCEntityExcludingVillagers(player)) || !UserManager.hasPlayerDataKey(player)) { return; } @@ -894,27 +957,17 @@ public class PlayerListener implements Listener { return; } - ChatManager chatManager = null; - - if (mcMMOPlayer.isChatEnabled(ChatMode.PARTY)) { - Party party = mcMMOPlayer.getParty(); - - if (party == null) { - mcMMOPlayer.disableChat(ChatMode.PARTY); - player.sendMessage(LocaleLoader.getString("Commands.Party.None")); - return; + if(plugin.getChatManager().isChatChannelEnabled(mcMMOPlayer.getChatChannel())) { + if(mcMMOPlayer.getChatChannel() != ChatChannel.NONE) { + if(plugin.getChatManager().isMessageAllowed(mcMMOPlayer)) { + //If the message is allowed we cancel this event to avoid double sending messages + plugin.getChatManager().processPlayerMessage(mcMMOPlayer, event.getMessage(), event.isAsynchronous()); + event.setCancelled(true); + } else { + //Message wasn't allowed, remove the player from their channel + plugin.getChatManager().setOrToggleChatChannel(mcMMOPlayer, mcMMOPlayer.getChatChannel()); + } } - - chatManager = ChatManagerFactory.getChatManager(plugin, ChatMode.PARTY); - ((PartyChatManager) chatManager).setParty(party); - } - else if (mcMMOPlayer.isChatEnabled(ChatMode.ADMIN)) { - chatManager = ChatManagerFactory.getChatManager(plugin, ChatMode.ADMIN); - } - - if (chatManager != null) { - chatManager.handleChat(player, event.getMessage(), event.isAsynchronous()); - event.setCancelled(true); } } @@ -925,7 +978,7 @@ public class PlayerListener implements Listener { */ @EventHandler(priority = EventPriority.LOWEST) public void onPlayerCommandPreprocess(PlayerCommandPreprocessEvent event) { - if (!Config.getInstance().getLocale().equalsIgnoreCase("en_US")) { + if (!mcMMO.p.getGeneralConfig().getLocale().equalsIgnoreCase("en_US")) { String message = event.getMessage(); String command = message.substring(1).split(" ")[0]; String lowerCaseCommand = command.toLowerCase(Locale.ENGLISH); @@ -933,7 +986,7 @@ public class PlayerListener implements Listener { // Do these ACTUALLY have to be lower case to work properly? for (PrimarySkillType skill : PrimarySkillType.values()) { String skillName = skill.toString().toLowerCase(Locale.ENGLISH); - String localizedName = skill.getName().toLowerCase(Locale.ENGLISH); + String localizedName = mcMMO.p.getSkillTools().getLocalizedSkillName(skill).toLowerCase(Locale.ENGLISH); if (lowerCaseCommand.equals(localizedName)) { event.setMessage(message.replace(command, skillName)); @@ -947,16 +1000,45 @@ public class PlayerListener implements Listener { } } - @EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true) - public void onPlayerStatisticIncrementEvent(PlayerStatisticIncrementEvent event) { - /* WORLD BLACKLIST CHECK */ - if(WorldBlacklist.isWorldBlacklisted(event.getPlayer().getWorld())) - return; + /** + * When a {@link Player} attempts to place an {@link ItemStack} + * into an {@link ItemFrame}, we want to make sure to remove any + * Ability buffs from that item. + * + * @param event The {@link PlayerInteractEntityEvent} to handle + */ + @EventHandler(priority = EventPriority.HIGH, ignoreCancelled = true) + public void onPlayerInteractEntity(PlayerInteractEntityEvent event) { + /* + * We can check for an instance instead of EntityType here, so we are + * ready for the infamous "Glow Item Frame" in 1.17 too! + */ + if (event.getRightClicked() instanceof ItemFrame) { + ItemFrame frame = (ItemFrame) event.getRightClicked(); - if (!mcMMO.getHolidayManager().isAprilFirst()) { - return; + // Check for existing items (ignore rotations) + if (frame.getItem().getType() != Material.AIR) { + return; + } + + // Get the item the Player is about to place + ItemStack itemInHand; + + if (event.getHand() == EquipmentSlot.OFF_HAND) { + itemInHand = event.getPlayer().getInventory().getItemInOffHand(); + } + else { + itemInHand = event.getPlayer().getInventory().getItemInMainHand(); + } + + // and remove any skill ability buffs! + SkillUtils.removeAbilityBuff(itemInHand); } + } - mcMMO.getHolidayManager().handleStatisticEvent(event); + @EventHandler(ignoreCancelled = true, priority = EventPriority.NORMAL) + public void onPlayerSwapHandItems(PlayerSwapHandItemsEvent event) { + SkillUtils.removeAbilityBuff(event.getMainHandItem()); + SkillUtils.removeAbilityBuff(event.getOffHandItem()); } } diff --git a/src/main/java/com/gmail/nossr50/listeners/SelfListener.java b/src/main/java/com/gmail/nossr50/listeners/SelfListener.java index 1d20e2f7d..0fe8eec9f 100644 --- a/src/main/java/com/gmail/nossr50/listeners/SelfListener.java +++ b/src/main/java/com/gmail/nossr50/listeners/SelfListener.java @@ -1,6 +1,5 @@ package com.gmail.nossr50.listeners; -import com.gmail.nossr50.config.Config; import com.gmail.nossr50.config.experience.ExperienceConfig; import com.gmail.nossr50.datatypes.experience.XPGainReason; import com.gmail.nossr50.datatypes.player.McMMOPlayer; @@ -13,6 +12,7 @@ import com.gmail.nossr50.util.player.PlayerLevelUtils; import com.gmail.nossr50.util.player.UserManager; import com.gmail.nossr50.util.scoreboards.ScoreboardManager; import com.gmail.nossr50.util.skills.RankUtils; +import com.gmail.nossr50.util.skills.SkillTools; import com.gmail.nossr50.worldguard.WorldGuardManager; import com.gmail.nossr50.worldguard.WorldGuardUtils; import org.bukkit.entity.Player; @@ -34,45 +34,57 @@ public class SelfListener implements Listener { 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); - } + McMMOPlayer mcMMOPlayer = UserManager.getPlayer(player); - //Reset the delay timer - RankUtils.resetUnlockDelayTimer(); - - if(Config.getInstance().getScoreboardsEnabled()) - ScoreboardManager.handleLevelUp(player, skill); - - if (!Config.getInstance().getLevelUpEffectsEnabled()) { + //TODO: Handle proper validation at the event level + if(mcMMOPlayer == null || !mcMMOPlayer.getProfile().isLoaded()) return; - } - /*if ((event.getSkillLevel() % Config.getInstance().getLevelUpEffectsTier()) == 0) { - skill.celebrateLevelUp(player); - }*/ + if(player.isOnline()) { + //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); + } + + //Reset the delay timer + RankUtils.resetUnlockDelayTimer(); + + if(mcMMO.p.getGeneralConfig().getScoreboardsEnabled()) + ScoreboardManager.handleLevelUp(player, skill); + } } @EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true) public void onPlayerXp(McMMOPlayerXpGainEvent event) { - if(Config.getInstance().getScoreboardsEnabled()) - ScoreboardManager.handleXp(event.getPlayer(), event.getSkill()); + Player player = event.getPlayer(); + + if(player.isOnline()) { + if(mcMMO.p.getGeneralConfig().getScoreboardsEnabled()) + ScoreboardManager.handleXp(player, event.getSkill()); + } } @EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true) public void onAbility(McMMOPlayerAbilityActivateEvent event) { - if(Config.getInstance().getScoreboardsEnabled()) - ScoreboardManager.cooldownUpdate(event.getPlayer(), event.getSkill()); + Player player = event.getPlayer(); + if(player.isOnline()) { + if(mcMMO.p.getGeneralConfig().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); + + //TODO: Handle proper validation at the event level + if(mcMMOPlayer == null || !mcMMOPlayer.getProfile().isLoaded()) + return; + PrimarySkillType primarySkillType = event.getSkill(); if(mcMMOPlayer.isDebugMode()) { @@ -133,7 +145,7 @@ public class SelfListener implements Listener { return; } - if (primarySkillType.isChildSkill()) { + if (SkillTools.isChildSkill(primarySkillType)) { return; } @@ -141,7 +153,7 @@ public class SelfListener implements Listener { float guaranteedMinimum = ExperienceConfig.getInstance().getDiminishedReturnsCap() * rawXp; - float modifiedThreshold = (float) (threshold / primarySkillType.getXpModifier() * ExperienceConfig.getInstance().getExperienceGainsGlobalMultiplier()); + float modifiedThreshold = (float) (threshold / ExperienceConfig.getInstance().getFormulaSkillModifier(primarySkillType) * ExperienceConfig.getInstance().getExperienceGainsGlobalMultiplier()); float difference = (mcMMOPlayer.getProfile().getRegisteredXpGain(primarySkillType) - modifiedThreshold) / modifiedThreshold; if (difference > 0) { diff --git a/src/main/java/com/gmail/nossr50/listeners/WorldListener.java b/src/main/java/com/gmail/nossr50/listeners/WorldListener.java index 5fc386c86..5abea42b3 100644 --- a/src/main/java/com/gmail/nossr50/listeners/WorldListener.java +++ b/src/main/java/com/gmail/nossr50/listeners/WorldListener.java @@ -3,18 +3,14 @@ package com.gmail.nossr50.listeners; import com.gmail.nossr50.config.WorldBlacklist; import com.gmail.nossr50.mcMMO; import org.bukkit.Chunk; -import org.bukkit.World; import org.bukkit.block.BlockState; import org.bukkit.event.EventHandler; import org.bukkit.event.EventPriority; import org.bukkit.event.Listener; import org.bukkit.event.world.ChunkUnloadEvent; import org.bukkit.event.world.StructureGrowEvent; -import org.bukkit.event.world.WorldInitEvent; import org.bukkit.event.world.WorldUnloadEvent; -import java.io.File; - public class WorldListener implements Listener { private final mcMMO plugin; @@ -33,37 +29,11 @@ public class WorldListener implements Listener { if(WorldBlacklist.isWorldBlacklisted(event.getWorld())) return; - if (!mcMMO.getPlaceStore().isTrue(event.getLocation().getBlock())) { - return; - } - for (BlockState blockState : event.getBlocks()) { mcMMO.getPlaceStore().setFalse(blockState); } } - /** - * Monitor WorldInit events. - * - * @param event The event to watch - */ - @EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true) - public void onWorldInit(WorldInitEvent event) { - /* WORLD BLACKLIST CHECK */ - if(WorldBlacklist.isWorldBlacklisted(event.getWorld())) - return; - - World world = event.getWorld(); - - if (!new File(world.getWorldFolder(), "mcmmo_data").exists() || plugin == null) { - return; - } - - plugin.getLogger().info("Converting block storage for " + world.getName() + " to a new format."); - - //new BlockStoreConversionMain(world).run(); - } - /** * Monitor WorldUnload events. * diff --git a/src/main/java/com/gmail/nossr50/locale/LocaleLoader.java b/src/main/java/com/gmail/nossr50/locale/LocaleLoader.java index 42df75d0f..f43662a0d 100644 --- a/src/main/java/com/gmail/nossr50/locale/LocaleLoader.java +++ b/src/main/java/com/gmail/nossr50/locale/LocaleLoader.java @@ -1,26 +1,30 @@ package com.gmail.nossr50.locale; -import com.gmail.nossr50.config.Config; import com.gmail.nossr50.mcMMO; +import com.gmail.nossr50.util.text.TextUtils; +import net.kyori.adventure.text.TextComponent; import org.bukkit.ChatColor; +import org.jetbrains.annotations.NotNull; -import java.io.IOException; -import java.io.Reader; +import java.io.*; import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.Paths; import java.text.MessageFormat; +import java.time.LocalDateTime; +import java.time.format.DateTimeFormatter; import java.util.*; import java.util.logging.Level; public final class LocaleLoader { private static final String BUNDLE_ROOT = "com.gmail.nossr50.locale.locale"; + private static final String OVERRIDE_FILE_NAME = "locale_override.properties"; private static Map bundleCache = new HashMap<>(); private static ResourceBundle bundle = null; private static ResourceBundle filesystemBundle = null; private static ResourceBundle enBundle = null; - private LocaleLoader() {}; + private LocaleLoader() {} public static String getString(String key) { return getString(key, (Object[]) null); @@ -29,8 +33,9 @@ public final class LocaleLoader { /** * Gets the appropriate string from the Locale files. * - * @param key The key to look up the string with + * @param key The key to look up the string with * @param messageArguments Any arguments to be added to the string + * * @return The properly formatted locale string */ public static String getString(String key, Object... messageArguments) { @@ -42,6 +47,25 @@ public final class LocaleLoader { return formatString(rawMessage, messageArguments); } + //TODO: Remove this hacky crap with something better later + + /** + * Gets the appropriate TextComponent representation of a formatted string from the Locale files. + * + * @param key The key to look up the string with + * @param messageArguments Any arguments to be added to the text component + * + * @return The properly formatted text component + */ + public static @NotNull TextComponent getTextComponent(@NotNull String key, Object... messageArguments) { + if (bundle == null) { + initialize(); + } + + String rawMessage = bundleCache.computeIfAbsent(key, LocaleLoader::getRawString); + return formatComponent(rawMessage, messageArguments); + } + /** * Reloads locale */ @@ -57,19 +81,18 @@ public final class LocaleLoader { if (filesystemBundle != null) { try { return filesystemBundle.getString(key); + } catch (MissingResourceException ignored) { } - catch (MissingResourceException ignored) {} } try { return bundle.getString(key); + } catch (MissingResourceException ignored) { } - catch (MissingResourceException ignored) {} try { return enBundle.getString(key); - } - catch (MissingResourceException ignored) { + } catch (MissingResourceException ignored) { if (!key.contains("Guides")) { mcMMO.p.getLogger().warning("Could not find locale string: " + key); } @@ -90,6 +113,16 @@ public final class LocaleLoader { return string; } + public static @NotNull TextComponent formatComponent(@NotNull String string, Object... messageArguments) { + if (messageArguments != null) { + MessageFormat formatter = new MessageFormat(""); + formatter.applyPattern(string.replace("'", "''")); + string = formatter.format(messageArguments); + } + + return TextUtils.colorizeText(string); + } + public static Locale getCurrentLocale() { if (bundle == null) { initialize(); @@ -101,34 +134,171 @@ public final class LocaleLoader { if (bundle == null) { Locale.setDefault(new Locale("en", "US")); Locale locale = null; - String[] myLocale = Config.getInstance().getLocale().split("[-_ ]"); + + String[] myLocale = mcMMO.p.getGeneralConfig().getLocale().split("[-_ ]"); if (myLocale.length == 1) { locale = new Locale(myLocale[0]); - } - else if (myLocale.length >= 2) { + } else if (myLocale.length >= 2) { locale = new Locale(myLocale[0], myLocale[1]); } if (locale == null) { - throw new IllegalStateException("Failed to parse locale string '" + Config.getInstance().getLocale() + "'"); + throw new IllegalStateException("Failed to parse locale string '" + mcMMO.p.getGeneralConfig().getLocale() + "'"); } Path localePath = Paths.get(mcMMO.getLocalesDirectory() + "locale_" + locale.toString() + ".properties"); + Path overridePath = Paths.get(mcMMO.getLocalesDirectory() + OVERRIDE_FILE_NAME); + File overrideFile = overridePath.toFile(); + if (Files.exists(localePath) && Files.isRegularFile(localePath)) { - try (Reader localeReader = Files.newBufferedReader(localePath)) { - mcMMO.p.getLogger().log(Level.INFO, "Loading locale from {0}", localePath); - filesystemBundle = new PropertyResourceBundle(localeReader); + + File oldOverrideFile = localePath.toFile(); + + try { + //Copy the file + com.google.common.io.Files.copy(oldOverrideFile, overrideFile); + //Remove the old file now + oldOverrideFile.delete(); + + //Insert our helpful text + StringBuilder stringBuilder = new StringBuilder(); + + try(BufferedReader bufferedReader = new BufferedReader(new FileReader(overrideFile.getPath()))) { + // Open the file + String line; + DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("MM/dd/yyyy HH:mm"); + LocalDateTime localDateTime = LocalDateTime.now(); + stringBuilder.append("# mcMMO Locale Override File created on ").append(localDateTime.format(dateTimeFormatter)).append("\r\n"); //Empty file + stringBuilder.append(getLocaleHelpTextWithoutExamples()); //Add our helpful text + while ((line = bufferedReader.readLine()) != null) { + stringBuilder.append(line).append("\r\n"); + } + } catch (IOException e) { + e.printStackTrace(); + } + + try(FileWriter fileWriter = new FileWriter(overrideFile.getPath())) { + fileWriter.write(stringBuilder.toString()); + } catch (IOException e) { + e.printStackTrace(); + } + } catch (IOException e) { - mcMMO.p.getLogger().log(Level.WARNING, "Failed to load locale from " + localePath, e); + e.printStackTrace(); } } + + //Use the new locale file + if (Files.exists(overridePath) && Files.isRegularFile(overridePath)) { + try (Reader localeReader = Files.newBufferedReader(overridePath)) { + mcMMO.p.getLogger().log(Level.INFO, "Loading locale from {0}", overridePath); + filesystemBundle = new PropertyResourceBundle(localeReader); + } catch (IOException e) { + mcMMO.p.getLogger().log(Level.WARNING, "Failed to load locale from " + overridePath, e); + } + } else { + //Create a blank file and fill it in with some helpful text + try (BufferedWriter bufferedWriter = new BufferedWriter(new FileWriter(overrideFile, true))) { + // Open the file to write the player + DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("MM/dd/yyyy HH:mm"); + LocalDateTime localDateTime = LocalDateTime.now(); + bufferedWriter.append("# mcMMO Locale Override File created on ").append(localDateTime.format(dateTimeFormatter)).append("\r\n"); //Empty file + String localeExplanation = getLocaleHelpText(); + bufferedWriter.append(localeExplanation); + } catch (Exception e) { + e.printStackTrace(); + } + } + bundle = ResourceBundle.getBundle(BUNDLE_ROOT, locale); - enBundle = ResourceBundle.getBundle(BUNDLE_ROOT, Locale.US); } + + enBundle = ResourceBundle.getBundle(BUNDLE_ROOT, Locale.US); } - private static String addColors(String input) { + @NotNull + private static String getLocaleHelpText() { + String localeExplanation = + "# -- Are you looking to change the language of mcMMO but without editing it yourself? --\n" + + "\n" + + "# mcMMO has quite a few built in translations, you can choose which translation by editing config.yml with the appropriate locale code. The setting is `General.Locale` in config.yml\n" + + "# Odds are, if you speak a popular language on earth we already have a translation for it.\n" + + "# However our translations are done by the community, and update infrequently. (Please help us out <3)\n" + + "# We would love more people to help update our locales, submit any updated translation file to our GitHub or email it to me at business@neetgames.com\n" + + "# For a list of built in translations, view this link: https://github.com/mcMMO-Dev/mcMMO/tree/master/src/main/resources/locale\n" + + "\n" + + "\n" + + "# -- Using a built in translation -- \n" + + "# Assuming you read the above section, edit config.yml's General.Locale from en_US to the locale code that we support (see the above link), then reboot your server\n" + + "\n" + + "\n" + + "# -- Do you want to change the text in mcMMO? Including adding colors? ( Locale Override ) -- \n" + + "# First, a brief explanation.\n" + + "# Locales are the language files used by mcMMO, they also contain color codes and most of the styling used by mcMMO.\n" + + "# You can customize a locale outside of the JAR in version 2.1.51 and up.\n" + + "#\n" + + "# Locales can be overridden by editing this file\n" + + "# You can find the up to date current locale files here https://github.com/mcMMO-Dev/mcMMO/tree/master/src/main/resources/locale\n" + + "# The master file is en_US, if a translation is missing entries (as they often are) it will pull from the en_US file https://github.com/mcMMO-Dev/mcMMO/blob/master/src/main/resources/locale/locale_en_US.properties\n" + + "#\n" + + "# To override a locale, add entries to this file and copy ** only ** the strings you want to replace, otherwise you will not see any updated strings when mcMMO updates and will have to manually change them and read patch notes carefully.\n" + + "# If you wish to replace every line in some way, feel free to copy the entire contents of this file, just be advised that you will need to be on top of locale updates in mcMMO and follow our changelog closely.\n" + + "\n" + + "\n" + + "# FIND KEYS HERE: On our github repo (en_US is our master file and has ALL the keys) -> https://github.com/mcMMO-Dev/mcMMO/tree/master/src/main/resources/locale\n" + + "# WARNING: Some keys in our master file are unused, make gratuitous use of Ctrl+F\n" + + "# HOW TO APPLY: You can either restart the server for these changes to take effect or run /mcreloadlocale.\n" + + "# -- Add Keys Below --\n" + + getExamples(); + return localeExplanation; + } + + @NotNull + private static String getExamples() { + return "This.Is.An.Example.Put.Locale.Keys.Here.One=&aExample text using hex color codes\n" + + "This.Is.An.Example.Put.Locale.Keys.Here.Two=[[DARK_AQUA]]Example text using our own color codes\n" + + "This.Is.An.Example.Put.Locale.Keys.Here.Three=Example text with no colors\n"; + } + + @NotNull + private static String getLocaleHelpTextWithoutExamples() { + String localeExplanation = + "# -- Are you looking to change the language of mcMMO but without editing it yourself? --\n" + + "\n" + + "# mcMMO has quite a few built in translations, you can choose which translation by editing config.yml with the appropriate locale code. The setting is `General.Locale` in config.yml\n" + + "# Odds are, if you speak a popular language on earth we already have a translation for it.\n" + + "# However our translations are done by the community, and update infrequently. (Please help us out <3)\n" + + "# We would love more people to help update our locales, submit any updated translation file to our GitHub or email it to me at business@neetgames.com\n" + + "# For a list of built in translations, view this link: https://github.com/mcMMO-Dev/mcMMO/tree/master/src/main/resources/locale\n" + + "\n" + + "\n" + + "# -- Using a built in translation -- \n" + + "# Assuming you read the above section, edit config.yml's General.Locale from en_US to the locale code that we support (see the above link), then reboot your server\n" + + "\n" + + "\n" + + "# -- Do you want to change the text in mcMMO? Including adding colors? ( Locale Override ) -- \n" + + "# First, a brief explanation.\n" + + "# Locales are the language files used by mcMMO, they also contain color codes and most of the styling used by mcMMO.\n" + + "# You can customize a locale outside of the JAR in version 2.1.51 and up.\n" + + "#\n" + + "# Locales can be overridden by editing this file\n" + + "# You can find the up to date current locale files here https://github.com/mcMMO-Dev/mcMMO/tree/master/src/main/resources/locale\n" + + "# The master file is en_US, if a translation is missing entries (as they often are) it will pull from the en_US file https://github.com/mcMMO-Dev/mcMMO/blob/master/src/main/resources/locale/locale_en_US.properties\n" + + "#\n" + + "# To override a locale, add entries to this file and copy ** only ** the strings you want to replace, otherwise you will not see any updated strings when mcMMO updates and will have to manually change them and read patch notes carefully.\n" + + "# If you wish to replace every line in some way, feel free to copy the entire contents of this file, just be advised that you will need to be on top of locale updates in mcMMO and follow our changelog closely.\n" + + "\n" + + "\n" + + "# WARNING: Locales only support ASCII and UTF16 characters at the moment, so you'll need to run special characters through a UTF16 converter (google it) to get them to work. This will be fixed in the future!\n" + + "# FIND KEYS HERE: On our github repo (en_US is our master file and has ALL the keys) -> https://github.com/mcMMO-Dev/mcMMO/tree/master/src/main/resources/locale\n" + + "# WARNING: Some keys in our master file are unused, make gratuitous use of Ctrl+F\n" + + "# HOW TO APPLY: You can either restart the server for these changes to take effect or run /mcreloadlocale.\n" + + "# -- Add Keys Below --\n"; + return localeExplanation; + } + + public static String addColors(String input) { input = input.replaceAll("\\Q[[BLACK]]\\E", ChatColor.BLACK.toString()); input = input.replaceAll("\\Q[[DARK_BLUE]]\\E", ChatColor.DARK_BLUE.toString()); input = input.replaceAll("\\Q[[DARK_GREEN]]\\E", ChatColor.DARK_GREEN.toString()); diff --git a/src/main/java/com/gmail/nossr50/mcMMO.java b/src/main/java/com/gmail/nossr50/mcMMO.java index 74a7b7aa7..3d33807b3 100644 --- a/src/main/java/com/gmail/nossr50/mcMMO.java +++ b/src/main/java/com/gmail/nossr50/mcMMO.java @@ -1,5 +1,7 @@ package com.gmail.nossr50; +import com.gmail.nossr50.chat.ChatManager; +import com.gmail.nossr50.commands.CommandManager; import com.gmail.nossr50.config.*; import com.gmail.nossr50.config.experience.ExperienceConfig; import com.gmail.nossr50.config.mods.ArmorConfigManager; @@ -9,14 +11,15 @@ import com.gmail.nossr50.config.mods.ToolConfigManager; import com.gmail.nossr50.config.skills.alchemy.PotionConfig; import com.gmail.nossr50.config.skills.repair.RepairConfigManager; import com.gmail.nossr50.config.skills.salvage.SalvageConfigManager; +import com.gmail.nossr50.config.treasure.FishingTreasureConfig; import com.gmail.nossr50.config.treasure.TreasureConfig; import com.gmail.nossr50.database.DatabaseManager; import com.gmail.nossr50.database.DatabaseManagerFactory; import com.gmail.nossr50.datatypes.skills.PrimarySkillType; import com.gmail.nossr50.datatypes.skills.subskills.acrobatics.Roll; import com.gmail.nossr50.listeners.*; +import com.gmail.nossr50.metadata.MetadataService; import com.gmail.nossr50.party.PartyManager; -import com.gmail.nossr50.runnables.CheckDateTask; import com.gmail.nossr50.runnables.SaveTimerTask; import com.gmail.nossr50.runnables.backups.CleanBackupsTask; import com.gmail.nossr50.runnables.commands.NotifySquelchReminderTask; @@ -25,7 +28,6 @@ import com.gmail.nossr50.runnables.party.PartyAutoKickTask; import com.gmail.nossr50.runnables.player.ClearRegisteredXPGainTask; import com.gmail.nossr50.runnables.player.PlayerProfileLoadingTask; import com.gmail.nossr50.runnables.player.PowerLevelUpdatingTask; -import com.gmail.nossr50.runnables.skills.BleedTimerTask; import com.gmail.nossr50.skills.alchemy.Alchemy; import com.gmail.nossr50.skills.child.ChildConfig; import com.gmail.nossr50.skills.repair.repairables.Repairable; @@ -35,8 +37,8 @@ import com.gmail.nossr50.skills.salvage.salvageables.Salvageable; import com.gmail.nossr50.skills.salvage.salvageables.SalvageableManager; import com.gmail.nossr50.skills.salvage.salvageables.SimpleSalvageableManager; import com.gmail.nossr50.util.*; -import com.gmail.nossr50.util.blockmeta.chunkmeta.ChunkManager; -import com.gmail.nossr50.util.blockmeta.chunkmeta.ChunkManagerFactory; +import com.gmail.nossr50.util.blockmeta.ChunkManager; +import com.gmail.nossr50.util.blockmeta.ChunkManagerFactory; import com.gmail.nossr50.util.commands.CommandRegistrationManager; import com.gmail.nossr50.util.compat.CompatibilityManager; import com.gmail.nossr50.util.experience.FormulaManager; @@ -46,39 +48,60 @@ import com.gmail.nossr50.util.player.PlayerLevelUtils; import com.gmail.nossr50.util.player.UserManager; import com.gmail.nossr50.util.scoreboards.ScoreboardManager; import com.gmail.nossr50.util.skills.RankUtils; +import com.gmail.nossr50.util.skills.SkillTools; +import com.gmail.nossr50.util.skills.SmeltingTracker; import com.gmail.nossr50.util.upgrade.UpgradeManager; import com.gmail.nossr50.worldguard.WorldGuardManager; -import com.google.common.base.Charsets; +import net.kyori.adventure.platform.bukkit.BukkitAudiences; import net.shatteredlands.shatt.backup.ZipLibrary; import org.bstats.bukkit.Metrics; +import org.bstats.charts.SimplePie; import org.bukkit.Bukkit; import org.bukkit.entity.Player; import org.bukkit.event.HandlerList; import org.bukkit.metadata.FixedMetadataValue; +import org.bukkit.plugin.PluginDescriptionFile; import org.bukkit.plugin.PluginManager; import org.bukkit.plugin.java.JavaPlugin; +import org.bukkit.plugin.java.JavaPluginLoader; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; import java.io.File; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; -import java.lang.reflect.Method; +import java.nio.charset.StandardCharsets; import java.util.ArrayList; import java.util.List; public class mcMMO extends JavaPlugin { - /* Managers */ + + + /* Managers & Services */ private static PlatformManager platformManager; + private static MetadataService metadataService; private static ChunkManager placeStore; private static RepairableManager repairableManager; private static SalvageableManager salvageableManager; private static ModManager modManager; private static DatabaseManager databaseManager; private static FormulaManager formulaManager; - private static HolidayManager holidayManager; private static UpgradeManager upgradeManager; private static MaterialMapStore materialMapStore; private static PlayerLevelUtils playerLevelUtils; + private static SmeltingTracker smeltingTracker; + private static TransientMetadataTools transientMetadataTools; + private static ChatManager chatManager; + private static CommandManager commandManager; //ACF + private static TransientEntityTracker transientEntityTracker; + + private @NotNull SkillTools skillTools; + + private static boolean serverShutdownExecuted = false; + + /* Adventure */ + private static BukkitAudiences audiences; /* Blacklist */ private static WorldBlacklist worldBlacklist; @@ -97,45 +120,40 @@ public class mcMMO extends JavaPlugin { /* Plugin Checks */ private static boolean healthBarPluginEnabled; + private static boolean projectKorraEnabled; // API checks private static boolean serverAPIOutdated = false; - // Config Validation Check - public boolean noErrorsInConfigFiles = true; - // XP Event Check private boolean xpEventEnabled; private static boolean isRetroModeEnabled; - /* Metadata Values */ - public final static String REPLANT_META_KEY = "mcMMO: Recently Replanted"; - public static final String FISH_HOOK_REF_METAKEY = "mcMMO: Fish Hook Tracker"; - public static final String DODGE_TRACKER = "mcMMO: Dodge Tracker"; - public static final String CUSTOM_DAMAGE_METAKEY = "mcMMO: Custom Damage"; - public static final String COTW_TEMPORARY_SUMMON = "mcMMO: COTW Entity"; - public final static String entityMetadataKey = "mcMMO: Spawned Entity"; - public final static String blockMetadataKey = "mcMMO: Piston Tracking"; - public final static String furnaceMetadataKey = "mcMMO: Tracked Furnace"; - public final static String tntMetadataKey = "mcMMO: Tracked TNT"; - public final static String funfettiMetadataKey = "mcMMO: Funfetti"; - public final static String customNameKey = "mcMMO: Custom Name"; - public final static String customVisibleKey = "mcMMO: Name Visibility"; - public final static String droppedItemKey = "mcMMO: Tracked Item"; - public final static String infiniteArrowKey = "mcMMO: Infinite Arrow"; - public final static String trackedArrow = "mcMMO: Tracked Arrow"; - public final static String bowForceKey = "mcMMO: Bow Force"; - public final static String arrowDistanceKey = "mcMMO: Arrow Distance"; - public final static String BONUS_DROPS_METAKEY = "mcMMO: Double Drops"; - //public final static String customDamageKey = "mcMMO: Custom Damage"; - public final static String disarmedItemKey = "mcMMO: Disarmed Item"; - public final static String playerDataKey = "mcMMO: Player Data"; - public final static String greenThumbDataKey = "mcMMO: Green Thumb"; - public final static String databaseCommandKey = "mcMMO: Processing Database Command"; - public final static String bredMetadataKey = "mcMMO: Bred Animal"; + private long purgeTime = 2630000000L; + + private GeneralConfig generalConfig; + private AdvancedConfig advancedConfig; +// private RepairConfig repairConfig; +// private SalvageConfig salvageConfig; +// private PersistentDataConfig persistentDataConfig; +// private ChatConfig chatConfig; +// private CoreSkillsConfig coreSkillsConfig; +// private RankConfig rankConfig; +// private TreasureConfig treasureConfig; +// private FishingTreasureConfig fishingTreasureConfig; +// private SoundConfig soundConfig; + + public mcMMO() { + p = this; + } + + + protected mcMMO(JavaPluginLoader loader, PluginDescriptionFile description, File dataFolder, File file) + { + super(loader, description, dataFolder, file); + } - public static FixedMetadataValue metadataValue; /** * Things to be run when the plugin is enabled. @@ -143,20 +161,33 @@ public class mcMMO extends JavaPlugin { @Override public void onEnable() { try { - p = this; + setupFilePaths(); + generalConfig = new GeneralConfig(getDataFolder()); //Load before skillTools + skillTools = new SkillTools(this); //Load after general config + + //Init configs + advancedConfig = new AdvancedConfig(getDataFolder()); + + //Store this value so other plugins can check it + isRetroModeEnabled = generalConfig.getIsRetroMode(); //Platform Manager platformManager = new PlatformManager(); + //metadata service + metadataService = new MetadataService(this); + + //Filter out any debug messages (if debug/verbose logging is not enabled) getLogger().setFilter(new LogFilter(this)); - metadataValue = new FixedMetadataValue(this, true); + + MetadataConstants.MCMMO_METADATA_VALUE = new FixedMetadataValue(this, true); PluginManager pluginManager = getServer().getPluginManager(); healthBarPluginEnabled = pluginManager.getPlugin("HealthBar") != null; + projectKorraEnabled = pluginManager.getPlugin("ProjectKorra") != null; upgradeManager = new UpgradeManager(); - setupFilePaths(); modManager = new ModManager(); @@ -165,17 +196,14 @@ public class mcMMO extends JavaPlugin { loadConfigFiles(); - if (!noErrorsInConfigFiles) { - return; - } - - //Store this value so other plugins can check it - isRetroModeEnabled = Config.getInstance().getIsRetroMode(); - if (getServer().getName().equals("Cauldron") || getServer().getName().equals("MCPC+")) { checkModConfigs(); } + if(projectKorraEnabled) { + getLogger().info("ProjectKorra was detected, this can cause some issues with weakness potions and combat skills for mcMMO"); + } + if (healthBarPluginEnabled) { getLogger().info("HealthBar plugin found, mcMMO's healthbars are automatically disabled."); } @@ -185,7 +213,10 @@ public class mcMMO extends JavaPlugin { getLogger().warning("mcMMO will not work properly alongside NoCheatPlus without CompatNoCheatPlus"); } - databaseManager = DatabaseManagerFactory.getDatabaseManager(); + // One month in milliseconds + this.purgeTime = 2630000000L * generalConfig.getOldUsersCutoff(); + + databaseManager = DatabaseManagerFactory.getDatabaseManager(mcMMO.getUsersFilePath(), getLogger(), purgeTime, mcMMO.p.getAdvancedConfig().getStartingLevel()); //Check for the newer API and tell them what to do if its missing checkForOutdatedAPI(); @@ -213,7 +244,6 @@ public class mcMMO extends JavaPlugin { PartyManager.loadParties(); formulaManager = new FormulaManager(); - holidayManager = new HolidayManager(); for (Player player : getServer().getOnlinePlayers()) { new PlayerProfileLoadingTask(player).runTaskLaterAsynchronously(mcMMO.p, 1); // 1 Tick delay to ensure the player is marked as online before we begin loading @@ -226,7 +256,7 @@ public class mcMMO extends JavaPlugin { placeStore = ChunkManagerFactory.getChunkManager(); // Get our ChunkletManager - if (Config.getInstance().getPTPCommandWorldPermissions()) { + if (generalConfig.getPTPCommandWorldPermissions()) { Permissions.generateWorldTeleportPermissions(); } @@ -237,16 +267,17 @@ public class mcMMO extends JavaPlugin { //If anonymous statistics are enabled then use them Metrics metrics; - if(Config.getInstance().getIsMetricsEnabled()) { - metrics = new Metrics(this); - metrics.addCustomChart(new Metrics.SimplePie("version", () -> getDescription().getVersion())); + if(generalConfig.getIsMetricsEnabled()) { + metrics = new Metrics(this, 3894); + metrics.addCustomChart(new SimplePie("version", () -> getDescription().getVersion())); - if(Config.getInstance().getIsRetroMode()) - metrics.addCustomChart(new Metrics.SimplePie("scaling", () -> "Standard")); + if(generalConfig.getIsRetroMode()) + metrics.addCustomChart(new SimplePie("leveling_system", () -> "Retro")); else - metrics.addCustomChart(new Metrics.SimplePie("scaling", () -> "Retro")); + metrics.addCustomChart(new SimplePie("leveling_system", () -> "Standard")); } } + catch (Throwable t) { getLogger().severe("There was an error while enabling mcMMO!"); @@ -258,6 +289,9 @@ public class mcMMO extends JavaPlugin { } getServer().getPluginManager().disablePlugin(this); + + //Fixes #4438 - Don't initialize things if we are going to disable mcMMO anyway + return; } //Init player level values @@ -265,6 +299,21 @@ public class mcMMO extends JavaPlugin { //Init the blacklist worldBlacklist = new WorldBlacklist(this); + + //Init smelting tracker + smeltingTracker = new SmeltingTracker(); + + //Set up Adventure's audiences + audiences = BukkitAudiences.create(this); + + transientMetadataTools = new TransientMetadataTools(this); + + chatManager = new ChatManager(this); + + commandManager = new CommandManager(this); + + transientEntityTracker = new TransientEntityTracker(); + setServerShutdown(false); //Reset flag, used to make decisions about async saves } public static PlayerLevelUtils getPlayerLevelUtils() { @@ -278,8 +327,8 @@ public class mcMMO extends JavaPlugin { private void checkForOutdatedAPI() { try { Class checkForClass = Class.forName("org.bukkit.event.block.BlockDropItemEvent"); - Method newerAPIMethod = checkForClass.getMethod("getItems"); - Class checkForClassBaseComponent = Class.forName("net.md_5.bungee.api.chat.BaseComponent"); + checkForClass.getMethod("getItems"); + Class.forName("net.md_5.bungee.api.chat.BaseComponent"); } catch (ClassNotFoundException | NoSuchMethodException e) { serverAPIOutdated = true; String software = platformManager.getServerSoftwareStr(); @@ -300,6 +349,10 @@ public class mcMMO extends JavaPlugin { */ @Override public void onDisable() { + setServerShutdown(true); + //TODO: Write code to catch unfinished async save tasks, for now we just hope they finish in time, which they should in most cases + mcMMO.p.getLogger().info("Server shutdown has been executed, saving and cleaning up data..."); + try { UserManager.saveAll(); // Make sure to save player information if the server shuts down UserManager.clearAll(); @@ -307,23 +360,17 @@ public class mcMMO extends JavaPlugin { PartyManager.saveParties(); // Save our parties //TODO: Needed? - if(Config.getInstance().getScoreboardsEnabled()) + if(generalConfig.getScoreboardsEnabled()) ScoreboardManager.teardownAll(); formulaManager.saveFormula(); - holidayManager.saveAnniversaryFiles(); - placeStore.saveAll(); // Save our metadata - placeStore.cleanUp(); // Cleanup empty metadata stores + placeStore.closeAll(); + } + catch (Exception e) { + e.printStackTrace(); } - catch (Exception e) { e.printStackTrace(); } - - debug("Canceling all tasks..."); - getServer().getScheduler().cancelTasks(this); // This removes our tasks - debug("Unregister all events..."); - HandlerList.unregisterAll(this); // Cancel event registrations - - if (Config.getInstance().getBackupsEnabled()) { + if (generalConfig.getBackupsEnabled()) { // Remove other tasks BEFORE starting the Backup, or we just cancel it straight away. try { ZipLibrary.mcMMOBackup(); @@ -331,17 +378,20 @@ public class mcMMO extends JavaPlugin { catch (IOException e) { getLogger().severe(e.toString()); } + catch(NoClassDefFoundError e) { + getLogger().severe("Backup class not found!"); + getLogger().info("Please do not replace the mcMMO jar while the server is running."); + } catch (Throwable e) { - if (e instanceof NoClassDefFoundError) { - getLogger().severe("Backup class not found!"); - getLogger().info("Please do not replace the mcMMO jar while the server is running."); - } - else { - getLogger().severe(e.toString()); - } + getLogger().severe(e.toString()); } } + debug("Canceling all tasks..."); + getServer().getScheduler().cancelTasks(this); // This removes our tasks + debug("Unregister all events..."); + HandlerList.unregisterAll(this); // Cancel event registrations + databaseManager.onDisable(); debug("Was disabled."); // How informative! } @@ -386,10 +436,6 @@ public class mcMMO extends JavaPlugin { return formulaManager; } - public static HolidayManager getHolidayManager() { - return holidayManager; - } - public static ChunkManager getPlaceStore() { return placeStore; } @@ -414,10 +460,14 @@ public class mcMMO extends JavaPlugin { return upgradeManager; } - public static CompatibilityManager getCompatibilityManager() { + public static @Nullable CompatibilityManager getCompatibilityManager() { return platformManager.getCompatibilityManager(); } + public static MetadataService getMetadataService() { + return metadataService; + } + @Deprecated public static void setDatabaseManager(DatabaseManager databaseManager) { mcMMO.databaseManager = databaseManager; @@ -494,8 +544,9 @@ public class mcMMO extends JavaPlugin { private void loadConfigFiles() { // Force the loading of config files TreasureConfig.getInstance(); + FishingTreasureConfig.getInstance(); HiddenConfig.getInstance(); - AdvancedConfig.getInstance(); + mcMMO.p.getAdvancedConfig(); PotionConfig.getInstance(); CoreSkillsConfig.getInstance(); SoundConfig.getInstance(); @@ -503,22 +554,21 @@ public class mcMMO extends JavaPlugin { new ChildConfig(); - List repairables = new ArrayList(); - List salvageables = new ArrayList(); + List repairables = new ArrayList<>(); - if (Config.getInstance().getToolModsEnabled()) { + if (generalConfig.getToolModsEnabled()) { new ToolConfigManager(this); } - if (Config.getInstance().getArmorModsEnabled()) { + if (generalConfig.getArmorModsEnabled()) { new ArmorConfigManager(this); } - if (Config.getInstance().getBlockModsEnabled()) { + if (generalConfig.getBlockModsEnabled()) { new BlockConfigManager(this); } - if (Config.getInstance().getEntityModsEnabled()) { + if (generalConfig.getEntityModsEnabled()) { new EntityConfigManager(this); } @@ -530,7 +580,7 @@ public class mcMMO extends JavaPlugin { // Load salvage configs, make manager and register them at this time SalvageConfigManager sManager = new SalvageConfigManager(this); - salvageables.addAll(sManager.getLoadedSalvageables()); + List salvageables = sManager.getLoadedSalvageables(); salvageableManager = new SimpleSalvageableManager(salvageables.size()); salvageableManager.registerSalvageables(salvageables); } @@ -545,6 +595,8 @@ public class mcMMO extends JavaPlugin { pluginManager.registerEvents(new InventoryListener(this), this); pluginManager.registerEvents(new SelfListener(this), this); pluginManager.registerEvents(new WorldListener(this), this); + pluginManager.registerEvents(new ChunkListener(), this); +// pluginManager.registerEvents(new CommandListener(this), this); } /** @@ -560,7 +612,7 @@ public class mcMMO extends JavaPlugin { if(CoreSkillsConfig.getInstance().isPrimarySkillEnabled(PrimarySkillType.ACROBATICS)) { - System.out.println("[mcMMO]" + " enabling Acrobatics Skills"); + getLogger().info("Enabling Acrobatics Skills"); //TODO: Should do this differently Roll roll = new Roll(); @@ -571,7 +623,7 @@ public class mcMMO extends JavaPlugin { private void registerCustomRecipes() { getServer().getScheduler().scheduleSyncDelayedTask(this, () -> { - if (Config.getInstance().getChimaeraEnabled()) { + if (generalConfig.getChimaeraEnabled()) { getServer().addRecipe(ChimaeraWing.getChimaeraWingRecipe()); } }, 40); @@ -579,17 +631,18 @@ public class mcMMO extends JavaPlugin { private void scheduleTasks() { // Periodic save timer (Saves every 10 minutes by default) - long saveIntervalTicks = Config.getInstance().getSaveInterval() * 1200; + long second = 20; + long minute = second * 60; + + long saveIntervalTicks = Math.max(minute, generalConfig.getSaveInterval() * minute); + new SaveTimerTask().runTaskTimer(this, saveIntervalTicks, saveIntervalTicks); // Cleanup the backups folder new CleanBackupsTask().runTaskAsynchronously(mcMMO.p); - // Bleed timer (Runs every 0.5 seconds) - new BleedTimerTask().runTaskTimer(this, 1 * Misc.TICK_CONVERSION_FACTOR, 1 * (Misc.TICK_CONVERSION_FACTOR / 2)); - // Old & Powerless User remover - long purgeIntervalTicks = Config.getInstance().getPurgeInterval() * 60L * 60L * Misc.TICK_CONVERSION_FACTOR; + long purgeIntervalTicks = generalConfig.getPurgeInterval() * 60L * 60L * Misc.TICK_CONVERSION_FACTOR; if (purgeIntervalTicks == 0) { new UserPurgeTask().runTaskLaterAsynchronously(this, 2 * Misc.TICK_CONVERSION_FACTOR); // Start 2 seconds after startup. @@ -599,7 +652,7 @@ public class mcMMO extends JavaPlugin { } // Automatically remove old members from parties - long kickIntervalTicks = Config.getInstance().getAutoPartyKickInterval() * 60L * 60L * Misc.TICK_CONVERSION_FACTOR; + long kickIntervalTicks = generalConfig.getAutoPartyKickInterval() * 60L * 60L * Misc.TICK_CONVERSION_FACTOR; if (kickIntervalTicks == 0) { new PartyAutoKickTask().runTaskLater(this, 2 * Misc.TICK_CONVERSION_FACTOR); // Start 2 seconds after startup. @@ -611,46 +664,42 @@ public class mcMMO extends JavaPlugin { // Update power level tag scoreboards new PowerLevelUpdatingTask().runTaskTimer(this, 2 * Misc.TICK_CONVERSION_FACTOR, 2 * Misc.TICK_CONVERSION_FACTOR); - if (getHolidayManager().nearingAprilFirst()) { - new CheckDateTask().runTaskTimer(this, 10L * Misc.TICK_CONVERSION_FACTOR, 1L * 60L * 60L * Misc.TICK_CONVERSION_FACTOR); - } - // Clear the registered XP data so players can earn XP again if (ExperienceConfig.getInstance().getDiminishedReturnsEnabled()) { new ClearRegisteredXPGainTask().runTaskTimer(this, 60, 60); } - if(AdvancedConfig.getInstance().allowPlayerTips()) + if(mcMMO.p.getAdvancedConfig().allowPlayerTips()) { new NotifySquelchReminderTask().runTaskTimer(this, 60, ((20 * 60) * 60)); } } private void checkModConfigs() { - if (!Config.getInstance().getToolModsEnabled()) { + if (!generalConfig.getToolModsEnabled()) { getLogger().warning("Cauldron implementation found, but the custom tool config for mcMMO is disabled!"); getLogger().info("To enable, set Mods.Tool_Mods_Enabled to TRUE in config.yml."); } - if (!Config.getInstance().getArmorModsEnabled()) { + if (!generalConfig.getArmorModsEnabled()) { getLogger().warning("Cauldron implementation found, but the custom armor config for mcMMO is disabled!"); getLogger().info("To enable, set Mods.Armor_Mods_Enabled to TRUE in config.yml."); } - if (!Config.getInstance().getBlockModsEnabled()) { + if (!generalConfig.getBlockModsEnabled()) { getLogger().warning("Cauldron implementation found, but the custom block config for mcMMO is disabled!"); getLogger().info("To enable, set Mods.Block_Mods_Enabled to TRUE in config.yml."); } - if (!Config.getInstance().getEntityModsEnabled()) { + if (!generalConfig.getEntityModsEnabled()) { getLogger().warning("Cauldron implementation found, but the custom entity config for mcMMO is disabled!"); getLogger().info("To enable, set Mods.Entity_Mods_Enabled to TRUE in config.yml."); } } - public InputStreamReader getResourceAsReader(String fileName) { + public @Nullable InputStreamReader getResourceAsReader(@NotNull String fileName) { InputStream in = getResource(fileName); - return in == null ? null : new InputStreamReader(in, Charsets.UTF_8); + return in == null ? null : new InputStreamReader(in, StandardCharsets.UTF_8); } /** @@ -670,4 +719,56 @@ public class mcMMO extends JavaPlugin { public static PlatformManager getPlatformManager() { return platformManager; } + + public static SmeltingTracker getSmeltingTracker() { + return smeltingTracker; + } + + public static BukkitAudiences getAudiences() { + return audiences; + } + + public static boolean isProjectKorraEnabled() { + return projectKorraEnabled; + } + + public static TransientMetadataTools getTransientMetadataTools() { + return transientMetadataTools; + } + + public ChatManager getChatManager() { + return chatManager; + } + + public CommandManager getCommandManager() { + return commandManager; + } + + public static TransientEntityTracker getTransientEntityTracker() { + return transientEntityTracker; + } + + public static synchronized boolean isServerShutdownExecuted() { + return serverShutdownExecuted; + } + + private static synchronized void setServerShutdown(boolean bool) { + serverShutdownExecuted = bool; + } + + public long getPurgeTime() { + return purgeTime; + } + + public @NotNull SkillTools getSkillTools() { + return skillTools; + } + + public @NotNull GeneralConfig getGeneralConfig() { + return generalConfig; + } + + public @NotNull AdvancedConfig getAdvancedConfig() { + return advancedConfig; + } } diff --git a/src/main/java/com/gmail/nossr50/metadata/BlockMetadataService.java b/src/main/java/com/gmail/nossr50/metadata/BlockMetadataService.java new file mode 100644 index 000000000..1545cd608 --- /dev/null +++ b/src/main/java/com/gmail/nossr50/metadata/BlockMetadataService.java @@ -0,0 +1,49 @@ +package com.gmail.nossr50.metadata; + +import com.gmail.nossr50.mcMMO; +import org.bukkit.block.Furnace; +import org.bukkit.persistence.PersistentDataContainer; +import org.bukkit.persistence.PersistentDataHolder; +import org.bukkit.persistence.PersistentDataType; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +import java.util.UUID; + +import static com.gmail.nossr50.metadata.MetadataService.NSK_FURNACE_UUID_LEAST_SIG; +import static com.gmail.nossr50.metadata.MetadataService.NSK_FURNACE_UUID_MOST_SIG; + +public class BlockMetadataService { + + private final @NotNull mcMMO pluginRef; + + public BlockMetadataService(@NotNull mcMMO pluginRef) { + this.pluginRef = pluginRef; + } + + public @Nullable UUID getFurnaceOwner(@NotNull Furnace furnace) { + //Get container from entity + PersistentDataContainer dataContainer = ((PersistentDataHolder) furnace).getPersistentDataContainer(); + + //Too lazy to make a custom data type for this stuff + Long mostSigBits = dataContainer.get(NSK_FURNACE_UUID_MOST_SIG, PersistentDataType.LONG); + Long leastSigBits = dataContainer.get(NSK_FURNACE_UUID_LEAST_SIG, PersistentDataType.LONG); + + if (mostSigBits != null && leastSigBits != null) { + return new UUID(mostSigBits, leastSigBits); + } else { + return null; + } + } + + public void setFurnaceOwner(@NotNull Furnace furnace, @NotNull UUID uuid) { + PersistentDataContainer dataContainer = ((PersistentDataHolder) furnace).getPersistentDataContainer(); + + dataContainer.set(NSK_FURNACE_UUID_MOST_SIG, PersistentDataType.LONG, uuid.getMostSignificantBits()); + dataContainer.set(NSK_FURNACE_UUID_LEAST_SIG, PersistentDataType.LONG, uuid.getLeastSignificantBits()); + + furnace.update(); + } + + +} diff --git a/src/main/java/com/gmail/nossr50/metadata/ItemMetadataService.java b/src/main/java/com/gmail/nossr50/metadata/ItemMetadataService.java new file mode 100644 index 000000000..f1d1e9471 --- /dev/null +++ b/src/main/java/com/gmail/nossr50/metadata/ItemMetadataService.java @@ -0,0 +1,110 @@ +package com.gmail.nossr50.metadata; + +import com.gmail.nossr50.mcMMO; +import org.bukkit.enchantments.Enchantment; +import org.bukkit.inventory.ItemStack; +import org.bukkit.inventory.meta.ItemMeta; +import org.bukkit.persistence.PersistentDataContainer; +import org.bukkit.persistence.PersistentDataType; +import org.jetbrains.annotations.NotNull; + +import java.util.List; + +import static com.gmail.nossr50.metadata.MetadataService.NSK_SUPER_ABILITY_BOOSTED_ITEM; + +public class ItemMetadataService { + + public final @NotNull String LEGACY_ABILITY_TOOL_LORE = "mcMMO Ability Tool"; + public final @NotNull mcMMO pluginRef; + + public ItemMetadataService(@NotNull mcMMO pluginRef) { + this.pluginRef = pluginRef; + } + + public void setSuperAbilityBoostedItem(@NotNull ItemStack itemStack, int originalDigSpeed) { + if (itemStack.getItemMeta() == null) { + mcMMO.p.getLogger().severe("Can not assign persistent data to an item with null item metadata"); + return; + } + + ItemMeta itemMeta = itemStack.getItemMeta(); + PersistentDataContainer dataContainer = itemMeta.getPersistentDataContainer(); + + dataContainer.set(NSK_SUPER_ABILITY_BOOSTED_ITEM, PersistentDataType.INTEGER, originalDigSpeed); + + itemStack.setItemMeta(itemMeta); + } + + public boolean isSuperAbilityBoosted(@NotNull ItemStack itemStack) { + if (itemStack.getItemMeta() == null) + return false; + + ItemMeta itemMeta = itemStack.getItemMeta(); + //Get container from entity + PersistentDataContainer dataContainer = itemMeta.getPersistentDataContainer(); + + //If this value isn't null, then the tool can be considered dig speed boosted + Integer boostValue = dataContainer.get(NSK_SUPER_ABILITY_BOOSTED_ITEM, PersistentDataType.INTEGER); + + return boostValue != null; + } + + public int getSuperAbilityToolOriginalDigSpeed(@NotNull ItemStack itemStack) { + //Get container from entity + ItemMeta itemMeta = itemStack.getItemMeta(); + + if (itemMeta == null) + return 0; + + PersistentDataContainer dataContainer = itemMeta.getPersistentDataContainer(); + + if (dataContainer.get(NSK_SUPER_ABILITY_BOOSTED_ITEM, PersistentDataType.INTEGER) == null) { + mcMMO.p.getLogger().severe("Value should never be null for a boosted item"); + return 0; + } else { + //Too lazy to make a custom data type for this stuff + Integer boostValue = dataContainer.get(NSK_SUPER_ABILITY_BOOSTED_ITEM, PersistentDataType.INTEGER); + return Math.max(boostValue, 0); + } + } + + public void removeBonusDigSpeedOnSuperAbilityTool(@NotNull ItemStack itemStack) { + int originalSpeed = getSuperAbilityToolOriginalDigSpeed(itemStack); + ItemMeta itemMeta = itemStack.getItemMeta(); + + if(itemMeta != null) { + //TODO: can be optimized + if (itemMeta.hasEnchant(Enchantment.DIG_SPEED)) { + itemMeta.removeEnchant(Enchantment.DIG_SPEED); + } + + if (originalSpeed > 0) { + itemMeta.addEnchant(Enchantment.DIG_SPEED, originalSpeed, true); + } + + PersistentDataContainer dataContainer = itemMeta.getPersistentDataContainer(); + dataContainer.remove(NSK_SUPER_ABILITY_BOOSTED_ITEM); //Remove persistent data + + //TODO: needed? + itemStack.setItemMeta(itemMeta); + } + } + + public boolean isLegacyAbilityTool(@NotNull ItemStack itemStack) { + ItemMeta itemMeta = itemStack.getItemMeta(); + + if (itemMeta == null) + return false; + + List lore = itemMeta.getLore(); + + if (lore == null || lore.isEmpty()) + return false; + + return lore.contains(LEGACY_ABILITY_TOOL_LORE); + } + + public @NotNull String getLegacyAbilityToolLore() { + return LEGACY_ABILITY_TOOL_LORE; + } +} diff --git a/src/main/java/com/gmail/nossr50/metadata/MetadataService.java b/src/main/java/com/gmail/nossr50/metadata/MetadataService.java new file mode 100644 index 000000000..d38726737 --- /dev/null +++ b/src/main/java/com/gmail/nossr50/metadata/MetadataService.java @@ -0,0 +1,71 @@ +package com.gmail.nossr50.metadata; + +import com.gmail.nossr50.mcMMO; +import com.gmail.nossr50.util.MetadataConstants; +import org.bukkit.NamespacedKey; +import org.jetbrains.annotations.NotNull; + +public class MetadataService { + private final @NotNull mcMMO pluginRef; + + protected static final @NotNull NamespacedKey NSK_SUPER_ABILITY_BOOSTED_ITEM; + protected static final @NotNull NamespacedKey NSK_MOB_SPAWNER_MOB; + protected static final @NotNull NamespacedKey NSK_EGG_MOB; + protected static final @NotNull NamespacedKey NSK_NETHER_GATE_MOB; + protected static final @NotNull NamespacedKey NSK_COTW_SUMMONED_MOB; + protected static final @NotNull NamespacedKey NSK_PLAYER_BRED_MOB; + protected static final @NotNull NamespacedKey NSK_PLAYER_TAMED_MOB; + protected static final @NotNull NamespacedKey NSK_VILLAGER_TRADE_ORIGIN_ITEM; + protected static final @NotNull NamespacedKey NSK_EXPLOITED_ENDERMEN; + protected static final @NotNull NamespacedKey NSK_FURNACE_UUID_MOST_SIG; + protected static final @NotNull NamespacedKey NSK_FURNACE_UUID_LEAST_SIG; + + static { + NSK_SUPER_ABILITY_BOOSTED_ITEM = getNamespacedKey(MetadataConstants.METADATA_KEY_SUPER_ABILITY_BOOSTED_ITEM); + NSK_MOB_SPAWNER_MOB = getNamespacedKey(MetadataConstants.METADATA_KEY_MOB_SPAWNER_MOB); + NSK_EGG_MOB = getNamespacedKey(MetadataConstants.METADATA_KEY_EGG_MOB); + NSK_NETHER_GATE_MOB = getNamespacedKey(MetadataConstants.METADATA_KEY_NETHER_PORTAL_MOB); + NSK_COTW_SUMMONED_MOB = getNamespacedKey(MetadataConstants.METADATA_KEY_COTW_SUMMONED_MOB); + NSK_PLAYER_BRED_MOB = getNamespacedKey(MetadataConstants.METADATA_KEY_PLAYER_BRED_MOB); + NSK_PLAYER_TAMED_MOB = getNamespacedKey(MetadataConstants.METADATA_KEY_PLAYER_TAMED_MOB); + NSK_VILLAGER_TRADE_ORIGIN_ITEM = getNamespacedKey(MetadataConstants.METADATA_KEY_VILLAGER_TRADE_ORIGIN_ITEM); + NSK_EXPLOITED_ENDERMEN = getNamespacedKey(MetadataConstants.METADATA_KEY_EXPLOITED_ENDERMEN); + NSK_FURNACE_UUID_MOST_SIG = getNamespacedKey(MetadataConstants.METADATA_KEY_FURNACE_UUID_MOST_SIG); + NSK_FURNACE_UUID_LEAST_SIG = getNamespacedKey(MetadataConstants.METADATA_KEY_FURNACE_UUID_LEAST_SIG); + } + + private final @NotNull ItemMetadataService itemMetadataService; + private final @NotNull MobMetadataService mobMetadataService; + private final @NotNull BlockMetadataService blockMetadataService; + + public MetadataService(@NotNull mcMMO pluginRef) { + this.pluginRef = pluginRef; + + blockMetadataService = new BlockMetadataService(pluginRef); + mobMetadataService = new MobMetadataService(pluginRef); + itemMetadataService = new ItemMetadataService(pluginRef); + } + + /** + * Helper method to simplify generating namespaced keys + * + * @param key the {@link String} value of the key + * + * @return the generated {@link NamespacedKey} + */ + public static @NotNull NamespacedKey getNamespacedKey(@NotNull String key) { + return new NamespacedKey(mcMMO.p, key); + } + + public @NotNull ItemMetadataService getItemMetadataService() { + return itemMetadataService; + } + + public @NotNull MobMetadataService getMobMetadataService() { + return mobMetadataService; + } + + public @NotNull BlockMetadataService getBlockMetadataService() { + return blockMetadataService; + } +} diff --git a/src/main/java/com/gmail/nossr50/metadata/MobMetaFlagType.java b/src/main/java/com/gmail/nossr50/metadata/MobMetaFlagType.java new file mode 100644 index 000000000..618bcd3a3 --- /dev/null +++ b/src/main/java/com/gmail/nossr50/metadata/MobMetaFlagType.java @@ -0,0 +1,11 @@ +package com.gmail.nossr50.metadata; + +public enum MobMetaFlagType { + MOB_SPAWNER_MOB, + EGG_MOB, + NETHER_PORTAL_MOB, + COTW_SUMMONED_MOB, + PLAYER_BRED_MOB, + PLAYER_TAMED_MOB, + EXPLOITED_ENDERMEN, +} diff --git a/src/main/java/com/gmail/nossr50/metadata/MobMetadataService.java b/src/main/java/com/gmail/nossr50/metadata/MobMetadataService.java new file mode 100644 index 000000000..c0ff78c0c --- /dev/null +++ b/src/main/java/com/gmail/nossr50/metadata/MobMetadataService.java @@ -0,0 +1,177 @@ +package com.gmail.nossr50.metadata; + +import com.gmail.nossr50.api.exceptions.IncompleteNamespacedKeyRegister; +import com.gmail.nossr50.config.PersistentDataConfig; +import com.gmail.nossr50.mcMMO; +import com.gmail.nossr50.util.MetadataConstants; +import org.bukkit.NamespacedKey; +import org.bukkit.entity.Entity; +import org.bukkit.entity.LivingEntity; +import org.bukkit.persistence.PersistentDataContainer; +import org.bukkit.persistence.PersistentDataType; +import org.jetbrains.annotations.NotNull; + +import java.util.EnumMap; +import java.util.HashSet; +import java.util.WeakHashMap; + +import static com.gmail.nossr50.metadata.MetadataService.*; + +//TODO: Use SpawnReason where appropriate instead of MobMetaFlagType +public class MobMetadataService { + private final @NotNull WeakHashMap> mobRegistry; //transient data + private final @NotNull EnumMap mobFlagKeyMap; //used for persistent data + private final @NotNull mcMMO pluginRef; + private boolean isUsingPersistentData = false; + + public MobMetadataService(@NotNull mcMMO pluginRef) { + this.pluginRef = pluginRef; + mobFlagKeyMap = new EnumMap<>(MobMetaFlagType.class); + mobRegistry = new WeakHashMap<>(); + initMobFlagKeyMap(); + + for (MobMetaFlagType metaFlagType : MobMetaFlagType.values()) { + if (PersistentDataConfig.getInstance().isMobPersistent(metaFlagType)) + isUsingPersistentData = true; + } + } + + /** + * Registers the namespaced keys required by the API (CB/Spigot) + * Used primarily for persistent data + */ + private void initMobFlagKeyMap() throws IncompleteNamespacedKeyRegister { + for (MobMetaFlagType mobMetaFlagType : MobMetaFlagType.values()) { + switch (mobMetaFlagType) { + case MOB_SPAWNER_MOB -> mobFlagKeyMap.put(mobMetaFlagType, NSK_MOB_SPAWNER_MOB); + case EGG_MOB -> mobFlagKeyMap.put(mobMetaFlagType, NSK_EGG_MOB); + case NETHER_PORTAL_MOB -> mobFlagKeyMap.put(mobMetaFlagType, NSK_NETHER_GATE_MOB); + case COTW_SUMMONED_MOB -> mobFlagKeyMap.put(mobMetaFlagType, NSK_COTW_SUMMONED_MOB); + case PLAYER_BRED_MOB -> mobFlagKeyMap.put(mobMetaFlagType, NSK_PLAYER_BRED_MOB); + case EXPLOITED_ENDERMEN -> mobFlagKeyMap.put(mobMetaFlagType, NSK_EXPLOITED_ENDERMEN); + case PLAYER_TAMED_MOB -> mobFlagKeyMap.put(mobMetaFlagType, NSK_PLAYER_TAMED_MOB); + default -> throw new IncompleteNamespacedKeyRegister("missing namespaced key register for type: " + mobMetaFlagType); + } + } + } + + /** + * Whether or not a target {@link LivingEntity} has a specific mcMMO mob flags + * + * @param flag the type of mob flag to check for + * @param livingEntity the living entity to check for metadata + * + * @return true if the mob has metadata values for target {@link MobMetaFlagType} + */ + public boolean hasMobFlag(@NotNull MobMetaFlagType flag, @NotNull LivingEntity livingEntity) { + if (PersistentDataConfig.getInstance().isMobPersistent(flag)) { + return livingEntity.getPersistentDataContainer().has(mobFlagKeyMap.get(flag), PersistentDataType.BYTE); + } else { + if (mobRegistry.containsKey(livingEntity)) { + return mobRegistry.get(livingEntity).contains(flag); + } + + return false; + } + } + + /** + * Whether or not a target {@link LivingEntity} has any mcMMO mob flags + * + * @param livingEntity the living entity to check for metadata + * + * @return true if the mob has any mcMMO mob related metadata values + */ + public boolean hasMobFlags(@NotNull LivingEntity livingEntity) { + if (isUsingPersistentData) { + for (MobMetaFlagType metaFlagType : MobMetaFlagType.values()) { + if (hasMobFlag(metaFlagType, livingEntity)) + return true; + } + + return false; + } else { + return mobRegistry.containsKey(livingEntity) && mobRegistry.get(livingEntity).size() > 0; + } + } + + /** + * Copies all mcMMO mob flags from one {@link LivingEntity} to another {@link LivingEntity} + * This does not clear existing mcMMO mob flags on the target + * + * @param sourceEntity entity to copy from + * @param targetEntity entity to copy to + */ + public void addMobFlags(@NotNull LivingEntity sourceEntity, @NotNull LivingEntity targetEntity) { + if (!hasMobFlags(sourceEntity)) + return; + + if (isUsingPersistentData) { + for (MobMetaFlagType flag : MobMetaFlagType.values()) { + if (hasMobFlag(flag, sourceEntity)) { + flagMetadata(flag, targetEntity); + } + } + } else { + HashSet flags = new HashSet<>(mobRegistry.get(sourceEntity)); + mobRegistry.put(targetEntity, flags); + } + } + + /** + * Adds a mob flag to a {@link LivingEntity} which effectively acts a true/false boolean + * Existence of the flag can be considered a true value, non-existence can be considered false for all intents and purposes + * + * @param flag the desired flag to assign + * @param livingEntity the target living entity + */ + public void flagMetadata(@NotNull MobMetaFlagType flag, @NotNull LivingEntity livingEntity) { + if (PersistentDataConfig.getInstance().isMobPersistent(flag)) { + if (!hasMobFlag(flag, livingEntity)) { + PersistentDataContainer persistentDataContainer = livingEntity.getPersistentDataContainer(); + persistentDataContainer.set(mobFlagKeyMap.get(flag), PersistentDataType.BYTE, MetadataConstants.SIMPLE_FLAG_VALUE); + } + } else { + HashSet flags = mobRegistry.getOrDefault(livingEntity, new HashSet<>()); + flags.add(flag); // add the new flag + mobRegistry.put(livingEntity, flags); //update registry + } + } + + /** + * Removes a specific mob flag from target {@link LivingEntity} + * + * @param flag desired flag to remove + * @param livingEntity the target living entity + */ + public void removeMobFlag(@NotNull MobMetaFlagType flag, @NotNull LivingEntity livingEntity) { + if (PersistentDataConfig.getInstance().isMobPersistent(flag)) { + if (hasMobFlag(flag, livingEntity)) { + PersistentDataContainer persistentDataContainer = livingEntity.getPersistentDataContainer(); + persistentDataContainer.remove(mobFlagKeyMap.get(flag)); + } + } else { + if (mobRegistry.containsKey(livingEntity)) { + mobRegistry.get(livingEntity).remove(flag); + + if (mobRegistry.get(livingEntity).size() == 0) + mobRegistry.remove(livingEntity); + } + } + } + + /** + * Remove all mcMMO related mob flags from the target {@link LivingEntity} + * + * @param livingEntity target entity + */ + public void removeMobFlags(@NotNull LivingEntity livingEntity) { + if (isUsingPersistentData) { + for (MobMetaFlagType flag : MobMetaFlagType.values()) { + removeMobFlag(flag, livingEntity); + } + } else { + mobRegistry.remove(livingEntity); + } + } +} diff --git a/src/main/java/com/gmail/nossr50/party/PartyManager.java b/src/main/java/com/gmail/nossr50/party/PartyManager.java index f27390613..16965629f 100644 --- a/src/main/java/com/gmail/nossr50/party/PartyManager.java +++ b/src/main/java/com/gmail/nossr50/party/PartyManager.java @@ -1,15 +1,12 @@ package com.gmail.nossr50.party; -import com.gmail.nossr50.config.Config; -import com.gmail.nossr50.datatypes.chat.ChatMode; -import com.gmail.nossr50.datatypes.database.UpgradeType; +import com.gmail.nossr50.datatypes.chat.ChatChannel; import com.gmail.nossr50.datatypes.interactions.NotificationType; import com.gmail.nossr50.datatypes.party.ItemShareType; import com.gmail.nossr50.datatypes.party.Party; import com.gmail.nossr50.datatypes.party.PartyLeader; import com.gmail.nossr50.datatypes.party.ShareMode; import com.gmail.nossr50.datatypes.player.McMMOPlayer; -import com.gmail.nossr50.datatypes.player.PlayerProfile; import com.gmail.nossr50.events.party.McMMOPartyAllianceChangeEvent; import com.gmail.nossr50.events.party.McMMOPartyChangeEvent; import com.gmail.nossr50.events.party.McMMOPartyChangeEvent.EventReason; @@ -33,9 +30,9 @@ import java.util.Map.Entry; import java.util.UUID; public final class PartyManager { - private static String partiesFilePath = mcMMO.getFlatFileDirectory() + "parties.yml"; - private static List parties = new ArrayList(); - private static File partyFile = new File(partiesFilePath); + private static final String partiesFilePath = mcMMO.getFlatFileDirectory() + "parties.yml"; + private static final List parties = new ArrayList<>(); + private static final File partyFile = new File(partiesFilePath); private PartyManager() {} @@ -63,7 +60,7 @@ public final class PartyManager { */ public static boolean isPartyFull(Player player, Party targetParty) { - return !Permissions.partySizeBypass(player) && Config.getInstance().getPartyMaxSize() >= 1 && targetParty.getOnlineMembers().size() >= Config.getInstance().getPartyMaxSize(); + return !Permissions.partySizeBypass(player) && mcMMO.p.getGeneralConfig().getPartyMaxSize() >= 1 && targetParty.getOnlineMembers().size() >= mcMMO.p.getGeneralConfig().getPartyMaxSize(); } /** @@ -150,12 +147,12 @@ public final class PartyManager { * @return the near party members */ public static List getNearMembers(McMMOPlayer mcMMOPlayer) { - List nearMembers = new ArrayList(); + List nearMembers = new ArrayList<>(); Party party = mcMMOPlayer.getParty(); if (party != null) { Player player = mcMMOPlayer.getPlayer(); - double range = Config.getInstance().getPartyShareRange(); + double range = mcMMO.p.getGeneralConfig().getPartyShareRange(); for (Player member : party.getOnlineMembers()) { if (!player.equals(member) && member.isValid() && Misc.isNear(player.getLocation(), member.getLocation(), range)) { @@ -168,12 +165,12 @@ public final class PartyManager { } public static List getNearVisibleMembers(McMMOPlayer mcMMOPlayer) { - List nearMembers = new ArrayList(); + List nearMembers = new ArrayList<>(); Party party = mcMMOPlayer.getParty(); if (party != null) { Player player = mcMMOPlayer.getPlayer(); - double range = Config.getInstance().getPartyShareRange(); + double range = mcMMO.p.getGeneralConfig().getPartyShareRange(); for (Player member : party.getVisibleMembers(player)) { if (!player.equals(member) @@ -197,7 +194,7 @@ public final class PartyManager { public static LinkedHashMap getAllMembers(Player player) { Party party = getParty(player); - return party == null ? new LinkedHashMap() : party.getMembers(); + return party == null ? new LinkedHashMap<>() : party.getMembers(); } /** @@ -221,7 +218,7 @@ public final class PartyManager { } private static List getOnlineMembers(Party party) { - return party == null ? new ArrayList() : party.getOnlineMembers(); + return party == null ? new ArrayList<>() : party.getOnlineMembers(); } /** @@ -249,7 +246,7 @@ public final class PartyManager { @Deprecated public static Party getPlayerParty(String playerName) { for (Party party : parties) { - if (party.getMembers().keySet().contains(playerName)) { + if (party.getMembers().containsKey(playerName)) { return party; } } @@ -266,7 +263,7 @@ public final class PartyManager { public static Party getPlayerParty(String playerName, UUID uuid) { for (Party party : parties) { LinkedHashMap members = party.getMembers(); - if (members.keySet().contains(uuid) || members.values().contains(playerName)) { + if (members.containsKey(uuid) || members.containsValue(playerName)) { // Name changes if (members.get(uuid) == null || !members.get(uuid).equals(playerName)) { @@ -350,10 +347,20 @@ public final class PartyManager { * Disband a party. Kicks out all members and removes the party. * * @param party The party to remove + * @deprecated Use {@link #disbandParty(McMMOPlayer, Party)} */ public static void disbandParty(Party party) { + disbandParty(null, party); + } + + /** + * Disband a party. Kicks out all members and removes the party. + * + * @param party The party to remove + */ + public static void disbandParty(McMMOPlayer mcMMOPlayer, Party party) { //TODO: Potential issues with unloaded profile? - for (Player member : party.getOnlineMembers()) { + for (final Player member : party.getOnlineMembers()) { //Profile not loaded if(UserManager.getPlayer(member) == null) { @@ -369,6 +376,9 @@ public final class PartyManager { } parties.remove(party); + if (mcMMOPlayer != null) { + handlePartyChangeEvent(mcMMOPlayer.getPlayer(), party.getName(), null, EventReason.DISBANDED_PARTY); + } } /** @@ -391,6 +401,7 @@ public final class PartyManager { player.sendMessage(LocaleLoader.getString("Commands.Party.Create", party.getName())); addToParty(mcMMOPlayer, party); + handlePartyChangeEvent(player, null, partyName, EventReason.CREATED_PARTY); } /** @@ -441,9 +452,9 @@ public final class PartyManager { /* * Don't let players join a full party */ - if(Config.getInstance().getPartyMaxSize() > 0 && invite.getMembers().size() >= Config.getInstance().getPartyMaxSize()) + if(mcMMO.p.getGeneralConfig().getPartyMaxSize() > 0 && invite.getMembers().size() >= mcMMO.p.getGeneralConfig().getPartyMaxSize()) { - NotificationManager.sendPlayerInformation(mcMMOPlayer.getPlayer(), NotificationType.PARTY_MESSAGE, "Commands.Party.PartyFull.InviteAccept", invite.getName(), String.valueOf(Config.getInstance().getPartyMaxSize())); + NotificationManager.sendPlayerInformation(mcMMOPlayer.getPlayer(), NotificationType.PARTY_MESSAGE, "Commands.Party.PartyFull.InviteAccept", invite.getName(), String.valueOf(mcMMO.p.getGeneralConfig().getPartyMaxSize())); return; } @@ -586,16 +597,16 @@ public final class PartyManager { return; } - if (mcMMO.getUpgradeManager().shouldUpgrade(UpgradeType.ADD_UUIDS_PARTY)) { - loadAndUpgradeParties(); - return; - } +// if (mcMMO.getUpgradeManager().shouldUpgrade(UpgradeType.ADD_UUIDS_PARTY)) { +// loadAndUpgradeParties(); +// return; +// } try { YamlConfiguration partiesFile; partiesFile = YamlConfiguration.loadConfiguration(partyFile); - ArrayList hasAlly = new ArrayList(); + ArrayList hasAlly = new ArrayList<>(); for (String partyName : partiesFile.getConfigurationSection("").getKeys(false)) { Party party = new Party(partyName); @@ -644,6 +655,8 @@ public final class PartyManager { * Save party file. */ public static void saveParties() { + mcMMO.p.debug("[Party Data] Saving..."); + if (partyFile.exists()) { if (!partyFile.delete()) { mcMMO.p.getLogger().warning("Could not delete party file. Party saving failed!"); @@ -653,7 +666,6 @@ public final class PartyManager { YamlConfiguration partiesFile = new YamlConfiguration(); - mcMMO.p.debug("Saving Parties... (" + parties.size() + ")"); for (Party party : parties) { String partyName = party.getName(); PartyLeader leader = party.getLeader(); @@ -671,7 +683,7 @@ public final class PartyManager { partiesFile.set(partyName + ".ItemShareType." + itemShareType.toString(), party.sharingDrops(itemShareType)); } - List members = new ArrayList(); + List members = new ArrayList<>(); for (Entry memberEntry : party.getMembers().entrySet()) { String memberUniqueId = memberEntry.getKey() == null ? "" : memberEntry.getKey().toString(); @@ -693,72 +705,72 @@ public final class PartyManager { } } - private static void loadAndUpgradeParties() { - YamlConfiguration partiesFile = YamlConfiguration.loadConfiguration(partyFile); - - if (!partyFile.renameTo(new File(mcMMO.getFlatFileDirectory() + "parties.yml.converted"))) { - mcMMO.p.getLogger().severe("Could not rename parties.yml to parties.yml.converted!"); - return; - } - - ArrayList hasAlly = new ArrayList(); - - for (String partyName : partiesFile.getConfigurationSection("").getKeys(false)) { - Party party = new Party(partyName); - - String leaderName = partiesFile.getString(partyName + ".Leader"); - PlayerProfile profile = mcMMO.getDatabaseManager().loadPlayerProfile(leaderName, false); - - if (!profile.isLoaded()) { - mcMMO.p.getLogger().warning("Could not find UUID in database for party leader " + leaderName + " in party " + partyName); - continue; - } - - UUID leaderUniqueId = profile.getUniqueId(); - - party.setLeader(new PartyLeader(leaderUniqueId, leaderName)); - party.setPassword(partiesFile.getString(partyName + ".Password")); - party.setLocked(partiesFile.getBoolean(partyName + ".Locked")); - party.setLevel(partiesFile.getInt(partyName + ".Level")); - party.setXp(partiesFile.getInt(partyName + ".Xp")); - - if (partiesFile.getString(partyName + ".Ally") != null) { - hasAlly.add(party); - } - - party.setXpShareMode(ShareMode.getShareMode(partiesFile.getString(partyName + ".ExpShareMode", "NONE"))); - party.setItemShareMode(ShareMode.getShareMode(partiesFile.getString(partyName + ".ItemShareMode", "NONE"))); - - for (ItemShareType itemShareType : ItemShareType.values()) { - party.setSharingDrops(itemShareType, partiesFile.getBoolean(partyName + ".ItemShareType." + itemShareType.toString(), true)); - } - - LinkedHashMap members = party.getMembers(); - - for (String memberName : partiesFile.getStringList(partyName + ".Members")) { - PlayerProfile memberProfile = mcMMO.getDatabaseManager().loadPlayerProfile(memberName, false); - - if (!memberProfile.isLoaded()) { - mcMMO.p.getLogger().warning("Could not find UUID in database for party member " + memberName + " in party " + partyName); - continue; - } - - UUID memberUniqueId = memberProfile.getUniqueId(); - - members.put(memberUniqueId, memberName); - } - - parties.add(party); - } - - mcMMO.p.debug("Loaded (" + parties.size() + ") Parties..."); - - for (Party party : hasAlly) { - party.setAlly(PartyManager.getParty(partiesFile.getString(party.getName() + ".Ally"))); - } - - mcMMO.getUpgradeManager().setUpgradeCompleted(UpgradeType.ADD_UUIDS_PARTY); - } +// private static void loadAndUpgradeParties() { +// YamlConfiguration partiesFile = YamlConfiguration.loadConfiguration(partyFile); +// +// if (!partyFile.renameTo(new File(mcMMO.getFlatFileDirectory() + "parties.yml.converted"))) { +// mcMMO.p.getLogger().severe("Could not rename parties.yml to parties.yml.converted!"); +// return; +// } +// +// ArrayList hasAlly = new ArrayList<>(); +// +// for (String partyName : partiesFile.getConfigurationSection("").getKeys(false)) { +// Party party = new Party(partyName); +// +// String leaderName = partiesFile.getString(partyName + ".Leader"); +// PlayerProfile profile = mcMMO.getDatabaseManager().loadPlayerProfile(leaderName, false); +// +// if (!profile.isLoaded()) { +// mcMMO.p.getLogger().warning("Could not find UUID in database for party leader " + leaderName + " in party " + partyName); +// continue; +// } +// +// UUID leaderUniqueId = profile.getUniqueId(); +// +// party.setLeader(new PartyLeader(leaderUniqueId, leaderName)); +// party.setPassword(partiesFile.getString(partyName + ".Password")); +// party.setLocked(partiesFile.getBoolean(partyName + ".Locked")); +// party.setLevel(partiesFile.getInt(partyName + ".Level")); +// party.setXp(partiesFile.getInt(partyName + ".Xp")); +// +// if (partiesFile.getString(partyName + ".Ally") != null) { +// hasAlly.add(party); +// } +// +// party.setXpShareMode(ShareMode.getShareMode(partiesFile.getString(partyName + ".ExpShareMode", "NONE"))); +// party.setItemShareMode(ShareMode.getShareMode(partiesFile.getString(partyName + ".ItemShareMode", "NONE"))); +// +// for (ItemShareType itemShareType : ItemShareType.values()) { +// party.setSharingDrops(itemShareType, partiesFile.getBoolean(partyName + ".ItemShareType." + itemShareType.toString(), true)); +// } +// +// LinkedHashMap members = party.getMembers(); +// +// for (String memberName : partiesFile.getStringList(partyName + ".Members")) { +// PlayerProfile memberProfile = mcMMO.getDatabaseManager().loadPlayerProfile(memberName, false); +// +// if (!memberProfile.isLoaded()) { +// mcMMO.p.getLogger().warning("Could not find UUID in database for party member " + memberName + " in party " + partyName); +// continue; +// } +// +// UUID memberUniqueId = memberProfile.getUniqueId(); +// +// members.put(memberUniqueId, memberName); +// } +// +// parties.add(party); +// } +// +// mcMMO.p.debug("Loaded (" + parties.size() + ") Parties..."); +// +// for (Party party : hasAlly) { +// party.setAlly(PartyManager.getParty(partiesFile.getString(party.getName() + ".Ally"))); +// } +// +// mcMMO.getUpgradeManager().setUpgradeCompleted(UpgradeType.ADD_UUIDS_PARTY); +// } /** * Handle party change event. @@ -799,7 +811,7 @@ public final class PartyManager { */ public static void processPartyLeaving(McMMOPlayer mcMMOPlayer) { mcMMOPlayer.removeParty(); - mcMMOPlayer.disableChat(ChatMode.PARTY); + mcMMOPlayer.setChatMode(ChatChannel.NONE); mcMMOPlayer.setItemShareModifier(10); } @@ -811,7 +823,7 @@ public final class PartyManager { * @param level The current party level */ public static void informPartyMembersLevelUp(Party party, int levelsGained, int level) { - boolean levelUpSoundsEnabled = Config.getInstance().getLevelUpSoundsEnabled(); + boolean levelUpSoundsEnabled = mcMMO.p.getGeneralConfig().getLevelUpSoundsEnabled(); for (Player member : party.getOnlineMembers()) { member.sendMessage(LocaleLoader.getString("Party.LevelUp", levelsGained, level)); diff --git a/src/main/java/com/gmail/nossr50/party/ShareHandler.java b/src/main/java/com/gmail/nossr50/party/ShareHandler.java index c0a78e253..cc991104d 100644 --- a/src/main/java/com/gmail/nossr50/party/ShareHandler.java +++ b/src/main/java/com/gmail/nossr50/party/ShareHandler.java @@ -1,6 +1,5 @@ package com.gmail.nossr50.party; -import com.gmail.nossr50.config.Config; import com.gmail.nossr50.config.party.ItemWeightConfig; import com.gmail.nossr50.datatypes.experience.XPGainReason; import com.gmail.nossr50.datatypes.experience.XPGainSource; @@ -9,6 +8,7 @@ import com.gmail.nossr50.datatypes.party.Party; import com.gmail.nossr50.datatypes.party.ShareMode; import com.gmail.nossr50.datatypes.player.McMMOPlayer; import com.gmail.nossr50.datatypes.skills.PrimarySkillType; +import com.gmail.nossr50.mcMMO; import com.gmail.nossr50.util.Misc; import com.gmail.nossr50.util.player.UserManager; import org.bukkit.entity.Item; @@ -44,7 +44,7 @@ public final class ShareHandler { nearMembers.add(mcMMOPlayer.getPlayer()); int partySize = nearMembers.size(); - double shareBonus = Math.min(Config.getInstance().getPartyShareBonusBase() + (partySize * Config.getInstance().getPartyShareBonusIncrease()), Config.getInstance().getPartyShareBonusCap()); + double shareBonus = Math.min(mcMMO.p.getGeneralConfig().getPartyShareBonusBase() + (partySize * mcMMO.p.getGeneralConfig().getPartyShareBonusIncrease()), mcMMO.p.getGeneralConfig().getPartyShareBonusCap()); float splitXp = (float) (xp / partySize * shareBonus); for (Player member : nearMembers) { diff --git a/src/main/java/com/gmail/nossr50/runnables/CheckDateTask.java b/src/main/java/com/gmail/nossr50/runnables/CheckDateTask.java index 0b296b4bd..9f52ed5bf 100644 --- a/src/main/java/com/gmail/nossr50/runnables/CheckDateTask.java +++ b/src/main/java/com/gmail/nossr50/runnables/CheckDateTask.java @@ -1,23 +1,23 @@ -package com.gmail.nossr50.runnables; - -import com.gmail.nossr50.mcMMO; -import com.gmail.nossr50.runnables.skills.AprilTask; -import com.gmail.nossr50.util.Misc; -import org.bukkit.scheduler.BukkitRunnable; - -public class CheckDateTask extends BukkitRunnable { - - @Override - public void run() { - if (!mcMMO.getHolidayManager().isAprilFirst()) { - return; - } - - // Set up jokes - new AprilTask().runTaskTimer(mcMMO.p, 1L * 60L * Misc.TICK_CONVERSION_FACTOR, 10L * 60L * Misc.TICK_CONVERSION_FACTOR); - mcMMO.getHolidayManager().registerAprilCommand(); - - // Jokes deployed. - this.cancel(); - } -} +//package com.gmail.nossr50.runnables; +// +//import com.gmail.nossr50.mcMMO; +//import com.gmail.nossr50.runnables.skills.AprilTask; +//import com.gmail.nossr50.util.Misc; +//import org.bukkit.scheduler.BukkitRunnable; +// +//public class CheckDateTask extends BukkitRunnable { +// +// @Override +// public void run() { +// if (!mcMMO.getHolidayManager().isAprilFirst()) { +// return; +// } +// +// // Set up jokes +// new AprilTask().runTaskTimer(mcMMO.p, 60L * Misc.TICK_CONVERSION_FACTOR, 10L * 60L * Misc.TICK_CONVERSION_FACTOR); +// mcMMO.getHolidayManager().registerAprilCommand(); +// +// // Jokes deployed. +// this.cancel(); +// } +//} diff --git a/src/main/java/com/gmail/nossr50/runnables/MobDodgeMetaCleanup.java b/src/main/java/com/gmail/nossr50/runnables/MobDodgeMetaCleanup.java new file mode 100644 index 000000000..43e2a2e4b --- /dev/null +++ b/src/main/java/com/gmail/nossr50/runnables/MobDodgeMetaCleanup.java @@ -0,0 +1,27 @@ +package com.gmail.nossr50.runnables; + +import com.gmail.nossr50.mcMMO; +import com.gmail.nossr50.util.MetadataConstants; +import org.bukkit.entity.Mob; +import org.bukkit.scheduler.BukkitRunnable; +import org.jetbrains.annotations.NotNull; + +public class MobDodgeMetaCleanup extends BukkitRunnable { + private final @NotNull Mob mob; + private final @NotNull mcMMO pluginRef; + + public MobDodgeMetaCleanup(@NotNull Mob mob, @NotNull mcMMO pluginRef) { + this.mob = mob; + this.pluginRef = pluginRef; + } + + @Override + public void run() { + if(!mob.isValid() || mob.getTarget() == null) { + mob.removeMetadata(MetadataConstants.METADATA_KEY_DODGE_TRACKER, pluginRef); + this.cancel(); + } else if (!mob.hasMetadata(MetadataConstants.METADATA_KEY_DODGE_TRACKER)) { + this.cancel(); + } + } +} \ No newline at end of file diff --git a/src/main/java/com/gmail/nossr50/runnables/MobHealthDisplayUpdaterTask.java b/src/main/java/com/gmail/nossr50/runnables/MobHealthDisplayUpdaterTask.java index 111ed9482..a48375727 100644 --- a/src/main/java/com/gmail/nossr50/runnables/MobHealthDisplayUpdaterTask.java +++ b/src/main/java/com/gmail/nossr50/runnables/MobHealthDisplayUpdaterTask.java @@ -1,11 +1,12 @@ package com.gmail.nossr50.runnables; import com.gmail.nossr50.mcMMO; +import com.gmail.nossr50.util.MetadataConstants; import org.bukkit.entity.LivingEntity; import org.bukkit.scheduler.BukkitRunnable; public class MobHealthDisplayUpdaterTask extends BukkitRunnable { - private LivingEntity target; + private final LivingEntity target; public MobHealthDisplayUpdaterTask(LivingEntity target) { this.target = target; @@ -13,14 +14,14 @@ public class MobHealthDisplayUpdaterTask extends BukkitRunnable { @Override public void run() { - if (target.hasMetadata(mcMMO.customNameKey)) { - target.setCustomName(target.getMetadata(mcMMO.customNameKey).get(0).asString()); - target.removeMetadata(mcMMO.customNameKey, mcMMO.p); + if (target.hasMetadata(MetadataConstants.METADATA_KEY_CUSTOM_NAME)) { + target.setCustomName(target.getMetadata(MetadataConstants.METADATA_KEY_CUSTOM_NAME).get(0).asString()); + target.removeMetadata(MetadataConstants.METADATA_KEY_CUSTOM_NAME, mcMMO.p); } - if (target.hasMetadata(mcMMO.customVisibleKey)) { - target.setCustomNameVisible(target.getMetadata(mcMMO.customVisibleKey).get(0).asBoolean()); - target.removeMetadata(mcMMO.customVisibleKey, mcMMO.p); + if (target.hasMetadata(MetadataConstants.METADATA_KEY_NAME_VISIBILITY)) { + target.setCustomNameVisible(target.getMetadata(MetadataConstants.METADATA_KEY_NAME_VISIBILITY).get(0).asBoolean()); + target.removeMetadata(MetadataConstants.METADATA_KEY_NAME_VISIBILITY, mcMMO.p); } } } diff --git a/src/main/java/com/gmail/nossr50/runnables/PistonTrackerTask.java b/src/main/java/com/gmail/nossr50/runnables/PistonTrackerTask.java index 9f01d64e5..efe0dcc5b 100644 --- a/src/main/java/com/gmail/nossr50/runnables/PistonTrackerTask.java +++ b/src/main/java/com/gmail/nossr50/runnables/PistonTrackerTask.java @@ -2,6 +2,7 @@ package com.gmail.nossr50.runnables; import com.gmail.nossr50.mcMMO; import com.gmail.nossr50.util.BlockUtils; +import com.gmail.nossr50.util.MetadataConstants; import org.bukkit.block.Block; import org.bukkit.block.BlockFace; import org.bukkit.scheduler.BukkitRunnable; @@ -9,9 +10,9 @@ import org.bukkit.scheduler.BukkitRunnable; import java.util.List; public class PistonTrackerTask extends BukkitRunnable { - private List blocks; - private BlockFace direction; - private Block futureEmptyBlock; + private final List blocks; + private final BlockFace direction; + private final Block futureEmptyBlock; public PistonTrackerTask(List blocks, BlockFace direction, Block futureEmptyBlock) { this.blocks = blocks; @@ -33,9 +34,9 @@ public class PistonTrackerTask extends BukkitRunnable { for (Block b : blocks) { Block nextBlock = b.getRelative(direction); - if (nextBlock.hasMetadata(mcMMO.blockMetadataKey)) { + if (nextBlock.hasMetadata(MetadataConstants.METADATA_KEY_PISTON_TRACKING)) { mcMMO.getPlaceStore().setTrue(nextBlock); - nextBlock.removeMetadata(mcMMO.blockMetadataKey, mcMMO.p); + nextBlock.removeMetadata(MetadataConstants.METADATA_KEY_PISTON_TRACKING, mcMMO.p); } else if (mcMMO.getPlaceStore().isTrue(nextBlock)) { // Block doesn't have metadatakey but isTrue - set it to false diff --git a/src/main/java/com/gmail/nossr50/runnables/SaveTimerTask.java b/src/main/java/com/gmail/nossr50/runnables/SaveTimerTask.java index 2e679b824..2eba9ec1f 100644 --- a/src/main/java/com/gmail/nossr50/runnables/SaveTimerTask.java +++ b/src/main/java/com/gmail/nossr50/runnables/SaveTimerTask.java @@ -10,6 +10,7 @@ import org.bukkit.scheduler.BukkitRunnable; public class SaveTimerTask extends BukkitRunnable { @Override public void run() { + mcMMO.p.debug("[User Data] Saving..."); // All player data will be saved periodically through this int count = 1; @@ -18,6 +19,7 @@ public class SaveTimerTask extends BukkitRunnable { count++; } + PartyManager.saveParties(); } } diff --git a/src/main/java/com/gmail/nossr50/runnables/StickyPistonTrackerTask.java b/src/main/java/com/gmail/nossr50/runnables/StickyPistonTrackerTask.java index 00062659b..d90da3b31 100644 --- a/src/main/java/com/gmail/nossr50/runnables/StickyPistonTrackerTask.java +++ b/src/main/java/com/gmail/nossr50/runnables/StickyPistonTrackerTask.java @@ -7,9 +7,9 @@ import org.bukkit.block.BlockFace; import org.bukkit.scheduler.BukkitRunnable; public class StickyPistonTrackerTask extends BukkitRunnable { - private BlockFace direction; - private Block block; - private Block movedBlock; + private final BlockFace direction; + private final Block block; + private final Block movedBlock; public StickyPistonTrackerTask(BlockFace direction, Block block, Block movedBlock) { this.direction = direction; diff --git a/src/main/java/com/gmail/nossr50/runnables/TravelingBlockMetaCleanup.java b/src/main/java/com/gmail/nossr50/runnables/TravelingBlockMetaCleanup.java new file mode 100644 index 000000000..2b4dc57ae --- /dev/null +++ b/src/main/java/com/gmail/nossr50/runnables/TravelingBlockMetaCleanup.java @@ -0,0 +1,27 @@ +package com.gmail.nossr50.runnables; + +import com.gmail.nossr50.mcMMO; +import com.gmail.nossr50.util.MetadataConstants; +import org.bukkit.entity.Entity; +import org.bukkit.scheduler.BukkitRunnable; +import org.jetbrains.annotations.NotNull; + +public class TravelingBlockMetaCleanup extends BukkitRunnable { + private final @NotNull Entity entity; + private final @NotNull mcMMO pluginRef; + + public TravelingBlockMetaCleanup(@NotNull Entity entity, @NotNull mcMMO pluginRef) { + this.entity = entity; + this.pluginRef = pluginRef; + } + + @Override + public void run() { + if(!entity.isValid()) { + entity.removeMetadata(MetadataConstants.METADATA_KEY_TRAVELING_BLOCK, pluginRef); + this.cancel(); + } else if (!entity.hasMetadata(MetadataConstants.METADATA_KEY_TRAVELING_BLOCK)) { + this.cancel(); + } + } +} diff --git a/src/main/java/com/gmail/nossr50/runnables/backups/CleanBackupsTask.java b/src/main/java/com/gmail/nossr50/runnables/backups/CleanBackupsTask.java index 822683030..1a8162843 100644 --- a/src/main/java/com/gmail/nossr50/runnables/backups/CleanBackupsTask.java +++ b/src/main/java/com/gmail/nossr50/runnables/backups/CleanBackupsTask.java @@ -1,6 +1,5 @@ package com.gmail.nossr50.runnables.backups; -import com.gmail.nossr50.config.Config; import com.gmail.nossr50.mcMMO; import org.bukkit.scheduler.BukkitRunnable; @@ -16,9 +15,9 @@ public class CleanBackupsTask extends BukkitRunnable { @Override public void run() { - List savedDays = new ArrayList(); - HashMap> savedYearsWeeks = new HashMap>(); - List toDelete = new ArrayList(); + List savedDays = new ArrayList<>(); + HashMap> savedYearsWeeks = new HashMap<>(); + List toDelete = new ArrayList<>(); int amountTotal = 0; int amountDeleted = 0; @@ -48,23 +47,19 @@ public class CleanBackupsTask extends BukkitRunnable { int weekOfYear = cal.get(Calendar.WEEK_OF_YEAR); int year = cal.get(Calendar.YEAR); - if (isPast24Hours(date) && Config.getInstance().getKeepLast24Hours()) { + if (isPast24Hours(date) && mcMMO.p.getGeneralConfig().getKeepLast24Hours()) { // Keep all files from the last 24 hours continue; } - else if (isLastWeek(date) && !savedDays.contains(dayOfWeek) && Config.getInstance().getKeepDailyLastWeek()) { + else if (isLastWeek(date) && !savedDays.contains(dayOfWeek) && mcMMO.p.getGeneralConfig().getKeepDailyLastWeek()) { // Keep daily backups of the past week savedDays.add(dayOfWeek); continue; } else { - List savedWeeks = savedYearsWeeks.get(year); - if (savedWeeks == null) { - savedWeeks = new ArrayList(); - savedYearsWeeks.put(year, savedWeeks); - } + List savedWeeks = savedYearsWeeks.computeIfAbsent(year, k -> new ArrayList<>()); - if (!savedWeeks.contains(weekOfYear) && Config.getInstance().getKeepWeeklyPastMonth()) { + if (!savedWeeks.contains(weekOfYear) && mcMMO.p.getGeneralConfig().getKeepWeeklyPastMonth()) { // Keep one backup of each week savedWeeks.add(weekOfYear); continue; diff --git a/src/main/java/com/gmail/nossr50/runnables/commands/McScoreboardKeepTask.java b/src/main/java/com/gmail/nossr50/runnables/commands/McScoreboardKeepTask.java index 5a318596f..a5d02c1dc 100644 --- a/src/main/java/com/gmail/nossr50/runnables/commands/McScoreboardKeepTask.java +++ b/src/main/java/com/gmail/nossr50/runnables/commands/McScoreboardKeepTask.java @@ -5,7 +5,7 @@ import org.bukkit.entity.Player; import org.bukkit.scheduler.BukkitRunnable; public class McScoreboardKeepTask extends BukkitRunnable { - private Player player; + private final Player player; public McScoreboardKeepTask(Player player) { this.player = player; diff --git a/src/main/java/com/gmail/nossr50/runnables/commands/McrankCommandDisplayTask.java b/src/main/java/com/gmail/nossr50/runnables/commands/McrankCommandDisplayTask.java index 353e0ea04..76a68345d 100644 --- a/src/main/java/com/gmail/nossr50/runnables/commands/McrankCommandDisplayTask.java +++ b/src/main/java/com/gmail/nossr50/runnables/commands/McrankCommandDisplayTask.java @@ -1,10 +1,11 @@ package com.gmail.nossr50.runnables.commands; -import com.gmail.nossr50.config.Config; import com.gmail.nossr50.datatypes.skills.PrimarySkillType; import com.gmail.nossr50.locale.LocaleLoader; import com.gmail.nossr50.mcMMO; +import com.gmail.nossr50.util.MetadataConstants; import com.gmail.nossr50.util.scoreboards.ScoreboardManager; +import com.gmail.nossr50.util.skills.SkillTools; import org.bukkit.command.CommandSender; import org.bukkit.entity.Player; import org.bukkit.scheduler.BukkitRunnable; @@ -30,14 +31,14 @@ public class McrankCommandDisplayTask extends BukkitRunnable { @Override public void run() { - if (useBoard && Config.getInstance().getScoreboardsEnabled()) { + if (useBoard && mcMMO.p.getGeneralConfig().getScoreboardsEnabled()) { displayBoard(); } if (useChat) { displayChat(); } - ((Player) sender).removeMetadata(mcMMO.databaseCommandKey, mcMMO.p); + ((Player) sender).removeMetadata(MetadataConstants.METADATA_KEY_DATABASE_COMMAND, mcMMO.p); } private void displayChat() { @@ -47,13 +48,13 @@ public class McrankCommandDisplayTask extends BukkitRunnable { sender.sendMessage(LocaleLoader.getString("Commands.mcrank.Heading")); sender.sendMessage(LocaleLoader.getString("Commands.mcrank.Player", playerName)); - for (PrimarySkillType skill : PrimarySkillType.NON_CHILD_SKILLS) { -// if (!skill.getPermissions(player)) { + for (PrimarySkillType skill : SkillTools.NON_CHILD_SKILLS) { +// if (!mcMMO.p.getSkillTools().doesPlayerHaveSkillPermission(player, skill)) { // continue; // } rank = skills.get(skill); - sender.sendMessage(LocaleLoader.getString("Commands.mcrank.Skill", skill.getName(), (rank == null ? LocaleLoader.getString("Commands.mcrank.Unranked") : rank))); + sender.sendMessage(LocaleLoader.getString("Commands.mcrank.Skill", mcMMO.p.getSkillTools().getLocalizedSkillName(skill), (rank == null ? LocaleLoader.getString("Commands.mcrank.Unranked") : rank))); } rank = skills.get(null); diff --git a/src/main/java/com/gmail/nossr50/runnables/commands/MctopCommandDisplayTask.java b/src/main/java/com/gmail/nossr50/runnables/commands/MctopCommandDisplayTask.java index 664a1da10..f105faa42 100644 --- a/src/main/java/com/gmail/nossr50/runnables/commands/MctopCommandDisplayTask.java +++ b/src/main/java/com/gmail/nossr50/runnables/commands/MctopCommandDisplayTask.java @@ -1,10 +1,10 @@ package com.gmail.nossr50.runnables.commands; -import com.gmail.nossr50.config.Config; import com.gmail.nossr50.datatypes.database.PlayerStat; import com.gmail.nossr50.datatypes.skills.PrimarySkillType; import com.gmail.nossr50.locale.LocaleLoader; import com.gmail.nossr50.mcMMO; +import com.gmail.nossr50.util.MetadataConstants; import com.gmail.nossr50.util.scoreboards.ScoreboardManager; import org.bukkit.ChatColor; import org.bukkit.command.CommandSender; @@ -34,7 +34,7 @@ public class MctopCommandDisplayTask extends BukkitRunnable { @Override public void run() { - if (useBoard && Config.getInstance().getScoreboardsEnabled()) { + if (useBoard && mcMMO.p.getGeneralConfig().getScoreboardsEnabled()) { displayBoard(); } @@ -43,7 +43,7 @@ public class MctopCommandDisplayTask extends BukkitRunnable { } if (sender instanceof Player) { - ((Player) sender).removeMetadata(mcMMO.databaseCommandKey, mcMMO.p); + ((Player) sender).removeMetadata(MetadataConstants.METADATA_KEY_DATABASE_COMMAND, mcMMO.p); } if(sender instanceof Player) sender.sendMessage(LocaleLoader.getString("Commands.mctop.Tip")); @@ -61,10 +61,10 @@ public class MctopCommandDisplayTask extends BukkitRunnable { } else { if(sender instanceof Player) { - sender.sendMessage(LocaleLoader.getString("Commands.Skill.Leaderboard", skill.getName())); + sender.sendMessage(LocaleLoader.getString("Commands.Skill.Leaderboard", mcMMO.p.getSkillTools().getLocalizedSkillName(skill))); } else { - sender.sendMessage(ChatColor.stripColor(LocaleLoader.getString("Commands.Skill.Leaderboard", skill.getName()))); + sender.sendMessage(ChatColor.stripColor(LocaleLoader.getString("Commands.Skill.Leaderboard", mcMMO.p.getSkillTools().getLocalizedSkillName(skill)))); } } diff --git a/src/main/java/com/gmail/nossr50/runnables/database/DatabaseConversionTask.java b/src/main/java/com/gmail/nossr50/runnables/database/DatabaseConversionTask.java index eaf30befe..0089ee677 100644 --- a/src/main/java/com/gmail/nossr50/runnables/database/DatabaseConversionTask.java +++ b/src/main/java/com/gmail/nossr50/runnables/database/DatabaseConversionTask.java @@ -21,11 +21,6 @@ public class DatabaseConversionTask extends BukkitRunnable { public void run() { sourceDatabase.convertUsers(mcMMO.getDatabaseManager()); - mcMMO.p.getServer().getScheduler().runTask(mcMMO.p, new Runnable() { - @Override - public void run() { - sender.sendMessage(message); - } - }); + mcMMO.p.getServer().getScheduler().runTask(mcMMO.p, () -> sender.sendMessage(message)); } } diff --git a/src/main/java/com/gmail/nossr50/runnables/database/FormulaConversionTask.java b/src/main/java/com/gmail/nossr50/runnables/database/FormulaConversionTask.java index f818cebba..dd061d8b6 100644 --- a/src/main/java/com/gmail/nossr50/runnables/database/FormulaConversionTask.java +++ b/src/main/java/com/gmail/nossr50/runnables/database/FormulaConversionTask.java @@ -10,12 +10,13 @@ import com.gmail.nossr50.locale.LocaleLoader; import com.gmail.nossr50.mcMMO; import com.gmail.nossr50.util.Misc; import com.gmail.nossr50.util.player.UserManager; +import com.gmail.nossr50.util.skills.SkillTools; import org.bukkit.command.CommandSender; import org.bukkit.scheduler.BukkitRunnable; public class FormulaConversionTask extends BukkitRunnable { - private CommandSender sender; - private FormulaType formulaType; + private final CommandSender sender; + private final FormulaType formulaType; public FormulaConversionTask(CommandSender sender, FormulaType formulaType) { this.sender = sender; @@ -32,7 +33,7 @@ public class FormulaConversionTask extends BukkitRunnable { // If the mcMMOPlayer doesn't exist, create a temporary profile and check if it's present in the database. If it's not, abort the process. if (mcMMOPlayer == null) { - profile = mcMMO.getDatabaseManager().loadPlayerProfile(playerName, false); + profile = mcMMO.getDatabaseManager().loadPlayerProfile(playerName); if (!profile.isLoaded()) { mcMMO.p.debug("Profile not loaded."); @@ -58,7 +59,7 @@ public class FormulaConversionTask extends BukkitRunnable { private void editValues(PlayerProfile profile) { mcMMO.p.debug("========================================================================"); mcMMO.p.debug("Conversion report for " + profile.getPlayerName() + ":"); - for (PrimarySkillType primarySkillType : PrimarySkillType.NON_CHILD_SKILLS) { + for (PrimarySkillType primarySkillType : SkillTools.NON_CHILD_SKILLS) { int oldLevel = profile.getSkillLevel(primarySkillType); int oldXPLevel = profile.getSkillXpLevel(primarySkillType); int totalOldXP = mcMMO.getFormulaManager().calculateTotalExperience(oldLevel, oldXPLevel); diff --git a/src/main/java/com/gmail/nossr50/runnables/database/UUIDUpdateAsyncTask.java b/src/main/java/com/gmail/nossr50/runnables/database/UUIDUpdateAsyncTask.java index ee5e182fa..fe7a029a7 100644 --- a/src/main/java/com/gmail/nossr50/runnables/database/UUIDUpdateAsyncTask.java +++ b/src/main/java/com/gmail/nossr50/runnables/database/UUIDUpdateAsyncTask.java @@ -1,105 +1,130 @@ package com.gmail.nossr50.runnables.database; -import com.gmail.nossr50.config.HiddenConfig; -import com.gmail.nossr50.database.DatabaseManager; import com.gmail.nossr50.datatypes.database.UpgradeType; import com.gmail.nossr50.mcMMO; import com.gmail.nossr50.util.Misc; -import com.gmail.nossr50.util.uuid.UUIDFetcher; -import org.bukkit.scheduler.BukkitRunnable; +import com.google.common.collect.ImmutableList; +import com.google.gson.Gson; +import com.google.gson.JsonObject; +import java.io.IOException; +import java.io.InputStream; +import java.io.InputStreamReader; +import java.io.OutputStream; +import java.net.HttpURLConnection; +import java.net.URL; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.UUID; +import java.util.concurrent.CountDownLatch; import java.util.logging.Level; -public class UUIDUpdateAsyncTask extends BukkitRunnable { - private mcMMO plugin; - private static final int MAX_LOOKUP = Math.max(HiddenConfig.getInstance().getUUIDConvertAmount(), 100); - private static final int RATE_LIMIT = HiddenConfig.getInstance().getMojangRateLimit(); - private static final long LIMIT_PERIOD = HiddenConfig.getInstance().getMojangLimitPeriod(); - private static final int BATCH_SIZE = MAX_LOOKUP * 3; +public class UUIDUpdateAsyncTask implements Runnable { + private static final Gson GSON = new Gson(); + private static final String PROFILE_URL = "https://api.mojang.com/profiles/minecraft"; - private List userNames; - private int size; - private int checkedUsers; - private long startMillis; + private static final int HARD_LIMIT_PERIOD = 600; // Mojang rate limit period is 600 seconds, wait that long if they reject us + private static final int RETRY_PERIOD = 60; // Wait 60 seconds on connection failure + private static final int DELAY_PERIOD = 100; // Wait 100 seconds between each batch + + private static final int BATCH_SIZE = 100; // 100 at a time + + private final CountDownLatch awaiter = new CountDownLatch(1); + private final mcMMO plugin; + private final ImmutableList userNames; + private int position = 0; public UUIDUpdateAsyncTask(mcMMO plugin, List userNames) { this.plugin = plugin; - this.userNames = userNames; - - this.checkedUsers = 0; - this.startMillis = System.currentTimeMillis(); + this.userNames = ImmutableList.copyOf(userNames); } @Override public void run() { - size = userNames.size(); + // First iteration + if (position == 0) + plugin.getLogger().info("Starting to check and update UUIDs, total amount of users: " + userNames.size()); - plugin.getLogger().info("Starting to check and update UUIDs, total amount of users: " + size); + List batch = userNames.subList(position, Math.min(userNames.size(), position + BATCH_SIZE)); - List userNamesSection; - Map fetchedUUIDs = new HashMap(); + Map fetchedUUIDs = new HashMap<>(); + HttpURLConnection connection; + try { + connection = (HttpURLConnection) new URL(PROFILE_URL).openConnection(); + connection.setRequestMethod("POST"); + connection.setRequestProperty("Content-Type", "application/json"); + connection.setUseCaches(false); + connection.setDoInput(true); + connection.setDoOutput(true); - while (size != 0) { - if (checkedUsers + 100 > RATE_LIMIT) { - try { - Thread.sleep(LIMIT_PERIOD); - } catch (InterruptedException e) { - e.printStackTrace(); + String body = GSON.toJson(batch.toArray(new String[0])); + + try (OutputStream output = connection.getOutputStream()) { + output.write(body.getBytes()); + output.flush(); + } + switch (connection.getResponseCode()) { + case HttpURLConnection.HTTP_OK: + break; // All is good + case HttpURLConnection.HTTP_BAD_REQUEST: + case HttpURLConnection.HTTP_FORBIDDEN: + // Rejected, probably rate limit, just wait it out + this.runTaskLaterAsynchronously(plugin, Misc.TICK_CONVERSION_FACTOR * HARD_LIMIT_PERIOD); return; + default: + // Unknown failure + this.runTaskLaterAsynchronously(plugin, Misc.TICK_CONVERSION_FACTOR * RETRY_PERIOD); + return; + } + + try (InputStream input = connection.getInputStream(); + InputStreamReader reader = new InputStreamReader(input)) { + for (JsonObject jsonProfile : GSON.fromJson(reader, JsonObject[].class)) { + UUID id = toUUID(jsonProfile.get("id").getAsString()); + String name = jsonProfile.get("name").getAsString(); + fetchedUUIDs.put(name, id); } - startMillis = System.currentTimeMillis(); - checkedUsers = 0; - } - if (size > MAX_LOOKUP) { - userNamesSection = userNames.subList(size - MAX_LOOKUP, size); - size -= MAX_LOOKUP; - } - else { - userNamesSection = userNames.subList(0, size); - size = 0; - } - - try { - fetchedUUIDs.putAll(new UUIDFetcher(userNamesSection).call()); - } - catch (Exception e) { - // Handle 429 - if(e.getMessage() != null) - { - if (e.getMessage().contains("429")) { - size += userNamesSection.size(); - try { - Thread.sleep(LIMIT_PERIOD); - } catch (InterruptedException ex) { - e.printStackTrace(); - return; - } - continue; - } - } - - plugin.getLogger().log(Level.SEVERE, "Unable to fetch UUIDs!", e); - return; - } - - checkedUsers += userNamesSection.size(); - userNamesSection.clear(); - size = userNames.size(); - - Misc.printProgress(checkedUsers, DatabaseManager.progressInterval, startMillis); - if (fetchedUUIDs.size() >= BATCH_SIZE) { - mcMMO.getDatabaseManager().saveUserUUIDs(fetchedUUIDs); - fetchedUUIDs = new HashMap(); } + } catch (IOException e) { + // failure + plugin.getLogger().log(Level.SEVERE, "Unable to contact mojang API!", e); + this.runTaskLaterAsynchronously(plugin, Misc.TICK_CONVERSION_FACTOR * RETRY_PERIOD); + return; } - if (fetchedUUIDs.size() == 0 || mcMMO.getDatabaseManager().saveUserUUIDs(fetchedUUIDs)) { + if (fetchedUUIDs.size() != 0) + mcMMO.getDatabaseManager().saveUserUUIDs(fetchedUUIDs); + + position += batch.size(); + plugin.getLogger().info(String.format("Conversion progress: %d/%d users", position, userNames.size())); + + if (position +1 >= userNames.size()) { mcMMO.getUpgradeManager().setUpgradeCompleted(UpgradeType.ADD_UUIDS); - plugin.getLogger().info("UUID upgrade completed!"); + awaiter.countDown(); + plugin.getLogger().info("UUID checks completed"); + } else + this.runTaskLaterAsynchronously(plugin, Misc.TICK_CONVERSION_FACTOR * DELAY_PERIOD); // Schedule next batch + } + + // Bukkit runnables don't let themselves reschedule themselves, so we are a pseudo bukkit runnable. + private void runTaskLaterAsynchronously(mcMMO plugin, int delay) { + plugin.getServer().getScheduler().runTaskLaterAsynchronously(plugin, this, delay); + } + + public void start() { + plugin.getServer().getScheduler().runTaskAsynchronously(plugin, this); + } + + private static UUID toUUID(String id) { + return UUID.fromString(id.substring(0, 8) + "-" + id.substring(8, 12) + "-" + id.substring(12, 16) + "-" + id.substring(16, 20) + "-" + id.substring(20, 32)); + } + + public void waitUntilFinished() { + try { + awaiter.await(); + } catch (InterruptedException e) { + // I guess we don't care in this event } } } diff --git a/src/main/java/com/gmail/nossr50/runnables/database/UserPurgeTask.java b/src/main/java/com/gmail/nossr50/runnables/database/UserPurgeTask.java index db8d83f3d..cf570e3f2 100644 --- a/src/main/java/com/gmail/nossr50/runnables/database/UserPurgeTask.java +++ b/src/main/java/com/gmail/nossr50/runnables/database/UserPurgeTask.java @@ -1,19 +1,18 @@ package com.gmail.nossr50.runnables.database; -import com.gmail.nossr50.config.Config; import com.gmail.nossr50.mcMMO; import org.bukkit.scheduler.BukkitRunnable; import java.util.concurrent.locks.ReentrantLock; public class UserPurgeTask extends BukkitRunnable { - private ReentrantLock lock = new ReentrantLock(); + private final ReentrantLock lock = new ReentrantLock(); @Override public void run() { lock.lock(); mcMMO.getDatabaseManager().purgePowerlessUsers(); - if (Config.getInstance().getOldUsersCutoff() != -1) { + if (mcMMO.p.getGeneralConfig().getOldUsersCutoff() != -1) { mcMMO.getDatabaseManager().purgeOldUsers(); } lock.unlock(); diff --git a/src/main/java/com/gmail/nossr50/runnables/items/ChimaeraWingWarmup.java b/src/main/java/com/gmail/nossr50/runnables/items/ChimaeraWingWarmup.java index 5e267a56a..c7409b3ce 100644 --- a/src/main/java/com/gmail/nossr50/runnables/items/ChimaeraWingWarmup.java +++ b/src/main/java/com/gmail/nossr50/runnables/items/ChimaeraWingWarmup.java @@ -1,8 +1,8 @@ package com.gmail.nossr50.runnables.items; -import com.gmail.nossr50.config.Config; import com.gmail.nossr50.datatypes.player.McMMOPlayer; import com.gmail.nossr50.locale.LocaleLoader; +import com.gmail.nossr50.mcMMO; import com.gmail.nossr50.util.ChimaeraWing; import com.gmail.nossr50.util.ItemUtils; import com.gmail.nossr50.util.Misc; @@ -13,7 +13,7 @@ import org.bukkit.inventory.ItemStack; import org.bukkit.scheduler.BukkitRunnable; public class ChimaeraWingWarmup extends BukkitRunnable { - private McMMOPlayer mcMMOPlayer; + private final McMMOPlayer mcMMOPlayer; public ChimaeraWingWarmup(McMMOPlayer mcMMOPlayer) { this.mcMMOPlayer = mcMMOPlayer; @@ -36,13 +36,13 @@ public class ChimaeraWingWarmup extends BukkitRunnable { ItemStack inHand = player.getInventory().getItemInMainHand(); - if (!ItemUtils.isChimaeraWing(inHand) || inHand.getAmount() < Config.getInstance().getChimaeraUseCost()) { + if (!ItemUtils.isChimaeraWing(inHand) || inHand.getAmount() < mcMMO.p.getGeneralConfig().getChimaeraUseCost()) { player.sendMessage(LocaleLoader.getString("Skills.NeedMore", LocaleLoader.getString("Item.ChimaeraWing.Name"))); return; } long recentlyHurt = mcMMOPlayer.getRecentlyHurt(); - int hurtCooldown = Config.getInstance().getChimaeraRecentlyHurtCooldown(); + int hurtCooldown = mcMMO.p.getGeneralConfig().getChimaeraRecentlyHurtCooldown(); if (hurtCooldown > 0) { int timeRemaining = SkillUtils.calculateTimeLeft(recentlyHurt * Misc.TIME_CONVERSION_FACTOR, hurtCooldown, player); diff --git a/src/main/java/com/gmail/nossr50/runnables/items/TeleportationWarmup.java b/src/main/java/com/gmail/nossr50/runnables/items/TeleportationWarmup.java index d9a62429b..49ce24aad 100644 --- a/src/main/java/com/gmail/nossr50/runnables/items/TeleportationWarmup.java +++ b/src/main/java/com/gmail/nossr50/runnables/items/TeleportationWarmup.java @@ -1,8 +1,8 @@ package com.gmail.nossr50.runnables.items; -import com.gmail.nossr50.config.Config; import com.gmail.nossr50.datatypes.player.McMMOPlayer; import com.gmail.nossr50.locale.LocaleLoader; +import com.gmail.nossr50.mcMMO; import com.gmail.nossr50.party.PartyManager; import com.gmail.nossr50.util.EventUtils; import com.gmail.nossr50.util.Misc; @@ -14,8 +14,8 @@ import org.bukkit.entity.Player; import org.bukkit.scheduler.BukkitRunnable; public class TeleportationWarmup extends BukkitRunnable { - private McMMOPlayer mcMMOPlayer; - private McMMOPlayer mcMMOTarget; + private final McMMOPlayer mcMMOPlayer; + private final McMMOPlayer mcMMOTarget; public TeleportationWarmup(McMMOPlayer mcMMOPlayer, McMMOPlayer mcMMOTarget) { this.mcMMOPlayer = mcMMOPlayer; @@ -42,7 +42,7 @@ public class TeleportationWarmup extends BukkitRunnable { return; } - int hurtCooldown = Config.getInstance().getPTPCommandRecentlyHurtCooldown(); + int hurtCooldown = mcMMO.p.getGeneralConfig().getPTPCommandRecentlyHurtCooldown(); if (hurtCooldown > 0) { int timeRemaining = SkillUtils.calculateTimeLeft(recentlyHurt * Misc.TIME_CONVERSION_FACTOR, hurtCooldown, teleportingPlayer); @@ -53,7 +53,7 @@ public class TeleportationWarmup extends BukkitRunnable { } } - if (Config.getInstance().getPTPCommandWorldPermissions()) { + if (mcMMO.p.getGeneralConfig().getPTPCommandWorldPermissions()) { World targetWorld = targetPlayer.getWorld(); World playerWorld = teleportingPlayer.getWorld(); diff --git a/src/main/java/com/gmail/nossr50/runnables/party/PartyAutoKickTask.java b/src/main/java/com/gmail/nossr50/runnables/party/PartyAutoKickTask.java index 987d1893f..f66b003b6 100644 --- a/src/main/java/com/gmail/nossr50/runnables/party/PartyAutoKickTask.java +++ b/src/main/java/com/gmail/nossr50/runnables/party/PartyAutoKickTask.java @@ -1,6 +1,5 @@ package com.gmail.nossr50.runnables.party; -import com.gmail.nossr50.config.Config; import com.gmail.nossr50.datatypes.party.Party; import com.gmail.nossr50.mcMMO; import com.gmail.nossr50.party.PartyManager; @@ -14,12 +13,12 @@ import java.util.Map.Entry; import java.util.UUID; public class PartyAutoKickTask extends BukkitRunnable { - private final static long KICK_TIME = 24L * 60L * 60L * 1000L * Config.getInstance().getAutoPartyKickTime(); + private final static long KICK_TIME = 24L * 60L * 60L * 1000L * mcMMO.p.getGeneralConfig().getAutoPartyKickTime(); @Override public void run() { - HashMap toRemove = new HashMap(); - List processedPlayers = new ArrayList(); + HashMap toRemove = new HashMap<>(); + List processedPlayers = new ArrayList<>(); long currentTime = System.currentTimeMillis(); diff --git a/src/main/java/com/gmail/nossr50/runnables/party/PartyChatTask.java b/src/main/java/com/gmail/nossr50/runnables/party/PartyChatTask.java deleted file mode 100644 index ff4b4999f..000000000 --- a/src/main/java/com/gmail/nossr50/runnables/party/PartyChatTask.java +++ /dev/null @@ -1,50 +0,0 @@ -package com.gmail.nossr50.runnables.party; - -import com.gmail.nossr50.config.Config; -import com.gmail.nossr50.datatypes.party.Party; -import com.gmail.nossr50.locale.LocaleLoader; -import org.bukkit.ChatColor; -import org.bukkit.entity.Player; -import org.bukkit.plugin.Plugin; -import org.bukkit.scheduler.BukkitRunnable; - -import java.util.regex.Matcher; -import java.util.regex.Pattern; - -public class PartyChatTask extends BukkitRunnable { - private Plugin plugin; - - private Party party; - private String senderName; - private String displayName; - private String message; - - public PartyChatTask(Plugin plugin, Party party, String senderName, String displayName, String message) { - this.plugin = plugin; - - this.party = party; - this.senderName = senderName; - this.displayName = displayName; - this.message = message; - } - - @Override - public void run() { - if (Config.getInstance().getPartyChatColorLeaderName() && senderName.equalsIgnoreCase(party.getLeader().getPlayerName())) { - message = message.replaceFirst(Pattern.quote(displayName), ChatColor.GOLD + Matcher.quoteReplacement(displayName) + ChatColor.RESET); - } - - for (Player member : party.getOnlineMembers()) { - member.sendMessage(message); - } - - if (party.getAlly() != null) { - for (Player member : party.getAlly().getOnlineMembers()) { - String allyPrefix = LocaleLoader.formatString(Config.getInstance().getPartyChatPrefixAlly()); - member.sendMessage(allyPrefix + message); - } - } - - plugin.getServer().getConsoleSender().sendMessage(ChatColor.stripColor("[mcMMO] [P]<" + party.getName() + ">" + message)); - } -} diff --git a/src/main/java/com/gmail/nossr50/runnables/player/PlayerProfileLoadingTask.java b/src/main/java/com/gmail/nossr50/runnables/player/PlayerProfileLoadingTask.java index bd255dcb5..5a82b43da 100644 --- a/src/main/java/com/gmail/nossr50/runnables/player/PlayerProfileLoadingTask.java +++ b/src/main/java/com/gmail/nossr50/runnables/player/PlayerProfileLoadingTask.java @@ -1,6 +1,5 @@ package com.gmail.nossr50.runnables.player; -import com.gmail.nossr50.config.Config; import com.gmail.nossr50.datatypes.player.McMMOPlayer; import com.gmail.nossr50.datatypes.player.PlayerProfile; import com.gmail.nossr50.locale.LocaleLoader; @@ -42,7 +41,13 @@ public class PlayerProfileLoadingTask extends BukkitRunnable { return; } - PlayerProfile profile = mcMMO.getDatabaseManager().loadPlayerProfile(player.getName(), player.getUniqueId(), true); + PlayerProfile profile = mcMMO.getDatabaseManager().loadPlayerProfile(player); + + if(!profile.isLoaded()) { + mcMMO.p.getLogger().info("Creating new data for player: "+player.getName()); + //Profile isn't loaded so add as new user + profile = mcMMO.getDatabaseManager().newUser(player); + } // If successful, schedule the apply if (profile.isLoaded()) { @@ -87,20 +92,22 @@ public class PlayerProfileLoadingTask extends BukkitRunnable { return; } + mcMMOPlayer.getProfile().updateLastLogin(); + mcMMOPlayer.setupPartyData(); UserManager.track(mcMMOPlayer); mcMMOPlayer.actualizeRespawnATS(); - if (Config.getInstance().getScoreboardsEnabled()) { + if (mcMMO.p.getGeneralConfig().getScoreboardsEnabled()) { ScoreboardManager.setupPlayer(player); - if (Config.getInstance().getShowStatsAfterLogin()) { + if (mcMMO.p.getGeneralConfig().getShowStatsAfterLogin()) { ScoreboardManager.enablePlayerStatsScoreboard(player); - new McScoreboardKeepTask(player).runTaskLater(mcMMO.p, 1 * Misc.TICK_CONVERSION_FACTOR); + new McScoreboardKeepTask(player).runTaskLater(mcMMO.p, Misc.TICK_CONVERSION_FACTOR); } } - if (Config.getInstance().getShowProfileLoadedMessage()) { + if (mcMMO.p.getGeneralConfig().getShowProfileLoadedMessage()) { player.sendMessage(LocaleLoader.getString("Profile.Loading.Success")); } diff --git a/src/main/java/com/gmail/nossr50/runnables/player/PlayerProfileSaveTask.java b/src/main/java/com/gmail/nossr50/runnables/player/PlayerProfileSaveTask.java index 593d785ca..2a6d30c69 100644 --- a/src/main/java/com/gmail/nossr50/runnables/player/PlayerProfileSaveTask.java +++ b/src/main/java/com/gmail/nossr50/runnables/player/PlayerProfileSaveTask.java @@ -4,8 +4,8 @@ import com.gmail.nossr50.datatypes.player.PlayerProfile; import org.bukkit.scheduler.BukkitRunnable; public class PlayerProfileSaveTask extends BukkitRunnable { - private PlayerProfile playerProfile; - private boolean isSync; + private final PlayerProfile playerProfile; + private final boolean isSync; public PlayerProfileSaveTask(PlayerProfile playerProfile, boolean isSync) { this.playerProfile = playerProfile; diff --git a/src/main/java/com/gmail/nossr50/runnables/player/PlayerUpdateInventoryTask.java b/src/main/java/com/gmail/nossr50/runnables/player/PlayerUpdateInventoryTask.java index d255eee2a..cdfb17d88 100644 --- a/src/main/java/com/gmail/nossr50/runnables/player/PlayerUpdateInventoryTask.java +++ b/src/main/java/com/gmail/nossr50/runnables/player/PlayerUpdateInventoryTask.java @@ -5,7 +5,7 @@ import org.bukkit.scheduler.BukkitRunnable; @SuppressWarnings("deprecation") public class PlayerUpdateInventoryTask extends BukkitRunnable { - private Player player; + private final Player player; public PlayerUpdateInventoryTask(Player player) { this.player = player; diff --git a/src/main/java/com/gmail/nossr50/runnables/skills/AbilityCooldownTask.java b/src/main/java/com/gmail/nossr50/runnables/skills/AbilityCooldownTask.java index a5b59303a..56c772a84 100644 --- a/src/main/java/com/gmail/nossr50/runnables/skills/AbilityCooldownTask.java +++ b/src/main/java/com/gmail/nossr50/runnables/skills/AbilityCooldownTask.java @@ -7,8 +7,8 @@ import com.gmail.nossr50.util.player.NotificationManager; import org.bukkit.scheduler.BukkitRunnable; public class AbilityCooldownTask extends BukkitRunnable { - private McMMOPlayer mcMMOPlayer; - private SuperAbilityType ability; + private final McMMOPlayer mcMMOPlayer; + private final SuperAbilityType ability; public AbilityCooldownTask(McMMOPlayer mcMMOPlayer, SuperAbilityType ability) { this.mcMMOPlayer = mcMMOPlayer; diff --git a/src/main/java/com/gmail/nossr50/runnables/skills/AbilityDisableTask.java b/src/main/java/com/gmail/nossr50/runnables/skills/AbilityDisableTask.java index 5aea0ea18..876aba4ca 100644 --- a/src/main/java/com/gmail/nossr50/runnables/skills/AbilityDisableTask.java +++ b/src/main/java/com/gmail/nossr50/runnables/skills/AbilityDisableTask.java @@ -1,6 +1,5 @@ package com.gmail.nossr50.runnables.skills; -import com.gmail.nossr50.config.Config; import com.gmail.nossr50.datatypes.interactions.NotificationType; import com.gmail.nossr50.datatypes.player.McMMOPlayer; import com.gmail.nossr50.datatypes.skills.SuperAbilityType; @@ -8,7 +7,6 @@ import com.gmail.nossr50.mcMMO; import com.gmail.nossr50.util.EventUtils; import com.gmail.nossr50.util.Misc; import com.gmail.nossr50.util.player.NotificationManager; -import com.gmail.nossr50.util.skills.ParticleEffectUtils; import com.gmail.nossr50.util.skills.PerksUtils; import com.gmail.nossr50.util.skills.SkillUtils; import org.bukkit.Chunk; @@ -17,8 +15,8 @@ import org.bukkit.entity.Player; import org.bukkit.scheduler.BukkitRunnable; public class AbilityDisableTask extends BukkitRunnable { - private McMMOPlayer mcMMOPlayer; - private SuperAbilityType ability; + private final McMMOPlayer mcMMOPlayer; + private final SuperAbilityType ability; public AbilityDisableTask(McMMOPlayer mcMMOPlayer, SuperAbilityType ability) { this.mcMMOPlayer = mcMMOPlayer; @@ -36,12 +34,12 @@ public class AbilityDisableTask extends BukkitRunnable { switch (ability) { case SUPER_BREAKER: case GIGA_DRILL_BREAKER: - SkillUtils.handleAbilitySpeedDecrease(player); + SkillUtils.removeAbilityBoostsFromInventory(player); // Fallthrough case BERSERK: - if (Config.getInstance().getRefreshChunksEnabled()) { - resendChunkRadiusAt(player, 1); + if (mcMMO.p.getGeneralConfig().getRefreshChunksEnabled()) { + resendChunkRadiusAt(player); } // Fallthrough @@ -54,25 +52,30 @@ public class AbilityDisableTask extends BukkitRunnable { mcMMOPlayer.setAbilityMode(ability, false); mcMMOPlayer.setAbilityInformed(ability, false); - ParticleEffectUtils.playAbilityDisabledEffect(player); +// ParticleEffectUtils.playAbilityDisabledEffect(player); if (mcMMOPlayer.useChatNotifications()) { //player.sendMessage(ability.getAbilityOff()); NotificationManager.sendPlayerInformation(player, NotificationType.ABILITY_OFF, ability.getAbilityOff()); } - - SkillUtils.sendSkillMessage(player, NotificationType.SUPER_ABILITY_ALERT_OTHERS, ability.getAbilityPlayerOff()); - new AbilityCooldownTask(mcMMOPlayer, ability).runTaskLater(mcMMO.p, PerksUtils.handleCooldownPerks(player, ability.getCooldown()) * Misc.TICK_CONVERSION_FACTOR); + if (mcMMO.p.getAdvancedConfig().sendAbilityNotificationToOtherPlayers()) { + SkillUtils.sendSkillMessage(player, NotificationType.SUPER_ABILITY_ALERT_OTHERS, ability.getAbilityPlayerOff()); + } + if(!mcMMO.isServerShutdownExecuted()) { + new AbilityCooldownTask(mcMMOPlayer, ability).runTaskLater(mcMMO.p, PerksUtils.handleCooldownPerks(player, ability.getCooldown()) * Misc.TICK_CONVERSION_FACTOR); + } } - private void resendChunkRadiusAt(Player player, int radius) { + private void resendChunkRadiusAt(Player player) { Chunk chunk = player.getLocation().getChunk(); World world = player.getWorld(); int chunkX = chunk.getX(); int chunkZ = chunk.getZ(); + int radius = 1; + for (int x = chunkX - radius; x <= chunkX + radius; x++) { for (int z = chunkZ - radius; z <= chunkZ + radius; z++) { world.refreshChunk(x, z); diff --git a/src/main/java/com/gmail/nossr50/runnables/skills/AlchemyBrewCheckTask.java b/src/main/java/com/gmail/nossr50/runnables/skills/AlchemyBrewCheckTask.java index 904aebc35..e81804ac8 100644 --- a/src/main/java/com/gmail/nossr50/runnables/skills/AlchemyBrewCheckTask.java +++ b/src/main/java/com/gmail/nossr50/runnables/skills/AlchemyBrewCheckTask.java @@ -11,9 +11,9 @@ import org.bukkit.scheduler.BukkitRunnable; import java.util.Arrays; public class AlchemyBrewCheckTask extends BukkitRunnable { - private Player player; - private BrewingStand brewingStand; - private ItemStack[] oldInventory; + private final Player player; + private final BrewingStand brewingStand; + private final ItemStack[] oldInventory; public AlchemyBrewCheckTask(Player player, BrewingStand brewingStand) { this.player = player; diff --git a/src/main/java/com/gmail/nossr50/runnables/skills/AlchemyBrewTask.java b/src/main/java/com/gmail/nossr50/runnables/skills/AlchemyBrewTask.java index 8bd1d8c7e..7a615bd96 100644 --- a/src/main/java/com/gmail/nossr50/runnables/skills/AlchemyBrewTask.java +++ b/src/main/java/com/gmail/nossr50/runnables/skills/AlchemyBrewTask.java @@ -18,14 +18,14 @@ import org.bukkit.entity.Player; import org.bukkit.scheduler.BukkitRunnable; public class AlchemyBrewTask extends BukkitRunnable { - private static double DEFAULT_BREW_SPEED = 1.0; - private static int DEFAULT_BREW_TICKS = 400; + private static final double DEFAULT_BREW_SPEED = 1.0; + private static final int DEFAULT_BREW_TICKS = 400; - private BlockState brewingStand; - private Location location; + private final BlockState brewingStand; + private final Location location; private double brewSpeed; private double brewTimer; - private Player player; + private final Player player; private int fuel; private boolean firstRun = true; diff --git a/src/main/java/com/gmail/nossr50/runnables/skills/AprilTask.java b/src/main/java/com/gmail/nossr50/runnables/skills/AprilTask.java index 6d37f2050..86fd6b819 100644 --- a/src/main/java/com/gmail/nossr50/runnables/skills/AprilTask.java +++ b/src/main/java/com/gmail/nossr50/runnables/skills/AprilTask.java @@ -1,56 +1,56 @@ -package com.gmail.nossr50.runnables.skills; - -import com.gmail.nossr50.mcMMO; -import com.gmail.nossr50.util.HolidayManager; -import com.gmail.nossr50.util.Misc; -import com.gmail.nossr50.util.sounds.SoundManager; -import com.gmail.nossr50.util.sounds.SoundType; -import org.bukkit.ChatColor; -import org.bukkit.Statistic; -import org.bukkit.entity.Player; -import org.bukkit.scheduler.BukkitRunnable; - -public class AprilTask extends BukkitRunnable { - - @Override - public void run() { - if (!mcMMO.getHolidayManager().isAprilFirst()) { - this.cancel(); - return; - } - - for (Player player : mcMMO.p.getServer().getOnlinePlayers()) { - int random = Misc.getRandom().nextInt(40) + 11; - int betterRandom = Misc.getRandom().nextInt(2000); - if (betterRandom == 0) { - SoundManager.sendSound(player, player.getLocation(), SoundType.LEVEL_UP); - player.sendMessage(unknown("superskill") + " skill increased by 1. Total (" + unknown("12") + ")"); -// fireworksShow(player); - } - - for (Statistic statistic : mcMMO.getHolidayManager().movementStatistics) { - if (player.getStatistic(statistic) > 0 && player.getStatistic(statistic) % random == 0) { - mcMMO.getHolidayManager().levelUpApril(player, HolidayManager.FakeSkillType.getByStatistic(statistic)); - break; - } - } - } - } - - /*private void fireworksShow(final Player player) { - final int firework_amount = 10; - for (int i = 0; i < firework_amount; i++) { - int delay = (int) (Misc.getRandom().nextDouble() * 3 * Misc.TICK_CONVERSION_FACTOR) + 4; - mcMMO.p.getServer().getScheduler().runTaskLater(mcMMO.p, new Runnable() { - @Override - public void run() { - mcMMO.getHolidayManager().spawnFireworks(player); - } - }, delay); - } - }*/ - - private String unknown(String string) { - return ChatColor.MAGIC + string + ChatColor.RESET + ChatColor.YELLOW; - } -} +//package com.gmail.nossr50.runnables.skills; +// +//import com.gmail.nossr50.mcMMO; +//import com.gmail.nossr50.util.HolidayManager; +//import com.gmail.nossr50.util.Misc; +//import com.gmail.nossr50.util.sounds.SoundManager; +//import com.gmail.nossr50.util.sounds.SoundType; +//import org.bukkit.ChatColor; +//import org.bukkit.Statistic; +//import org.bukkit.entity.Player; +//import org.bukkit.scheduler.BukkitRunnable; +// +//public class AprilTask extends BukkitRunnable { +// +// @Override +// public void run() { +// if (!mcMMO.getHolidayManager().isAprilFirst()) { +// this.cancel(); +// return; +// } +// +// for (Player player : mcMMO.p.getServer().getOnlinePlayers()) { +// int random = Misc.getRandom().nextInt(40) + 11; +// int betterRandom = Misc.getRandom().nextInt(2000); +// if (betterRandom == 0) { +// SoundManager.sendSound(player, player.getLocation(), SoundType.LEVEL_UP); +// player.sendMessage(unknown("superskill") + " skill increased by 1. Total (" + unknown("12") + ")"); +//// fireworksShow(player); +// } +// +// for (Statistic statistic : mcMMO.getHolidayManager().movementStatistics) { +// if (player.getStatistic(statistic) > 0 && player.getStatistic(statistic) % random == 0) { +// mcMMO.getHolidayManager().levelUpApril(player, HolidayManager.FakeSkillType.getByStatistic(statistic)); +// break; +// } +// } +// } +// } +// +// /*private void fireworksShow(final Player player) { +// final int firework_amount = 10; +// for (int i = 0; i < firework_amount; i++) { +// int delay = (int) (Misc.getRandom().nextDouble() * 3 * Misc.TICK_CONVERSION_FACTOR) + 4; +// mcMMO.p.getServer().getScheduler().runTaskLater(mcMMO.p, new Runnable() { +// @Override +// public void run() { +// mcMMO.getHolidayManager().spawnFireworks(player); +// } +// }, delay); +// } +// }*/ +// +// private String unknown(String string) { +// return ChatColor.MAGIC + string + ChatColor.RESET + ChatColor.YELLOW; +// } +//} diff --git a/src/main/java/com/gmail/nossr50/runnables/skills/AwardCombatXpTask.java b/src/main/java/com/gmail/nossr50/runnables/skills/AwardCombatXpTask.java index d7aee1718..735ed8c17 100644 --- a/src/main/java/com/gmail/nossr50/runnables/skills/AwardCombatXpTask.java +++ b/src/main/java/com/gmail/nossr50/runnables/skills/AwardCombatXpTask.java @@ -8,12 +8,12 @@ import org.bukkit.entity.LivingEntity; import org.bukkit.scheduler.BukkitRunnable; public class AwardCombatXpTask extends BukkitRunnable { - private McMMOPlayer mcMMOPlayer; - private double baseXp; - private PrimarySkillType primarySkillType; - private LivingEntity target; - private XPGainReason xpGainReason; - private double baseHealth; + private final McMMOPlayer mcMMOPlayer; + private final double baseXp; + private final PrimarySkillType primarySkillType; + private final LivingEntity target; + private final XPGainReason xpGainReason; + private final double baseHealth; public AwardCombatXpTask(McMMOPlayer mcMMOPlayer, PrimarySkillType primarySkillType, double baseXp, LivingEntity target, XPGainReason xpGainReason) { this.mcMMOPlayer = mcMMOPlayer; diff --git a/src/main/java/com/gmail/nossr50/runnables/skills/BleedTimerTask.java b/src/main/java/com/gmail/nossr50/runnables/skills/BleedTimerTask.java index e8b283bff..839358afd 100644 --- a/src/main/java/com/gmail/nossr50/runnables/skills/BleedTimerTask.java +++ b/src/main/java/com/gmail/nossr50/runnables/skills/BleedTimerTask.java @@ -1,200 +1,214 @@ -package com.gmail.nossr50.runnables.skills; - -import com.gmail.nossr50.config.AdvancedConfig; -import com.gmail.nossr50.datatypes.interactions.NotificationType; -import com.gmail.nossr50.events.fake.FakeEntityDamageByEntityEvent; -import com.gmail.nossr50.mcMMO; -import com.gmail.nossr50.util.MobHealthbarUtils; -import com.gmail.nossr50.util.player.NotificationManager; -import com.gmail.nossr50.util.skills.CombatUtils; -import com.gmail.nossr50.util.skills.ParticleEffectUtils; -import com.gmail.nossr50.util.sounds.SoundManager; -import com.gmail.nossr50.util.sounds.SoundType; -import org.bukkit.Bukkit; -import org.bukkit.entity.LivingEntity; -import org.bukkit.entity.Player; -import org.bukkit.event.entity.EntityDamageEvent; -import org.bukkit.inventory.ItemStack; -import org.bukkit.scheduler.BukkitRunnable; - -import java.util.HashMap; -import java.util.Iterator; -import java.util.Map; -import java.util.Map.Entry; - -public class BleedTimerTask extends BukkitRunnable { - private static Map bleedList = new HashMap(); - private static boolean isIterating = false; - - @Override - public void run() { - isIterating = true; - Iterator> bleedIterator = bleedList.entrySet().iterator(); - - while (bleedIterator.hasNext()) { - Entry containerEntry = bleedIterator.next(); - LivingEntity target = containerEntry.getKey(); - int toolTier = containerEntry.getValue().toolTier; - -// String debugMessage = ""; -// debugMessage += ChatColor.GOLD + "Target ["+target.getName()+"]: " + ChatColor.RESET; - -// debugMessage+="RemainingTicks=["+containerEntry.getValue().bleedTicks+"], "; - - if (containerEntry.getValue().bleedTicks <= 0 || !target.isValid()) { - if(target instanceof Player) - { - NotificationManager.sendPlayerInformation((Player) target, NotificationType.SUBSKILL_MESSAGE, "Swords.Combat.Bleeding.Stopped"); - } - - bleedIterator.remove(); - continue; - } - - int armorCount = 0; - - double damage; - - if (target instanceof Player) { - damage = AdvancedConfig.getInstance().getRuptureDamagePlayer(); - - //Above Bleed Rank 3 deals 50% more damage - if (containerEntry.getValue().toolTier >= 4 && containerEntry.getValue().bleedRank >= 3) - damage = damage * 1.5; - - Player player = (Player) target; - - if (!player.isOnline()) { - continue; - } - - //Count Armor - for(ItemStack armorPiece : ((Player) target).getInventory().getArmorContents()) - { - if(armorPiece != null) - armorCount++; - } - - } else { - damage = AdvancedConfig.getInstance().getRuptureDamageMobs(); - -// debugMessage+="BaseDMG=["+damage+"], "; - - //Above Bleed Rank 3 deals 50% more damage - if (containerEntry.getValue().bleedRank >= 3) - { - damage = damage * 1.5; - } - -// debugMessage+="Rank4Bonus=["+String.valueOf(containerEntry.getValue().bleedRank >= 3)+"], "; - - - MobHealthbarUtils.handleMobHealthbars(target, damage, mcMMO.p); //Update health bars - } - -// debugMessage+="FullArmor=["+String.valueOf(armorCount > 3)+"], "; - - if(armorCount > 3) - { - damage = damage * .75; - } - -// debugMessage+="AfterRankAndArmorChecks["+damage+"], "; - - //Weapons below Diamond get damage cut in half - if(toolTier < 4) - damage = damage / 2; - -// debugMessage+="AfterDiamondCheck=["+String.valueOf(damage)+"], "; - - //Wood weapons get damage cut in half again - if(toolTier < 2) - damage = damage / 2; - -// debugMessage+="AfterWoodenCheck=["+String.valueOf(damage)+"], "; - - double victimHealth = target.getHealth(); - -// debugMessage+="TargetHealthBeforeDMG=["+String.valueOf(target.getHealth())+"], "; - - //Fire a fake event - FakeEntityDamageByEntityEvent fakeEntityDamageByEntityEvent = (FakeEntityDamageByEntityEvent) CombatUtils.sendEntityDamageEvent(containerEntry.getValue().damageSource, target, EntityDamageEvent.DamageCause.CUSTOM, damage); - Bukkit.getPluginManager().callEvent(fakeEntityDamageByEntityEvent); - - CombatUtils.dealNoInvulnerabilityTickDamageRupture(target, damage, containerEntry.getValue().damageSource, toolTier); - - double victimHealthAftermath = target.getHealth(); - -// debugMessage+="TargetHealthAfterDMG=["+String.valueOf(target.getHealth())+"], "; - - if(victimHealthAftermath <= 0 || victimHealth != victimHealthAftermath) - { - //Play Bleed Sound - SoundManager.worldSendSound(target.getWorld(), target.getLocation(), SoundType.BLEED); - - ParticleEffectUtils.playBleedEffect(target); - } - - //Lower Bleed Ticks - BleedContainer loweredBleedContainer = copyContainer(containerEntry.getValue()); - loweredBleedContainer.bleedTicks -= 1; - -// debugMessage+="RemainingTicks=["+loweredBleedContainer.bleedTicks+"]"; - containerEntry.setValue(loweredBleedContainer); - -// Bukkit.broadcastMessage(debugMessage); - } - isIterating = false; - } - - public static BleedContainer copyContainer(BleedContainer container) - { - LivingEntity target = container.target; - LivingEntity source = container.damageSource; - int bleedTicks = container.bleedTicks; - int bleedRank = container.bleedRank; - int toolTier = container.toolTier; - - BleedContainer newContainer = new BleedContainer(target, bleedTicks, bleedRank, toolTier, source); - return newContainer; - } - - /** - * Instantly Bleed out a LivingEntity - * - * @param entity LivingEntity to bleed out - */ - public static void bleedOut(LivingEntity entity) { - /* - * Don't remove anything from the list outside of run() - */ - - if (bleedList.containsKey(entity)) { - CombatUtils.dealNoInvulnerabilityTickDamage(entity, bleedList.get(entity).bleedTicks * 2, bleedList.get(entity).damageSource); - } - } - - /** - * Add a LivingEntity to the bleedList if it is not in it. - * - * @param entity LivingEntity to add - * @param ticks Number of bleeding ticks - */ - public static void add(LivingEntity entity, LivingEntity attacker, int ticks, int bleedRank, int toolTier) { - if (!Bukkit.isPrimaryThread()) { - throw new IllegalStateException("Cannot add bleed task async!"); - } - - if (isIterating) throw new IllegalStateException("Cannot add task while iterating timers!"); - - if(toolTier < 4) - ticks = Math.max(1, (ticks / 3)); - - BleedContainer newBleedContainer = new BleedContainer(entity, ticks, bleedRank, toolTier, attacker); - bleedList.put(entity, newBleedContainer); - } - - public static boolean isBleeding(LivingEntity entity) { - return bleedList.containsKey(entity); - } -} +//package com.gmail.nossr50.runnables.skills; +// +//import com.gmail.nossr50.config.AdvancedConfig; +//import com.gmail.nossr50.datatypes.interactions.NotificationType; +//import com.gmail.nossr50.events.fake.FakeEntityDamageByEntityEvent; +//import com.gmail.nossr50.mcMMO; +//import com.gmail.nossr50.util.MobHealthbarUtils; +//import com.gmail.nossr50.util.player.NotificationManager; +//import com.gmail.nossr50.util.skills.CombatUtils; +//import com.gmail.nossr50.util.skills.ParticleEffectUtils; +//import com.gmail.nossr50.util.sounds.SoundManager; +//import com.gmail.nossr50.util.sounds.SoundType; +//import org.bukkit.Bukkit; +//import org.bukkit.entity.LivingEntity; +//import org.bukkit.entity.Player; +//import org.bukkit.event.entity.EntityDamageEvent; +//import org.bukkit.inventory.ItemStack; +//import org.bukkit.scheduler.BukkitRunnable; +//import org.jetbrains.annotations.NotNull; +// +//import java.util.HashMap; +//import java.util.Iterator; +//import java.util.Map; +//import java.util.Map.Entry; +// +//public class BleedTimerTask extends BukkitRunnable { +// private static final @NotNull Map bleedList = new HashMap<>(); +// private static boolean isIterating = false; +// +// @Override +// public void run() { +// isIterating = true; +// Iterator> bleedIterator = bleedList.entrySet().iterator(); +// +// while (bleedIterator.hasNext()) { +// Entry containerEntry = bleedIterator.next(); +// LivingEntity target = containerEntry.getKey(); +// int toolTier = containerEntry.getValue().toolTier; +// +//// String debugMessage = ""; +//// debugMessage += ChatColor.GOLD + "Target ["+target.getName()+"]: " + ChatColor.RESET; +// +//// debugMessage+="RemainingTicks=["+containerEntry.getValue().bleedTicks+"], "; +// +// if (containerEntry.getValue().bleedTicks <= 0 || !target.isValid()) { +// if(target instanceof Player) +// { +// NotificationManager.sendPlayerInformation((Player) target, NotificationType.SUBSKILL_MESSAGE, "Swords.Combat.Bleeding.Stopped"); +// } +// +// bleedIterator.remove(); +// continue; +// } +// +// int armorCount = 0; +// +// double damage; +// +// if (target instanceof Player) { +// damage = mcMMO.p.getAdvancedConfig().getRuptureDamagePlayer(); +// +// //Above Bleed Rank 3 deals 50% more damage +// if (containerEntry.getValue().toolTier >= 4 && containerEntry.getValue().bleedRank >= 3) +// damage = damage * 1.5; +// +// Player player = (Player) target; +// +// if (!player.isOnline()) { +// continue; +// } +// +// //Count Armor +// for (ItemStack armorPiece : ((Player) target).getInventory().getArmorContents()) { +// //We only want to count slots that contain armor. +// if (armorPiece != null) { +// armorCount++; +// } +// } +// +// } else { +// damage = mcMMO.p.getAdvancedConfig().getRuptureDamageMobs(); +// +//// debugMessage+="BaseDMG=["+damage+"], "; +// +// //Above Bleed Rank 3 deals 50% more damage +// if (containerEntry.getValue().bleedRank >= 3) +// { +// damage = damage * 1.5; +// } +// +//// debugMessage+="Rank4Bonus=["+String.valueOf(containerEntry.getValue().bleedRank >= 3)+"], "; +// +// +// MobHealthbarUtils.handleMobHealthbars(target, damage, mcMMO.p); //Update health bars +// } +// +//// debugMessage+="FullArmor=["+String.valueOf(armorCount > 3)+"], "; +// +// if(armorCount > 3) +// { +// damage = damage * .75; +// } +// +//// debugMessage+="AfterRankAndArmorChecks["+damage+"], "; +// +// //Weapons below Diamond get damage cut in half +// if(toolTier < 4) +// damage = damage / 2; +// +//// debugMessage+="AfterDiamondCheck=["+String.valueOf(damage)+"], "; +// +// //Wood weapons get damage cut in half again +// if(toolTier < 2) +// damage = damage / 2; +// +//// debugMessage+="AfterWoodenCheck=["+String.valueOf(damage)+"], "; +// +// double victimHealth = target.getHealth(); +// +//// debugMessage+="TargetHealthBeforeDMG=["+String.valueOf(target.getHealth())+"], "; +// +// //Fire a fake event +// FakeEntityDamageByEntityEvent fakeEntityDamageByEntityEvent = (FakeEntityDamageByEntityEvent) CombatUtils.sendEntityDamageEvent(containerEntry.getValue().damageSource, target, EntityDamageEvent.DamageCause.CUSTOM, damage); +// Bukkit.getPluginManager().callEvent(fakeEntityDamageByEntityEvent); +// +// CombatUtils.dealNoInvulnerabilityTickDamageRupture(target, damage, containerEntry.getValue().damageSource, toolTier); +// +// double victimHealthAftermath = target.getHealth(); +// +//// debugMessage+="TargetHealthAfterDMG=["+String.valueOf(target.getHealth())+"], "; +// +// if(victimHealthAftermath <= 0 || victimHealth != victimHealthAftermath) +// { +// //Play Bleed Sound +// SoundManager.worldSendSound(target.getWorld(), target.getLocation(), SoundType.BLEED); +// +// ParticleEffectUtils.playBleedEffect(target); +// } +// +// //Lower Bleed Ticks +// BleedContainer loweredBleedContainer = copyContainer(containerEntry.getValue()); +// loweredBleedContainer.bleedTicks -= 1; +// +//// debugMessage+="RemainingTicks=["+loweredBleedContainer.bleedTicks+"]"; +// containerEntry.setValue(loweredBleedContainer); +// +//// Bukkit.broadcastMessage(debugMessage); +// } +// isIterating = false; +// } +// +// public static @NotNull BleedContainer copyContainer(@NotNull BleedContainer container) +// { +// LivingEntity target = container.target; +// LivingEntity source = container.damageSource; +// int bleedTicks = container.bleedTicks; +// int bleedRank = container.bleedRank; +// int toolTier = container.toolTier; +// +// return new BleedContainer(target, bleedTicks, bleedRank, toolTier, source); +// } +// +// /** +// * Instantly Bleed out a LivingEntity +// * +// * @param entity LivingEntity to bleed out +// */ +// public static void bleedOut(@NotNull LivingEntity entity) { +// /* +// * Don't remove anything from the list outside of run() +// */ +// +// if (bleedList.containsKey(entity)) { +// CombatUtils.dealNoInvulnerabilityTickDamage(entity, bleedList.get(entity).bleedTicks * 2, bleedList.get(entity).damageSource); +// } +// } +// +// /** +// * Add a LivingEntity to the bleedList if it is not in it. +// * +// * @param entity LivingEntity to add +// * @param attacker source of the bleed/rupture +// * @param ticks Number of bleeding ticks +// */ +// public static void add(@NotNull LivingEntity entity, @NotNull LivingEntity attacker, int ticks, int bleedRank, int toolTier) { +// if (!Bukkit.isPrimaryThread()) { +// throw new IllegalStateException("Cannot add bleed task async!"); +// } +// +// if(isIterating) { +// //Used to throw an error here, but in reality all we are really doing is preventing concurrency issues from other plugins being naughty and its not really needed +// //I'm not really a fan of silent errors, but I'm sick of seeing people using crazy enchantments come in and report this "bug" +// return; +// } +// +//// if (isIterating) throw new IllegalStateException("Cannot add task while iterating timers!"); +// +// if(toolTier < 4) +// ticks = Math.max(1, (ticks / 3)); +// +// ticks+=1; +// +// BleedContainer newBleedContainer = new BleedContainer(entity, ticks, bleedRank, toolTier, attacker); +// bleedList.put(entity, newBleedContainer); +// } +// +// public static boolean isBleedOperationAllowed() { +// return !isIterating && Bukkit.isPrimaryThread(); +// } +// +// public static boolean isBleeding(@NotNull LivingEntity entity) { +// return bleedList.containsKey(entity); +// } +//} diff --git a/src/main/java/com/gmail/nossr50/runnables/skills/DelayedCropReplant.java b/src/main/java/com/gmail/nossr50/runnables/skills/DelayedCropReplant.java index 55fc91767..617d1b735 100644 --- a/src/main/java/com/gmail/nossr50/runnables/skills/DelayedCropReplant.java +++ b/src/main/java/com/gmail/nossr50/runnables/skills/DelayedCropReplant.java @@ -2,6 +2,7 @@ package com.gmail.nossr50.runnables.skills; import com.gmail.nossr50.datatypes.meta.RecentlyReplantedCropMeta; import com.gmail.nossr50.mcMMO; +import com.gmail.nossr50.util.MetadataConstants; import com.gmail.nossr50.util.skills.ParticleEffectUtils; import org.bukkit.Location; import org.bukkit.Material; @@ -11,8 +12,11 @@ import org.bukkit.block.BlockState; import org.bukkit.block.data.Ageable; import org.bukkit.block.data.BlockData; import org.bukkit.block.data.Directional; +import org.bukkit.block.data.type.Cocoa; import org.bukkit.event.block.BlockBreakEvent; import org.bukkit.scheduler.BukkitRunnable; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; public class DelayedCropReplant extends BukkitRunnable { @@ -21,7 +25,7 @@ public class DelayedCropReplant extends BukkitRunnable { private final Material cropMaterial; private boolean wasImmaturePlant; private final BlockBreakEvent blockBreakEvent; - private BlockFace cropFace; + private @Nullable BlockFace cropFace; /** * Replants a crop after a delay setting the age to desiredCropAge @@ -48,6 +52,7 @@ public class DelayedCropReplant extends BukkitRunnable { public void run() { Block cropBlock = cropLocation.getBlock(); BlockState currentState = cropBlock.getState(); + PlantAnchorType plantAnchorType = PlantAnchorType.NORMAL; //Remove the metadata marking the block as recently replanted new markPlantAsOld(blockBreakEvent.getBlock().getLocation()).runTaskLater(mcMMO.p, 10); @@ -81,6 +86,10 @@ public class DelayedCropReplant extends BukkitRunnable { directional.setFacing(cropFace); newState.setBlockData(directional); + + if(newData instanceof Cocoa) { + plantAnchorType = PlantAnchorType.COCOA; + } } //Age the crop @@ -89,16 +98,70 @@ public class DelayedCropReplant extends BukkitRunnable { newState.setBlockData(ageable); - newState.update(true); + newState.update(true, true); //Play an effect ParticleEffectUtils.playGreenThumbEffect(cropLocation); - + new PhysicsBlockUpdate(newState.getBlock(), cropFace, plantAnchorType).runTaskLater(mcMMO.p, 1); } - } - private class markPlantAsOld extends BukkitRunnable { + private enum PlantAnchorType { + NORMAL, + COCOA + } + + private static class PhysicsBlockUpdate extends BukkitRunnable { + private final Block plantBlock; + private final PlantAnchorType plantAnchorType; + private BlockFace plantFace; + + private PhysicsBlockUpdate(@NotNull Block plantBlock, @Nullable BlockFace plantFace, @NotNull PlantAnchorType plantAnchorType) { + this.plantBlock = plantBlock; + this.plantAnchorType = plantAnchorType; + + if(plantFace != null) { + this.plantFace = plantFace; + } + } + + @Override + public void run() { + //Update neighbors + switch (plantAnchorType) { + case COCOA: + checkPlantIntegrity(plantFace); + break; + case NORMAL: + checkPlantIntegrity(BlockFace.DOWN); + break; + } + } + + private void checkPlantIntegrity(@NotNull BlockFace blockFace) { + Block neighbor = plantBlock.getRelative(blockFace); + + if(plantAnchorType == PlantAnchorType.COCOA) { + if(!neighbor.getType().toString().toLowerCase().contains("jungle")) { + plantBlock.breakNaturally(); + } + } else { + switch (neighbor.getType()) { + case AIR: + case CAVE_AIR: + case WATER: + case LAVA: + plantBlock.breakNaturally(); + break; + default: + } + } + } + } + + + + private static class markPlantAsOld extends BukkitRunnable { private final Location cropLoc; @@ -109,8 +172,8 @@ public class DelayedCropReplant extends BukkitRunnable { @Override public void run() { Block cropBlock = cropLoc.getBlock(); - if(cropBlock.getMetadata(mcMMO.REPLANT_META_KEY).size() > 0) - cropBlock.setMetadata(mcMMO.REPLANT_META_KEY, new RecentlyReplantedCropMeta(mcMMO.p, false)); + if(cropBlock.getMetadata(MetadataConstants.METADATA_KEY_REPLANT).size() > 0) + cropBlock.setMetadata(MetadataConstants.METADATA_KEY_REPLANT, new RecentlyReplantedCropMeta(mcMMO.p, false)); } } diff --git a/src/main/java/com/gmail/nossr50/runnables/skills/HerbalismBlockUpdaterTask.java b/src/main/java/com/gmail/nossr50/runnables/skills/HerbalismBlockUpdaterTask.java index 38f5eb84d..102c9b0b7 100644 --- a/src/main/java/com/gmail/nossr50/runnables/skills/HerbalismBlockUpdaterTask.java +++ b/src/main/java/com/gmail/nossr50/runnables/skills/HerbalismBlockUpdaterTask.java @@ -4,7 +4,7 @@ import org.bukkit.block.BlockState; import org.bukkit.scheduler.BukkitRunnable; public class HerbalismBlockUpdaterTask extends BukkitRunnable { - private BlockState blockState; + private final BlockState blockState; public HerbalismBlockUpdaterTask(BlockState blockState) { this.blockState = blockState; diff --git a/src/main/java/com/gmail/nossr50/runnables/skills/MasterAnglerTask.java b/src/main/java/com/gmail/nossr50/runnables/skills/MasterAnglerTask.java new file mode 100644 index 000000000..0f652e02c --- /dev/null +++ b/src/main/java/com/gmail/nossr50/runnables/skills/MasterAnglerTask.java @@ -0,0 +1,23 @@ +package com.gmail.nossr50.runnables.skills; + +import com.gmail.nossr50.skills.fishing.FishingManager; +import org.bukkit.entity.FishHook; +import org.bukkit.scheduler.BukkitRunnable; +import org.jetbrains.annotations.NotNull; + +public class MasterAnglerTask extends BukkitRunnable { + private final @NotNull FishHook fishHook; + private final @NotNull FishingManager fishingManager; + private final int lureLevel; + + public MasterAnglerTask(@NotNull FishHook fishHook, @NotNull FishingManager fishingManager, int lureLevel) { + this.fishHook = fishHook; + this.fishingManager = fishingManager; + this.lureLevel = lureLevel; + } + + @Override + public void run() { + fishingManager.processMasterAngler(fishHook, lureLevel); + } +} diff --git a/src/main/java/com/gmail/nossr50/runnables/skills/RuptureTask.java b/src/main/java/com/gmail/nossr50/runnables/skills/RuptureTask.java new file mode 100644 index 000000000..1b4c56197 --- /dev/null +++ b/src/main/java/com/gmail/nossr50/runnables/skills/RuptureTask.java @@ -0,0 +1,169 @@ +package com.gmail.nossr50.runnables.skills; + +import com.gmail.nossr50.datatypes.player.McMMOPlayer; +import com.gmail.nossr50.events.skills.rupture.McMMOEntityDamageByRuptureEvent; +import com.gmail.nossr50.mcMMO; +import com.gmail.nossr50.util.MetadataConstants; +import com.gmail.nossr50.util.skills.ParticleEffectUtils; +import com.google.common.base.Objects; +import org.bukkit.entity.LivingEntity; +import org.bukkit.entity.Player; +import org.bukkit.scheduler.BukkitRunnable; +import org.jetbrains.annotations.NotNull; + +public class RuptureTask extends BukkitRunnable { + + public static final int DAMAGE_TICK_INTERVAL = 10; + public static final int ANIMATION_TICK_INTERVAL = 1; + + private final @NotNull McMMOPlayer ruptureSource; + private final @NotNull LivingEntity targetEntity; + private final int expireTick; + + private int ruptureTick; + private int damageTickTracker; + private int animationTick; + private final double pureTickDamage; + private final double explosionDamage; + + public RuptureTask(@NotNull McMMOPlayer ruptureSource, @NotNull LivingEntity targetEntity, double pureTickDamage, double explosionDamage) { + this.ruptureSource = ruptureSource; + this.targetEntity = targetEntity; + this.expireTick = mcMMO.p.getAdvancedConfig().getRuptureDurationSeconds(targetEntity instanceof Player) * 20; + + this.ruptureTick = 0; + this.damageTickTracker = 0; + this.animationTick = ANIMATION_TICK_INTERVAL; //Play an animation right away + this.pureTickDamage = pureTickDamage; + this.explosionDamage = explosionDamage; + } + + @Override + public void run() { + //Check validity + if(targetEntity.isValid()) { + ruptureTick += 1; //Advance rupture tick by 1. + damageTickTracker += 1; //Increment damage tick tracker + + //TODO: Clean this code up, applyRupture() is a confusing name for something that returns boolean + //Rupture hasn't ended yet + if(ruptureTick < expireTick) { + //Is it time to damage? + if(damageTickTracker >= DAMAGE_TICK_INTERVAL) { + + damageTickTracker = 0; //Reset timer + if (applyRupture()) return; + + playAnimation(); + } + } else { + if(!applyRupture()) { + playAnimation(); + } + + endRupture(); + } + } else { + targetEntity.removeMetadata(MetadataConstants.METADATA_KEY_RUPTURE, mcMMO.p); + this.cancel(); //Task no longer needed + } + } + + private void playAnimation() { + if(animationTick >= ANIMATION_TICK_INTERVAL) { + ParticleEffectUtils.playBleedEffect(targetEntity); //Animate + animationTick = 0; + } else { + animationTick++; + } + } + + private boolean applyRupture() { + double healthBeforeRuptureIsApplied = targetEntity.getHealth(); + + //Ensure victim has health + if (healthBeforeRuptureIsApplied > 0.01) { + //Send a fake damage event + McMMOEntityDamageByRuptureEvent event = new McMMOEntityDamageByRuptureEvent(ruptureSource, targetEntity, calculateAdjustedTickDamage()); + mcMMO.p.getServer().getPluginManager().callEvent(event); + + //Ensure the event wasn't cancelled and damage is still greater than 0 + double damage = event.getFinalDamage(); + + if (event.isCancelled() || damage <= 0 || healthBeforeRuptureIsApplied - damage <= 0) + return true; + + double damagedHealth = healthBeforeRuptureIsApplied - damage; + + targetEntity.setHealth(damagedHealth); //Hurt entity without the unwanted side effects of damage()} + } + + return false; + } + + public void refreshRupture() { + damageTickTracker = DAMAGE_TICK_INTERVAL; + ruptureTick = 0; + } + + public void endRupture() { +// targetEntity.setMetadata(mcMMO.EXPLOSION_FROM_RUPTURE, new FixedMetadataValue(mcMMO.p, "null")); +// +// ParticleEffectUtils.playGreaterImpactEffect(targetEntity); //Animate +// +// if(ruptureSource.getPlayer() != null && ruptureSource.getPlayer().isValid()) { +// targetEntity.damage(getExplosionDamage(), ruptureSource.getPlayer()); +// } else { +// targetEntity.damage(getExplosionDamage(), null); +// } +// +// targetEntity.removeMetadata(mcMMO.RUPTURE_META_KEY, mcMMO.p); + + targetEntity.removeMetadata(MetadataConstants.METADATA_KEY_RUPTURE, mcMMO.p); + this.cancel(); //Task no longer needed + } + + private double calculateAdjustedTickDamage() { + double tickDamage = pureTickDamage; + + if(targetEntity.getHealth() <= tickDamage) { + tickDamage = targetEntity.getHealth() - 0.01; + + if(tickDamage <= 0) { + tickDamage = 0; + } + } + + return tickDamage; + } + + private double getExplosionDamage() { + return explosionDamage; + } + + @Override + public String toString() { + return "RuptureTask{" + + "ruptureSource=" + ruptureSource + + ", targetEntity=" + targetEntity + + ", expireTick=" + expireTick + + ", ruptureTick=" + ruptureTick + + ", damageTickTracker=" + damageTickTracker + + ", pureTickDamage=" + pureTickDamage + + ", explosionDamage=" + explosionDamage + + '}'; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + RuptureTask that = (RuptureTask) o; + return expireTick == that.expireTick && ruptureTick == that.ruptureTick && damageTickTracker == that.damageTickTracker && Double.compare(that.pureTickDamage, pureTickDamage) == 0 && Double.compare(that.explosionDamage, explosionDamage) == 0 && Objects.equal(ruptureSource, that.ruptureSource) && Objects.equal(targetEntity, that.targetEntity); + } + + @Override + public int hashCode() { + return Objects.hashCode(ruptureSource, targetEntity, expireTick, ruptureTick, damageTickTracker, pureTickDamage, explosionDamage); + } +} diff --git a/src/main/java/com/gmail/nossr50/runnables/skills/SkillUnlockNotificationTask.java b/src/main/java/com/gmail/nossr50/runnables/skills/SkillUnlockNotificationTask.java index 2e23e42eb..342f77162 100644 --- a/src/main/java/com/gmail/nossr50/runnables/skills/SkillUnlockNotificationTask.java +++ b/src/main/java/com/gmail/nossr50/runnables/skills/SkillUnlockNotificationTask.java @@ -7,9 +7,9 @@ import org.bukkit.scheduler.BukkitRunnable; public class SkillUnlockNotificationTask extends BukkitRunnable { - private McMMOPlayer mcMMOPlayer; - private SubSkillType subSkillType; - private int rank; + private final McMMOPlayer mcMMOPlayer; + private final SubSkillType subSkillType; + private final int rank; /** * Notify a player about a newly unlocked subskill * @param mcMMOPlayer target player diff --git a/src/main/java/com/gmail/nossr50/runnables/skills/ToolLowerTask.java b/src/main/java/com/gmail/nossr50/runnables/skills/ToolLowerTask.java index bff688e4f..ef3cd0561 100644 --- a/src/main/java/com/gmail/nossr50/runnables/skills/ToolLowerTask.java +++ b/src/main/java/com/gmail/nossr50/runnables/skills/ToolLowerTask.java @@ -1,15 +1,15 @@ package com.gmail.nossr50.runnables.skills; -import com.gmail.nossr50.config.Config; import com.gmail.nossr50.datatypes.interactions.NotificationType; import com.gmail.nossr50.datatypes.player.McMMOPlayer; import com.gmail.nossr50.datatypes.skills.ToolType; +import com.gmail.nossr50.mcMMO; import com.gmail.nossr50.util.player.NotificationManager; import org.bukkit.scheduler.BukkitRunnable; public class ToolLowerTask extends BukkitRunnable { - private McMMOPlayer mcMMOPlayer; - private ToolType tool; + private final McMMOPlayer mcMMOPlayer; + private final ToolType tool; public ToolLowerTask(McMMOPlayer mcMMOPlayer, ToolType tool) { this.mcMMOPlayer = mcMMOPlayer; @@ -24,7 +24,7 @@ public class ToolLowerTask extends BukkitRunnable { mcMMOPlayer.setToolPreparationMode(tool, false); - if (Config.getInstance().getAbilityMessagesEnabled()) { + if (mcMMO.p.getGeneralConfig().getAbilityMessagesEnabled()) { NotificationManager.sendPlayerInformation(mcMMOPlayer.getPlayer(), NotificationType.TOOL, tool.getLowerTool()); } } diff --git a/src/main/java/com/gmail/nossr50/skills/SkillManager.java b/src/main/java/com/gmail/nossr50/skills/SkillManager.java index ccfd3fe8f..cc18c9b32 100644 --- a/src/main/java/com/gmail/nossr50/skills/SkillManager.java +++ b/src/main/java/com/gmail/nossr50/skills/SkillManager.java @@ -9,20 +9,20 @@ import org.bukkit.entity.LivingEntity; import org.bukkit.entity.Player; public abstract class SkillManager { - protected McMMOPlayer mcMMOPlayer; + protected McMMOPlayer mmoPlayer; protected PrimarySkillType skill; - public SkillManager(McMMOPlayer mcMMOPlayer, PrimarySkillType skill) { - this.mcMMOPlayer = mcMMOPlayer; + public SkillManager(McMMOPlayer mmoPlayer, PrimarySkillType skill) { + this.mmoPlayer = mmoPlayer; this.skill = skill; } public Player getPlayer() { - return mcMMOPlayer.getPlayer(); + return mmoPlayer.getPlayer(); } public int getSkillLevel() { - return mcMMOPlayer.getSkillLevel(skill); + return mmoPlayer.getSkillLevel(skill); } /** @@ -33,7 +33,7 @@ public abstract class SkillManager { */ @Deprecated public void applyXpGain(float xp, XPGainReason xpGainReason) { - mcMMOPlayer.beginXpGain(skill, xp, xpGainReason, XPGainSource.SELF); + mmoPlayer.beginXpGain(skill, xp, xpGainReason, XPGainSource.SELF); } /** @@ -43,7 +43,7 @@ public abstract class SkillManager { * @param xpGainSource the source of the XP */ public void applyXpGain(float xp, XPGainReason xpGainReason, XPGainSource xpGainSource) { - mcMMOPlayer.beginXpGain(skill, xp, xpGainReason, xpGainSource); + mmoPlayer.beginXpGain(skill, xp, xpGainReason, xpGainSource); } public XPGainReason getXPGainReason(LivingEntity target, Entity damager) { diff --git a/src/main/java/com/gmail/nossr50/skills/acrobatics/Acrobatics.java b/src/main/java/com/gmail/nossr50/skills/acrobatics/Acrobatics.java index 1c72521f8..60f948d90 100644 --- a/src/main/java/com/gmail/nossr50/skills/acrobatics/Acrobatics.java +++ b/src/main/java/com/gmail/nossr50/skills/acrobatics/Acrobatics.java @@ -1,13 +1,12 @@ package com.gmail.nossr50.skills.acrobatics; -import com.gmail.nossr50.config.AdvancedConfig; -import com.gmail.nossr50.config.Config; import com.gmail.nossr50.config.experience.ExperienceConfig; +import com.gmail.nossr50.mcMMO; public final class Acrobatics { - public static double dodgeDamageModifier = AdvancedConfig.getInstance().getDodgeDamageModifier(); + public static double dodgeDamageModifier = mcMMO.p.getAdvancedConfig().getDodgeDamageModifier(); public static int dodgeXpModifier = ExperienceConfig.getInstance().getDodgeXPModifier(); - public static boolean dodgeLightningDisabled = Config.getInstance().getDodgeLightningDisabled(); + public static boolean dodgeLightningDisabled = mcMMO.p.getGeneralConfig().getDodgeLightningDisabled(); private Acrobatics() {} diff --git a/src/main/java/com/gmail/nossr50/skills/acrobatics/AcrobaticsManager.java b/src/main/java/com/gmail/nossr50/skills/acrobatics/AcrobaticsManager.java index c241cd946..5d959b096 100644 --- a/src/main/java/com/gmail/nossr50/skills/acrobatics/AcrobaticsManager.java +++ b/src/main/java/com/gmail/nossr50/skills/acrobatics/AcrobaticsManager.java @@ -1,14 +1,16 @@ package com.gmail.nossr50.skills.acrobatics; import com.gmail.nossr50.config.experience.ExperienceConfig; -import com.gmail.nossr50.datatypes.LimitedSizeList; +import com.gmail.nossr50.datatypes.BlockLocationHistory; import com.gmail.nossr50.datatypes.experience.XPGainReason; import com.gmail.nossr50.datatypes.interactions.NotificationType; import com.gmail.nossr50.datatypes.player.McMMOPlayer; import com.gmail.nossr50.datatypes.skills.PrimarySkillType; import com.gmail.nossr50.datatypes.skills.SubSkillType; import com.gmail.nossr50.mcMMO; +import com.gmail.nossr50.runnables.MobDodgeMetaCleanup; import com.gmail.nossr50.skills.SkillManager; +import com.gmail.nossr50.util.MetadataConstants; import com.gmail.nossr50.util.Misc; import com.gmail.nossr50.util.Permissions; import com.gmail.nossr50.util.player.NotificationManager; @@ -20,6 +22,7 @@ import com.gmail.nossr50.util.skills.SkillUtils; import org.bukkit.Location; import org.bukkit.entity.Entity; import org.bukkit.entity.LightningStrike; +import org.bukkit.entity.Mob; import org.bukkit.entity.Player; import org.bukkit.metadata.FixedMetadataValue; import org.bukkit.metadata.MetadataValue; @@ -28,13 +31,13 @@ public class AcrobaticsManager extends SkillManager { public AcrobaticsManager(McMMOPlayer mcMMOPlayer) { super(mcMMOPlayer, PrimarySkillType.ACROBATICS); - fallLocationMap = new LimitedSizeList(50); + fallLocationMap = new BlockLocationHistory(50); } private long rollXPCooldown = 0; - private long rollXPInterval = (1000 * 3); //1 Minute + private final long rollXPInterval = (1000 * 3); //1 Minute private long rollXPIntervalLengthen = (1000 * 10); //10 Seconds - private LimitedSizeList fallLocationMap; + private final BlockLocationHistory fallLocationMap; public boolean hasFallenInLocationBefore(Location location) { @@ -64,6 +67,9 @@ public class AcrobaticsManager extends SkillManager { } public boolean canDodge(Entity damager) { + if(getPlayer().isBlocking()) + return false; + if(!RankUtils.hasUnlockedSubskill(getPlayer(), SubSkillType.ACROBATICS_DODGE)) return false; @@ -72,7 +78,7 @@ public class AcrobaticsManager extends SkillManager { return false; } - return skill.shouldProcess(damager); + return mcMMO.p.getSkillTools().canCombatSkillsTrigger(skill, damager); } return false; @@ -91,25 +97,27 @@ public class AcrobaticsManager extends SkillManager { if (!isFatal(modifiedDamage) && RandomChanceUtil.isActivationSuccessful(SkillActivationType.RANDOM_LINEAR_100_SCALE_WITH_CAP, SubSkillType.ACROBATICS_DODGE, player)) { ParticleEffectUtils.playDodgeEffect(player); - if (mcMMOPlayer.useChatNotifications()) { + if (mmoPlayer.useChatNotifications()) { NotificationManager.sendPlayerInformation(player, NotificationType.SUBSKILL_MESSAGE, "Acrobatics.Combat.Proc"); } - if (SkillUtils.cooldownExpired(mcMMOPlayer.getRespawnATS(), Misc.PLAYER_RESPAWN_COOLDOWN_SECONDS)) { - if(!(attacker instanceof Player)) { + if (SkillUtils.cooldownExpired(mmoPlayer.getRespawnATS(), Misc.PLAYER_RESPAWN_COOLDOWN_SECONDS)) { + if(attacker instanceof Mob) { + Mob mob = (Mob) attacker; //Check to see how many dodge XP rewards this mob has handed out - if(attacker.hasMetadata(mcMMO.DODGE_TRACKER) && ExperienceConfig.getInstance().isAcrobaticsExploitingPrevented()) { + if(mob.hasMetadata(MetadataConstants.METADATA_KEY_DODGE_TRACKER) && ExperienceConfig.getInstance().isAcrobaticsExploitingPrevented()) { //If Dodge XP has been handed out 5 times then consider it being exploited - MetadataValue metadataValue = attacker.getMetadata(mcMMO.DODGE_TRACKER).get(0); - int count = attacker.getMetadata(mcMMO.DODGE_TRACKER).get(0).asInt(); + MetadataValue metadataValue = mob.getMetadata(MetadataConstants.METADATA_KEY_DODGE_TRACKER).get(0); + int count = metadataValue.asInt(); if(count <= 5) { applyXpGain((float) (damage * Acrobatics.dodgeXpModifier), XPGainReason.PVE); - attacker.setMetadata(mcMMO.DODGE_TRACKER, new FixedMetadataValue(mcMMO.p, count + 1)); + mob.setMetadata(MetadataConstants.METADATA_KEY_DODGE_TRACKER, new FixedMetadataValue(mcMMO.p, count + 1)); + MobDodgeMetaCleanup metaCleanupTask = new MobDodgeMetaCleanup(mob, mcMMO.p); + metaCleanupTask.runTaskTimer(mcMMO.p, 20, 20*60); //one minute } } else { applyXpGain((float) (damage * Acrobatics.dodgeXpModifier), XPGainReason.PVE); - attacker.setMetadata(mcMMO.DODGE_TRACKER, new FixedMetadataValue(mcMMO.p, 1)); } } } diff --git a/src/main/java/com/gmail/nossr50/skills/alchemy/Alchemy.java b/src/main/java/com/gmail/nossr50/skills/alchemy/Alchemy.java index 478957de6..387a35550 100644 --- a/src/main/java/com/gmail/nossr50/skills/alchemy/Alchemy.java +++ b/src/main/java/com/gmail/nossr50/skills/alchemy/Alchemy.java @@ -1,10 +1,7 @@ package com.gmail.nossr50.skills.alchemy; -import com.gmail.nossr50.config.AdvancedConfig; -import com.gmail.nossr50.datatypes.skills.SubSkillType; import com.gmail.nossr50.mcMMO; import com.gmail.nossr50.runnables.skills.AlchemyBrewTask; -import com.gmail.nossr50.util.skills.RankUtils; import org.bukkit.Location; import java.util.ArrayList; @@ -43,18 +40,17 @@ public final class Alchemy { } protected int getLevel() { - return AdvancedConfig.getInstance().getConcoctionsTierLevel(this); + return mcMMO.p.getAdvancedConfig().getConcoctionsTierLevel(this); } }*/ public static final int INGREDIENT_SLOT = 3; - public static int catalysisUnlockLevel = RankUtils.getUnlockLevel(SubSkillType.ALCHEMY_CATALYSIS); - public static int catalysisMaxBonusLevel = AdvancedConfig.getInstance().getCatalysisMaxBonusLevel(); - public static double catalysisMinSpeed = AdvancedConfig.getInstance().getCatalysisMinSpeed(); - public static double catalysisMaxSpeed = AdvancedConfig.getInstance().getCatalysisMaxSpeed(); + public static int catalysisMaxBonusLevel = mcMMO.p.getAdvancedConfig().getCatalysisMaxBonusLevel(); + public static double catalysisMinSpeed = mcMMO.p.getAdvancedConfig().getCatalysisMinSpeed(); + public static double catalysisMaxSpeed = mcMMO.p.getAdvancedConfig().getCatalysisMaxSpeed(); - public static Map brewingStandMap = new HashMap(); + public static Map brewingStandMap = new HashMap<>(); private Alchemy() {} @@ -64,9 +60,7 @@ public final class Alchemy { public static void finishAllBrews() { mcMMO.p.debug("Completing " + brewingStandMap.size() + " unfinished Alchemy brews."); - List toFinish = new ArrayList(); - - toFinish.addAll(brewingStandMap.values()); + List toFinish = new ArrayList<>(brewingStandMap.values()); for (AlchemyBrewTask alchemyBrewTask : toFinish) { alchemyBrewTask.finishImmediately(); diff --git a/src/main/java/com/gmail/nossr50/skills/alchemy/AlchemyManager.java b/src/main/java/com/gmail/nossr50/skills/alchemy/AlchemyManager.java index 01c8e7665..16b1dd2ac 100644 --- a/src/main/java/com/gmail/nossr50/skills/alchemy/AlchemyManager.java +++ b/src/main/java/com/gmail/nossr50/skills/alchemy/AlchemyManager.java @@ -9,8 +9,8 @@ import com.gmail.nossr50.datatypes.skills.PrimarySkillType; import com.gmail.nossr50.datatypes.skills.SubSkillType; import com.gmail.nossr50.datatypes.skills.alchemy.PotionStage; import com.gmail.nossr50.skills.SkillManager; -import com.gmail.nossr50.util.StringUtils; import com.gmail.nossr50.util.skills.RankUtils; +import com.gmail.nossr50.util.text.StringUtils; import org.bukkit.inventory.ItemStack; import java.util.List; @@ -45,11 +45,11 @@ public class AlchemyManager extends SkillManager { public double calculateBrewSpeed(boolean isLucky) { int skillLevel = getSkillLevel(); - if (skillLevel < Alchemy.catalysisUnlockLevel) { + if (skillLevel < RankUtils.getUnlockLevel(SubSkillType.ALCHEMY_CATALYSIS)) { return Alchemy.catalysisMinSpeed; } - return Math.min(Alchemy.catalysisMaxSpeed, Alchemy.catalysisMinSpeed + (Alchemy.catalysisMaxSpeed - Alchemy.catalysisMinSpeed) * (skillLevel - Alchemy.catalysisUnlockLevel) / (Alchemy.catalysisMaxBonusLevel - Alchemy.catalysisUnlockLevel)) * (isLucky ? LUCKY_MODIFIER : 1.0); + return Math.min(Alchemy.catalysisMaxSpeed, Alchemy.catalysisMinSpeed + (Alchemy.catalysisMaxSpeed - Alchemy.catalysisMinSpeed) * (skillLevel - RankUtils.getUnlockLevel(SubSkillType.ALCHEMY_CATALYSIS)) / (Alchemy.catalysisMaxBonusLevel - RankUtils.getUnlockLevel(SubSkillType.ALCHEMY_CATALYSIS))) * (isLucky ? LUCKY_MODIFIER : 1.0); } public void handlePotionBrewSuccesses(PotionStage potionStage, int amount) { diff --git a/src/main/java/com/gmail/nossr50/skills/alchemy/AlchemyPotionBrewer.java b/src/main/java/com/gmail/nossr50/skills/alchemy/AlchemyPotionBrewer.java index f6b42c285..116fe64e6 100644 --- a/src/main/java/com/gmail/nossr50/skills/alchemy/AlchemyPotionBrewer.java +++ b/src/main/java/com/gmail/nossr50/skills/alchemy/AlchemyPotionBrewer.java @@ -22,6 +22,7 @@ import org.bukkit.inventory.InventoryView; import org.bukkit.inventory.ItemStack; import java.util.ArrayList; +import java.util.Collections; import java.util.List; public final class AlchemyPotionBrewer { @@ -56,19 +57,19 @@ public final class AlchemyPotionBrewer { } private static void removeIngredient(BrewerInventory inventory, Player player) { - ItemStack ingredient = inventory.getIngredient() == null ? null : inventory.getIngredient().clone(); + if(inventory.getIngredient() == null) + return; - if (isEmpty(ingredient) || !isValidIngredient(player, ingredient)) { - return; - } - else if (ingredient.getAmount() <= 1) { - inventory.setIngredient(null); - return; - } - else { - ingredient.setAmount(ingredient.getAmount() - 1); - inventory.setIngredient(ingredient); - return; + ItemStack ingredient = inventory.getIngredient().clone(); + + if (!isEmpty(ingredient) && isValidIngredient(player, ingredient)) { + if (ingredient.getAmount() <= 1) { + inventory.setIngredient(null); + } + else { + ingredient.setAmount(ingredient.getAmount() - 1); + inventory.setIngredient(ingredient); + } } } @@ -113,7 +114,8 @@ public final class AlchemyPotionBrewer { return; } - List inputList = new ArrayList(); + List inputList = new ArrayList<>(Collections.nCopies(3, null)); + List outputList = new ArrayList<>(Collections.nCopies(3, null)); for (int i = 0; i < 3; i++) { ItemStack item = inventory.getItem(i); @@ -125,23 +127,31 @@ public final class AlchemyPotionBrewer { AlchemyPotion input = PotionConfig.getInstance().getPotion(item); AlchemyPotion output = input.getChild(ingredient); - inputList.add(input); + inputList.set(i, input); if (output != null) { - inventory.setItem(i, output.toItemStack(item.getAmount()).clone()); + outputList.set(i, output.toItemStack(item.getAmount()).clone()); } } - FakeBrewEvent event = new FakeBrewEvent(brewingStand.getBlock(), inventory, ((BrewingStand) brewingStand).getFuelLevel()); + FakeBrewEvent event = new FakeBrewEvent(brewingStand.getBlock(), inventory, outputList, ((BrewingStand) brewingStand).getFuelLevel()); mcMMO.p.getServer().getPluginManager().callEvent(event); if (event.isCancelled() || inputList.isEmpty()) { return; } + for (int i = 0; i < 3; i++) { + if(outputList.get(i) != null) { + inventory.setItem(i, outputList.get(i)); + } + } + removeIngredient(inventory, player); for (AlchemyPotion input : inputList) { + if (input == null) continue; + AlchemyPotion output = input.getChild(ingredient); if (output != null && player != null) { diff --git a/src/main/java/com/gmail/nossr50/skills/archery/Archery.java b/src/main/java/com/gmail/nossr50/skills/archery/Archery.java index 9d3634e46..3ad317287 100644 --- a/src/main/java/com/gmail/nossr50/skills/archery/Archery.java +++ b/src/main/java/com/gmail/nossr50/skills/archery/Archery.java @@ -1,25 +1,27 @@ package com.gmail.nossr50.skills.archery; -import com.gmail.nossr50.config.AdvancedConfig; +import com.gmail.nossr50.api.ItemSpawnReason; import com.gmail.nossr50.config.experience.ExperienceConfig; import com.gmail.nossr50.datatypes.skills.SubSkillType; +import com.gmail.nossr50.mcMMO; import com.gmail.nossr50.util.Misc; import com.gmail.nossr50.util.skills.RankUtils; import org.bukkit.Material; import org.bukkit.entity.LivingEntity; import org.bukkit.entity.Player; import org.bukkit.inventory.ItemStack; +import org.jetbrains.annotations.NotNull; import java.util.ArrayList; import java.util.Iterator; import java.util.List; public class Archery { - private static List trackedEntities = new ArrayList(); + private static final List trackedEntities = new ArrayList<>(); - public static double skillShotMaxBonusDamage = AdvancedConfig.getInstance().getSkillShotDamageMax(); + public static double skillShotMaxBonusDamage = mcMMO.p.getAdvancedConfig().getSkillShotDamageMax(); - public static double dazeBonusDamage = AdvancedConfig.getInstance().getDazeBonusDamage(); + public static double dazeBonusDamage = mcMMO.p.getAdvancedConfig().getDazeBonusDamage(); public static final double DISTANCE_XP_MULTIPLIER = ExperienceConfig.getInstance().getArcheryDistanceMultiplier(); @@ -50,12 +52,12 @@ public class Archery { * * @param livingEntity The entity hit by the arrows */ - public static void arrowRetrievalCheck(LivingEntity livingEntity) { + public static void arrowRetrievalCheck(@NotNull LivingEntity livingEntity) { for (Iterator entityIterator = trackedEntities.iterator(); entityIterator.hasNext();) { TrackedEntity trackedEntity = entityIterator.next(); if (trackedEntity.getID() == livingEntity.getUniqueId()) { - Misc.dropItems(livingEntity.getLocation(), new ItemStack(Material.ARROW), trackedEntity.getArrowCount()); + Misc.spawnItems(null, livingEntity.getLocation(), new ItemStack(Material.ARROW), trackedEntity.getArrowCount(), ItemSpawnReason.ARROW_RETRIEVAL_ACTIVATED); entityIterator.remove(); return; } @@ -70,6 +72,6 @@ public class Archery { } public static double getDamageBonusPercent(Player player) { - return ((RankUtils.getRank(player, SubSkillType.ARCHERY_SKILL_SHOT)) * (AdvancedConfig.getInstance().getSkillShotRankDamageMultiplier()) / 100.0D); + return ((RankUtils.getRank(player, SubSkillType.ARCHERY_SKILL_SHOT)) * (mcMMO.p.getAdvancedConfig().getSkillShotRankDamageMultiplier()) / 100.0D); } } diff --git a/src/main/java/com/gmail/nossr50/skills/archery/ArcheryManager.java b/src/main/java/com/gmail/nossr50/skills/archery/ArcheryManager.java index 91f9f9588..29b03457e 100644 --- a/src/main/java/com/gmail/nossr50/skills/archery/ArcheryManager.java +++ b/src/main/java/com/gmail/nossr50/skills/archery/ArcheryManager.java @@ -6,6 +6,7 @@ import com.gmail.nossr50.datatypes.skills.PrimarySkillType; import com.gmail.nossr50.datatypes.skills.SubSkillType; import com.gmail.nossr50.mcMMO; import com.gmail.nossr50.skills.SkillManager; +import com.gmail.nossr50.util.MetadataConstants; import com.gmail.nossr50.util.Misc; import com.gmail.nossr50.util.Permissions; import com.gmail.nossr50.util.player.NotificationManager; @@ -50,16 +51,19 @@ public class ArcheryManager extends SkillManager { * Calculate bonus XP awarded for Archery when hitting a far-away target. * * @param target The {@link LivingEntity} damaged by the arrow - * @param damager The {@link Entity} who shot the arrow + * @param arrow The {@link Entity} who shot the arrow */ - public double distanceXpBonusMultiplier(LivingEntity target, Entity damager) { + public double distanceXpBonusMultiplier(LivingEntity target, Entity arrow) { //Hacky Fix - some plugins spawn arrows and assign them to players after the ProjectileLaunchEvent fires - if(!damager.hasMetadata(mcMMO.arrowDistanceKey)) - return damager.getLocation().distance(target.getLocation()); + if(!arrow.hasMetadata(MetadataConstants.METADATA_KEY_ARROW_DISTANCE)) + return 1; - Location firedLocation = (Location) damager.getMetadata(mcMMO.arrowDistanceKey).get(0).value(); + Location firedLocation = (Location) arrow.getMetadata(MetadataConstants.METADATA_KEY_ARROW_DISTANCE).get(0).value(); Location targetLocation = target.getLocation(); + if(firedLocation == null || firedLocation.getWorld() == null) + return 1; + if (firedLocation.getWorld() != targetLocation.getWorld()) { return 1; } @@ -73,9 +77,9 @@ public class ArcheryManager extends SkillManager { * @param target The {@link LivingEntity} damaged by the arrow */ public void retrieveArrows(LivingEntity target, Projectile projectile) { - if(projectile.hasMetadata(mcMMO.trackedArrow)) { + if(projectile.hasMetadata(MetadataConstants.METADATA_KEY_TRACKED_ARROW)) { Archery.incrementTrackerValue(target); - projectile.removeMetadata(mcMMO.trackedArrow, mcMMO.p); //Only 1 entity per projectile + projectile.removeMetadata(MetadataConstants.METADATA_KEY_TRACKED_ARROW, mcMMO.p); //Only 1 entity per projectile } } @@ -100,7 +104,7 @@ public class ArcheryManager extends SkillManager { NotificationManager.sendPlayerInformation(defender, NotificationType.SUBSKILL_MESSAGE, "Combat.TouchedFuzzy"); } - if (mcMMOPlayer.useChatNotifications()) { + if (mmoPlayer.useChatNotifications()) { NotificationManager.sendPlayerInformation(getPlayer(), NotificationType.SUBSKILL_MESSAGE, "Combat.TargetDazed"); } diff --git a/src/main/java/com/gmail/nossr50/skills/archery/TrackedEntity.java b/src/main/java/com/gmail/nossr50/skills/archery/TrackedEntity.java index 851a007df..8cc97cc29 100644 --- a/src/main/java/com/gmail/nossr50/skills/archery/TrackedEntity.java +++ b/src/main/java/com/gmail/nossr50/skills/archery/TrackedEntity.java @@ -7,8 +7,8 @@ import org.bukkit.scheduler.BukkitRunnable; import java.util.UUID; public class TrackedEntity extends BukkitRunnable { - private LivingEntity livingEntity; - private UUID id; + private final LivingEntity livingEntity; + private final UUID id; private int arrowCount; protected TrackedEntity(LivingEntity livingEntity) { diff --git a/src/main/java/com/gmail/nossr50/skills/axes/Axes.java b/src/main/java/com/gmail/nossr50/skills/axes/Axes.java index 939d175bd..47d95be3f 100644 --- a/src/main/java/com/gmail/nossr50/skills/axes/Axes.java +++ b/src/main/java/com/gmail/nossr50/skills/axes/Axes.java @@ -1,7 +1,7 @@ package com.gmail.nossr50.skills.axes; -import com.gmail.nossr50.config.AdvancedConfig; import com.gmail.nossr50.datatypes.skills.SubSkillType; +import com.gmail.nossr50.mcMMO; import com.gmail.nossr50.util.ItemUtils; import com.gmail.nossr50.util.skills.RankUtils; import org.bukkit.entity.LivingEntity; @@ -9,22 +9,28 @@ import org.bukkit.entity.Player; import org.bukkit.inventory.ItemStack; public class Axes { - public static double axeMasteryRankDamageMultiplier = AdvancedConfig.getInstance().getAxeMasteryRankDamageMultiplier(); + public static double axeMasteryRankDamageMultiplier = mcMMO.p.getAdvancedConfig().getAxeMasteryRankDamageMultiplier(); - public static double criticalHitPVPModifier = AdvancedConfig.getInstance().getCriticalStrikesPVPModifier(); - public static double criticalHitPVEModifier = AdvancedConfig.getInstance().getCriticalStrikesPVEModifier(); + public static double criticalHitPVPModifier = mcMMO.p.getAdvancedConfig().getCriticalStrikesPVPModifier(); + public static double criticalHitPVEModifier = mcMMO.p.getAdvancedConfig().getCriticalStrikesPVEModifier(); - public static double impactChance = AdvancedConfig.getInstance().getImpactChance(); + public static double impactChance = mcMMO.p.getAdvancedConfig().getImpactChance(); - public static double greaterImpactBonusDamage = AdvancedConfig.getInstance().getGreaterImpactBonusDamage(); - public static double greaterImpactChance = AdvancedConfig.getInstance().getGreaterImpactChance(); - public static double greaterImpactKnockbackMultiplier = AdvancedConfig.getInstance().getGreaterImpactModifier(); + public static double greaterImpactBonusDamage = mcMMO.p.getAdvancedConfig().getGreaterImpactBonusDamage(); + public static double greaterImpactChance = mcMMO.p.getAdvancedConfig().getGreaterImpactChance(); + public static double greaterImpactKnockbackMultiplier = mcMMO.p.getAdvancedConfig().getGreaterImpactModifier(); - public static double skullSplitterModifier = AdvancedConfig.getInstance().getSkullSplitterModifier(); + public static double skullSplitterModifier = mcMMO.p.getAdvancedConfig().getSkullSplitterModifier(); protected static boolean hasArmor(LivingEntity target) { + if(target == null || !target.isValid() || target.getEquipment() == null) + return false; + for (ItemStack itemStack : target.getEquipment().getArmorContents()) { - if (itemStack != null && ItemUtils.isArmor(itemStack)) { + if(itemStack == null) + continue; + + if (ItemUtils.isArmor(itemStack)) { return true; } } diff --git a/src/main/java/com/gmail/nossr50/skills/axes/AxesManager.java b/src/main/java/com/gmail/nossr50/skills/axes/AxesManager.java index abff849b8..8f28f6ac8 100644 --- a/src/main/java/com/gmail/nossr50/skills/axes/AxesManager.java +++ b/src/main/java/com/gmail/nossr50/skills/axes/AxesManager.java @@ -1,12 +1,12 @@ package com.gmail.nossr50.skills.axes; -import com.gmail.nossr50.config.AdvancedConfig; import com.gmail.nossr50.datatypes.interactions.NotificationType; import com.gmail.nossr50.datatypes.player.McMMOPlayer; import com.gmail.nossr50.datatypes.skills.PrimarySkillType; import com.gmail.nossr50.datatypes.skills.SubSkillType; import com.gmail.nossr50.datatypes.skills.SuperAbilityType; import com.gmail.nossr50.datatypes.skills.ToolType; +import com.gmail.nossr50.mcMMO; import com.gmail.nossr50.skills.SkillManager; import com.gmail.nossr50.util.ItemUtils; import com.gmail.nossr50.util.Permissions; @@ -17,6 +17,7 @@ import org.bukkit.entity.LivingEntity; import org.bukkit.entity.Player; import org.bukkit.event.entity.EntityDamageEvent.DamageModifier; import org.bukkit.inventory.ItemStack; +import org.jetbrains.annotations.NotNull; import java.util.Map; @@ -32,43 +33,43 @@ public class AxesManager extends SkillManager { return Permissions.isSubSkillEnabled(getPlayer(), SubSkillType.AXES_AXE_MASTERY); } - public boolean canCriticalHit(LivingEntity target) { + public boolean canCriticalHit(@NotNull LivingEntity target) { if(!RankUtils.hasUnlockedSubskill(getPlayer(), SubSkillType.AXES_CRITICAL_STRIKES)) return false; return target.isValid() && Permissions.isSubSkillEnabled(getPlayer(), SubSkillType.AXES_CRITICAL_STRIKES); } - public boolean canImpact(LivingEntity target) { + public boolean canImpact(@NotNull LivingEntity target) { if(!RankUtils.hasUnlockedSubskill(getPlayer(), SubSkillType.AXES_ARMOR_IMPACT)) return false; return target.isValid() && Permissions.isSubSkillEnabled(getPlayer(), SubSkillType.AXES_ARMOR_IMPACT) && Axes.hasArmor(target); } - public boolean canGreaterImpact(LivingEntity target) { + public boolean canGreaterImpact(@NotNull LivingEntity target) { if(!RankUtils.hasUnlockedSubskill(getPlayer(), SubSkillType.AXES_GREATER_IMPACT)) return false; return target.isValid() && Permissions.isSubSkillEnabled(getPlayer(), SubSkillType.AXES_GREATER_IMPACT) && !Axes.hasArmor(target); } - public boolean canUseSkullSplitter(LivingEntity target) { + public boolean canUseSkullSplitter(@NotNull LivingEntity target) { if(!RankUtils.hasUnlockedSubskill(getPlayer(), SubSkillType.AXES_SKULL_SPLITTER)) return false; - return target.isValid() && mcMMOPlayer.getAbilityMode(SuperAbilityType.SKULL_SPLITTER) && Permissions.skullSplitter(getPlayer()); + return target.isValid() && mmoPlayer.getAbilityMode(SuperAbilityType.SKULL_SPLITTER) && Permissions.skullSplitter(getPlayer()); } public boolean canActivateAbility() { - return mcMMOPlayer.getToolPreparationMode(ToolType.AXE) && Permissions.skullSplitter(getPlayer()); + return mmoPlayer.getToolPreparationMode(ToolType.AXE) && Permissions.skullSplitter(getPlayer()); } /** * Handle the effects of the Axe Mastery ability */ public double axeMastery() { - if (!RandomChanceUtil.isActivationSuccessful(SkillActivationType.ALWAYS_FIRES, SubSkillType.AXES_AXE_MASTERY, getPlayer(), mcMMOPlayer.getAttackStrength())) { + if (!RandomChanceUtil.isActivationSuccessful(SkillActivationType.ALWAYS_FIRES, SubSkillType.AXES_AXE_MASTERY, getPlayer())) { return 0; } @@ -82,13 +83,13 @@ public class AxesManager extends SkillManager { * @param damage The amount of damage initially dealt by the event */ public double criticalHit(LivingEntity target, double damage) { - if (!RandomChanceUtil.isActivationSuccessful(SkillActivationType.RANDOM_LINEAR_100_SCALE_WITH_CAP, SubSkillType.AXES_CRITICAL_STRIKES, getPlayer(), mcMMOPlayer.getAttackStrength())) { + if (!RandomChanceUtil.isActivationSuccessful(SkillActivationType.RANDOM_LINEAR_100_SCALE_WITH_CAP, SubSkillType.AXES_CRITICAL_STRIKES, getPlayer())) { return 0; } Player player = getPlayer(); - if (mcMMOPlayer.useChatNotifications()) { + if (mmoPlayer.useChatNotifications()) { NotificationManager.sendPlayerInformation(player, NotificationType.SUBSKILL_MESSAGE, "Axes.Combat.CriticalHit"); } @@ -113,20 +114,20 @@ public class AxesManager extends SkillManager { * * @param target The {@link LivingEntity} being affected by Impact */ - public void impactCheck(LivingEntity target) { + public void impactCheck(@NotNull LivingEntity target) { double durabilityDamage = getImpactDurabilityDamage(); for (ItemStack armor : target.getEquipment().getArmorContents()) { if (armor != null && ItemUtils.isArmor(armor)) { - if (RandomChanceUtil.isActivationSuccessful(SkillActivationType.RANDOM_STATIC_CHANCE, SubSkillType.AXES_ARMOR_IMPACT, getPlayer(), mcMMOPlayer.getAttackStrength())) { - SkillUtils.handleDurabilityChange(armor, durabilityDamage, 1); + if (RandomChanceUtil.isActivationSuccessful(SkillActivationType.RANDOM_STATIC_CHANCE, SubSkillType.AXES_ARMOR_IMPACT, getPlayer())) { + SkillUtils.handleArmorDurabilityChange(armor, durabilityDamage, 1); } } } } public double getImpactDurabilityDamage() { - return AdvancedConfig.getInstance().getImpactDurabilityDamageMultiplier() * RankUtils.getRank(getPlayer(), SubSkillType.AXES_ARMOR_IMPACT); + return mcMMO.p.getAdvancedConfig().getImpactDurabilityDamageMultiplier() * RankUtils.getRank(getPlayer(), SubSkillType.AXES_ARMOR_IMPACT); } /** @@ -134,9 +135,9 @@ public class AxesManager extends SkillManager { * * @param target The {@link LivingEntity} being affected by the ability */ - public double greaterImpact(LivingEntity target) { + public double greaterImpact(@NotNull LivingEntity target) { //static chance (3rd param) - if (!RandomChanceUtil.isActivationSuccessful(SkillActivationType.RANDOM_STATIC_CHANCE, SubSkillType.AXES_GREATER_IMPACT, getPlayer(), mcMMOPlayer.getAttackStrength())) { + if (!RandomChanceUtil.isActivationSuccessful(SkillActivationType.RANDOM_STATIC_CHANCE, SubSkillType.AXES_GREATER_IMPACT, getPlayer())) { return 0; } @@ -145,7 +146,7 @@ public class AxesManager extends SkillManager { ParticleEffectUtils.playGreaterImpactEffect(target); target.setVelocity(player.getLocation().getDirection().normalize().multiply(Axes.greaterImpactKnockbackMultiplier)); - if (mcMMOPlayer.useChatNotifications()) { + if (mmoPlayer.useChatNotifications()) { NotificationManager.sendPlayerInformation(player, NotificationType.SUBSKILL_MESSAGE, "Axes.Combat.GI.Proc"); } @@ -166,7 +167,7 @@ public class AxesManager extends SkillManager { * @param target The {@link LivingEntity} being affected by the ability * @param damage The amount of damage initially dealt by the event */ - public void skullSplitterCheck(LivingEntity target, double damage, Map modifiers) { + public void skullSplitterCheck(@NotNull LivingEntity target, double damage, Map modifiers) { CombatUtils.applyAbilityAoE(getPlayer(), target, damage / Axes.skullSplitterModifier, modifiers, skill); } } diff --git a/src/main/java/com/gmail/nossr50/skills/child/ChildConfig.java b/src/main/java/com/gmail/nossr50/skills/child/ChildConfig.java index a2cf127a8..c3d99ffc4 100644 --- a/src/main/java/com/gmail/nossr50/skills/child/ChildConfig.java +++ b/src/main/java/com/gmail/nossr50/skills/child/ChildConfig.java @@ -1,27 +1,33 @@ package com.gmail.nossr50.skills.child; -import com.gmail.nossr50.config.AutoUpdateConfigLoader; +import com.gmail.nossr50.config.BukkitConfig; import com.gmail.nossr50.datatypes.skills.PrimarySkillType; -import com.gmail.nossr50.util.StringUtils; +import com.gmail.nossr50.mcMMO; +import com.gmail.nossr50.util.text.StringUtils; import org.bukkit.configuration.file.YamlConfiguration; import java.util.EnumSet; import java.util.Locale; -public class ChildConfig extends AutoUpdateConfigLoader { +public class ChildConfig extends BukkitConfig { public ChildConfig() { super("child.yml"); loadKeys(); } + @Override + protected void validateConfigKeys() { + //TODO: Rewrite legacy validation code + } + @Override protected void loadKeys() { - config.setDefaults(YamlConfiguration.loadConfiguration(plugin.getResourceAsReader("child.yml"))); + config.setDefaults(YamlConfiguration.loadConfiguration(mcMMO.p.getResourceAsReader("child.yml"))); FamilyTree.clearRegistrations(); // when reloading, need to clear statics - for (PrimarySkillType skill : PrimarySkillType.CHILD_SKILLS) { - plugin.debug("Finding parents of " + skill.name()); + for (PrimarySkillType skill : mcMMO.p.getSkillTools().CHILD_SKILLS) { + mcMMO.p.debug("Finding parents of " + skill.name()); EnumSet parentSkills = EnumSet.noneOf(PrimarySkillType.class); boolean useDefaults = false; // If we had an error we back out and use defaults @@ -33,7 +39,7 @@ public class ChildConfig extends AutoUpdateConfigLoader { parentSkills.add(parentSkill); } catch (IllegalArgumentException ex) { - plugin.getLogger().warning(name + " is not a valid skill type, or is a child skill!"); + mcMMO.p.getLogger().warning(name + " is not a valid skill type, or is a child skill!"); useDefaults = true; break; } @@ -52,7 +58,7 @@ public class ChildConfig extends AutoUpdateConfigLoader { // Register them for (PrimarySkillType parentSkill : parentSkills) { - plugin.debug("Registering " + parentSkill.name() + " as parent of " + skill.name()); + mcMMO.p.debug("Registering " + parentSkill.name() + " as parent of " + skill.name()); FamilyTree.registerParent(skill, parentSkill); } } diff --git a/src/main/java/com/gmail/nossr50/skills/child/FamilyTree.java b/src/main/java/com/gmail/nossr50/skills/child/FamilyTree.java index 72ecbe530..0be533600 100644 --- a/src/main/java/com/gmail/nossr50/skills/child/FamilyTree.java +++ b/src/main/java/com/gmail/nossr50/skills/child/FamilyTree.java @@ -1,6 +1,7 @@ package com.gmail.nossr50.skills.child; import com.gmail.nossr50.datatypes.skills.PrimarySkillType; +import com.gmail.nossr50.util.skills.SkillTools; import java.util.Collections; import java.util.EnumSet; @@ -8,7 +9,7 @@ import java.util.HashMap; import java.util.Set; public class FamilyTree { - private static HashMap> tree = new HashMap>(); + private static final HashMap> tree = new HashMap<>(); public static Set getParents(PrimarySkillType childSkill) { enforceChildSkill(childSkill); @@ -40,13 +41,13 @@ public class FamilyTree { } protected static void enforceChildSkill(PrimarySkillType skill) { - if (!skill.isChildSkill()) { + if (!SkillTools.isChildSkill(skill)) { throw new IllegalArgumentException(skill.name() + " is not a child skill!"); } } protected static void enforceNotChildSkill(PrimarySkillType skill) { - if (skill.isChildSkill()) { + if (SkillTools.isChildSkill(skill)) { throw new IllegalArgumentException(skill.name() + " is a child skill!"); } } diff --git a/src/main/java/com/gmail/nossr50/skills/excavation/Excavation.java b/src/main/java/com/gmail/nossr50/skills/excavation/Excavation.java index 86580a944..aa6209e80 100644 --- a/src/main/java/com/gmail/nossr50/skills/excavation/Excavation.java +++ b/src/main/java/com/gmail/nossr50/skills/excavation/Excavation.java @@ -5,7 +5,7 @@ import com.gmail.nossr50.config.treasure.TreasureConfig; import com.gmail.nossr50.datatypes.skills.PrimarySkillType; import com.gmail.nossr50.datatypes.treasure.ExcavationTreasure; import com.gmail.nossr50.mcMMO; -import com.gmail.nossr50.util.StringUtils; +import com.gmail.nossr50.util.text.StringUtils; import org.bukkit.block.BlockState; import java.util.ArrayList; @@ -22,7 +22,7 @@ public class Excavation { String friendly = StringUtils.getFriendlyConfigBlockDataString(blockState.getBlockData()); if (TreasureConfig.getInstance().excavationMap.containsKey(friendly)) return TreasureConfig.getInstance().excavationMap.get(friendly); - return new ArrayList(); + return new ArrayList<>(); } protected static int getBlockXP(BlockState blockState) { diff --git a/src/main/java/com/gmail/nossr50/skills/excavation/ExcavationManager.java b/src/main/java/com/gmail/nossr50/skills/excavation/ExcavationManager.java index 994d84866..876634b46 100644 --- a/src/main/java/com/gmail/nossr50/skills/excavation/ExcavationManager.java +++ b/src/main/java/com/gmail/nossr50/skills/excavation/ExcavationManager.java @@ -1,11 +1,12 @@ package com.gmail.nossr50.skills.excavation; -import com.gmail.nossr50.config.Config; +import com.gmail.nossr50.api.ItemSpawnReason; import com.gmail.nossr50.datatypes.experience.XPGainReason; import com.gmail.nossr50.datatypes.player.McMMOPlayer; import com.gmail.nossr50.datatypes.skills.PrimarySkillType; import com.gmail.nossr50.datatypes.skills.SubSkillType; import com.gmail.nossr50.datatypes.treasure.ExcavationTreasure; +import com.gmail.nossr50.mcMMO; import com.gmail.nossr50.skills.SkillManager; import com.gmail.nossr50.util.Misc; import com.gmail.nossr50.util.Permissions; @@ -14,8 +15,6 @@ import com.gmail.nossr50.util.skills.RankUtils; import com.gmail.nossr50.util.skills.SkillUtils; import org.bukkit.Location; import org.bukkit.block.BlockState; -import org.bukkit.entity.EntityType; -import org.bukkit.entity.ExperienceOrb; import org.bukkit.entity.Player; import java.util.List; @@ -46,12 +45,11 @@ public class ExcavationManager extends SkillManager { //Spawn Vanilla XP orbs if a dice roll succeeds if(RandomChanceUtil.rollDice(getArchaelogyExperienceOrbChance(), 100)) { - ExperienceOrb experienceOrb = (ExperienceOrb) getPlayer().getWorld().spawnEntity(location, EntityType.EXPERIENCE_ORB); - experienceOrb.setExperience(getExperienceOrbsReward()); + Misc.spawnExperienceOrb(location, getExperienceOrbsReward()); } xp += treasure.getXp(); - Misc.dropItem(location, treasure.getDrop()); + Misc.spawnItem(getPlayer(), location, treasure.getDrop(), ItemSpawnReason.EXCAVATION_TREASURE); } } } @@ -61,7 +59,7 @@ public class ExcavationManager extends SkillManager { } public int getExperienceOrbsReward() { - return 1 * getArchaeologyRank(); + return getArchaeologyRank(); } public double getArchaelogyExperienceOrbChance() { @@ -100,6 +98,6 @@ public class ExcavationManager extends SkillManager { excavationBlockCheck(blockState); excavationBlockCheck(blockState); - SkillUtils.handleDurabilityChange(getPlayer().getInventory().getItemInMainHand(), Config.getInstance().getAbilityToolDamage()); + SkillUtils.handleDurabilityChange(getPlayer().getInventory().getItemInMainHand(), mcMMO.p.getGeneralConfig().getAbilityToolDamage()); } } diff --git a/src/main/java/com/gmail/nossr50/skills/fishing/Fishing.java b/src/main/java/com/gmail/nossr50/skills/fishing/Fishing.java index 8b52bf894..965b9c924 100644 --- a/src/main/java/com/gmail/nossr50/skills/fishing/Fishing.java +++ b/src/main/java/com/gmail/nossr50/skills/fishing/Fishing.java @@ -1,6 +1,6 @@ package com.gmail.nossr50.skills.fishing; -import com.gmail.nossr50.config.treasure.TreasureConfig; +import com.gmail.nossr50.config.treasure.FishingTreasureConfig; import com.gmail.nossr50.datatypes.treasure.ShakeTreasure; import com.gmail.nossr50.util.Misc; import com.gmail.nossr50.util.adapter.BiomeAdapter; @@ -16,7 +16,7 @@ import java.util.Set; public final class Fishing { - protected static final HashMap> ENCHANTABLE_CACHE = new HashMap>(); + protected static final HashMap> ENCHANTABLE_CACHE = new HashMap<>(); public static Set masterAnglerBiomes = BiomeAdapter.WATER_BIOMES; public static Set iceFishingBiomes = BiomeAdapter.ICE_BIOMES; @@ -31,8 +31,8 @@ public final class Fishing { * @return possibleDrops List of ItemStack that can be dropped */ protected static List findPossibleDrops(LivingEntity target) { - if (TreasureConfig.getInstance().shakeMap.containsKey(target.getType())) - return TreasureConfig.getInstance().shakeMap.get(target.getType()); + if (FishingTreasureConfig.getInstance().shakeMap.containsKey(target.getType())) + return FishingTreasureConfig.getInstance().shakeMap.get(target.getType()); return null; } diff --git a/src/main/java/com/gmail/nossr50/skills/fishing/FishingManager.java b/src/main/java/com/gmail/nossr50/skills/fishing/FishingManager.java index add636f12..a0f4f014a 100644 --- a/src/main/java/com/gmail/nossr50/skills/fishing/FishingManager.java +++ b/src/main/java/com/gmail/nossr50/skills/fishing/FishingManager.java @@ -1,32 +1,29 @@ package com.gmail.nossr50.skills.fishing; -import com.gmail.nossr50.config.AdvancedConfig; -import com.gmail.nossr50.config.Config; +import com.gmail.nossr50.api.ItemSpawnReason; import com.gmail.nossr50.config.experience.ExperienceConfig; -import com.gmail.nossr50.config.treasure.TreasureConfig; +import com.gmail.nossr50.config.treasure.FishingTreasureConfig; import com.gmail.nossr50.datatypes.experience.XPGainReason; import com.gmail.nossr50.datatypes.interactions.NotificationType; import com.gmail.nossr50.datatypes.player.McMMOPlayer; import com.gmail.nossr50.datatypes.skills.PrimarySkillType; import com.gmail.nossr50.datatypes.skills.SubSkillType; -import com.gmail.nossr50.datatypes.treasure.EnchantmentTreasure; -import com.gmail.nossr50.datatypes.treasure.FishingTreasure; -import com.gmail.nossr50.datatypes.treasure.Rarity; -import com.gmail.nossr50.datatypes.treasure.ShakeTreasure; +import com.gmail.nossr50.datatypes.treasure.*; import com.gmail.nossr50.events.skills.fishing.McMMOPlayerFishingTreasureEvent; import com.gmail.nossr50.events.skills.fishing.McMMOPlayerShakeEvent; import com.gmail.nossr50.locale.LocaleLoader; import com.gmail.nossr50.mcMMO; +import com.gmail.nossr50.runnables.skills.MasterAnglerTask; import com.gmail.nossr50.skills.SkillManager; import com.gmail.nossr50.util.*; +import com.gmail.nossr50.util.compat.layers.skills.MasterAnglerCompatibilityLayer; import com.gmail.nossr50.util.player.NotificationManager; import com.gmail.nossr50.util.random.RandomChanceSkillStatic; import com.gmail.nossr50.util.random.RandomChanceUtil; import com.gmail.nossr50.util.skills.CombatUtils; import com.gmail.nossr50.util.skills.RankUtils; import com.gmail.nossr50.util.skills.SkillUtils; -import com.gmail.nossr50.util.sounds.SoundManager; -import com.gmail.nossr50.util.sounds.SoundType; +import org.bukkit.ChatColor; import org.bukkit.Location; import org.bukkit.Material; import org.bukkit.block.Block; @@ -39,12 +36,13 @@ import org.bukkit.inventory.PlayerInventory; import org.bukkit.inventory.meta.SkullMeta; import org.bukkit.util.BoundingBox; import org.bukkit.util.Vector; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; import java.util.*; public class FishingManager extends SkillManager { public static final int FISHING_ROD_CAST_CD_MILLISECONDS = 100; - public static final int OVERFISH_LIMIT = 10; private final long FISHING_COOLDOWN_SECONDS = 1000L; private long fishingRodCastTimestamp = 0L; @@ -66,46 +64,46 @@ public class FishingManager extends SkillManager { } public boolean canMasterAngler() { - return getSkillLevel() >= RankUtils.getUnlockLevel(SubSkillType.FISHING_MASTER_ANGLER) && Permissions.isSubSkillEnabled(getPlayer(), SubSkillType.FISHING_MASTER_ANGLER); + return mcMMO.getCompatibilityManager().getMasterAnglerCompatibilityLayer() != null && getSkillLevel() >= RankUtils.getUnlockLevel(SubSkillType.FISHING_MASTER_ANGLER) && Permissions.isSubSkillEnabled(getPlayer(), SubSkillType.FISHING_MASTER_ANGLER); } - public void setFishingRodCastTimestamp() - { - long currentTime = System.currentTimeMillis(); - //Only track spam casting if the fishing hook is fresh - if(currentTime > fishHookSpawnTimestamp + 1000) - return; - - if(currentTime < fishingRodCastTimestamp + FISHING_ROD_CAST_CD_MILLISECONDS) - { - ItemStack fishingRod = getPlayer().getInventory().getItemInMainHand(); - - //Ensure correct hand item is damaged - if(fishingRod.getType() != Material.FISHING_ROD) { - fishingRod = getPlayer().getInventory().getItemInOffHand(); - } - - getPlayer().setFoodLevel(Math.max(getPlayer().getFoodLevel() - 1, 0)); - fishingRod.setDurability((short) (fishingRod.getDurability() + 5)); - getPlayer().updateInventory(); - - if(lastWarnedExhaust + (1000 * 1) < currentTime) - { - getPlayer().sendMessage(LocaleLoader.getString("Fishing.Exhausting")); - lastWarnedExhaust = currentTime; - SoundManager.sendSound(getPlayer(), getPlayer().getLocation(), SoundType.TIRED); - } - } - - fishingRodCastTimestamp = System.currentTimeMillis(); - } +// public void setFishingRodCastTimestamp() +// { +// long currentTime = System.currentTimeMillis(); +// //Only track spam casting if the fishing hook is fresh +// if(currentTime > fishHookSpawnTimestamp + 1000) +// return; +// +// if(currentTime < fishingRodCastTimestamp + FISHING_ROD_CAST_CD_MILLISECONDS) +// { +// ItemStack fishingRod = getPlayer().getInventory().getItemInMainHand(); +// +// //Ensure correct hand item is damaged +// if(fishingRod.getType() != Material.FISHING_ROD) { +// fishingRod = getPlayer().getInventory().getItemInOffHand(); +// } +// +// getPlayer().setFoodLevel(Math.max(getPlayer().getFoodLevel() - 1, 0)); +// fishingRod.setDurability((short) (fishingRod.getDurability() + 5)); +// getPlayer().updateInventory(); +// +// if(lastWarnedExhaust + (1000) < currentTime) +// { +// getPlayer().sendMessage(LocaleLoader.getString("Fishing.Exhausting")); +// lastWarnedExhaust = currentTime; +// SoundManager.sendSound(getPlayer(), getPlayer().getLocation(), SoundType.TIRED); +// } +// } +// +// fishingRodCastTimestamp = System.currentTimeMillis(); +// } public void setFishHookReference(FishHook fishHook) { - if(fishHook.getMetadata(mcMMO.FISH_HOOK_REF_METAKEY).size() > 0) + if(fishHook.getMetadata(MetadataConstants.METADATA_KEY_FISH_HOOK_REF).size() > 0) return; - fishHook.setMetadata(mcMMO.FISH_HOOK_REF_METAKEY, mcMMO.metadataValue); + fishHook.setMetadata(MetadataConstants.METADATA_KEY_FISH_HOOK_REF, MetadataConstants.MCMMO_METADATA_VALUE); this.fishHookReference = fishHook; fishHookSpawnTimestamp = System.currentTimeMillis(); fishingRodCastTimestamp = System.currentTimeMillis(); @@ -118,7 +116,7 @@ public class FishingManager extends SkillManager { long fishHookSpawnCD = fishHookSpawnTimestamp + 1000; boolean hasFished = (currentTime < fishHookSpawnCD); - if(hasFished && (lastWarned + (1000 * 1) < currentTime)) + if(hasFished && (lastWarned + (1000) < currentTime)) { getPlayer().sendMessage(LocaleLoader.getString("Fishing.Scared")); lastWarned = System.currentTimeMillis(); @@ -144,20 +142,21 @@ public class FishingManager extends SkillManager { else fishCaughtCounter = 1; - if(fishCaughtCounter + 1 == OVERFISH_LIMIT) + if(fishCaughtCounter + 1 == ExperienceConfig.getInstance().getFishingExploitingOptionOverFishLimit()) { - getPlayer().sendMessage(LocaleLoader.getString("Fishing.LowResourcesTip", 3)); + getPlayer().sendMessage(LocaleLoader.getString("Fishing.LowResourcesTip", ExperienceConfig.getInstance().getFishingExploitingOptionMoveRange())); } //If the new bounding box does not intersect with the old one, then update our bounding box reference if(!sameTarget) lastFishingBoundingBox = newCastBoundingBox; - return sameTarget && fishCaughtCounter >= OVERFISH_LIMIT; + return sameTarget && fishCaughtCounter >= ExperienceConfig.getInstance().getFishingExploitingOptionOverFishLimit(); } public static BoundingBox makeBoundingBox(Vector centerOfCastVector) { - return BoundingBox.of(centerOfCastVector, 1, 1, 1); + int exploitingRange = ExperienceConfig.getInstance().getFishingExploitingOptionMoveRange(); + return BoundingBox.of(centerOfCastVector, exploitingRange / 2, 1, exploitingRange / 2); } public void setFishingTarget() { @@ -197,11 +196,11 @@ public class FishingManager extends SkillManager { } public double getShakeChance() { - return AdvancedConfig.getInstance().getShakeChance(getLootTier()); + return mcMMO.p.getAdvancedConfig().getShakeChance(RankUtils.getRank(mmoPlayer.getPlayer(), SubSkillType.FISHING_SHAKE)); } protected int getVanillaXPBoostModifier() { - return AdvancedConfig.getInstance().getFishingVanillaXPModifier(getLootTier()); + return mcMMO.p.getAdvancedConfig().getFishingVanillaXPModifier(getLootTier()); } /** @@ -242,26 +241,130 @@ public class FishingManager extends SkillManager { EventUtils.callFakeFishEvent(getPlayer(), hook); } - public void masterAngler(FishHook hook) { - Player player = getPlayer(); - Location location = hook.getLocation(); - double biteChance = hook.getBiteChance(); - - hookLocation = location; - - if (Fishing.masterAnglerBiomes.contains(location.getBlock().getBiome())) { - biteChance = biteChance * AdvancedConfig.getInstance().getMasterAnglerBiomeModifier(); - } - - if (player.isInsideVehicle() && player.getVehicle().getType() == EntityType.BOAT) { - biteChance = biteChance * AdvancedConfig.getInstance().getMasterAnglerBoatModifier(); - } - - hook.setBiteChance(Math.min(biteChance, 1.0)); + public void masterAngler(@NotNull FishHook hook, int lureLevel) { + new MasterAnglerTask(hook, this, lureLevel).runTaskLater(mcMMO.p, 0); //We run later to get the lure bonus applied } - public boolean isMagicHunterEnabled() - { + /** + * Processes master angler + * Reduced tick time on fish hook, etc + * @param fishHook target fish hook + */ + public void processMasterAngler(@NotNull FishHook fishHook, int lureLevel) { + MasterAnglerCompatibilityLayer masterAnglerCompatibilityLayer = (MasterAnglerCompatibilityLayer) mcMMO.getCompatibilityManager().getMasterAnglerCompatibilityLayer(); + + if(masterAnglerCompatibilityLayer != null) { + int maxWaitTicks = masterAnglerCompatibilityLayer.getMaxWaitTime(fishHook); + int minWaitTicks = masterAnglerCompatibilityLayer.getMinWaitTime(fishHook); + + int masterAnglerRank = RankUtils.getRank(mmoPlayer, SubSkillType.FISHING_MASTER_ANGLER); + int convertedLureBonus = 0; + + //This avoids a Minecraft bug where lure levels above 3 break fishing + if(lureLevel > 0) { + masterAnglerCompatibilityLayer.setApplyLure(fishHook, false); + convertedLureBonus = lureLevel * 100; + } + + boolean boatBonus = isInBoat(); + int minWaitReduction = getMasterAnglerTickMinWaitReduction(masterAnglerRank, boatBonus); + int maxWaitReduction = getMasterAnglerTickMaxWaitReduction(masterAnglerRank, boatBonus, convertedLureBonus); + + //Ticks for minWait and maxWait never go below this value + int bonusCapMin = mcMMO.p.getAdvancedConfig().getFishingReductionMinWaitCap(); + int bonusCapMax = mcMMO.p.getAdvancedConfig().getFishingReductionMaxWaitCap(); + + int reducedMinWaitTime = getReducedTicks(minWaitTicks, minWaitReduction, bonusCapMin); + int reducedMaxWaitTime = getReducedTicks(maxWaitTicks, maxWaitReduction, bonusCapMax); + + boolean badValuesFix = false; + + //If we find bad values correct it + if(reducedMaxWaitTime < reducedMinWaitTime) { + reducedMaxWaitTime = reducedMinWaitTime + 100; + badValuesFix = true; + } + + if(mmoPlayer.isDebugMode()) { + mmoPlayer.getPlayer().sendMessage(ChatColor.GOLD + "Master Angler Debug"); + + if(badValuesFix) { + mmoPlayer.getPlayer().sendMessage(ChatColor.RED + "Bad values were applied and corrected, check your configs, max wait should never be lower than min wait."); + } + + mmoPlayer.getPlayer().sendMessage("ALLOW STACK WITH LURE: " + masterAnglerCompatibilityLayer.getApplyLure(fishHook)); + mmoPlayer.getPlayer().sendMessage("MIN TICK REDUCTION: " + minWaitReduction); + mmoPlayer.getPlayer().sendMessage("MAX TICK REDUCTION: " + maxWaitReduction); + mmoPlayer.getPlayer().sendMessage("BOAT BONUS: " + boatBonus); + + if(boatBonus) { + mmoPlayer.getPlayer().sendMessage("BOAT MAX TICK REDUCTION: " + maxWaitReduction); + mmoPlayer.getPlayer().sendMessage("BOAT MIN TICK REDUCTION: " + maxWaitReduction); + } + + mmoPlayer.getPlayer().sendMessage(""); + + mmoPlayer.getPlayer().sendMessage(ChatColor.DARK_AQUA + "BEFORE MASTER ANGLER WAS APPLIED"); + mmoPlayer.getPlayer().sendMessage("Original Max Wait Ticks: " + maxWaitTicks); + mmoPlayer.getPlayer().sendMessage("Original Min Wait Ticks: " + minWaitTicks); + mmoPlayer.getPlayer().sendMessage(""); + + mmoPlayer.getPlayer().sendMessage(ChatColor.DARK_AQUA + "AFTER MASTER ANGLER WAS APPLIED"); + mmoPlayer.getPlayer().sendMessage("Current Max Wait Ticks: " + reducedMaxWaitTime); + mmoPlayer.getPlayer().sendMessage("Current Min Wait Ticks: " + reducedMinWaitTime); + + mmoPlayer.getPlayer().sendMessage(""); + + mmoPlayer.getPlayer().sendMessage(ChatColor.DARK_AQUA + "Caps / Limits (edit in advanced.yml)"); + mmoPlayer.getPlayer().sendMessage("Lowest possible max wait ticks " + bonusCapMax); + mmoPlayer.getPlayer().sendMessage("Lowest possible min wait ticks " + bonusCapMin); + } + + masterAnglerCompatibilityLayer.setMaxWaitTime(fishHook, reducedMaxWaitTime); + masterAnglerCompatibilityLayer.setMinWaitTime(fishHook, reducedMinWaitTime); + } + + } + + public int getReducedTicks(int ticks, int totalBonus, int tickBounds) { + return Math.max(tickBounds, ticks - totalBonus); + } + + public boolean isInBoat() { + return mmoPlayer.getPlayer().isInsideVehicle() && mmoPlayer.getPlayer().getVehicle() instanceof Boat; + } + + public int getMasterAnglerTickMaxWaitReduction(int masterAnglerRank, boolean boatBonus, int emulatedLureBonus) { + int totalBonus = mcMMO.p.getAdvancedConfig().getFishingReductionMaxWaitTicks() * masterAnglerRank; + + if(boatBonus) { + totalBonus += getFishingBoatMaxWaitReduction(); + } + + totalBonus += emulatedLureBonus; + + return totalBonus; + } + + public int getMasterAnglerTickMinWaitReduction(int masterAnglerRank, boolean boatBonus) { + int totalBonus = mcMMO.p.getAdvancedConfig().getFishingReductionMinWaitTicks() * masterAnglerRank; + + if(boatBonus) { + totalBonus += getFishingBoatMinWaitReduction(); + } + + return totalBonus; + } + + public int getFishingBoatMinWaitReduction() { + return mcMMO.p.getAdvancedConfig().getFishingBoatReductionMinWaitTicks(); + } + + public int getFishingBoatMaxWaitReduction() { + return mcMMO.p.getAdvancedConfig().getFishingBoatReductionMaxWaitTicks(); + } + + public boolean isMagicHunterEnabled() { return RankUtils.hasUnlockedSubskill(getPlayer(), SubSkillType.FISHING_MAGIC_HUNTER) && RankUtils.hasUnlockedSubskill(getPlayer(), SubSkillType.FISHING_TREASURE_HUNTER) && Permissions.isSubSkillEnabled(getPlayer(), SubSkillType.FISHING_TREASURE_HUNTER); @@ -272,57 +375,81 @@ public class FishingManager extends SkillManager { * * @param fishingCatch The {@link Item} initially caught */ - public void handleFishing(Item fishingCatch) { + public void processFishing(@NotNull Item fishingCatch) { this.fishingCatch = fishingCatch; int fishXp = ExperienceConfig.getInstance().getXp(PrimarySkillType.FISHING, fishingCatch.getItemStack().getType()); int treasureXp = 0; + ItemStack treasureDrop = null; Player player = getPlayer(); FishingTreasure treasure = null; + boolean fishingSucceeds = false; - if (Config.getInstance().getFishingDropsEnabled() && Permissions.isSubSkillEnabled(player, SubSkillType.FISHING_TREASURE_HUNTER)) { + if (mcMMO.p.getGeneralConfig().getFishingDropsEnabled() && Permissions.isSubSkillEnabled(player, SubSkillType.FISHING_TREASURE_HUNTER)) { treasure = getFishingTreasure(); this.fishingCatch = null; } if (treasure != null) { - ItemStack treasureDrop = treasure.getDrop().clone(); // Not cloning is bad, m'kay? - Map enchants = new HashMap(); + if(treasure instanceof FishingTreasureBook) { + treasureDrop = ItemUtils.createEnchantBook((FishingTreasureBook) treasure); + } else { + treasureDrop = treasure.getDrop().clone(); // Not cloning is bad, m'kay? - if (isMagicHunterEnabled() - && ItemUtils.isEnchantable(treasureDrop)) { - enchants = handleMagicHunter(treasureDrop); } + Map enchants = new HashMap<>(); + McMMOPlayerFishingTreasureEvent event; - McMMOPlayerFishingTreasureEvent event = EventUtils.callFishingTreasureEvent(player, treasureDrop, treasure.getXp(), enchants); + /* + * Books get some special treatment + */ + if(treasure instanceof FishingTreasureBook) { + //Skip the magic hunter stuff + if(treasureDrop.getItemMeta() != null) { + enchants.putAll(treasureDrop.getItemMeta().getEnchants()); + } + + event = EventUtils.callFishingTreasureEvent(player, treasureDrop, treasure.getXp(), enchants); + } else { + if (isMagicHunterEnabled() && ItemUtils.isEnchantable(treasureDrop)) { + enchants = processMagicHunter(treasureDrop); + } + + event = EventUtils.callFishingTreasureEvent(player, treasureDrop, treasure.getXp(), enchants); + } if (!event.isCancelled()) { treasureDrop = event.getTreasure(); treasureXp = event.getXp(); - } - else { + + // Drop the original catch at the feet of the player and set the treasure as the real catch + if (treasureDrop != null) { + fishingSucceeds = true; + boolean enchanted = false; + + if(treasure instanceof FishingTreasureBook) { + enchanted = true; + } else if (!enchants.isEmpty()) { + treasureDrop.addUnsafeEnchantments(enchants); + enchanted = true; + } + + if (enchanted) { + NotificationManager.sendPlayerInformation(player, NotificationType.SUBSKILL_MESSAGE, "Fishing.Ability.TH.MagicFound"); + } + + } + } else { treasureDrop = null; treasureXp = 0; } + } - // Drop the original catch at the feet of the player and set the treasure as the real catch - if (treasureDrop != null) { - boolean enchanted = false; - - if (!enchants.isEmpty()) { - treasureDrop.addUnsafeEnchantments(enchants); - enchanted = true; - } - - if (enchanted) { - NotificationManager.sendPlayerInformation(player, NotificationType.SUBSKILL_MESSAGE, "Fishing.Ability.TH.MagicFound"); - } - - if (Config.getInstance().getFishingExtraFish()) { - Misc.dropItem(player.getEyeLocation(), fishingCatch.getItemStack()); - } - - fishingCatch.setItemStack(treasureDrop); + if(fishingSucceeds) { + if (mcMMO.p.getGeneralConfig().getFishingExtraFish()) { + Misc.spawnItem(getPlayer(), player.getEyeLocation(), fishingCatch.getItemStack(), ItemSpawnReason.FISHING_EXTRA_FISH); } + + fishingCatch.setItemStack(treasureDrop); } applyXpGain(fishXp + treasureXp, XPGainReason.PVE); @@ -377,7 +504,7 @@ public class FishingManager extends SkillManager { break; case BEDROCK: - if (TreasureConfig.getInstance().getInventoryStealEnabled()) { + if (FishingTreasureConfig.getInstance().getInventoryStealEnabled()) { PlayerInventory inventory = targetPlayer.getInventory(); int length = inventory.getContents().length; int slot = Misc.getRandom().nextInt(length); @@ -387,7 +514,7 @@ public class FishingManager extends SkillManager { break; } - if (TreasureConfig.getInstance().getInventoryStealStacks()) { + if (FishingTreasureConfig.getInstance().getInventoryStealStacks()) { inventory.setItem(slot, null); } else { @@ -426,7 +553,7 @@ public class FishingManager extends SkillManager { return; } - Misc.dropItem(target.getLocation(), drop); + Misc.spawnItem(getPlayer(), target.getLocation(), drop, ItemSpawnReason.FISHING_SHAKE_TREASURE); CombatUtils.dealDamage(target, Math.min(Math.max(target.getMaxHealth() / 4, 1), 10), EntityDamageEvent.DamageCause.CUSTOM, getPlayer()); // Make it so you can shake a mob no more than 4 times. applyXpGain(ExperienceConfig.getInstance().getFishingShakeXP(), XPGainReason.PVE); } @@ -437,7 +564,7 @@ public class FishingManager extends SkillManager { * * @return The {@link FishingTreasure} found, or null if no treasure was found. */ - private FishingTreasure getFishingTreasure() { + private @Nullable FishingTreasure getFishingTreasure() { double diceRoll = Misc.getRandom().nextDouble() * 100; int luck; @@ -450,20 +577,16 @@ public class FishingManager extends SkillManager { } // Rather than subtracting luck (and causing a minimum 3% chance for every drop), scale by luck. - diceRoll *= (1.0 - luck * Config.getInstance().getFishingLureModifier() / 100); + diceRoll *= (1.0 - luck * mcMMO.p.getGeneralConfig().getFishingLureModifier() / 100); FishingTreasure treasure = null; for (Rarity rarity : Rarity.values()) { - double dropRate = TreasureConfig.getInstance().getItemDropRate(getLootTier(), rarity); + double dropRate = FishingTreasureConfig.getInstance().getItemDropRate(getLootTier(), rarity); if (diceRoll <= dropRate) { - /*if (rarity == Rarity.TRAP) { - handleTraps(); - break; - }*/ - List fishingTreasures = TreasureConfig.getInstance().fishingRewards.get(rarity); + List fishingTreasures = FishingTreasureConfig.getInstance().fishingRewards.get(rarity); if (fishingTreasures.isEmpty()) { return null; @@ -501,21 +624,16 @@ public class FishingManager extends SkillManager { * Process the Magic Hunter ability * * @param treasureDrop The {@link ItemStack} to enchant - * - * @return true if the item has been enchanted */ - private Map handleMagicHunter(ItemStack treasureDrop) { - Map enchants = new HashMap(); + private Map processMagicHunter(@NotNull ItemStack treasureDrop) { + Map enchants = new HashMap<>(); List fishingEnchantments = null; double diceRoll = Misc.getRandom().nextDouble() * 100; for (Rarity rarity : Rarity.values()) { - if (rarity == Rarity.RECORD) { - continue; - } - double dropRate = TreasureConfig.getInstance().getEnchantmentDropRate(getLootTier(), rarity); + double dropRate = FishingTreasureConfig.getInstance().getEnchantmentDropRate(getLootTier(), rarity); if (diceRoll <= dropRate) { // Make sure enchanted books always get some kind of enchantment. --hoorigan @@ -523,7 +641,8 @@ public class FishingManager extends SkillManager { diceRoll = dropRate + 1; continue; } - fishingEnchantments = TreasureConfig.getInstance().fishingEnchantments.get(rarity); + + fishingEnchantments = FishingTreasureConfig.getInstance().fishingEnchantments.get(rarity); break; } @@ -535,7 +654,7 @@ public class FishingManager extends SkillManager { } List validEnchantments = getPossibleEnchantments(treasureDrop); - List possibleEnchants = new ArrayList(); + List possibleEnchants = new ArrayList<>(); for (EnchantmentTreasure enchantmentTreasure : fishingEnchantments) { if (validEnchantments.contains(enchantmentTreasure.getEnchantment())) { @@ -574,7 +693,7 @@ public class FishingManager extends SkillManager { return Fishing.ENCHANTABLE_CACHE.get(dropType); } - List possibleEnchantments = new ArrayList(); + List possibleEnchantments = new ArrayList<>(); for (Enchantment enchantment : Enchantment.values()) { if (enchantment.canEnchantItem(treasureDrop)) { diff --git a/src/main/java/com/gmail/nossr50/skills/herbalism/Herbalism.java b/src/main/java/com/gmail/nossr50/skills/herbalism/Herbalism.java index 60166dcdf..00c05d20e 100644 --- a/src/main/java/com/gmail/nossr50/skills/herbalism/Herbalism.java +++ b/src/main/java/com/gmail/nossr50/skills/herbalism/Herbalism.java @@ -8,8 +8,8 @@ public class Herbalism { /** * Convert blocks affected by the Green Thumb & Green Terra abilities. * - * @param blockState - * The {@link BlockState} to check ability activation for + * @param blockState The {@link BlockState} to check ability activation for + * * @return true if the ability was successful, false otherwise */ protected static boolean convertGreenTerraBlocks(BlockState blockState) { @@ -22,16 +22,16 @@ public class Herbalism { blockState.setType(Material.MOSSY_STONE_BRICKS); return true; - case DIRT : - case GRASS_PATH : + case DIRT: + case DIRT_PATH: blockState.setType(Material.GRASS_BLOCK); return true; - case COBBLESTONE : + case COBBLESTONE: blockState.setType(Material.MOSSY_COBBLESTONE); return true; - default : + default: return false; } } @@ -39,19 +39,19 @@ public class Herbalism { /** * Convert blocks affected by the Green Thumb & Green Terra abilities. * - * @param blockState - * The {@link BlockState} to check ability activation for + * @param blockState The {@link BlockState} to check ability activation for + * * @return true if the ability was successful, false otherwise */ protected static boolean convertShroomThumb(BlockState blockState) { switch (blockState.getType()) { - case DIRT : + case DIRT: case GRASS_BLOCK: - case GRASS_PATH : + case DIRT_PATH: blockState.setType(Material.MYCELIUM); return true; - default : + default: return false; } } diff --git a/src/main/java/com/gmail/nossr50/skills/herbalism/HerbalismManager.java b/src/main/java/com/gmail/nossr50/skills/herbalism/HerbalismManager.java index 5e668a3db..541a8ac18 100644 --- a/src/main/java/com/gmail/nossr50/skills/herbalism/HerbalismManager.java +++ b/src/main/java/com/gmail/nossr50/skills/herbalism/HerbalismManager.java @@ -1,6 +1,6 @@ package com.gmail.nossr50.skills.herbalism; -import com.gmail.nossr50.config.Config; +import com.gmail.nossr50.api.ItemSpawnReason; import com.gmail.nossr50.config.experience.ExperienceConfig; import com.gmail.nossr50.config.treasure.TreasureConfig; import com.gmail.nossr50.datatypes.BlockSnapshot; @@ -27,6 +27,7 @@ import com.gmail.nossr50.util.skills.SkillActivationType; import com.gmail.nossr50.util.skills.SkillUtils; import com.gmail.nossr50.util.sounds.SoundManager; import com.gmail.nossr50.util.sounds.SoundType; +import com.gmail.nossr50.util.text.StringUtils; import org.bukkit.Location; import org.bukkit.Material; import org.bukkit.block.Block; @@ -38,6 +39,8 @@ import org.bukkit.entity.Player; import org.bukkit.event.block.BlockBreakEvent; import org.bukkit.inventory.ItemStack; import org.bukkit.inventory.PlayerInventory; +import org.bukkit.scheduler.BukkitRunnable; +import org.jetbrains.annotations.NotNull; import java.util.ArrayList; import java.util.Collection; @@ -60,6 +63,10 @@ public class HerbalismManager extends SkillManager { } public boolean canUseShroomThumb(BlockState blockState) { + if(!BlockUtils.canMakeShroomy(blockState)) { + return false; + } + if(!RankUtils.hasUnlockedSubskill(getPlayer(), SubSkillType.HERBALISM_SHROOM_THUMB)) return false; @@ -67,9 +74,78 @@ public class HerbalismManager extends SkillManager { PlayerInventory inventory = player.getInventory(); Material itemType = inventory.getItemInMainHand().getType(); - return (itemType == Material.BROWN_MUSHROOM || itemType == Material.RED_MUSHROOM) && inventory.contains(Material.BROWN_MUSHROOM, 1) && inventory.contains(Material.RED_MUSHROOM, 1) && BlockUtils.canMakeShroomy(blockState) && Permissions.isSubSkillEnabled(player, SubSkillType.HERBALISM_SHROOM_THUMB); + return (itemType == Material.BROWN_MUSHROOM + || itemType == Material.RED_MUSHROOM) + && inventory.contains(Material.BROWN_MUSHROOM, 1) + && inventory.contains(Material.RED_MUSHROOM, 1) + && Permissions.isSubSkillEnabled(player, SubSkillType.HERBALISM_SHROOM_THUMB); } + public void processBerryBushHarvesting(@NotNull BlockState blockState) { + /* Check if the player is harvesting a berry bush */ + if(blockState.getType().toString().equalsIgnoreCase("sweet_berry_bush")) { + if(mmoPlayer.isDebugMode()) { + mmoPlayer.getPlayer().sendMessage("Processing sweet berry bush rewards"); + } + //Check the age + if(blockState.getBlockData() instanceof Ageable) { + int rewardByAge = 0; + + Ageable ageable = (Ageable) blockState.getBlockData(); + + if(ageable.getAge() == 2) { + rewardByAge = 1; //Normal XP + } else if(ageable.getAge() == 3) { + rewardByAge = 2; //Double XP + } else { + return; //Not old enough, back out of processing + } + + if(mmoPlayer.isDebugMode()) { + mmoPlayer.getPlayer().sendMessage("Bush Reward Multiplier: " + rewardByAge); + } + + int xpReward = ExperienceConfig.getInstance().getXp(PrimarySkillType.HERBALISM, blockState) * rewardByAge; + + if(mmoPlayer.isDebugMode()) { + mmoPlayer.getPlayer().sendMessage("Bush XP: " + xpReward); + } + + CheckBushAge checkBushAge = new CheckBushAge(blockState.getBlock(), mmoPlayer, xpReward); + checkBushAge.runTaskLater(mcMMO.p, 1); + } + } + } + + private class CheckBushAge extends BukkitRunnable { + + @NotNull Block block; + @NotNull McMMOPlayer mmoPlayer; + int xpReward; + + public CheckBushAge(@NotNull Block block, @NotNull McMMOPlayer mmoPlayer, int xpReward) { + this.block = block; + this.mmoPlayer = mmoPlayer; + this.xpReward = xpReward; + } + + @Override + public void run() { + BlockState blockState = block.getState(); + + if(blockState.getType().toString().equalsIgnoreCase("sweet_berry_bush")) { + if(blockState.getBlockData() instanceof Ageable) { + Ageable ageable = (Ageable) blockState.getBlockData(); + + if(ageable.getAge() <= 1) { + applyXpGain(xpReward, XPGainReason.PVE, XPGainSource.SELF); + } + } + } + } + } + + public boolean canUseHylianLuck() { if(!RankUtils.hasUnlockedSubskill(getPlayer(), SubSkillType.HERBALISM_HYLIAN_LUCK)) return false; @@ -78,15 +154,15 @@ public class HerbalismManager extends SkillManager { } public boolean canGreenTerraBlock(BlockState blockState) { - return mcMMOPlayer.getAbilityMode(SuperAbilityType.GREEN_TERRA) && BlockUtils.canMakeMossy(blockState); + return mmoPlayer.getAbilityMode(SuperAbilityType.GREEN_TERRA) && BlockUtils.canMakeMossy(blockState); } public boolean canActivateAbility() { - return mcMMOPlayer.getToolPreparationMode(ToolType.HOE) && Permissions.greenTerra(getPlayer()); + return mmoPlayer.getToolPreparationMode(ToolType.HOE) && Permissions.greenTerra(getPlayer()); } public boolean isGreenTerraActive() { - return mcMMOPlayer.getAbilityMode(SuperAbilityType.GREEN_TERRA); + return mmoPlayer.getAbilityMode(SuperAbilityType.GREEN_TERRA); } /** @@ -133,18 +209,21 @@ public class HerbalismManager extends SkillManager { public void processHerbalismBlockBreakEvent(BlockBreakEvent blockBreakEvent) { Player player = getPlayer(); - if (Config.getInstance().getHerbalismPreventAFK() && player.isInsideVehicle()) { + Block block = blockBreakEvent.getBlock(); + + if (mcMMO.p.getGeneralConfig().getHerbalismPreventAFK() && player.isInsideVehicle()) { + if(block.hasMetadata(MetadataConstants.METADATA_KEY_REPLANT)) { + block.removeMetadata(MetadataConstants.METADATA_KEY_REPLANT, mcMMO.p); + } return; } //Check if the plant was recently replanted - if(blockBreakEvent.getBlock().getBlockData() instanceof Ageable) { - Ageable ageableCrop = (Ageable) blockBreakEvent.getBlock().getBlockData(); - - if(blockBreakEvent.getBlock().getMetadata(mcMMO.REPLANT_META_KEY).size() >= 1) { - if(blockBreakEvent.getBlock().getMetadata(mcMMO.REPLANT_META_KEY).get(0).asBoolean()) { + if(block.getBlockData() instanceof Ageable ageableCrop) { + if(block.getMetadata(MetadataConstants.METADATA_KEY_REPLANT).size() >= 1) { + if(block.getMetadata(MetadataConstants.METADATA_KEY_REPLANT).get(0).asBoolean()) { if(isAgeableMature(ageableCrop)) { - blockBreakEvent.getBlock().removeMetadata(mcMMO.REPLANT_META_KEY, mcMMO.p); + block.removeMetadata(MetadataConstants.METADATA_KEY_REPLANT, mcMMO.p); } else { //Crop is recently replanted to back out of destroying it blockBreakEvent.setCancelled(true); @@ -175,22 +254,17 @@ public class HerbalismManager extends SkillManager { * @param brokenPlants plant blocks to process */ private void processHerbalismOnBlocksBroken(BlockBreakEvent blockBreakEvent, HashSet brokenPlants) { + if(blockBreakEvent.isCancelled()) + return; + BlockState originalBreak = blockBreakEvent.getBlock().getState(); boolean greenThumbActivated = false; //TODO: The design of Green Terra needs to change, this is a mess if(Permissions.greenThumbPlant(getPlayer(), originalBreak.getType())) { - if(!getPlayer().isSneaking()) { - greenThumbActivated = processGreenThumbPlants(originalBreak, blockBreakEvent, isGreenTerraActive()); - } - } - - //When replanting a immature crop we cancel the block break event and back out - if(greenThumbActivated) { - if(originalBreak.getBlock().getBlockData() instanceof Ageable) { - Ageable ageableCrop = (Ageable) originalBreak.getBlock().getBlockData(); - if(!isAgeableMature(ageableCrop)) { - return; + if(mcMMO.p.getGeneralConfig().isGreenThumbReplantableCrop(originalBreak.getType())) { + if(!getPlayer().isSneaking()) { + greenThumbActivated = processGreenThumbPlants(originalBreak, blockBreakEvent, isGreenTerraActive()); } } } @@ -240,10 +314,10 @@ public class HerbalismManager extends SkillManager { if(delayedChorusBlocks.size() > 0) { //Check XP for chorus blocks - DelayedHerbalismXPCheckTask delayedHerbalismXPCheckTask = new DelayedHerbalismXPCheckTask(mcMMOPlayer, delayedChorusBlocks); + DelayedHerbalismXPCheckTask delayedHerbalismXPCheckTask = new DelayedHerbalismXPCheckTask(mmoPlayer, delayedChorusBlocks); //Large delay because the tree takes a while to break - delayedHerbalismXPCheckTask.runTaskLater(mcMMO.p, 20); //Calculate Chorus XP + Bonus Drops 1 tick later + delayedHerbalismXPCheckTask.runTaskLater(mcMMO.p, 0); //Calculate Chorus XP + Bonus Drops 1 tick later } } @@ -316,6 +390,7 @@ public class HerbalismManager extends SkillManager { //Catcus and Sugar Canes cannot be trusted switch(blockData.getMaterial()) { case CACTUS: + case KELP: case SUGAR_CANE: return true; default: @@ -328,7 +403,7 @@ public class HerbalismManager extends SkillManager { public void markForBonusDrops(BlockState brokenPlantState) { //Add metadata to mark this block for double or triple drops - boolean awardTriple = mcMMOPlayer.getAbilityMode(SuperAbilityType.GREEN_TERRA); + boolean awardTriple = mmoPlayer.getAbilityMode(SuperAbilityType.GREEN_TERRA); BlockUtils.markDropsAsBonus(brokenPlantState, awardTriple); } @@ -385,8 +460,8 @@ public class HerbalismManager extends SkillManager { } } - if(mcMMOPlayer.isDebugMode()) { - mcMMOPlayer.getPlayer().sendMessage("Plants processed: "+brokenPlants.size()); + if(mmoPlayer.isDebugMode()) { + mmoPlayer.getPlayer().sendMessage("Plants processed: "+brokenPlants.size()); } //Reward XP @@ -416,8 +491,8 @@ public class HerbalismManager extends SkillManager { BlockState brokenBlockNewState = blockSnapshot.getBlockRef().getState(); //Remove metadata from the snapshot of blocks - if(brokenBlockNewState.hasMetadata(mcMMO.BONUS_DROPS_METAKEY)) { - brokenBlockNewState.removeMetadata(mcMMO.BONUS_DROPS_METAKEY, mcMMO.p); + if(brokenBlockNewState.hasMetadata(MetadataConstants.METADATA_KEY_BONUS_DROPS)) { + brokenBlockNewState.removeMetadata(MetadataConstants.METADATA_KEY_BONUS_DROPS, mcMMO.p); } //If the block is not AIR that means it wasn't broken @@ -436,9 +511,9 @@ public class HerbalismManager extends SkillManager { } } - if(mcMMOPlayer.isDebugMode()) { - mcMMOPlayer.getPlayer().sendMessage("Chorus Plants checked for XP: "+brokenPlants.size()); - mcMMOPlayer.getPlayer().sendMessage("Valid Chorus Plant XP Gains: "+blocksGivingXP); + if(mmoPlayer.isDebugMode()) { + mmoPlayer.getPlayer().sendMessage("Chorus Plants checked for XP: "+brokenPlants.size()); + mmoPlayer.getPlayer().sendMessage("Valid Chorus Plant XP Gains: "+blocksGivingXP); } //Reward XP @@ -452,21 +527,18 @@ public class HerbalismManager extends SkillManager { * @param blockBreakEvent target event * @return a set of plant-blocks that were broken as a result of this event */ - private HashSet getBrokenHerbalismBlocks(BlockBreakEvent blockBreakEvent) { + private HashSet getBrokenHerbalismBlocks(@NotNull BlockBreakEvent blockBreakEvent) { //Get an updated capture of this block - BlockState originalBlockBlockState = blockBreakEvent.getBlock().getState(); - Material originalBlockMaterial = originalBlockBlockState.getType(); + BlockState originBlockState = blockBreakEvent.getBlock().getState(); + Material originBlockMaterial = originBlockState.getType(); HashSet blocksBroken = new HashSet<>(); //Blocks broken - //Check if this block is a one block plant or not - boolean oneBlockPlant = isOneBlockPlant(originalBlockMaterial); + //Add the initial block + blocksBroken.add(originBlockState.getBlock()); - if(oneBlockPlant) { - //If the block is a one-block plant return only that - blocksBroken.add(originalBlockBlockState.getBlock()); - } else { + if(!isOneBlockPlant(originBlockMaterial)) { //If the block is a multi-block structure, capture a set of all blocks broken and return that - blocksBroken = getBrokenBlocksMultiBlockPlants(originalBlockBlockState, blockBreakEvent); + blocksBroken = getBrokenBlocksMultiBlockPlants(originBlockState); } //Return all broken plant-blocks @@ -502,17 +574,16 @@ public class HerbalismManager extends SkillManager { * The method to grab these blocks is a bit hacky and does not hook into the API * Basically we expect the blocks to be broken if this event is not cancelled and we determine which block are broken on our end rather than any event state captures * - * @param blockBreakEvent target event * @return a set of plant-blocks broken from this event */ - protected HashSet getBrokenBlocksMultiBlockPlants(BlockState originalBlockBroken, BlockBreakEvent blockBreakEvent) { + protected HashSet getBrokenBlocksMultiBlockPlants(BlockState brokenBlock) { //Track the broken blocks HashSet brokenBlocks; - if (isChorusBranch(originalBlockBroken.getType())) { - brokenBlocks = getBrokenChorusBlocks(originalBlockBroken); + if (isChorusBranch(brokenBlock.getType())) { + brokenBlocks = getBrokenChorusBlocks(brokenBlock); } else { - brokenBlocks = getBlocksBrokenAbove(originalBlockBroken); + brokenBlocks = getBlocksBrokenAbove(brokenBlock, false); } return brokenBlocks; @@ -532,21 +603,22 @@ public class HerbalismManager extends SkillManager { * The vertical search returns early if it runs into anything that is not a multi-block plant * Multi-block plants are hard-coded and kept in {@link MaterialMapStore} * - * @param breakPointBlockState The point of the "break" + * @param originBlock The point of the "break" * @return A set of blocks above the target block which can be assumed to be broken */ - private HashSet getBlocksBrokenAbove(BlockState breakPointBlockState) { + private HashSet getBlocksBrokenAbove(BlockState originBlock, boolean inclusive) { HashSet brokenBlocks = new HashSet<>(); - Block block = breakPointBlockState.getBlock(); + Block block = originBlock.getBlock(); //Add the initial block to the set - brokenBlocks.add(block); + if(inclusive) + brokenBlocks.add(block); //Limit our search - int maxHeight = 255; + int maxHeight = 512; // Search vertically for multi-block plants, exit early if any non-multi block plants - for (int y = 1; y < maxHeight; y++) { + for (int y = 0; y < maxHeight; y++) { //TODO: Should this grab state? It would be more expensive.. Block relativeUpBlock = block.getRelative(BlockFace.UP, y); @@ -626,7 +698,7 @@ public class HerbalismManager extends SkillManager { return false; } blockState.setType(Material.AIR); - Misc.dropItem(location, treasure.getDrop()); + Misc.spawnItem(getPlayer(), location, treasure.getDrop(), ItemSpawnReason.HYLIAN_LUCK_TREASURE); NotificationManager.sendPlayerInformation(player, NotificationType.SUBSKILL_MESSAGE, "Herbalism.HylianLuck"); return true; } @@ -675,7 +747,7 @@ public class HerbalismManager extends SkillManager { private void startReplantTask(int desiredCropAge, BlockBreakEvent blockBreakEvent, BlockState cropState, boolean isImmature) { //Mark the plant as recently replanted to avoid accidental breakage new DelayedCropReplant(blockBreakEvent, cropState, desiredCropAge, isImmature).runTaskLater(mcMMO.p, 20 * 2); - blockBreakEvent.getBlock().setMetadata(mcMMO.REPLANT_META_KEY, new RecentlyReplantedCropMeta(mcMMO.p, true)); + blockBreakEvent.getBlock().setMetadata(MetadataConstants.METADATA_KEY_REPLANT, new RecentlyReplantedCropMeta(mcMMO.p, true)); } /** @@ -685,7 +757,8 @@ public class HerbalismManager extends SkillManager { * @param greenTerra boolean to determine if greenTerra is active or not */ private boolean processGreenThumbPlants(BlockState blockState, BlockBreakEvent blockBreakEvent, boolean greenTerra) { - if(!ItemUtils.isHoe(blockBreakEvent.getPlayer().getInventory().getItemInMainHand())) { + if (!ItemUtils.isHoe(blockBreakEvent.getPlayer().getInventory().getItemInMainHand()) + && !ItemUtils.isAxe(blockBreakEvent.getPlayer().getInventory().getItemInMainHand())) { return false; } @@ -701,7 +774,7 @@ public class HerbalismManager extends SkillManager { Player player = getPlayer(); PlayerInventory playerInventory = player.getInventory(); - Material seed = null; + Material seed; switch (blockState.getType()) { case CARROTS: @@ -734,10 +807,14 @@ public class HerbalismManager extends SkillManager { ItemStack seedStack = new ItemStack(seed); - if (!greenTerra && !RandomChanceUtil.checkRandomChanceExecutionSuccess(player, SubSkillType.HERBALISM_GREEN_THUMB, true)) { + if (ItemUtils.isAxe(blockBreakEvent.getPlayer().getInventory().getItemInMainHand()) + && blockState.getType() != Material.COCOA) { return false; } + if (!greenTerra && !RandomChanceUtil.checkRandomChanceExecutionSuccess(player, SubSkillType.HERBALISM_GREEN_THUMB, true)) { + return false; + } if (!playerInventory.containsAtLeast(seedStack, 1)) { return false; @@ -747,11 +824,16 @@ public class HerbalismManager extends SkillManager { return false; } - playerInventory.removeItem(seedStack); - player.updateInventory(); // Needed until replacement available - //Play sound - SoundManager.sendSound(player, player.getLocation(), SoundType.ITEM_CONSUMED); - return true; + if(EventUtils.callSubSkillBlockEvent(player, SubSkillType.HERBALISM_GREEN_THUMB, blockState.getBlock()).isCancelled()) { + return false; + } else { + playerInventory.removeItem(seedStack); + player.updateInventory(); // Needed until replacement available + //Play sound + SoundManager.sendSound(player, player.getLocation(), SoundType.ITEM_CONSUMED); + return true; + } + // new HerbalismBlockUpdaterTask(blockState).runTaskLater(mcMMO.p, 0); } @@ -761,7 +843,7 @@ public class HerbalismManager extends SkillManager { return false; } - int finalAge = 0; + int finalAge; int greenThumbStage = getGreenThumbStage(greenTerra); //Immature plants will start over at 0 diff --git a/src/main/java/com/gmail/nossr50/skills/mining/BlastMining.java b/src/main/java/com/gmail/nossr50/skills/mining/BlastMining.java index a299bb0be..23fde19d3 100644 --- a/src/main/java/com/gmail/nossr50/skills/mining/BlastMining.java +++ b/src/main/java/com/gmail/nossr50/skills/mining/BlastMining.java @@ -1,8 +1,8 @@ package com.gmail.nossr50.skills.mining; -import com.gmail.nossr50.config.AdvancedConfig; import com.gmail.nossr50.datatypes.skills.SubSkillType; import com.gmail.nossr50.mcMMO; +import com.gmail.nossr50.util.MetadataConstants; import com.gmail.nossr50.util.player.UserManager; import com.gmail.nossr50.util.skills.RankUtils; import org.bukkit.entity.Player; @@ -33,7 +33,7 @@ public class BlastMining { } protected int getLevel() { - return AdvancedConfig.getInstance().getBlastMiningRankLevel(this); + return mcMMO.p.getAdvancedConfig().getBlastMiningRankLevel(this); } @@ -42,13 +42,13 @@ public class BlastMining { public final static int MAXIMUM_REMOTE_DETONATION_DISTANCE = 100; public static double getBlastRadiusModifier(int rank) { - return AdvancedConfig.getInstance().getBlastRadiusModifier(rank); + return mcMMO.p.getAdvancedConfig().getBlastRadiusModifier(rank); } public static double getBlastDamageDecrease(int rank) { - return AdvancedConfig.getInstance().getBlastDamageDecrease(rank); + return mcMMO.p.getAdvancedConfig().getBlastDamageDecrease(rank); } @@ -92,14 +92,14 @@ public class BlastMining { } public static boolean processBlastMiningExplosion(EntityDamageByEntityEvent event, TNTPrimed tnt, Player defender) { - if (!tnt.hasMetadata(mcMMO.tntMetadataKey) || !UserManager.hasPlayerDataKey(defender)) { + if (!tnt.hasMetadata(MetadataConstants.METADATA_KEY_TRACKED_TNT) || !UserManager.hasPlayerDataKey(defender)) { return false; } // We can make this assumption because we (should) be the only ones using this exact metadata - Player player = mcMMO.p.getServer().getPlayerExact(tnt.getMetadata(mcMMO.tntMetadataKey).get(0).asString()); + Player player = mcMMO.p.getServer().getPlayerExact(tnt.getMetadata(MetadataConstants.METADATA_KEY_TRACKED_TNT).get(0).asString()); - if (!player.equals(defender)) { + if (!(player != null && player.equals(defender))) { return false; } diff --git a/src/main/java/com/gmail/nossr50/skills/mining/Mining.java b/src/main/java/com/gmail/nossr50/skills/mining/Mining.java index 288736726..0c301752c 100644 --- a/src/main/java/com/gmail/nossr50/skills/mining/Mining.java +++ b/src/main/java/com/gmail/nossr50/skills/mining/Mining.java @@ -3,10 +3,7 @@ package com.gmail.nossr50.skills.mining; import com.gmail.nossr50.config.experience.ExperienceConfig; import com.gmail.nossr50.datatypes.skills.PrimarySkillType; import com.gmail.nossr50.mcMMO; -import com.gmail.nossr50.util.Misc; -import org.bukkit.Material; import org.bukkit.block.BlockState; -import org.bukkit.inventory.ItemStack; public class Mining { @@ -24,147 +21,4 @@ public class Mining { return xp; } - - /** - * Handle double drops when using Silk Touch. - * - * @param blockState The {@link BlockState} to check ability activation for - */ - protected static void handleSilkTouchDrops(BlockState blockState) { - Material blockType = blockState.getType(); - - switch (blockType) { - case ANDESITE: - case DIORITE: - case GRANITE: - case END_STONE: - case TERRACOTTA: - case CLAY: - case IRON_ORE: - case MOSSY_COBBLESTONE: - case NETHERRACK: - case OBSIDIAN: - case SANDSTONE: - case BLACK_GLAZED_TERRACOTTA: - case BLACK_TERRACOTTA: - case BLUE_GLAZED_TERRACOTTA: - case BLUE_TERRACOTTA: - case BROWN_GLAZED_TERRACOTTA: - case BROWN_TERRACOTTA: - case CYAN_GLAZED_TERRACOTTA: - case CYAN_TERRACOTTA: - case GRAY_GLAZED_TERRACOTTA: - case GRAY_TERRACOTTA: - case GREEN_GLAZED_TERRACOTTA: - case GREEN_TERRACOTTA: - case LIGHT_BLUE_GLAZED_TERRACOTTA: - case LIGHT_BLUE_TERRACOTTA: - case LIGHT_GRAY_GLAZED_TERRACOTTA: - case LIGHT_GRAY_TERRACOTTA: - case LIME_GLAZED_TERRACOTTA: - case LIME_TERRACOTTA: - case MAGENTA_GLAZED_TERRACOTTA: - case MAGENTA_TERRACOTTA: - case ORANGE_GLAZED_TERRACOTTA: - case ORANGE_TERRACOTTA: - case PINK_GLAZED_TERRACOTTA: - case PINK_TERRACOTTA: - case PURPLE_GLAZED_TERRACOTTA: - case PURPLE_TERRACOTTA: - case RED_GLAZED_TERRACOTTA: - case RED_TERRACOTTA: - case WHITE_GLAZED_TERRACOTTA: - case WHITE_TERRACOTTA: - case YELLOW_GLAZED_TERRACOTTA: - case YELLOW_TERRACOTTA: - handleMiningDrops(blockState); - return; - - case COAL_ORE: - case DIAMOND_ORE: - case EMERALD_ORE: - case GLOWSTONE: - case LAPIS_ORE: - case PACKED_ICE: - case NETHER_QUARTZ_ORE: - case REDSTONE_ORE: - case STONE: - case PRISMARINE: - Misc.dropItem(Misc.getBlockCenter(blockState), new ItemStack(blockState.getType())); - return; - - default: - if (mcMMO.getModManager().isCustomMiningBlock(blockState)) { - Misc.dropItem(Misc.getBlockCenter(blockState), new ItemStack(blockState.getType())); - } - return; - } - } - - /** - * Handle double drops from Mining & Blast Mining. - * - * @param blockState The {@link BlockState} to check ability activation for - */ - protected static void handleMiningDrops(BlockState blockState) { - switch (blockState.getType()) { - case COAL_ORE: - case DIAMOND_ORE: - case EMERALD_ORE: - case END_STONE: - case GLOWSTONE: - case GOLD_ORE: - case TERRACOTTA: - case IRON_ORE: - case LAPIS_ORE: - case MOSSY_COBBLESTONE: - case NETHERRACK: - case OBSIDIAN: - case PACKED_ICE: - case REDSTONE_ORE: - case SANDSTONE: - case BLACK_GLAZED_TERRACOTTA: - case BLACK_TERRACOTTA: - case BLUE_GLAZED_TERRACOTTA: - case BLUE_TERRACOTTA: - case BROWN_GLAZED_TERRACOTTA: - case BROWN_TERRACOTTA: - case CYAN_GLAZED_TERRACOTTA: - case CYAN_TERRACOTTA: - case GRAY_GLAZED_TERRACOTTA: - case GRAY_TERRACOTTA: - case GREEN_GLAZED_TERRACOTTA: - case GREEN_TERRACOTTA: - case LIGHT_BLUE_GLAZED_TERRACOTTA: - case LIGHT_BLUE_TERRACOTTA: - case LIGHT_GRAY_GLAZED_TERRACOTTA: - case LIGHT_GRAY_TERRACOTTA: - case LIME_GLAZED_TERRACOTTA: - case LIME_TERRACOTTA: - case MAGENTA_GLAZED_TERRACOTTA: - case MAGENTA_TERRACOTTA: - case ORANGE_GLAZED_TERRACOTTA: - case ORANGE_TERRACOTTA: - case PINK_GLAZED_TERRACOTTA: - case PINK_TERRACOTTA: - case PURPLE_GLAZED_TERRACOTTA: - case PURPLE_TERRACOTTA: - case RED_GLAZED_TERRACOTTA: - case RED_TERRACOTTA: - case WHITE_GLAZED_TERRACOTTA: - case WHITE_TERRACOTTA: - case YELLOW_GLAZED_TERRACOTTA: - case YELLOW_TERRACOTTA: - case STONE: - case NETHER_QUARTZ_ORE: - Misc.dropItems(Misc.getBlockCenter(blockState), blockState.getBlock().getDrops()); - return; - - default: - if (mcMMO.getModManager().isCustomMiningBlock(blockState)) { - Misc.dropItems(Misc.getBlockCenter(blockState), blockState.getBlock().getDrops()); - } - return; - } - } } diff --git a/src/main/java/com/gmail/nossr50/skills/mining/MiningManager.java b/src/main/java/com/gmail/nossr50/skills/mining/MiningManager.java index c30187d5d..2d91949a8 100644 --- a/src/main/java/com/gmail/nossr50/skills/mining/MiningManager.java +++ b/src/main/java/com/gmail/nossr50/skills/mining/MiningManager.java @@ -1,7 +1,6 @@ package com.gmail.nossr50.skills.mining; -import com.gmail.nossr50.config.AdvancedConfig; -import com.gmail.nossr50.config.Config; +import com.gmail.nossr50.api.ItemSpawnReason; import com.gmail.nossr50.config.experience.ExperienceConfig; import com.gmail.nossr50.datatypes.experience.XPGainReason; import com.gmail.nossr50.datatypes.interactions.NotificationType; @@ -27,11 +26,15 @@ import org.bukkit.entity.Player; import org.bukkit.entity.TNTPrimed; import org.bukkit.event.entity.EntityExplodeEvent; import org.bukkit.inventory.ItemStack; +import org.jetbrains.annotations.NotNull; import java.util.ArrayList; import java.util.List; public class MiningManager extends SkillManager { + + public static final String BUDDING_AMETHYST = "budding_amethyst"; + public MiningManager(McMMOPlayer mcMMOPlayer) { super(mcMMOPlayer, PrimarySkillType.MINING); } @@ -47,7 +50,7 @@ public class MiningManager extends SkillManager { Player player = getPlayer(); return canUseBlastMining() && player.isSneaking() - && (ItemUtils.isPickaxe(getPlayer().getInventory().getItemInMainHand()) || player.getInventory().getItemInMainHand().getType() == Config.getInstance().getDetonatorItem()) + && (ItemUtils.isPickaxe(getPlayer().getInventory().getItemInMainHand()) || player.getInventory().getItemInMainHand().getType() == mcMMO.p.getGeneralConfig().getDetonatorItem()) && Permissions.remoteDetonation(player); } @@ -81,21 +84,22 @@ public class MiningManager extends SkillManager { return; } - if (mcMMOPlayer.getAbilityMode(skill.getAbility())) { - SkillUtils.handleDurabilityChange(getPlayer().getInventory().getItemInMainHand(), Config.getInstance().getAbilityToolDamage()); + if (mmoPlayer.getAbilityMode(mcMMO.p.getSkillTools().getSuperAbility(skill))) { + SkillUtils.handleDurabilityChange(getPlayer().getInventory().getItemInMainHand(), mcMMO.p.getGeneralConfig().getAbilityToolDamage()); } - if(!Config.getInstance().getDoubleDropsEnabled(PrimarySkillType.MINING, blockState.getType()) || !canDoubleDrop()) + if(!mcMMO.p.getGeneralConfig().getDoubleDropsEnabled(PrimarySkillType.MINING, blockState.getType()) || !canDoubleDrop()) return; boolean silkTouch = player.getInventory().getItemInMainHand().containsEnchantment(Enchantment.SILK_TOUCH); - if(silkTouch && !AdvancedConfig.getInstance().getDoubleDropSilkTouchEnabled()) + if(silkTouch && !mcMMO.p.getAdvancedConfig().getDoubleDropSilkTouchEnabled()) return; //TODO: Make this readable if (RandomChanceUtil.checkRandomChanceExecutionSuccess(getPlayer(), SubSkillType.MINING_DOUBLE_DROPS, true)) { - BlockUtils.markDropsAsBonus(blockState, mcMMOPlayer.getAbilityMode(skill.getAbility())); + boolean useTriple = mmoPlayer.getAbilityMode(mcMMO.p.getSkillTools().getSuperAbility(skill)) && mcMMO.p.getAdvancedConfig().getAllowMiningTripleDrops(); + BlockUtils.markDropsAsBonus(blockState, useTriple); } } @@ -117,13 +121,16 @@ public class MiningManager extends SkillManager { NotificationManager.sendPlayerInformation(player, NotificationType.SUPER_ABILITY, "Mining.Blast.Boom"); //player.sendMessage(LocaleLoader.getString("Mining.Blast.Boom")); - tnt.setMetadata(mcMMO.tntMetadataKey, mcMMOPlayer.getPlayerMetadata()); + tnt.setMetadata(MetadataConstants.METADATA_KEY_TRACKED_TNT, mmoPlayer.getPlayerMetadata()); tnt.setFuseTicks(0); + if (mcMMO.getCompatibilityManager().getMinecraftGameVersion().isAtLeast(1, 16, 4)) { + tnt.setSource(player); + } targetBlock.setType(Material.AIR); - mcMMOPlayer.setAbilityDATS(SuperAbilityType.BLAST_MINING, System.currentTimeMillis()); - mcMMOPlayer.setAbilityInformed(SuperAbilityType.BLAST_MINING, false); - new AbilityCooldownTask(mcMMOPlayer, SuperAbilityType.BLAST_MINING).runTaskLater(mcMMO.p, SuperAbilityType.BLAST_MINING.getCooldown() * Misc.TICK_CONVERSION_FACTOR); + mmoPlayer.setAbilityDATS(SuperAbilityType.BLAST_MINING, System.currentTimeMillis()); + mmoPlayer.setAbilityInformed(SuperAbilityType.BLAST_MINING, false); + new AbilityCooldownTask(mmoPlayer, SuperAbilityType.BLAST_MINING).runTaskLater(mcMMO.p, SuperAbilityType.BLAST_MINING.getCooldown() * Misc.TICK_CONVERSION_FACTOR); } /** @@ -133,62 +140,59 @@ public class MiningManager extends SkillManager { * @param event The {@link EntityExplodeEvent} */ //TODO: Rewrite this garbage - //TODO: Rewrite this garbage - //TODO: Rewrite this garbage - //TODO: Rewrite this garbage - //TODO: Rewrite this garbage - //TODO: Rewrite this garbage - //TODO: Rewrite this garbage - //TODO: Rewrite this garbage - //TODO: Rewrite this garbage - //TODO: Rewrite this garbage - //TODO: Rewrite this garbage - //TODO: Rewrite this garbage - //TODO: Rewrite this garbage - //TODO: Rewrite this garbage - //TODO: Rewrite this garbage - //TODO: Rewrite this garbage - //TODO: Rewrite this garbage - //TODO: Rewrite this garbage - //TODO: Rewrite this garbage - //TODO: Rewrite this garbage - //TODO: Rewrite this garbage - //TODO: Rewrite this garbage - //TODO: Rewrite this garbage - //TODO: Rewrite this garbage public void blastMiningDropProcessing(float yield, EntityExplodeEvent event) { + if (yield == 0) + return; + //Strip out only stuff that gives mining XP + List ores = new ArrayList<>(); - List ores = new ArrayList(); - - List notOres = new ArrayList<>(); + List notOres = new ArrayList<>(); for (Block targetBlock : event.blockList()) { + BlockState blockState = targetBlock.getState(); //Containers usually have 0 XP unless someone edited their config in a very strange way - if (ExperienceConfig.getInstance().getXp(PrimarySkillType.MINING, targetBlock) == 0 || targetBlock instanceof Container || mcMMO.getPlaceStore().isTrue(targetBlock)) { - notOres.add(targetBlock); - } else { - ores.add(targetBlock.getState()); + if (ExperienceConfig.getInstance().getXp(PrimarySkillType.MINING, targetBlock) != 0 + && !(targetBlock instanceof Container) + && !mcMMO.getPlaceStore().isTrue(targetBlock)) { + if(BlockUtils.isOre(blockState)) { + ores.add(blockState); + } else { + notOres.add(blockState); + } } } int xp = 0; -// float oreBonus = (float) (getOreBonus() / 100); - //TODO: Pretty sure something is fucked with debrisReduction stuff -// float debrisReduction = (float) (getDebrisReduction() / 100); + float oreBonus = (float) (getOreBonus() / 100); + float debrisReduction = (float) (getDebrisReduction() / 100); int dropMultiplier = getDropMultiplier(); + float debrisYield = yield - debrisReduction; -// float debrisYield = yield - debrisReduction; + //Drop "debris" based on skill modifiers + for(BlockState blockState : notOres) { + if(isDropIllegal(blockState.getType())) + continue; + + if(RandomUtils.nextFloat() < debrisYield) { + Misc.spawnItem(getPlayer(), Misc.getBlockCenter(blockState), new ItemStack(blockState.getType()), ItemSpawnReason.BLAST_MINING_DEBRIS_NON_ORES); // Initial block that would have been dropped + } + } for (BlockState blockState : ores) { - if (RandomUtils.nextInt(ores.size()) >= (ores.size() / 2)) { + if(isDropIllegal(blockState.getType())) + continue; + + if (RandomUtils.nextFloat() < (yield + oreBonus)) { xp += Mining.getBlockXp(blockState); - Misc.dropItem(Misc.getBlockCenter(blockState), new ItemStack(blockState.getType())); // Initial block that would have been dropped + Misc.spawnItem(getPlayer(), Misc.getBlockCenter(blockState), new ItemStack(blockState.getType()), ItemSpawnReason.BLAST_MINING_ORES); // Initial block that would have been dropped - for (int i = 1; i < dropMultiplier; i++) { - if(RandomUtils.nextInt(100) >= 75) - Mining.handleSilkTouchDrops(blockState); // Bonus drops - should drop the block & not the items + if (!mcMMO.getPlaceStore().isTrue(blockState)) { + for (int i = 1; i < dropMultiplier; i++) { +// Bukkit.broadcastMessage("Bonus Drop on Ore: "+blockState.getType().toString()); + Misc.spawnItem(getPlayer(), Misc.getBlockCenter(blockState), new ItemStack(blockState.getType()), ItemSpawnReason.BLAST_MINING_ORES_BONUS_DROP); // Initial block that would have been dropped + } } } } @@ -201,6 +205,17 @@ public class MiningManager extends SkillManager { applyXpGain(xp, XPGainReason.PVE); } + /** + * Checks if it would be illegal (in vanilla) to obtain the block + * Certain things should never drop ( such as budding_amethyst ) + * + * @param material target material + * @return true if it's not legal to obtain the block through normal gameplay + */ + public boolean isDropIllegal(@NotNull Material material) { + return material.getKey().getKey().equalsIgnoreCase(BUDDING_AMETHYST); + } + /** * Increases the blast radius of the explosion. * @@ -234,11 +249,11 @@ public class MiningManager extends SkillManager { } public static double getOreBonus(int rank) { - return AdvancedConfig.getInstance().getOreBonus(rank); + return mcMMO.p.getAdvancedConfig().getOreBonus(rank); } public static double getDebrisReduction(int rank) { - return AdvancedConfig.getInstance().getDebrisReduction(rank); + return mcMMO.p.getAdvancedConfig().getDebrisReduction(rank); } /** @@ -251,7 +266,7 @@ public class MiningManager extends SkillManager { } public static int getDropMultiplier(int rank) { - return AdvancedConfig.getInstance().getDropMultiplier(rank); + return mcMMO.p.getAdvancedConfig().getDropMultiplier(rank); } /** @@ -296,7 +311,7 @@ public class MiningManager extends SkillManager { } private boolean blastMiningCooldownOver() { - int timeRemaining = mcMMOPlayer.calculateTimeRemaining(SuperAbilityType.BLAST_MINING); + int timeRemaining = mmoPlayer.calculateTimeRemaining(SuperAbilityType.BLAST_MINING); if (timeRemaining > 0) { //getPlayer().sendMessage(LocaleLoader.getString("Skills.TooTired", timeRemaining)); diff --git a/src/main/java/com/gmail/nossr50/skills/repair/ArcaneForging.java b/src/main/java/com/gmail/nossr50/skills/repair/ArcaneForging.java index f7ea4fd70..05bcfb160 100644 --- a/src/main/java/com/gmail/nossr50/skills/repair/ArcaneForging.java +++ b/src/main/java/com/gmail/nossr50/skills/repair/ArcaneForging.java @@ -1,9 +1,9 @@ package com.gmail.nossr50.skills.repair; -import com.gmail.nossr50.config.AdvancedConfig; +import com.gmail.nossr50.mcMMO; public class ArcaneForging { - public static boolean arcaneForgingDowngrades = AdvancedConfig.getInstance().getArcaneForgingDowngradeEnabled(); - public static boolean arcaneForgingEnchantLoss = AdvancedConfig.getInstance().getArcaneForgingEnchantLossEnabled(); + public static boolean arcaneForgingDowngrades = mcMMO.p.getAdvancedConfig().getArcaneForgingDowngradeEnabled(); + public static boolean arcaneForgingEnchantLoss = mcMMO.p.getAdvancedConfig().getArcaneForgingEnchantLossEnabled(); } diff --git a/src/main/java/com/gmail/nossr50/skills/repair/Repair.java b/src/main/java/com/gmail/nossr50/skills/repair/Repair.java index 4ee346ea1..36ba8cdc5 100644 --- a/src/main/java/com/gmail/nossr50/skills/repair/Repair.java +++ b/src/main/java/com/gmail/nossr50/skills/repair/Repair.java @@ -1,13 +1,12 @@ package com.gmail.nossr50.skills.repair; -import com.gmail.nossr50.config.AdvancedConfig; -import com.gmail.nossr50.config.Config; import com.gmail.nossr50.datatypes.skills.SubSkillType; +import com.gmail.nossr50.mcMMO; import org.bukkit.Material; public class Repair { - public static int repairMasteryMaxBonusLevel = AdvancedConfig.getInstance().getMaxBonusLevel(SubSkillType.REPAIR_REPAIR_MASTERY); - public static double repairMasteryMaxBonus = AdvancedConfig.getInstance().getRepairMasteryMaxBonus(); + public static int repairMasteryMaxBonusLevel = mcMMO.p.getAdvancedConfig().getMaxBonusLevel(SubSkillType.REPAIR_REPAIR_MASTERY); + public static double repairMasteryMaxBonus = mcMMO.p.getAdvancedConfig().getRepairMasteryMaxBonus(); - public static Material anvilMaterial = Config.getInstance().getRepairAnvilMaterial(); + public static Material anvilMaterial = mcMMO.p.getGeneralConfig().getRepairAnvilMaterial(); } diff --git a/src/main/java/com/gmail/nossr50/skills/repair/RepairManager.java b/src/main/java/com/gmail/nossr50/skills/repair/RepairManager.java index ce1d1775d..203244107 100644 --- a/src/main/java/com/gmail/nossr50/skills/repair/RepairManager.java +++ b/src/main/java/com/gmail/nossr50/skills/repair/RepairManager.java @@ -1,7 +1,5 @@ package com.gmail.nossr50.skills.repair; -import com.gmail.nossr50.config.AdvancedConfig; -import com.gmail.nossr50.config.Config; import com.gmail.nossr50.config.experience.ExperienceConfig; import com.gmail.nossr50.datatypes.experience.XPGainReason; import com.gmail.nossr50.datatypes.interactions.NotificationType; @@ -15,7 +13,6 @@ import com.gmail.nossr50.skills.repair.repairables.Repairable; import com.gmail.nossr50.util.EventUtils; import com.gmail.nossr50.util.Misc; import com.gmail.nossr50.util.Permissions; -import com.gmail.nossr50.util.StringUtils; import com.gmail.nossr50.util.player.NotificationManager; import com.gmail.nossr50.util.random.RandomChanceSkillStatic; import com.gmail.nossr50.util.random.RandomChanceUtil; @@ -24,14 +21,18 @@ import com.gmail.nossr50.util.skills.SkillActivationType; import com.gmail.nossr50.util.skills.SkillUtils; import com.gmail.nossr50.util.sounds.SoundManager; import com.gmail.nossr50.util.sounds.SoundType; +import com.gmail.nossr50.util.text.StringUtils; import org.bukkit.Material; import org.bukkit.enchantments.Enchantment; import org.bukkit.entity.Player; import org.bukkit.inventory.ItemStack; import org.bukkit.inventory.PlayerInventory; +import java.util.Arrays; import java.util.Map; import java.util.Map.Entry; +import java.util.Objects; +import java.util.Optional; public class RepairManager extends SkillManager { private boolean placedAnvil; @@ -51,11 +52,11 @@ public class RepairManager extends SkillManager { return; } - if (Config.getInstance().getRepairAnvilMessagesEnabled()) { + if (mcMMO.p.getGeneralConfig().getRepairAnvilMessagesEnabled()) { NotificationManager.sendPlayerInformation(player, NotificationType.SUBSKILL_MESSAGE, "Repair.Listener.Anvil"); } - if (Config.getInstance().getRepairAnvilPlaceSoundsEnabled()) { + if (mcMMO.p.getGeneralConfig().getRepairAnvilPlaceSoundsEnabled()) { SoundManager.sendSound(player, player.getLocation(), SoundType.ANVIL); } @@ -128,6 +129,38 @@ public class RepairManager extends SkillManager { int baseRepairAmount = repairable.getBaseRepairDurability(item); // Did they send me daughters? short newDurability = repairCalculate(startDurability, baseRepairAmount); // When I asked for sons? + // toRemove should be refreshed before the event call. + toRemove = inventory.getItem(inventory.first(repairMaterial)).clone(); + + // Check if we allow enchanted materials to be used to repair objects. + // (Servers may provide enchanted items that don't follow their intended use) + if (!mcMMO.p.getAdvancedConfig().getAllowEnchantedRepairMaterials()) { + + // See if our proposed item is even enchanted in the first place. + if (toRemove.getEnchantments().size() > 0) { + + // Lots of array sorting to find a potential non-enchanted candidate item. + Optional possibleMaterial = Arrays.stream(inventory.getContents()) + .filter(Objects::nonNull) + .filter(p -> p.getType() == repairMaterial) + .filter(p -> p.getEnchantments().isEmpty()) + .findFirst(); + + // Fail out with "you need material" if we don't find a suitable alternative. + if (possibleMaterial.isEmpty()) { + String prettyName = repairable.getRepairMaterialPrettyName() == null ? StringUtils.getPrettyItemString(repairMaterial) : repairable.getRepairMaterialPrettyName(); + + String materialsNeeded = ""; + + NotificationManager.sendPlayerInformation(player, NotificationType.SUBSKILL_MESSAGE_FAILED, "Skills.NeedMore.Extra", prettyName, materialsNeeded); + return; + } + + // Update our toRemove item to our suggested possible material. + toRemove = possibleMaterial.get().clone(); + } + } + // Call event if (EventUtils.callRepairCheckEvent(player, (short) (startDurability - newDurability), toRemove, item).isCancelled()) { return; @@ -139,7 +172,6 @@ public class RepairManager extends SkillManager { } // Remove the item - toRemove = inventory.getItem(inventory.first(repairMaterial)).clone(); toRemove.setAmount(1); inventory.removeItem(toRemove); @@ -151,7 +183,7 @@ public class RepairManager extends SkillManager { * ExperienceConfig.getInstance().getRepairXP(repairable.getRepairMaterialType())), XPGainReason.PVE); // BWONG BWONG BWONG - if (Config.getInstance().getRepairAnvilUseSoundsEnabled()) { + if (mcMMO.p.getGeneralConfig().getRepairAnvilUseSoundsEnabled()) { SoundManager.sendSound(player, player.getLocation(), SoundType.ANVIL); SoundManager.sendSound(player, player.getLocation(), SoundType.ITEM_BREAK); } @@ -173,7 +205,7 @@ public class RepairManager extends SkillManager { Player player = getPlayer(); long lastUse = getLastAnvilUse(); - if (!SkillUtils.cooldownExpired(lastUse, 3) || !Config.getInstance().getRepairConfirmRequired()) { + if (!SkillUtils.cooldownExpired(lastUse, 3) || !mcMMO.p.getGeneralConfig().getRepairConfirmRequired()) { return true; } @@ -202,7 +234,7 @@ public class RepairManager extends SkillManager { * @return The chance of keeping the enchantment */ public double getKeepEnchantChance() { - return AdvancedConfig.getInstance().getArcaneForgingKeepEnchantsChance(getArcaneForgingRank()); + return mcMMO.p.getAdvancedConfig().getArcaneForgingKeepEnchantsChance(getArcaneForgingRank()); } /** @@ -211,13 +243,13 @@ public class RepairManager extends SkillManager { * @return The chance of the enchantment being downgraded */ public double getDowngradeEnchantChance() { - return AdvancedConfig.getInstance().getArcaneForgingDowngradeChance(getArcaneForgingRank()); + return mcMMO.p.getAdvancedConfig().getArcaneForgingDowngradeChance(getArcaneForgingRank()); } - /** - * Gets chance of keeping enchantment during repair. - * - * @return The chance of keeping the enchantment + /* + Gets chance of keeping enchantment during repair. + + @return The chance of keeping the enchantment */ /*public double getKeepEnchantChance() { int skillLevel = getSkillLevel(); @@ -231,10 +263,10 @@ public class RepairManager extends SkillManager { return 0; }*/ - /** - * Gets chance of enchantment being downgraded during repair. - * - * @return The chance of the enchantment being downgraded + /* + Gets chance of enchantment being downgraded during repair. + + @return The chance of the enchantment being downgraded */ /*public double getDowngradeEnchantChance() { int skillLevel = getSkillLevel(); @@ -393,4 +425,4 @@ public class RepairManager extends SkillManager { public void actualizeLastAnvilUse() { lastClick = (int) (System.currentTimeMillis() / Misc.TIME_CONVERSION_FACTOR); } -} \ No newline at end of file +} diff --git a/src/main/java/com/gmail/nossr50/skills/repair/repairables/Repairable.java b/src/main/java/com/gmail/nossr50/skills/repair/repairables/Repairable.java index 24384872e..b59333f9d 100644 --- a/src/main/java/com/gmail/nossr50/skills/repair/repairables/Repairable.java +++ b/src/main/java/com/gmail/nossr50/skills/repair/repairables/Repairable.java @@ -12,35 +12,35 @@ public interface Repairable { * * @return the type of this repairable */ - public Material getItemMaterial(); + Material getItemMaterial(); /** * Gets the id of the material used to repair this item * * @return the id of the repair material */ - public Material getRepairMaterial(); + Material getRepairMaterial(); /** * Gets the pretty name of the material used to repair this item * * @return the pretty name of the repair material */ - public String getRepairMaterialPrettyName(); + String getRepairMaterialPrettyName(); /** * Gets the RepairItemType value for this repairable item * * @return the RepairItemType for this repairable */ - public ItemType getRepairItemType(); + ItemType getRepairItemType(); /** * Gets the RepairMaterialType value for this repairable item * * @return the RepairMaterialType for this repairable */ - public MaterialType getRepairMaterialType(); + MaterialType getRepairMaterialType(); /** * Gets the minimum quantity of repair materials ignoring all other repair bonuses @@ -49,14 +49,14 @@ public interface Repairable { * * @return the minimum number of items */ - public int getMinimumQuantity(); + int getMinimumQuantity(); /** * Gets the maximum durability of this item before it breaks * * @return the maximum durability */ - public short getMaximumDurability(); + short getMaximumDurability(); /** * Gets the base repair durability on which to calculate bonuses. @@ -65,19 +65,19 @@ public interface Repairable { * * @return the base repair durability */ - public short getBaseRepairDurability(ItemStack itemStack); + short getBaseRepairDurability(ItemStack itemStack); /** * Gets the minimum repair level needed to repair this item * * @return the minimum level to repair this item, or 0 for no minimum */ - public int getMinimumLevel(); + int getMinimumLevel(); /** * Gets the xpMultiplier for this repairable * * @return the xpMultiplier of this repairable */ - public double getXpMultiplier(); + double getXpMultiplier(); } diff --git a/src/main/java/com/gmail/nossr50/skills/repair/repairables/RepairableManager.java b/src/main/java/com/gmail/nossr50/skills/repair/repairables/RepairableManager.java index fff27e718..fbfe46019 100644 --- a/src/main/java/com/gmail/nossr50/skills/repair/repairables/RepairableManager.java +++ b/src/main/java/com/gmail/nossr50/skills/repair/repairables/RepairableManager.java @@ -11,14 +11,14 @@ public interface RepairableManager { * * @param repairable Repairable to register */ - public void registerRepairable(Repairable repairable); + void registerRepairable(Repairable repairable); /** * Register a list of repairables with the RepairManager * * @param repairables List to register */ - public void registerRepairables(List repairables); + void registerRepairables(List repairables); /** * Checks if an item is repairable @@ -27,7 +27,7 @@ public interface RepairableManager { * * @return true if repairable, false if not */ - public boolean isRepairable(Material type); + boolean isRepairable(Material type); /** * Checks if an item is repairable @@ -36,7 +36,7 @@ public interface RepairableManager { * * @return true if repairable, false if not */ - public boolean isRepairable(ItemStack itemStack); + boolean isRepairable(ItemStack itemStack); /** * Gets the repairable with this type @@ -45,5 +45,5 @@ public interface RepairableManager { * * @return the repairable, can be null */ - public Repairable getRepairable(Material type); + Repairable getRepairable(Material type); } diff --git a/src/main/java/com/gmail/nossr50/skills/repair/repairables/SimpleRepairable.java b/src/main/java/com/gmail/nossr50/skills/repair/repairables/SimpleRepairable.java index aecfac359..de201456d 100644 --- a/src/main/java/com/gmail/nossr50/skills/repair/repairables/SimpleRepairable.java +++ b/src/main/java/com/gmail/nossr50/skills/repair/repairables/SimpleRepairable.java @@ -11,7 +11,7 @@ public class SimpleRepairable implements Repairable { private final Material itemMaterial, repairMaterial; private final int minimumLevel; private final short maximumDurability; - private String repairMaterialPrettyName; + private final String repairMaterialPrettyName; private final ItemType repairItemType; private final MaterialType repairMaterialType; private final double xpMultiplier; diff --git a/src/main/java/com/gmail/nossr50/skills/repair/repairables/SimpleRepairableManager.java b/src/main/java/com/gmail/nossr50/skills/repair/repairables/SimpleRepairableManager.java index 8fe95d830..dd7a74f36 100644 --- a/src/main/java/com/gmail/nossr50/skills/repair/repairables/SimpleRepairableManager.java +++ b/src/main/java/com/gmail/nossr50/skills/repair/repairables/SimpleRepairableManager.java @@ -7,14 +7,14 @@ import java.util.HashMap; import java.util.List; public class SimpleRepairableManager implements RepairableManager { - private HashMap repairables; + private final HashMap repairables; public SimpleRepairableManager() { this(55); } public SimpleRepairableManager(int repairablesSize) { - this.repairables = new HashMap(repairablesSize); + this.repairables = new HashMap<>(repairablesSize); } @Override diff --git a/src/main/java/com/gmail/nossr50/skills/salvage/Salvage.java b/src/main/java/com/gmail/nossr50/skills/salvage/Salvage.java index dde4962c6..4f510f909 100644 --- a/src/main/java/com/gmail/nossr50/skills/salvage/Salvage.java +++ b/src/main/java/com/gmail/nossr50/skills/salvage/Salvage.java @@ -1,21 +1,27 @@ package com.gmail.nossr50.skills.salvage; -import com.gmail.nossr50.config.AdvancedConfig; -import com.gmail.nossr50.config.Config; +import com.gmail.nossr50.mcMMO; import org.bukkit.Material; -public class Salvage { - public static Material anvilMaterial = Config.getInstance().getSalvageAnvilMaterial(); +public final class Salvage { - /*public static int salvageMaxPercentageLevel = AdvancedConfig.getInstance().getSalvageMaxPercentageLevel(); - public static double salvageMaxPercentage = AdvancedConfig.getInstance().getSalvageMaxPercentage(); + /** + * This is a static utility class, therefore we don't want any instances of + * this class. Making the constructor private prevents accidents like that. + */ + private Salvage() {} + + public static Material anvilMaterial = mcMMO.p.getGeneralConfig().getSalvageAnvilMaterial(); + + /*public static int salvageMaxPercentageLevel = mcMMO.p.getAdvancedConfig().getSalvageMaxPercentageLevel(); + public static double salvageMaxPercentage = mcMMO.p.getAdvancedConfig().getSalvageMaxPercentage(); public static int advancedSalvageUnlockLevel = RankUtils.getRankUnlockLevel(SubSkillType.SALVAGE_SCRAP_COLLECTOR, 1);*/ - public static boolean arcaneSalvageDowngrades = AdvancedConfig.getInstance().getArcaneSalvageEnchantDowngradeEnabled(); - public static boolean arcaneSalvageEnchantLoss = AdvancedConfig.getInstance().getArcaneSalvageEnchantLossEnabled(); + public static boolean arcaneSalvageDowngrades = mcMMO.p.getAdvancedConfig().getArcaneSalvageEnchantDowngradeEnabled(); + public static boolean arcaneSalvageEnchantLoss = mcMMO.p.getAdvancedConfig().getArcaneSalvageEnchantLossEnabled(); - protected static int calculateSalvageableAmount(short currentDurability, short maxDurability, int baseAmount) { + static int calculateSalvageableAmount(int currentDurability, short maxDurability, int baseAmount) { double percentDamaged = (maxDurability <= 0) ? 1D : (double) (maxDurability - currentDurability) / maxDurability; return (int) Math.floor(baseAmount * percentDamaged); diff --git a/src/main/java/com/gmail/nossr50/skills/salvage/SalvageManager.java b/src/main/java/com/gmail/nossr50/skills/salvage/SalvageManager.java index 7eab2c9dc..4e4c04ff3 100644 --- a/src/main/java/com/gmail/nossr50/skills/salvage/SalvageManager.java +++ b/src/main/java/com/gmail/nossr50/skills/salvage/SalvageManager.java @@ -1,7 +1,6 @@ package com.gmail.nossr50.skills.salvage; -import com.gmail.nossr50.config.AdvancedConfig; -import com.gmail.nossr50.config.Config; +import com.gmail.nossr50.api.ItemSpawnReason; import com.gmail.nossr50.config.experience.ExperienceConfig; import com.gmail.nossr50.datatypes.interactions.NotificationType; import com.gmail.nossr50.datatypes.player.McMMOPlayer; @@ -14,7 +13,6 @@ import com.gmail.nossr50.skills.salvage.salvageables.Salvageable; import com.gmail.nossr50.util.EventUtils; import com.gmail.nossr50.util.Misc; import com.gmail.nossr50.util.Permissions; -import com.gmail.nossr50.util.StringUtils; import com.gmail.nossr50.util.player.NotificationManager; import com.gmail.nossr50.util.random.RandomChanceSkillStatic; import com.gmail.nossr50.util.random.RandomChanceUtil; @@ -22,12 +20,15 @@ import com.gmail.nossr50.util.skills.RankUtils; import com.gmail.nossr50.util.skills.SkillUtils; import com.gmail.nossr50.util.sounds.SoundManager; import com.gmail.nossr50.util.sounds.SoundType; +import com.gmail.nossr50.util.text.StringUtils; import org.bukkit.Location; import org.bukkit.Material; import org.bukkit.enchantments.Enchantment; import org.bukkit.entity.Player; import org.bukkit.inventory.ItemStack; +import org.bukkit.inventory.meta.Damageable; import org.bukkit.inventory.meta.EnchantmentStorageMeta; +import org.bukkit.inventory.meta.ItemMeta; import java.util.Map; import java.util.Map.Entry; @@ -50,11 +51,11 @@ public class SalvageManager extends SkillManager { return; } - if (Config.getInstance().getSalvageAnvilMessagesEnabled()) { + if (mcMMO.p.getGeneralConfig().getSalvageAnvilMessagesEnabled()) { NotificationManager.sendPlayerInformation(player, NotificationType.SUBSKILL_MESSAGE, "Salvage.Listener.Anvil"); } - if (Config.getInstance().getSalvageAnvilPlaceSoundsEnabled()) { + if (mcMMO.p.getGeneralConfig().getSalvageAnvilPlaceSoundsEnabled()) { SoundManager.sendSound(player, player.getLocation(), SoundType.ANVIL); } @@ -65,8 +66,9 @@ public class SalvageManager extends SkillManager { Player player = getPlayer(); Salvageable salvageable = mcMMO.getSalvageableManager().getSalvageable(item.getType()); - - if (item.getItemMeta() != null && item.getItemMeta().isUnbreakable()) { + ItemMeta meta = item.getItemMeta(); + + if (meta != null && meta.isUnbreakable()) { NotificationManager.sendPlayerInformation(player, NotificationType.SUBSKILL_MESSAGE_FAILED, "Anvil.Unbreakable"); return; } @@ -87,11 +89,14 @@ public class SalvageManager extends SkillManager { // Level check if (getSkillLevel() < minimumSalvageableLevel) { - NotificationManager.sendPlayerInformation(player, NotificationType.REQUIREMENTS_NOT_MET, "Salvage.Skills.Adept.Level", String.valueOf(salvageable.getMinimumLevel()), StringUtils.getPrettyItemString(item.getType())); + NotificationManager.sendPlayerInformation(player, NotificationType.REQUIREMENTS_NOT_MET, + "Salvage.Skills.Adept.Level", + String.valueOf(minimumSalvageableLevel), StringUtils.getPrettyItemString(item.getType())); return; } - int potentialSalvageYield = Salvage.calculateSalvageableAmount(item.getDurability(), salvageable.getMaximumDurability(), salvageable.getMaximumQuantity()); + int durability = meta instanceof Damageable ? ((Damageable) meta).getDamage(): 0; + int potentialSalvageYield = Salvage.calculateSalvageableAmount(durability, salvageable.getMaximumDurability(), salvageable.getMaximumQuantity()); if (potentialSalvageYield <= 0) { NotificationManager.sendPlayerInformation(player, NotificationType.SUBSKILL_MESSAGE_FAILED, "Salvage.Skills.TooDamaged"); @@ -100,7 +105,6 @@ public class SalvageManager extends SkillManager { potentialSalvageYield = Math.min(potentialSalvageYield, getSalvageLimit()); // Always get at least something back, if you're capable of salvaging it. - player.getInventory().setItemInMainHand(new ItemStack(Material.AIR)); location.add(0.5, 1, 0.5); Map enchants = item.getEnchantments(); @@ -125,14 +129,6 @@ public class SalvageManager extends SkillManager { } } - if(lotteryResults == potentialSalvageYield && potentialSalvageYield != 1 && RankUtils.isPlayerMaxRankInSubSkill(player, SubSkillType.SALVAGE_ARCANE_SALVAGE)) { - NotificationManager.sendPlayerInformationChatOnly(player, "Salvage.Skills.Lottery.Perfect", String.valueOf(lotteryResults), StringUtils.getPrettyItemString(item.getType())); - } else if(salvageable.getMaximumQuantity() == 1 || getSalvageLimit() >= salvageable.getMaximumQuantity()) { - NotificationManager.sendPlayerInformationChatOnly(player, "Salvage.Skills.Lottery.Normal", String.valueOf(lotteryResults), StringUtils.getPrettyItemString(item.getType())); - } else { - NotificationManager.sendPlayerInformationChatOnly(player, "Salvage.Skills.Lottery.Untrained", String.valueOf(lotteryResults), StringUtils.getPrettyItemString(item.getType())); - } - ItemStack salvageResults = new ItemStack(salvageable.getSalvageMaterial(), lotteryResults); //Call event @@ -140,6 +136,17 @@ public class SalvageManager extends SkillManager { return; } + // We only send a confirmation message after processing the event (fixes #4694) + if (lotteryResults == potentialSalvageYield && potentialSalvageYield != 1 && RankUtils.isPlayerMaxRankInSubSkill(player, SubSkillType.SALVAGE_ARCANE_SALVAGE)) { + NotificationManager.sendPlayerInformationChatOnly(player, "Salvage.Skills.Lottery.Perfect", String.valueOf(lotteryResults), StringUtils.getPrettyItemString(item.getType())); + } else if (salvageable.getMaximumQuantity() == 1 || getSalvageLimit() >= salvageable.getMaximumQuantity()) { + NotificationManager.sendPlayerInformationChatOnly(player, "Salvage.Skills.Lottery.Normal", String.valueOf(lotteryResults), StringUtils.getPrettyItemString(item.getType())); + } else { + NotificationManager.sendPlayerInformationChatOnly(player, "Salvage.Skills.Lottery.Untrained", String.valueOf(lotteryResults), StringUtils.getPrettyItemString(item.getType())); + } + + player.getInventory().setItemInMainHand(new ItemStack(Material.AIR)); + Location anvilLoc = location.clone(); Location playerLoc = player.getLocation().clone(); double distance = anvilLoc.distance(playerLoc); @@ -154,13 +161,13 @@ public class SalvageManager extends SkillManager { anvilLoc.add(0, .1, 0); if (enchantBook != null) { - Misc.spawnItemTowardsLocation(anvilLoc.clone(), playerLoc.clone(), enchantBook, vectorSpeed); + Misc.spawnItemTowardsLocation(getPlayer(), anvilLoc.clone(), playerLoc.clone(), enchantBook, vectorSpeed, ItemSpawnReason.SALVAGE_ENCHANTMENT_BOOK); } - Misc.spawnItemTowardsLocation(anvilLoc.clone(), playerLoc.clone(), salvageResults, vectorSpeed); + Misc.spawnItemTowardsLocation(getPlayer(), anvilLoc.clone(), playerLoc.clone(), salvageResults, vectorSpeed, ItemSpawnReason.SALVAGE_MATERIALS); // BWONG BWONG BWONG - CLUNK! - if (Config.getInstance().getSalvageAnvilUseSoundsEnabled()) { + if (mcMMO.p.getGeneralConfig().getSalvageAnvilUseSoundsEnabled()) { SoundManager.sendSound(player, player.getLocation(), SoundType.ITEM_BREAK); } @@ -212,11 +219,11 @@ public class SalvageManager extends SkillManager { if(Permissions.hasSalvageEnchantBypassPerk(getPlayer())) return 100.0D; - return AdvancedConfig.getInstance().getArcaneSalvageExtractFullEnchantsChance(getArcaneSalvageRank()); + return mcMMO.p.getAdvancedConfig().getArcaneSalvageExtractFullEnchantsChance(getArcaneSalvageRank()); } public double getExtractPartialEnchantChance() { - return AdvancedConfig.getInstance().getArcaneSalvageExtractPartialEnchantsChance(getArcaneSalvageRank()); + return mcMMO.p.getAdvancedConfig().getArcaneSalvageExtractPartialEnchantsChance(getArcaneSalvageRank()); } private ItemStack arcaneSalvageCheck(Map enchants) { @@ -285,7 +292,7 @@ public class SalvageManager extends SkillManager { Player player = getPlayer(); long lastUse = getLastAnvilUse(); - if (!SkillUtils.cooldownExpired(lastUse, 3) || !Config.getInstance().getSalvageConfirmRequired()) { + if (!SkillUtils.cooldownExpired(lastUse, 3) || !mcMMO.p.getGeneralConfig().getSalvageConfirmRequired()) { return true; } diff --git a/src/main/java/com/gmail/nossr50/skills/salvage/salvageables/Salvageable.java b/src/main/java/com/gmail/nossr50/skills/salvage/salvageables/Salvageable.java index 07831d5ea..1d9ac26a9 100644 --- a/src/main/java/com/gmail/nossr50/skills/salvage/salvageables/Salvageable.java +++ b/src/main/java/com/gmail/nossr50/skills/salvage/salvageables/Salvageable.java @@ -10,28 +10,28 @@ public interface Salvageable { * * @return the type of this salvageable */ - public Material getItemMaterial(); + Material getItemMaterial(); /** * Gets the material of the items dropped when salvaging this item * * @return the material of the salvage drop */ - public Material getSalvageMaterial(); + Material getSalvageMaterial(); /** * Gets the ItemType value for this salvageable item * * @return the ItemType for this salvageable */ - public ItemType getSalvageItemType(); + ItemType getSalvageItemType(); /** * Gets the MaterialType value for this salvageable item * * @return the MaterialType for this salvageable */ - public MaterialType getSalvageMaterialType(); + MaterialType getSalvageMaterialType(); /** * Gets the maximum quantity of salvage materials ignoring all other salvage bonuses @@ -40,14 +40,14 @@ public interface Salvageable { * * @return the maximum number of items */ - public int getMaximumQuantity(); + int getMaximumQuantity(); /** * Gets the maximum durability of this item before it breaks * * @return the maximum durability */ - public short getMaximumDurability(); + short getMaximumDurability(); /** * Gets the base salvage durability on which to calculate bonuses. @@ -56,19 +56,19 @@ public interface Salvageable { * * @return the base salvage durability */ - public short getBaseSalvageDurability(); + short getBaseSalvageDurability(); /** * Gets the minimum salvage level needed to salvage this item * * @return the minimum level to salvage this item, or 0 for no minimum */ - public int getMinimumLevel(); + int getMinimumLevel(); /** * Gets the xpMultiplier for this salvageable * * @return the xpMultiplier of this salvageable */ - public double getXpMultiplier(); + double getXpMultiplier(); } diff --git a/src/main/java/com/gmail/nossr50/skills/salvage/salvageables/SalvageableFactory.java b/src/main/java/com/gmail/nossr50/skills/salvage/salvageables/SalvageableFactory.java index f22108157..d408b1992 100644 --- a/src/main/java/com/gmail/nossr50/skills/salvage/salvageables/SalvageableFactory.java +++ b/src/main/java/com/gmail/nossr50/skills/salvage/salvageables/SalvageableFactory.java @@ -4,7 +4,13 @@ import com.gmail.nossr50.datatypes.skills.ItemType; import com.gmail.nossr50.datatypes.skills.MaterialType; import org.bukkit.Material; -public class SalvageableFactory { +public final class SalvageableFactory { + /** + * This is a static utility class, therefore we don't want any instances of + * this class. Making the constructor private prevents accidents like that. + */ + private SalvageableFactory() {} + public static Salvageable getSalvageable(Material itemMaterial, Material recipeMaterial, int maximumQuantity, short maximumDurability) { return getSalvageable(itemMaterial, recipeMaterial, 0, maximumQuantity, maximumDurability, ItemType.OTHER, MaterialType.OTHER, 1); } diff --git a/src/main/java/com/gmail/nossr50/skills/salvage/salvageables/SalvageableManager.java b/src/main/java/com/gmail/nossr50/skills/salvage/salvageables/SalvageableManager.java index fb9f4b84e..24add9b40 100644 --- a/src/main/java/com/gmail/nossr50/skills/salvage/salvageables/SalvageableManager.java +++ b/src/main/java/com/gmail/nossr50/skills/salvage/salvageables/SalvageableManager.java @@ -11,14 +11,14 @@ public interface SalvageableManager { * * @param salvageable Salvageable to register */ - public void registerSalvageable(Salvageable salvageable); + void registerSalvageable(Salvageable salvageable); /** * Register a list of salvageables with the SalvageManager * * @param salvageables List to register */ - public void registerSalvageables(List salvageables); + void registerSalvageables(List salvageables); /** * Checks if an item is salvageable @@ -27,7 +27,7 @@ public interface SalvageableManager { * * @return true if salvageable, false if not */ - public boolean isSalvageable(Material type); + boolean isSalvageable(Material type); /** * Checks if an item is salvageable @@ -36,7 +36,7 @@ public interface SalvageableManager { * * @return true if salvageable, false if not */ - public boolean isSalvageable(ItemStack itemStack); + boolean isSalvageable(ItemStack itemStack); /** * Gets the salvageable with this type @@ -45,5 +45,5 @@ public interface SalvageableManager { * * @return the salvageable, can be null */ - public Salvageable getSalvageable(Material type); + Salvageable getSalvageable(Material type); } diff --git a/src/main/java/com/gmail/nossr50/skills/salvage/salvageables/SimpleSalvageableManager.java b/src/main/java/com/gmail/nossr50/skills/salvage/salvageables/SimpleSalvageableManager.java index 872364e64..1a6d8a1f3 100644 --- a/src/main/java/com/gmail/nossr50/skills/salvage/salvageables/SimpleSalvageableManager.java +++ b/src/main/java/com/gmail/nossr50/skills/salvage/salvageables/SimpleSalvageableManager.java @@ -5,17 +5,17 @@ import org.bukkit.inventory.ItemStack; import java.util.HashMap; import java.util.List; - +import java.util.Map; public class SimpleSalvageableManager implements SalvageableManager { - private HashMap salvageables; + private final Map salvageables; public SimpleSalvageableManager() { this(55); } public SimpleSalvageableManager(int salvageablesSize) { - this.salvageables = new HashMap(salvageablesSize); + this.salvageables = new HashMap<>(salvageablesSize); } @Override diff --git a/src/main/java/com/gmail/nossr50/skills/smelting/Smelting.java b/src/main/java/com/gmail/nossr50/skills/smelting/Smelting.java index 11b43d7d8..c9bb2bd13 100644 --- a/src/main/java/com/gmail/nossr50/skills/smelting/Smelting.java +++ b/src/main/java/com/gmail/nossr50/skills/smelting/Smelting.java @@ -2,22 +2,13 @@ package com.gmail.nossr50.skills.smelting; import com.gmail.nossr50.config.experience.ExperienceConfig; import com.gmail.nossr50.datatypes.skills.PrimarySkillType; -import com.gmail.nossr50.datatypes.skills.SubSkillType; -import com.gmail.nossr50.mcMMO; -import com.gmail.nossr50.util.skills.RankUtils; -import org.bukkit.entity.Player; import org.bukkit.inventory.ItemStack; +import org.jetbrains.annotations.NotNull; public class Smelting { - public static int getRank(Player player) - { - return RankUtils.getRank(player, SubSkillType.SMELTING_UNDERSTANDING_THE_ART); + public static int getSmeltXP(@NotNull ItemStack smelting) { + return ExperienceConfig.getInstance().getXp(PrimarySkillType.SMELTING, smelting.getType()); } - //public static int fluxMiningUnlockLevel = RankUtils.getUnlockLevel(SubSkillType.SMELTING_FLUX_MINING); - - protected static int getResourceXp(ItemStack smelting) { - return mcMMO.getModManager().isCustomOre(smelting.getType()) ? mcMMO.getModManager().getBlock(smelting.getType()).getSmeltingXpGain() : ExperienceConfig.getInstance().getXp(PrimarySkillType.SMELTING, smelting.getType()); - } } diff --git a/src/main/java/com/gmail/nossr50/skills/smelting/SmeltingManager.java b/src/main/java/com/gmail/nossr50/skills/smelting/SmeltingManager.java index e36df9787..90ece98cf 100644 --- a/src/main/java/com/gmail/nossr50/skills/smelting/SmeltingManager.java +++ b/src/main/java/com/gmail/nossr50/skills/smelting/SmeltingManager.java @@ -5,14 +5,18 @@ import com.gmail.nossr50.datatypes.experience.XPGainSource; import com.gmail.nossr50.datatypes.player.McMMOPlayer; import com.gmail.nossr50.datatypes.skills.PrimarySkillType; import com.gmail.nossr50.datatypes.skills.SubSkillType; +import com.gmail.nossr50.mcMMO; import com.gmail.nossr50.skills.SkillManager; import com.gmail.nossr50.util.Permissions; import com.gmail.nossr50.util.random.RandomChanceUtil; import com.gmail.nossr50.util.skills.RankUtils; import com.gmail.nossr50.util.skills.SkillActivationType; -import org.bukkit.block.BlockState; +import org.bukkit.block.Furnace; import org.bukkit.event.inventory.FurnaceBurnEvent; +import org.bukkit.event.inventory.FurnaceSmeltEvent; +import org.bukkit.inventory.FurnaceInventory; import org.bukkit.inventory.ItemStack; +import org.jetbrains.annotations.NotNull; public class SmeltingManager extends SkillManager { public SmeltingManager(McMMOPlayer mcMMOPlayer) { @@ -31,10 +35,10 @@ public class SmeltingManager extends SkillManager { && RandomChanceUtil.isActivationSuccessful(SkillActivationType.RANDOM_LINEAR_100_SCALE_WITH_CAP, SubSkillType.SMELTING_SECOND_SMELT, getPlayer()); } - /** - * Process the Flux Mining ability. - * - * @param blockState The {@link BlockState} to check ability activation for + /* + Process the Flux Mining ability. + + @param blockState The {@link BlockState} to check ability activation for * @return true if the ability was successful, false otherwise */ /*public boolean processFluxMining(BlockState blockState) { @@ -108,17 +112,41 @@ public class SmeltingManager extends SkillManager { } } - public ItemStack smeltProcessing(ItemStack smelting, ItemStack result) { - applyXpGain(Smelting.getResourceXp(smelting), XPGainReason.PVE, XPGainSource.PASSIVE); + public void smeltProcessing(@NotNull FurnaceSmeltEvent furnaceSmeltEvent, @NotNull Furnace furnace) { + applyXpGain(Smelting.getSmeltXP(furnaceSmeltEvent.getSource()), XPGainReason.PVE, XPGainSource.PASSIVE); //Add XP - if (isSecondSmeltSuccessful()) { - ItemStack newResult = result.clone(); + processDoubleSmelt(furnaceSmeltEvent, furnace); + } - newResult.setAmount(result.getAmount() + 1); - return newResult; + private void processDoubleSmelt(@NotNull FurnaceSmeltEvent furnaceSmeltEvent, @NotNull Furnace furnace) { + ItemStack resultItemStack = furnaceSmeltEvent.getResult(); + /* + doubleSmeltCondition should be equal to the max + */ + + //Process double smelt + if (mcMMO.p.getGeneralConfig().getDoubleDropsEnabled(PrimarySkillType.SMELTING, resultItemStack.getType()) + && canDoubleSmeltItemStack(furnace) //Effectively two less than max stack size + && isSecondSmeltSuccessful()) { + + ItemStack doubleSmeltStack = resultItemStack.clone(); //TODO: Necessary? + doubleSmeltStack.setAmount(resultItemStack.getAmount() + 1); //Add one + furnaceSmeltEvent.setResult(doubleSmeltStack); //Set result } + } - return result; + private boolean canDoubleSmeltItemStack(@NotNull Furnace furnace) { + FurnaceInventory furnaceInventory = furnace.getInventory(); + ItemStack furnaceResult = furnaceInventory.getResult(); + + if(furnaceResult == null) + return true; //This actually means there is nothing yet in the resulting item slot, which means it should always be okay to double smelt + + int resultAmount = furnaceResult.getAmount(); //Amount before double smelt + int itemLimit = furnaceResult.getMaxStackSize(); + int doubleSmeltCondition = itemLimit - 2; //Don't double smelt if it would cause an illegal stack size + + return resultAmount <= doubleSmeltCondition; } public int vanillaXPBoost(int experience) { diff --git a/src/main/java/com/gmail/nossr50/skills/swords/Swords.java b/src/main/java/com/gmail/nossr50/skills/swords/Swords.java index c15d05ab7..7dda504ea 100644 --- a/src/main/java/com/gmail/nossr50/skills/swords/Swords.java +++ b/src/main/java/com/gmail/nossr50/skills/swords/Swords.java @@ -1,11 +1,9 @@ package com.gmail.nossr50.skills.swords; -import com.gmail.nossr50.config.AdvancedConfig; +import com.gmail.nossr50.mcMMO; public class Swords { - public static int bleedMaxTicks = AdvancedConfig.getInstance().getRuptureMaxTicks(); + public static double counterAttackModifier = mcMMO.p.getAdvancedConfig().getCounterModifier(); - public static double counterAttackModifier = AdvancedConfig.getInstance().getCounterModifier(); - - public static double serratedStrikesModifier = AdvancedConfig.getInstance().getSerratedStrikesModifier(); + public static double serratedStrikesModifier = mcMMO.p.getAdvancedConfig().getSerratedStrikesModifier(); } diff --git a/src/main/java/com/gmail/nossr50/skills/swords/SwordsManager.java b/src/main/java/com/gmail/nossr50/skills/swords/SwordsManager.java index c8d9cc36c..7d864e36e 100644 --- a/src/main/java/com/gmail/nossr50/skills/swords/SwordsManager.java +++ b/src/main/java/com/gmail/nossr50/skills/swords/SwordsManager.java @@ -1,14 +1,17 @@ package com.gmail.nossr50.skills.swords; import com.gmail.nossr50.datatypes.interactions.NotificationType; +import com.gmail.nossr50.datatypes.meta.RuptureTaskMeta; import com.gmail.nossr50.datatypes.player.McMMOPlayer; import com.gmail.nossr50.datatypes.skills.PrimarySkillType; import com.gmail.nossr50.datatypes.skills.SubSkillType; import com.gmail.nossr50.datatypes.skills.SuperAbilityType; import com.gmail.nossr50.datatypes.skills.ToolType; -import com.gmail.nossr50.runnables.skills.BleedTimerTask; +import com.gmail.nossr50.mcMMO; +import com.gmail.nossr50.runnables.skills.RuptureTask; import com.gmail.nossr50.skills.SkillManager; import com.gmail.nossr50.util.ItemUtils; +import com.gmail.nossr50.util.MetadataConstants; import com.gmail.nossr50.util.Permissions; import com.gmail.nossr50.util.player.NotificationManager; import com.gmail.nossr50.util.random.RandomChanceUtil; @@ -20,6 +23,7 @@ import org.bukkit.entity.LivingEntity; import org.bukkit.entity.Player; import org.bukkit.event.entity.EntityDamageEvent.DamageModifier; import org.bukkit.inventory.ItemStack; +import org.jetbrains.annotations.NotNull; import java.util.Map; @@ -29,7 +33,7 @@ public class SwordsManager extends SkillManager { } public boolean canActivateAbility() { - return mcMMOPlayer.getToolPreparationMode(ToolType.SWORD) && Permissions.serratedStrikes(getPlayer()); + return mmoPlayer.getToolPreparationMode(ToolType.SWORD) && Permissions.serratedStrikes(getPlayer()); } public boolean canUseStab() { @@ -51,7 +55,7 @@ public class SwordsManager extends SkillManager { if(!RankUtils.hasUnlockedSubskill(getPlayer(), SubSkillType.SWORDS_SERRATED_STRIKES)) return false; - return mcMMOPlayer.getAbilityMode(SuperAbilityType.SERRATED_STRIKES); + return mmoPlayer.getAbilityMode(SuperAbilityType.SERRATED_STRIKES); } /** @@ -59,8 +63,23 @@ public class SwordsManager extends SkillManager { * * @param target The defending entity */ - public void ruptureCheck(LivingEntity target) { - if (RandomChanceUtil.isActivationSuccessful(SkillActivationType.RANDOM_LINEAR_100_SCALE_WITH_CAP, SubSkillType.SWORDS_RUPTURE, getPlayer(), this.mcMMOPlayer.getAttackStrength())) { + public void processRupture(@NotNull LivingEntity target) { + if(!canUseRupture()) + return; + + if(target.hasMetadata(MetadataConstants.METADATA_KEY_RUPTURE)) { + RuptureTaskMeta ruptureTaskMeta = (RuptureTaskMeta) target.getMetadata(MetadataConstants.METADATA_KEY_RUPTURE).get(0); + + if(mmoPlayer.isDebugMode()) { + mmoPlayer.getPlayer().sendMessage("Rupture task ongoing for target " + target.toString()); + mmoPlayer.getPlayer().sendMessage(ruptureTaskMeta.getRuptureTimerTask().toString()); + } + + ruptureTaskMeta.getRuptureTimerTask().refreshRupture(); + return; //Don't apply bleed + } + + if (RandomChanceUtil.rollDice(mcMMO.p.getAdvancedConfig().getRuptureChanceToApplyOnHit(getRuptureRank()), 100)) { if (target instanceof Player) { Player defender = (Player) target; @@ -70,19 +89,29 @@ public class SwordsManager extends SkillManager { return; if (NotificationManager.doesPlayerUseNotifications(defender)) { - if(!BleedTimerTask.isBleeding(defender)) - NotificationManager.sendPlayerInformation(defender, NotificationType.SUBSKILL_MESSAGE, "Swords.Combat.Bleeding.Started"); + NotificationManager.sendPlayerInformation(defender, NotificationType.SUBSKILL_MESSAGE, "Swords.Combat.Bleeding.Started"); } } - BleedTimerTask.add(target, getPlayer(), getRuptureBleedTicks(), RankUtils.getRank(getPlayer(), SubSkillType.SWORDS_RUPTURE), getToolTier(getPlayer().getInventory().getItemInMainHand())); + RuptureTask ruptureTask = new RuptureTask(mmoPlayer, target, + mcMMO.p.getAdvancedConfig().getRuptureTickDamage(target instanceof Player, getRuptureRank()), + mcMMO.p.getAdvancedConfig().getRuptureExplosionDamage(target instanceof Player, getRuptureRank())); - if (mcMMOPlayer.useChatNotifications()) { - NotificationManager.sendPlayerInformation(getPlayer(), NotificationType.SUBSKILL_MESSAGE, "Swords.Combat.Bleeding"); - } + RuptureTaskMeta ruptureTaskMeta = new RuptureTaskMeta(mcMMO.p, ruptureTask); + + ruptureTask.runTaskTimer(mcMMO.p, 0, 1); + target.setMetadata(MetadataConstants.METADATA_KEY_RUPTURE, ruptureTaskMeta); + +// if (mmoPlayer.useChatNotifications()) { +// NotificationManager.sendPlayerInformation(getPlayer(), NotificationType.SUBSKILL_MESSAGE, "Swords.Combat.Bleeding"); +// } } } + private int getRuptureRank() { + return RankUtils.getRank(getPlayer(), SubSkillType.SWORDS_RUPTURE); + } + public double getStabDamage() { int rank = RankUtils.getRank(getPlayer(), SubSkillType.SWORDS_STAB); @@ -95,7 +124,7 @@ public class SwordsManager extends SkillManager { return 0; } - public int getToolTier(ItemStack itemStack) + public int getToolTier(@NotNull ItemStack itemStack) { if(ItemUtils.isNetheriteTool(itemStack)) return 5; @@ -109,23 +138,13 @@ public class SwordsManager extends SkillManager { return 1; } - public int getRuptureBleedTicks() - { - int bleedTicks = 2 * RankUtils.getRank(getPlayer(), SubSkillType.SWORDS_RUPTURE); - - if(bleedTicks > Swords.bleedMaxTicks) - bleedTicks = Swords.bleedMaxTicks; - - return bleedTicks; - } - /** * Handle the effects of the Counter Attack ability * * @param attacker The {@link LivingEntity} being affected by the ability * @param damage The amount of damage initially dealt by the event */ - public void counterAttackChecks(LivingEntity attacker, double damage) { + public void counterAttackChecks(@NotNull LivingEntity attacker, double damage) { if (RandomChanceUtil.isActivationSuccessful(SkillActivationType.RANDOM_LINEAR_100_SCALE_WITH_CAP, SubSkillType.SWORDS_COUNTER_ATTACK, getPlayer())) { CombatUtils.dealDamage(attacker, damage / Swords.counterAttackModifier, getPlayer()); @@ -143,7 +162,7 @@ public class SwordsManager extends SkillManager { * @param target The {@link LivingEntity} being affected by the ability * @param damage The amount of damage initially dealt by the event */ - public void serratedStrikes(LivingEntity target, double damage, Map modifiers) { + public void serratedStrikes(@NotNull LivingEntity target, double damage, Map modifiers) { CombatUtils.applyAbilityAoE(getPlayer(), target, damage / Swords.serratedStrikesModifier, modifiers, skill); } } diff --git a/src/main/java/com/gmail/nossr50/skills/taming/Taming.java b/src/main/java/com/gmail/nossr50/skills/taming/Taming.java index 1313c4c46..26ee15a67 100644 --- a/src/main/java/com/gmail/nossr50/skills/taming/Taming.java +++ b/src/main/java/com/gmail/nossr50/skills/taming/Taming.java @@ -1,20 +1,20 @@ package com.gmail.nossr50.skills.taming; -import com.gmail.nossr50.config.AdvancedConfig; +import com.gmail.nossr50.mcMMO; import org.bukkit.EntityEffect; import org.bukkit.entity.*; public class Taming { - public static double fastFoodServiceActivationChance = AdvancedConfig.getInstance().getFastFoodChance(); + public static double fastFoodServiceActivationChance = mcMMO.p.getAdvancedConfig().getFastFoodChance(); public static int goreBleedTicks = 2; //Equivalent to rank 1 in Rupture - public static double goreModifier = AdvancedConfig.getInstance().getGoreModifier(); + public static double goreModifier = mcMMO.p.getAdvancedConfig().getGoreModifier(); - public static double sharpenedClawsBonusDamage = AdvancedConfig.getInstance().getSharpenedClawsBonus(); + public static double sharpenedClawsBonusDamage = mcMMO.p.getAdvancedConfig().getSharpenedClawsBonus(); - public static double shockProofModifier = AdvancedConfig.getInstance().getShockProofModifier(); + public static double shockProofModifier = mcMMO.p.getAdvancedConfig().getShockProofModifier(); - public static double thickFurModifier = AdvancedConfig.getInstance().getThickFurModifier(); + public static double thickFurModifier = mcMMO.p.getAdvancedConfig().getThickFurModifier(); public static boolean canPreventDamage(Tameable pet, AnimalTamer owner) { return pet.isTamed() && owner instanceof Player && pet instanceof Wolf; diff --git a/src/main/java/com/gmail/nossr50/skills/taming/TamingManager.java b/src/main/java/com/gmail/nossr50/skills/taming/TamingManager.java index ef9167659..d51b50291 100644 --- a/src/main/java/com/gmail/nossr50/skills/taming/TamingManager.java +++ b/src/main/java/com/gmail/nossr50/skills/taming/TamingManager.java @@ -1,7 +1,5 @@ package com.gmail.nossr50.skills.taming; -import com.gmail.nossr50.config.AdvancedConfig; -import com.gmail.nossr50.config.Config; import com.gmail.nossr50.config.experience.ExperienceConfig; import com.gmail.nossr50.datatypes.experience.XPGainReason; import com.gmail.nossr50.datatypes.interactions.NotificationType; @@ -12,11 +10,10 @@ import com.gmail.nossr50.datatypes.skills.subskills.taming.CallOfTheWildType; import com.gmail.nossr50.datatypes.skills.subskills.taming.TamingSummon; import com.gmail.nossr50.locale.LocaleLoader; import com.gmail.nossr50.mcMMO; -import com.gmail.nossr50.runnables.skills.BleedTimerTask; +import com.gmail.nossr50.metadata.MobMetaFlagType; import com.gmail.nossr50.skills.SkillManager; import com.gmail.nossr50.util.Misc; import com.gmail.nossr50.util.Permissions; -import com.gmail.nossr50.util.StringUtils; import com.gmail.nossr50.util.player.NotificationManager; import com.gmail.nossr50.util.random.RandomChanceSkillStatic; import com.gmail.nossr50.util.random.RandomChanceUtil; @@ -25,15 +22,16 @@ import com.gmail.nossr50.util.skills.RankUtils; import com.gmail.nossr50.util.skills.SkillActivationType; import com.gmail.nossr50.util.sounds.SoundManager; import com.gmail.nossr50.util.sounds.SoundType; +import com.gmail.nossr50.util.text.StringUtils; import org.bukkit.Location; import org.bukkit.Material; import org.bukkit.attribute.Attribute; +import org.bukkit.attribute.AttributeInstance; import org.bukkit.entity.*; import org.bukkit.inventory.ItemStack; +import org.jetbrains.annotations.NotNull; -import java.util.ArrayList; import java.util.HashMap; -import java.util.List; public class TamingManager extends SkillManager { //TODO: Temporary static cache, will be changed in 2.2 @@ -41,9 +39,7 @@ public class TamingManager extends SkillManager { private static HashMap cotwSummonDataProperties; private long lastSummonTimeStamp; - private HashMap> playerSummonedEntities; - - public TamingManager(McMMOPlayer mcMMOPlayer) { + public TamingManager(@NotNull McMMOPlayer mcMMOPlayer) { super(mcMMOPlayer, PrimarySkillType.TAMING); init(); } @@ -54,29 +50,21 @@ public class TamingManager extends SkillManager { lastSummonTimeStamp = 0L; //Init per-player tracking of summoned entities - initPerPlayerSummonTracking(); + mcMMO.getTransientEntityTracker().initPlayer(mmoPlayer.getPlayer()); //Hacky stuff used as a band-aid initStaticCaches(); } - private void initPerPlayerSummonTracking() { - playerSummonedEntities = new HashMap<>(); - - for(CallOfTheWildType callOfTheWildType : CallOfTheWildType.values()) { - playerSummonedEntities.put(callOfTheWildType, new ArrayList()); - } - } - private void initStaticCaches() { //TODO: Temporary static cache, will be changed in 2.2 //This is shared between instances of TamingManager if(summoningItems == null) { summoningItems = new HashMap<>(); - summoningItems.put(Config.getInstance().getTamingCOTWMaterial(CallOfTheWildType.CAT.getConfigEntityTypeEntry()), CallOfTheWildType.CAT); - summoningItems.put(Config.getInstance().getTamingCOTWMaterial(CallOfTheWildType.WOLF.getConfigEntityTypeEntry()), CallOfTheWildType.WOLF); - summoningItems.put(Config.getInstance().getTamingCOTWMaterial(CallOfTheWildType.HORSE.getConfigEntityTypeEntry()), CallOfTheWildType.HORSE); + summoningItems.put(mcMMO.p.getGeneralConfig().getTamingCOTWMaterial(CallOfTheWildType.CAT.getConfigEntityTypeEntry()), CallOfTheWildType.CAT); + summoningItems.put(mcMMO.p.getGeneralConfig().getTamingCOTWMaterial(CallOfTheWildType.WOLF.getConfigEntityTypeEntry()), CallOfTheWildType.WOLF); + summoningItems.put(mcMMO.p.getGeneralConfig().getTamingCOTWMaterial(CallOfTheWildType.HORSE.getConfigEntityTypeEntry()), CallOfTheWildType.HORSE); } //TODO: Temporary static cache, will be changed in 2.2 @@ -85,11 +73,11 @@ public class TamingManager extends SkillManager { cotwSummonDataProperties = new HashMap<>(); for(CallOfTheWildType callOfTheWildType : CallOfTheWildType.values()) { - Material itemSummonMaterial = Config.getInstance().getTamingCOTWMaterial(callOfTheWildType.getConfigEntityTypeEntry()); - int itemAmountRequired = Config.getInstance().getTamingCOTWCost(callOfTheWildType.getConfigEntityTypeEntry()); - int entitiesSummonedPerCOTW = Config.getInstance().getTamingCOTWAmount(callOfTheWildType.getConfigEntityTypeEntry()); - int summonLifespanSeconds = Config.getInstance().getTamingCOTWLength(callOfTheWildType.getConfigEntityTypeEntry()); - int perPlayerMaxAmount = Config.getInstance().getTamingCOTWMaxAmount(callOfTheWildType.getConfigEntityTypeEntry()); + Material itemSummonMaterial = mcMMO.p.getGeneralConfig().getTamingCOTWMaterial(callOfTheWildType.getConfigEntityTypeEntry()); + int itemAmountRequired = mcMMO.p.getGeneralConfig().getTamingCOTWCost(callOfTheWildType.getConfigEntityTypeEntry()); + int entitiesSummonedPerCOTW = mcMMO.p.getGeneralConfig().getTamingCOTWAmount(callOfTheWildType.getConfigEntityTypeEntry()); + int summonLifespanSeconds = mcMMO.p.getGeneralConfig().getTamingCOTWLength(callOfTheWildType.getConfigEntityTypeEntry()); + int perPlayerMaxAmount = mcMMO.p.getGeneralConfig().getTamingCOTWMaxAmount(callOfTheWildType.getConfigEntityTypeEntry()); TamingSummon tamingSummon = new TamingSummon(callOfTheWildType, itemSummonMaterial, itemAmountRequired, entitiesSummonedPerCOTW, summonLifespanSeconds, perPlayerMaxAmount); cotwSummonDataProperties.put(callOfTheWildType, tamingSummon); @@ -146,7 +134,7 @@ public class TamingManager extends SkillManager { * * @param entity The LivingEntity to award XP for */ - public void awardTamingXP(LivingEntity entity) { + public void awardTamingXP(@NotNull LivingEntity entity) { applyXpGain(ExperienceConfig.getInstance().getTamingXP(entity.getType()), XPGainReason.PVE); } @@ -156,7 +144,7 @@ public class TamingManager extends SkillManager { * @param wolf The wolf using the ability * @param damage The damage being absorbed by the wolf */ - public void fastFoodService(Wolf wolf, double damage) { + public void fastFoodService(@NotNull Wolf wolf, double damage) { if (!RandomChanceUtil.isActivationSuccessful(SkillActivationType.RANDOM_STATIC_CHANCE, SubSkillType.TAMING_FAST_FOOD_SERVICE, getPlayer())) { return; } @@ -176,20 +164,15 @@ public class TamingManager extends SkillManager { * @param target The LivingEntity to apply Gore on * @param damage The initial damage */ - public double gore(LivingEntity target, double damage) { - if (!RandomChanceUtil.isActivationSuccessful(SkillActivationType.RANDOM_LINEAR_100_SCALE_WITH_CAP, SubSkillType.TAMING_GORE, getPlayer())) { - return 0; - } - - BleedTimerTask.add(target, getPlayer(), Taming.goreBleedTicks, 1, 2); - - if (target instanceof Player) { - NotificationManager.sendPlayerInformation((Player)target, NotificationType.SUBSKILL_MESSAGE, "Combat.StruckByGore"); - } - - NotificationManager.sendPlayerInformation(getPlayer(), NotificationType.SUBSKILL_MESSAGE, "Combat.Gore"); + public double gore(@NotNull LivingEntity target, double damage) { +// if (target instanceof Player) { +// NotificationManager.sendPlayerInformation((Player)target, NotificationType.SUBSKILL_MESSAGE, "Combat.StruckByGore"); +// } +// +// NotificationManager.sendPlayerInformation(getPlayer(), NotificationType.SUBSKILL_MESSAGE, "Combat.Gore"); damage = (damage * Taming.goreModifier) - damage; + return damage; } @@ -256,19 +239,24 @@ public class TamingManager extends SkillManager { message = message.concat(LocaleLoader.getString("Combat.BeastLoreHealth", target.getHealth(), target.getMaxHealth())); - if (beast instanceof Horse) { - Horse horse = (Horse) beast; - double jumpStrength = horse.getAttribute(Attribute.HORSE_JUMP_STRENGTH).getValue(); - // Taken from https://minecraft.gamepedia.com/Horse#Jump_strength - jumpStrength = -0.1817584952 * Math.pow(jumpStrength, 3) + 3.689713992 * Math.pow(jumpStrength, 2) + 2.128599134 * jumpStrength - 0.343930367; - message = message.concat("\n" + LocaleLoader.getString("Combat.BeastLoreHorseSpeed", horse.getAttribute(Attribute.GENERIC_MOVEMENT_SPEED).getValue() * 43)) - .concat("\n" + LocaleLoader.getString("Combat.BeastLoreHorseJumpStrength", jumpStrength)); + // Bred mules & donkeys can actually have horse-like stats, but llamas cannot. + if (beast instanceof AbstractHorse && !(beast instanceof Llama)) { + AbstractHorse horseLikeCreature = (AbstractHorse) beast; + AttributeInstance jumpAttribute = horseLikeCreature.getAttribute(Attribute.HORSE_JUMP_STRENGTH); + + if(jumpAttribute != null) { + double jumpStrength = jumpAttribute.getValue(); + // Taken from https://minecraft.gamepedia.com/Horse#Jump_strength + jumpStrength = -0.1817584952 * Math.pow(jumpStrength, 3) + 3.689713992 * Math.pow(jumpStrength, 2) + 2.128599134 * jumpStrength - 0.343930367; + message = message.concat("\n" + LocaleLoader.getString("Combat.BeastLoreHorseSpeed", horseLikeCreature.getAttribute(Attribute.GENERIC_MOVEMENT_SPEED).getValue() * 43)) + .concat("\n" + LocaleLoader.getString("Combat.BeastLoreHorseJumpStrength", jumpStrength)); + } } player.sendMessage(message); } - public void processEnvironmentallyAware(Wolf wolf, double damage) { + public void processEnvironmentallyAware(@NotNull Wolf wolf, double damage) { if (damage > wolf.getHealth()) { return; } @@ -283,7 +271,7 @@ public class TamingManager extends SkillManager { if(!RankUtils.hasUnlockedSubskill(getPlayer(), SubSkillType.TAMING_PUMMEL)) return; - if(!RandomChanceUtil.checkRandomChanceExecutionSuccess(new RandomChanceSkillStatic(AdvancedConfig.getInstance().getPummelChance(), getPlayer(), SubSkillType.TAMING_PUMMEL))) + if(!RandomChanceUtil.checkRandomChanceExecutionSuccess(new RandomChanceSkillStatic(mcMMO.p.getAdvancedConfig().getPummelChance(), getPlayer(), SubSkillType.TAMING_PUMMEL))) return; ParticleEffectUtils.playGreaterImpactEffect(target); @@ -469,7 +457,7 @@ public class TamingManager extends SkillManager { callOfWildEntity.setHealth(callOfWildEntity.getMaxHealth()); horse.setColor(Horse.Color.values()[Misc.getRandom().nextInt(Horse.Color.values().length)]); horse.setStyle(Horse.Style.values()[Misc.getRandom().nextInt(Horse.Style.values().length)]); - horse.setJumpStrength(Math.max(AdvancedConfig.getInstance().getMinHorseJumpStrength(), Math.min(Math.min(Misc.getRandom().nextDouble(), Misc.getRandom().nextDouble()) * 2, AdvancedConfig.getInstance().getMaxHorseJumpStrength()))); + horse.setJumpStrength(Math.max(mcMMO.p.getAdvancedConfig().getMinHorseJumpStrength(), Math.min(Math.min(Misc.getRandom().nextDouble(), Misc.getRandom().nextDouble()) * 2, mcMMO.p.getAdvancedConfig().getMaxHorseJumpStrength()))); horse.setAdult(); //TODO: setSpeed, once available @@ -485,12 +473,9 @@ public class TamingManager extends SkillManager { callOfWildEntity.setRemoveWhenFarAway(false); } - private void applyMetaDataToCOTWEntity(LivingEntity callOfWildEntity) { - //This is used to prevent XP gains for damaging this entity - callOfWildEntity.setMetadata(mcMMO.entityMetadataKey, mcMMO.metadataValue); - + private void applyMetaDataToCOTWEntity(LivingEntity summonedEntity) { //This helps identify the entity as being summoned by COTW - callOfWildEntity.setMetadata(mcMMO.COTW_TEMPORARY_SUMMON, mcMMO.metadataValue); + mcMMO.getMetadataService().getMobMetadataService().flagMetadata(MobMetaFlagType.COTW_SUMMONED_MOB, summonedEntity); } /** @@ -498,63 +483,16 @@ public class TamingManager extends SkillManager { * @param itemStack target ItemStack * @return true if it is used for any COTW */ - public boolean isCOTWItem(ItemStack itemStack) { + public boolean isCOTWItem(@NotNull ItemStack itemStack) { return summoningItems.containsKey(itemStack.getType()); } - //TODO: The way this tracker was written is garbo, I should just rewrite it, I'll save that for a future update - private int getAmountCurrentlySummoned(CallOfTheWildType callOfTheWildType) { - //The tracker is unreliable so validate its contents first - recalibrateTracker(); - - return playerSummonedEntities.get(callOfTheWildType).size(); + private int getAmountCurrentlySummoned(@NotNull CallOfTheWildType callOfTheWildType) { + return mcMMO.getTransientEntityTracker().getAmountCurrentlySummoned(getPlayer().getUniqueId(), callOfTheWildType); } - //TODO: The way this tracker was written is garbo, I should just rewrite it, I'll save that for a future update - private void addToTracker(LivingEntity livingEntity, CallOfTheWildType callOfTheWildType) { - TrackedTamingEntity trackedEntity = new TrackedTamingEntity(livingEntity, callOfTheWildType, this); - - playerSummonedEntities.get(callOfTheWildType).add(trackedEntity); - } - - //TODO: The way this tracker was written is garbo, I should just rewrite it, I'll save that for a future update - public List getTrackedEntities(CallOfTheWildType callOfTheWildType) { - return playerSummonedEntities.get(callOfTheWildType); - } - - //TODO: The way this tracker was written is garbo, I should just rewrite it, I'll save that for a future update - public void removeFromTracker(TrackedTamingEntity trackedEntity) { - if(playerSummonedEntities.get(trackedEntity.getCallOfTheWildType()).contains(trackedEntity)) - playerSummonedEntities.get(trackedEntity.getCallOfTheWildType()).remove(trackedEntity); - - NotificationManager.sendPlayerInformationChatOnly(getPlayer(), "Taming.Summon.COTW.TimeExpired", StringUtils.getPrettyEntityTypeString(trackedEntity.getLivingEntity().getType())); - } - - /** - * Builds a new tracked list by determining which tracked things are still valid - */ - //TODO: The way this tracker was written is garbo, I should just rewrite it, I'll save that for a future update - private void recalibrateTracker() { - for(CallOfTheWildType callOfTheWildType : CallOfTheWildType.values()) { - ArrayList validEntities = getValidTrackedEntities(callOfTheWildType); - playerSummonedEntities.put(callOfTheWildType, validEntities); //Replace the old list with the new list - } - } - - //TODO: The way this tracker was written is garbo, I should just rewrite it, I'll save that for a future update - private ArrayList getValidTrackedEntities(CallOfTheWildType callOfTheWildType) { - ArrayList validTrackedEntities = new ArrayList<>(); - - for(TrackedTamingEntity trackedTamingEntity : getTrackedEntities(callOfTheWildType)) { - LivingEntity livingEntity = trackedTamingEntity.getLivingEntity(); - - //Remove from existence - if(livingEntity != null && livingEntity.isValid()) { - validTrackedEntities.add(trackedTamingEntity); - } - } - - return validTrackedEntities; + private void addToTracker(@NotNull LivingEntity livingEntity, @NotNull CallOfTheWildType callOfTheWildType) { + mcMMO.getTransientEntityTracker().registerEntity(getPlayer().getUniqueId(), new TrackedTamingEntity(livingEntity, callOfTheWildType, getPlayer())); } /** @@ -563,19 +501,6 @@ public class TamingManager extends SkillManager { */ //TODO: The way this tracker was written is garbo, I should just rewrite it, I'll save that for a future update public void cleanupAllSummons() { - for(List trackedTamingEntities : playerSummonedEntities.values()) { - for(TrackedTamingEntity trackedTamingEntity : trackedTamingEntities) { - LivingEntity livingEntity = trackedTamingEntity.getLivingEntity(); - - //Remove from existence - if(livingEntity != null && livingEntity.isValid()) { - livingEntity.setHealth(0); - livingEntity.remove(); - } - } - - //Clear the list - trackedTamingEntities.clear(); - } + mcMMO.getTransientEntityTracker().cleanupPlayer(getPlayer()); } } diff --git a/src/main/java/com/gmail/nossr50/skills/taming/TrackedTamingEntity.java b/src/main/java/com/gmail/nossr50/skills/taming/TrackedTamingEntity.java index 0a8e99637..79cd4802b 100644 --- a/src/main/java/com/gmail/nossr50/skills/taming/TrackedTamingEntity.java +++ b/src/main/java/com/gmail/nossr50/skills/taming/TrackedTamingEntity.java @@ -1,64 +1,42 @@ package com.gmail.nossr50.skills.taming; -import com.gmail.nossr50.config.Config; import com.gmail.nossr50.datatypes.skills.subskills.taming.CallOfTheWildType; import com.gmail.nossr50.mcMMO; import com.gmail.nossr50.util.Misc; -import com.gmail.nossr50.util.skills.ParticleEffectUtils; -import org.bukkit.Location; -import org.bukkit.Sound; import org.bukkit.entity.LivingEntity; +import org.bukkit.entity.Player; import org.bukkit.scheduler.BukkitRunnable; - -import java.util.UUID; +import org.jetbrains.annotations.NotNull; public class TrackedTamingEntity extends BukkitRunnable { - private LivingEntity livingEntity; - private final CallOfTheWildType callOfTheWildType; - private UUID id; - private int length; - private final TamingManager tamingManagerRef; + private final @NotNull LivingEntity livingEntity; + private final @NotNull CallOfTheWildType callOfTheWildType; + private final @NotNull Player player; - protected TrackedTamingEntity(LivingEntity livingEntity, CallOfTheWildType callOfTheWildType, TamingManager tamingManagerRef) { - this.tamingManagerRef = tamingManagerRef; + protected TrackedTamingEntity(@NotNull LivingEntity livingEntity, @NotNull CallOfTheWildType callOfTheWildType, @NotNull Player player) { + this.player = player; this.callOfTheWildType = callOfTheWildType; this.livingEntity = livingEntity; - this.id = livingEntity.getUniqueId(); - int tamingCOTWLength = Config.getInstance().getTamingCOTWLength(callOfTheWildType.getConfigEntityTypeEntry()); + int tamingCOTWLength = mcMMO.p.getGeneralConfig().getTamingCOTWLength(callOfTheWildType.getConfigEntityTypeEntry()); if (tamingCOTWLength > 0) { - this.length = tamingCOTWLength * Misc.TICK_CONVERSION_FACTOR; + int length = tamingCOTWLength * Misc.TICK_CONVERSION_FACTOR; this.runTaskLater(mcMMO.p, length); } } @Override public void run() { - if (livingEntity.isValid()) { - Location location = livingEntity.getLocation(); - location.getWorld().playSound(location, Sound.BLOCK_FIRE_EXTINGUISH, 0.8F, 0.8F); - ParticleEffectUtils.playCallOfTheWildEffect(livingEntity); - - if(tamingManagerRef != null) - tamingManagerRef.removeFromTracker(this); - - livingEntity.setHealth(0); - livingEntity.remove(); - } - + mcMMO.getTransientEntityTracker().removeSummon(this.getLivingEntity(), player, true); this.cancel(); } - public CallOfTheWildType getCallOfTheWildType() { + public @NotNull CallOfTheWildType getCallOfTheWildType() { return callOfTheWildType; } - public LivingEntity getLivingEntity() { + public @NotNull LivingEntity getLivingEntity() { return livingEntity; } - - public UUID getID() { - return id; - } } diff --git a/src/main/java/com/gmail/nossr50/skills/unarmed/Unarmed.java b/src/main/java/com/gmail/nossr50/skills/unarmed/Unarmed.java index a39cbccc5..cb1124dd4 100644 --- a/src/main/java/com/gmail/nossr50/skills/unarmed/Unarmed.java +++ b/src/main/java/com/gmail/nossr50/skills/unarmed/Unarmed.java @@ -1,6 +1,6 @@ package com.gmail.nossr50.skills.unarmed; -import com.gmail.nossr50.config.Config; +import com.gmail.nossr50.mcMMO; import com.gmail.nossr50.util.sounds.SoundManager; import com.gmail.nossr50.util.sounds.SoundType; import org.bukkit.entity.Player; @@ -8,7 +8,7 @@ import org.bukkit.event.entity.EntityPickupItemEvent; import org.bukkit.inventory.ItemStack; public class Unarmed { - public static boolean blockCrackerSmoothBrick = Config.getInstance().getUnarmedBlockCrackerSmoothbrickToCracked(); + public static boolean blockCrackerSmoothBrick = mcMMO.p.getGeneralConfig().getUnarmedBlockCrackerSmoothbrickToCracked(); public static double berserkDamageModifier = 1.5; public static void handleItemPickup(Player player, EntityPickupItemEvent event) { diff --git a/src/main/java/com/gmail/nossr50/skills/unarmed/UnarmedManager.java b/src/main/java/com/gmail/nossr50/skills/unarmed/UnarmedManager.java index 430b8e12c..93dc5eef5 100644 --- a/src/main/java/com/gmail/nossr50/skills/unarmed/UnarmedManager.java +++ b/src/main/java/com/gmail/nossr50/skills/unarmed/UnarmedManager.java @@ -1,6 +1,6 @@ package com.gmail.nossr50.skills.unarmed; -import com.gmail.nossr50.config.AdvancedConfig; +import com.gmail.nossr50.api.ItemSpawnReason; import com.gmail.nossr50.datatypes.interactions.NotificationType; import com.gmail.nossr50.datatypes.player.McMMOPlayer; import com.gmail.nossr50.datatypes.skills.PrimarySkillType; @@ -9,10 +9,7 @@ import com.gmail.nossr50.datatypes.skills.SuperAbilityType; import com.gmail.nossr50.datatypes.skills.ToolType; import com.gmail.nossr50.mcMMO; import com.gmail.nossr50.skills.SkillManager; -import com.gmail.nossr50.util.EventUtils; -import com.gmail.nossr50.util.ItemUtils; -import com.gmail.nossr50.util.Misc; -import com.gmail.nossr50.util.Permissions; +import com.gmail.nossr50.util.*; import com.gmail.nossr50.util.player.NotificationManager; import com.gmail.nossr50.util.player.UserManager; import com.gmail.nossr50.util.random.RandomChanceUtil; @@ -24,6 +21,7 @@ import org.bukkit.entity.Item; import org.bukkit.entity.LivingEntity; import org.bukkit.entity.Player; import org.bukkit.inventory.ItemStack; +import org.jetbrains.annotations.NotNull; public class UnarmedManager extends SkillManager { @@ -32,18 +30,18 @@ public class UnarmedManager extends SkillManager { } public boolean canActivateAbility() { - return mcMMOPlayer.getToolPreparationMode(ToolType.FISTS) && Permissions.berserk(getPlayer()); + return mmoPlayer.getToolPreparationMode(ToolType.FISTS) && Permissions.berserk(getPlayer()); } - public boolean canUseIronArm() { - if(!RankUtils.hasUnlockedSubskill(getPlayer(), SubSkillType.UNARMED_IRON_ARM_STYLE)) + public boolean canUseSteelArm() { + if(!RankUtils.hasUnlockedSubskill(getPlayer(), SubSkillType.UNARMED_STEEL_ARM_STYLE)) return false; - return Permissions.isSubSkillEnabled(getPlayer(), SubSkillType.UNARMED_IRON_ARM_STYLE); + return Permissions.isSubSkillEnabled(getPlayer(), SubSkillType.UNARMED_STEEL_ARM_STYLE); } public boolean canUseBerserk() { - return mcMMOPlayer.getAbilityMode(SuperAbilityType.BERSERK); + return mmoPlayer.getAbilityMode(SuperAbilityType.BERSERK); } public boolean canDisarm(LivingEntity target) { @@ -69,7 +67,7 @@ public class UnarmedManager extends SkillManager { return Permissions.isSubSkillEnabled(getPlayer(), SubSkillType.UNARMED_BLOCK_CRACKER); } - public boolean blockCrackerCheck(BlockState blockState) { + public boolean blockCrackerCheck(@NotNull BlockState blockState) { if (!RandomChanceUtil.isActivationSuccessful(SkillActivationType.ALWAYS_FIRES, SubSkillType.UNARMED_BLOCK_CRACKER, getPlayer())) { return false; } @@ -100,8 +98,8 @@ public class UnarmedManager extends SkillManager { * * @param defender The defending player */ - public void disarmCheck(Player defender) { - if (RandomChanceUtil.isActivationSuccessful(SkillActivationType.RANDOM_LINEAR_100_SCALE_WITH_CAP, SubSkillType.UNARMED_DISARM, getPlayer(), mcMMOPlayer.getAttackStrength()) && !hasIronGrip(defender)) { + public void disarmCheck(@NotNull Player defender) { + if (RandomChanceUtil.isActivationSuccessful(SkillActivationType.RANDOM_LINEAR_100_SCALE_WITH_CAP, SubSkillType.UNARMED_DISARM, getPlayer()) && !hasIronGrip(defender)) { if (EventUtils.callDisarmEvent(defender).isCancelled()) { return; } @@ -109,10 +107,10 @@ public class UnarmedManager extends SkillManager { if(UserManager.getPlayer(defender) == null) return; - Item item = Misc.dropItem(defender.getLocation(), defender.getInventory().getItemInMainHand()); + Item item = Misc.spawnItem(getPlayer(), defender.getLocation(), defender.getInventory().getItemInMainHand(), ItemSpawnReason.UNARMED_DISARMED_ITEM); - if (item != null && AdvancedConfig.getInstance().getDisarmProtected()) { - item.setMetadata(mcMMO.disarmedItemKey, UserManager.getPlayer(defender).getPlayerMetadata()); + if (item != null && mcMMO.p.getAdvancedConfig().getDisarmProtected()) { + item.setMetadata(MetadataConstants.METADATA_KEY_DISARMED_ITEM, UserManager.getPlayer(defender).getPlayerMetadata()); } defender.getInventory().setItemInMainHand(new ItemStack(Material.AIR)); @@ -138,7 +136,7 @@ public class UnarmedManager extends SkillManager { * @param damage The amount of damage initially dealt by the event */ public double berserkDamage(double damage) { - damage = ((damage * Unarmed.berserkDamageModifier) * mcMMOPlayer.getAttackStrength()) - damage; + damage = ((damage * Unarmed.berserkDamageModifier) * mmoPlayer.getAttackStrength()) - damage; return damage; } @@ -146,22 +144,29 @@ public class UnarmedManager extends SkillManager { /** * Handle the effects of the Iron Arm ability */ - public double calculateIronArmDamage() { - if (!RandomChanceUtil.isActivationSuccessful(SkillActivationType.ALWAYS_FIRES, SubSkillType.UNARMED_IRON_ARM_STYLE, getPlayer())) { + public double calculateSteelArmStyleDamage() { + if (!RandomChanceUtil.isActivationSuccessful(SkillActivationType.ALWAYS_FIRES, SubSkillType.UNARMED_STEEL_ARM_STYLE, getPlayer())) { return 0; } - return getIronArmDamage(); + return getSteelArmStyleDamage(); } - public double getIronArmDamage() { - int rank = RankUtils.getRank(getPlayer(), SubSkillType.UNARMED_IRON_ARM_STYLE); + public double getSteelArmStyleDamage() { + double rank = RankUtils.getRank(getPlayer(), SubSkillType.UNARMED_STEEL_ARM_STYLE); - if(rank == 1) - { - return 4; + double bonus = 0; + + if(rank >= 18) + bonus = 1 + rank - 18; + + double finalBonus = bonus + 0.5 + (rank / 2); + + + if(mcMMO.p.getAdvancedConfig().isSteelArmDamageCustom()) { + return mcMMO.p.getAdvancedConfig().getSteelArmOverride(RankUtils.getRank(getPlayer(), SubSkillType.UNARMED_STEEL_ARM_STYLE), finalBonus); } else { - return 3 + (rank * 2); + return finalBonus; } } @@ -171,7 +176,7 @@ public class UnarmedManager extends SkillManager { * @param defender The defending player * @return true if the defender was not disarmed, false otherwise */ - private boolean hasIronGrip(Player defender) { + private boolean hasIronGrip(@NotNull Player defender) { if (!Misc.isNPCEntityExcludingVillagers(defender) && Permissions.isSubSkillEnabled(defender, SubSkillType.UNARMED_IRON_GRIP) && RandomChanceUtil.isActivationSuccessful(SkillActivationType.RANDOM_LINEAR_100_SCALE_WITH_CAP, SubSkillType.UNARMED_IRON_GRIP, defender)) { diff --git a/src/main/java/com/gmail/nossr50/skills/woodcutting/WoodcuttingManager.java b/src/main/java/com/gmail/nossr50/skills/woodcutting/WoodcuttingManager.java index 72a797ea3..d08cad2da 100644 --- a/src/main/java/com/gmail/nossr50/skills/woodcutting/WoodcuttingManager.java +++ b/src/main/java/com/gmail/nossr50/skills/woodcutting/WoodcuttingManager.java @@ -1,6 +1,6 @@ package com.gmail.nossr50.skills.woodcutting; -import com.gmail.nossr50.config.Config; +import com.gmail.nossr50.api.ItemSpawnReason; import com.gmail.nossr50.config.experience.ExperienceConfig; import com.gmail.nossr50.datatypes.experience.XPGainReason; import com.gmail.nossr50.datatypes.interactions.NotificationType; @@ -17,12 +17,17 @@ import com.gmail.nossr50.util.skills.CombatUtils; import com.gmail.nossr50.util.skills.RankUtils; import com.gmail.nossr50.util.skills.SkillActivationType; import com.gmail.nossr50.util.skills.SkillUtils; +import org.bukkit.Bukkit; import org.bukkit.Material; import org.bukkit.block.Block; import org.bukkit.block.BlockFace; import org.bukkit.block.BlockState; import org.bukkit.entity.Player; +import org.bukkit.event.player.PlayerItemDamageEvent; import org.bukkit.inventory.ItemStack; +import org.bukkit.inventory.meta.Damageable; +import org.bukkit.inventory.meta.ItemMeta; +import org.jetbrains.annotations.NotNull; import java.util.ArrayList; import java.util.HashSet; @@ -30,7 +35,6 @@ import java.util.List; import java.util.Set; public class WoodcuttingManager extends SkillManager { - private boolean treeFellerReachedThreshold = false; private static int treeFellerThreshold; //TODO: Shared setting, will be removed in 2.2 @@ -48,7 +52,7 @@ public class WoodcuttingManager extends SkillManager { public WoodcuttingManager(McMMOPlayer mcMMOPlayer) { super(mcMMOPlayer, PrimarySkillType.WOODCUTTING); - treeFellerThreshold = Config.getInstance().getTreeFellerThreshold(); + treeFellerThreshold = mcMMO.p.getGeneralConfig().getTreeFellerThreshold(); } public boolean canUseLeafBlower(ItemStack heldItem) { @@ -58,14 +62,15 @@ public class WoodcuttingManager extends SkillManager { } public boolean canUseTreeFeller(ItemStack heldItem) { - return mcMMOPlayer.getAbilityMode(SuperAbilityType.TREE_FELLER) + return mmoPlayer.getAbilityMode(SuperAbilityType.TREE_FELLER) && ItemUtils.isAxe(heldItem); } - private boolean canGetDoubleDrops() { + private boolean checkHarvestLumberActivation(@NotNull Material material) { return Permissions.isSubSkillEnabled(getPlayer(), SubSkillType.WOODCUTTING_HARVEST_LUMBER) && RankUtils.hasReachedRank(1, getPlayer(), SubSkillType.WOODCUTTING_HARVEST_LUMBER) - && RandomChanceUtil.isActivationSuccessful(SkillActivationType.RANDOM_LINEAR_100_SCALE_WITH_CAP, SubSkillType.WOODCUTTING_HARVEST_LUMBER, getPlayer()); + && RandomChanceUtil.isActivationSuccessful(SkillActivationType.RANDOM_LINEAR_100_SCALE_WITH_CAP, SubSkillType.WOODCUTTING_HARVEST_LUMBER, getPlayer()) + && mcMMO.p.getGeneralConfig().getDoubleDropsEnabled(PrimarySkillType.WOODCUTTING, material); } /** @@ -73,20 +78,14 @@ public class WoodcuttingManager extends SkillManager { * * @param blockState Block being broken */ - public void woodcuttingBlockCheck(BlockState blockState) { - int xp = getExperienceFromLog(blockState); - - switch (blockState.getType()) { - case BROWN_MUSHROOM_BLOCK: - case RED_MUSHROOM_BLOCK: - break; - - default: - if (canGetDoubleDrops()) { - checkForDoubleDrop(blockState); - } + public void processHarvestLumber(@NotNull BlockState blockState) { + if (checkHarvestLumberActivation(blockState.getType())) { + spawnHarvestLumberBonusDrops(blockState); } + } + public void processWoodcuttingBlockXP(@NotNull BlockState blockState) { + int xp = getExperienceFromLog(blockState); applyXpGain(xp, XPGainReason.PVE); } @@ -97,7 +96,7 @@ public class WoodcuttingManager extends SkillManager { */ public void processTreeFeller(BlockState blockState) { Player player = getPlayer(); - Set treeFellerBlocks = new HashSet(); + Set treeFellerBlocks = new HashSet<>(); treeFellerReachedThreshold = false; @@ -108,11 +107,16 @@ public class WoodcuttingManager extends SkillManager { treeFellerReachedThreshold = false; NotificationManager.sendPlayerInformation(player, NotificationType.SUBSKILL_MESSAGE_FAILED, "Woodcutting.Skills.TreeFeller.Threshold"); + + //Tree feller won't be activated for this block, award normal xp. + processWoodcuttingBlockXP(blockState); + processHarvestLumber(blockState); + return; } // If the tool can't sustain the durability loss - if (!handleDurabilityLoss(treeFellerBlocks, player.getInventory().getItemInMainHand())) { + if (!handleDurabilityLoss(treeFellerBlocks, player.getInventory().getItemInMainHand(), player)) { NotificationManager.sendPlayerInformation(player, NotificationType.SUBSKILL_MESSAGE_FAILED, "Woodcutting.Skills.TreeFeller.Splinter"); double health = player.getHealth(); @@ -158,7 +162,7 @@ public class WoodcuttingManager extends SkillManager { * before taking measurements). */ private void processTree(BlockState blockState, Set treeFellerBlocks) { - List futureCenterBlocks = new ArrayList(); + List futureCenterBlocks = new ArrayList<>(); // Check the block up and take different behavior (smaller search) if it's a log if (processTreeFellerTargetBlock(blockState.getBlock().getRelative(BlockFace.UP).getState(), futureCenterBlocks, treeFellerBlocks)) { @@ -200,25 +204,38 @@ public class WoodcuttingManager extends SkillManager { * * @param treeFellerBlocks List of blocks to be removed * @param inHand tool being used + * @param player the player holding the item * @return True if the tool can sustain the durability loss */ - private static boolean handleDurabilityLoss(Set treeFellerBlocks, ItemStack inHand) { + private static boolean handleDurabilityLoss(@NotNull Set treeFellerBlocks, @NotNull ItemStack inHand, @NotNull Player player) { //Treat the NBT tag for unbreakable and the durability enchant differently - if(inHand.getItemMeta() != null && inHand.getItemMeta().isUnbreakable()) { + ItemMeta meta = inHand.getItemMeta(); + + if (meta != null && meta.isUnbreakable()) { return true; } - short durabilityLoss = 0; + int durabilityLoss = 0; Material type = inHand.getType(); for (BlockState blockState : treeFellerBlocks) { - if (BlockUtils.isLog(blockState)) { - durabilityLoss += Config.getInstance().getAbilityToolDamage(); + if (BlockUtils.hasWoodcuttingXP(blockState)) { + durabilityLoss += mcMMO.p.getGeneralConfig().getAbilityToolDamage(); } } + // Call PlayerItemDamageEvent first to make sure it's not cancelled + //TODO: Put this event stuff in handleDurabilityChange + final PlayerItemDamageEvent event = new PlayerItemDamageEvent(player, inHand, durabilityLoss); + Bukkit.getPluginManager().callEvent(event); + + if (event.isCancelled()) { + return true; + } + SkillUtils.handleDurabilityChange(inHand, durabilityLoss); - return (inHand.getDurability() < (mcMMO.getRepairableManager().isRepairable(type) ? mcMMO.getRepairableManager().getRepairable(type).getMaximumDurability() : type.getMaxDurability())); + int durability = meta instanceof Damageable ? ((Damageable) meta).getDamage(): 0; + return (durability < (mcMMO.getRepairableManager().isRepairable(type) ? mcMMO.getRepairableManager().getRepairable(type).getMaximumDurability() : type.getMaxDurability())); } /** @@ -233,7 +250,7 @@ public class WoodcuttingManager extends SkillManager { * @return true if and only if the given blockState was a Log not already * in treeFellerBlocks. */ - private boolean processTreeFellerTargetBlock(BlockState blockState, List futureCenterBlocks, Set treeFellerBlocks) { + private boolean processTreeFellerTargetBlock(@NotNull BlockState blockState, @NotNull List futureCenterBlocks, @NotNull Set treeFellerBlocks) { if (treeFellerBlocks.contains(blockState) || mcMMO.getPlaceStore().isTrue(blockState)) { return false; } @@ -243,12 +260,12 @@ public class WoodcuttingManager extends SkillManager { treeFellerReachedThreshold = true; } - if (BlockUtils.isLog(blockState)) { + if (BlockUtils.hasWoodcuttingXP(blockState)) { treeFellerBlocks.add(blockState); futureCenterBlocks.add(blockState); return true; } - else if (BlockUtils.isLeaves(blockState)) { + else if (BlockUtils.isNonWoodPartOfTree(blockState)) { treeFellerBlocks.add(blockState); return false; } @@ -260,7 +277,7 @@ public class WoodcuttingManager extends SkillManager { * * @param treeFellerBlocks List of blocks to be dropped */ - private void dropTreeFellerLootFromBlocks(Set treeFellerBlocks) { + private void dropTreeFellerLootFromBlocks(@NotNull Set treeFellerBlocks) { Player player = getPlayer(); int xp = 0; int processedLogCount = 0; @@ -270,27 +287,39 @@ public class WoodcuttingManager extends SkillManager { Block block = blockState.getBlock(); if (!EventUtils.simulateBlockBreak(block, player, true)) { - break; // TODO: Shouldn't we use continue instead? + continue; } - Material material = blockState.getType(); + /* + * Handle Drops & XP + */ - //TODO: Update this to drop the correct items/blocks via NMS - if (material == Material.BROWN_MUSHROOM_BLOCK || material == Material.RED_MUSHROOM_BLOCK) { + if (BlockUtils.hasWoodcuttingXP(blockState)) { + //Add XP xp += processTreeFellerXPGains(blockState, processedLogCount); - Misc.dropItems(Misc.getBlockCenter(blockState), block.getDrops()); - } else if (mcMMO.getModManager().isCustomLeaf(blockState)) { - Misc.dropItems(Misc.getBlockCenter(blockState), block.getDrops()); - } else { - if (BlockUtils.isLog(blockState)) { - if (canGetDoubleDrops()) { - checkForDoubleDrop(blockState); + + //Drop displaced block + Misc.spawnItemsFromCollection(getPlayer(), Misc.getBlockCenter(blockState), block.getDrops(), ItemSpawnReason.TREE_FELLER_DISPLACED_BLOCK); + + //Bonus Drops / Harvest lumber checks + processHarvestLumber(blockState); + } else if (BlockUtils.isNonWoodPartOfTree(blockState)) { + //Drop displaced non-woodcutting XP blocks + + if(RankUtils.hasUnlockedSubskill(player, SubSkillType.WOODCUTTING_KNOCK_ON_WOOD)) { + Misc.spawnItemsFromCollection(getPlayer(), Misc.getBlockCenter(blockState), block.getDrops(), ItemSpawnReason.TREE_FELLER_DISPLACED_BLOCK); + + if(RankUtils.hasReachedRank(2, player, SubSkillType.WOODCUTTING_KNOCK_ON_WOOD)) { + if(mcMMO.p.getAdvancedConfig().isKnockOnWoodXPOrbEnabled()) { + if(RandomChanceUtil.rollDice(10, 100)) { + int randOrbCount = Math.max(1, Misc.getRandom().nextInt(100)); + Misc.spawnExperienceOrb(blockState.getLocation(), randOrbCount); + } + } } - xp += processTreeFellerXPGains(blockState, processedLogCount); - Misc.dropItems(Misc.getBlockCenter(blockState), block.getDrops()); - } - if (BlockUtils.isLeaves(blockState)) { - Misc.dropItems(Misc.getBlockCenter(blockState), block.getDrops()); + + } else { + Misc.spawnItemsFromCollection(getPlayer(), Misc.getBlockCenter(blockState), block.getDrops(), ItemSpawnReason.TREE_FELLER_DISPLACED_BLOCK, 1); } } @@ -351,18 +380,11 @@ public class WoodcuttingManager extends SkillManager { } /** - * Checks for double drops + * Spawns harvest lumber bonus drops * * @param blockState Block being broken */ - protected static void checkForDoubleDrop(BlockState blockState) { - if (mcMMO.getModManager().isCustomLog(blockState) && mcMMO.getModManager().getBlock(blockState).isDoubleDropEnabled()) { - Misc.dropItems(Misc.getBlockCenter(blockState), blockState.getBlock().getDrops()); - } - else { - if (Config.getInstance().getWoodcuttingDoubleDropsEnabled(blockState.getBlockData())) { - Misc.dropItems(Misc.getBlockCenter(blockState), blockState.getBlock().getDrops()); - } - } + protected void spawnHarvestLumberBonusDrops(@NotNull BlockState blockState) { + Misc.spawnItemsFromCollection(getPlayer(), Misc.getBlockCenter(blockState), blockState.getBlock().getDrops(), ItemSpawnReason.BONUS_DROPS); } } diff --git a/src/main/java/com/gmail/nossr50/util/BlockUtils.java b/src/main/java/com/gmail/nossr50/util/BlockUtils.java index ef6b3df76..c899fc148 100644 --- a/src/main/java/com/gmail/nossr50/util/BlockUtils.java +++ b/src/main/java/com/gmail/nossr50/util/BlockUtils.java @@ -1,6 +1,5 @@ package com.gmail.nossr50.util; -import com.gmail.nossr50.config.Config; import com.gmail.nossr50.config.experience.ExperienceConfig; import com.gmail.nossr50.datatypes.meta.BonusDropMeta; import com.gmail.nossr50.datatypes.skills.PrimarySkillType; @@ -11,10 +10,13 @@ import com.gmail.nossr50.skills.salvage.Salvage; import com.gmail.nossr50.util.random.RandomChanceSkill; import com.gmail.nossr50.util.random.RandomChanceUtil; import org.bukkit.Material; +import org.bukkit.World; +import org.bukkit.block.Block; import org.bukkit.block.BlockState; import org.bukkit.block.data.Ageable; import org.bukkit.block.data.BlockData; import org.bukkit.entity.Player; +import org.jetbrains.annotations.NotNull; import java.util.HashSet; @@ -31,9 +33,22 @@ public final class BlockUtils { */ public static void markDropsAsBonus(BlockState blockState, boolean triple) { if (triple) - blockState.setMetadata(mcMMO.BONUS_DROPS_METAKEY, new BonusDropMeta(2, mcMMO.p)); + blockState.setMetadata(MetadataConstants.METADATA_KEY_BONUS_DROPS, new BonusDropMeta(2, mcMMO.p)); else - blockState.setMetadata(mcMMO.BONUS_DROPS_METAKEY, new BonusDropMeta(1, mcMMO.p)); + blockState.setMetadata(MetadataConstants.METADATA_KEY_BONUS_DROPS, new BonusDropMeta(1, mcMMO.p)); + } + + /** + * Cleans up some block metadata when a block breaks and the metadata is no longer needed + * This also sets the blocks coords to false in our chunk store + * @param block target block + */ + public static void cleanupBlockMetadata(Block block) { + if(block.hasMetadata(MetadataConstants.METADATA_KEY_REPLANT)) { + block.removeMetadata(MetadataConstants.METADATA_KEY_REPLANT, mcMMO.p); + } + + mcMMO.getPlaceStore().setFalse(block); } /** @@ -42,7 +57,7 @@ public final class BlockUtils { * @param amount amount of extra items to drop */ public static void markDropsAsBonus(BlockState blockState, int amount) { - blockState.setMetadata(mcMMO.BONUS_DROPS_METAKEY, new BonusDropMeta(amount, mcMMO.p)); + blockState.setMetadata(MetadataConstants.METADATA_KEY_BONUS_DROPS, new BonusDropMeta(amount, mcMMO.p)); } /** @@ -52,7 +67,7 @@ public final class BlockUtils { * @return true if the player succeeded in the check */ public static boolean checkDoubleDrops(Player player, BlockState blockState, PrimarySkillType skillType, SubSkillType subSkillType) { - if (Config.getInstance().getDoubleDropsEnabled(skillType, blockState.getType()) && Permissions.isSubSkillEnabled(player, subSkillType)) { + if (mcMMO.p.getGeneralConfig().getDoubleDropsEnabled(skillType, blockState.getType()) && Permissions.isSubSkillEnabled(player, subSkillType)) { return RandomChanceUtil.checkRandomChanceExecutionSuccess(new RandomChanceSkill(player, subSkillType, true)); } @@ -66,7 +81,11 @@ public final class BlockUtils { * @return true if the block awards XP, false otherwise */ public static boolean shouldBeWatched(BlockState blockState) { - return affectedByGigaDrillBreaker(blockState) || affectedByGreenTerra(blockState) || affectedBySuperBreaker(blockState) || isLog(blockState); + return affectedByGigaDrillBreaker(blockState) || affectedByGreenTerra(blockState) || affectedBySuperBreaker(blockState) || hasWoodcuttingXP(blockState) + || mcMMO.p.getGeneralConfig().getDoubleDropsEnabled(PrimarySkillType.MINING, blockState.getType()) + || mcMMO.p.getGeneralConfig().getDoubleDropsEnabled(PrimarySkillType.EXCAVATION, blockState.getType()) + || mcMMO.p.getGeneralConfig().getDoubleDropsEnabled(PrimarySkillType.WOODCUTTING, blockState.getType()) + || mcMMO.p.getGeneralConfig().getDoubleDropsEnabled(PrimarySkillType.SMELTING, blockState.getType()); } /** @@ -135,11 +154,14 @@ public final class BlockUtils { * @return true if the block should affected by Super Breaker, false * otherwise */ - public static Boolean affectedBySuperBreaker(BlockState blockState) { + public static boolean affectedBySuperBreaker(BlockState blockState) { + if(mcMMO.getMaterialMapStore().isIntendedToolPickaxe(blockState.getType())) + return true; + if (ExperienceConfig.getInstance().doesBlockGiveSkillXP(PrimarySkillType.MINING, blockState.getBlockData())) return true; - return isOre(blockState) || mcMMO.getModManager().isCustomMiningBlock(blockState); + return mcMMO.getModManager().isCustomMiningBlock(blockState); } /** @@ -149,7 +171,7 @@ public final class BlockUtils { * @return true if the block should affected by Giga Drill Breaker, false * otherwise */ - public static boolean affectedByGigaDrillBreaker(BlockState blockState) { + public static boolean affectedByGigaDrillBreaker(@NotNull BlockState blockState) { if (ExperienceConfig.getInstance().doesBlockGiveSkillXP(PrimarySkillType.EXCAVATION, blockState.getBlockData())) return true; return mcMMO.getModManager().isCustomExcavationBlock(blockState); @@ -161,10 +183,8 @@ public final class BlockUtils { * @param blockState The {@link BlockState} of the block to check * @return true if the block is a log, false otherwise */ - public static boolean isLog(BlockState blockState) { - if (ExperienceConfig.getInstance().doesBlockGiveSkillXP(PrimarySkillType.WOODCUTTING, blockState.getBlockData())) - return true; - return mcMMO.getModManager().isCustomLog(blockState); + public static boolean hasWoodcuttingXP(@NotNull BlockState blockState) { + return ExperienceConfig.getInstance().doesBlockGiveSkillXP(PrimarySkillType.WOODCUTTING, blockState.getBlockData()); } /** @@ -173,8 +193,12 @@ public final class BlockUtils { * @param blockState The {@link BlockState} of the block to check * @return true if the block is a leaf, false otherwise */ - public static boolean isLeaves(BlockState blockState) { - return mcMMO.getMaterialMapStore().isLeavesWhiteListed(blockState.getType()); + public static boolean isNonWoodPartOfTree(@NotNull BlockState blockState) { + return mcMMO.getMaterialMapStore().isTreeFellerDestructible(blockState.getType()); + } + + public static boolean isNonWoodPartOfTree(@NotNull Material material) { + return mcMMO.getMaterialMapStore().isTreeFellerDestructible(material); } /** @@ -250,7 +274,7 @@ public final class BlockUtils { * @return HashSet with the IDs of every transparent block */ public static HashSet getTransparentBlocks() { - HashSet transparentBlocks = new HashSet(); + HashSet transparentBlocks = new HashSet<>(); for (Material material : Material.values()) { if (material.isTransparent()) { @@ -272,4 +296,22 @@ public final class BlockUtils { } return true; } + + public static boolean isPartOfTree(Block block) { + return hasWoodcuttingXP(block.getState()) || isNonWoodPartOfTree(block.getType()); + } + + /** + * Checks to see if a Block is within the world bounds + * Prevent processing blocks from other plugins (or perhaps odd spigot anomalies) from sending blocks that can't exist within the world + * @param block + * @return + */ + public static boolean isWithinWorldBounds(@NotNull Block block) { + World world = block.getWorld(); + + //World min height = inclusive | World max height = exclusive + return block.getY() >= world.getMinHeight() && block.getY() < world.getMaxHeight(); + } + } diff --git a/src/main/java/com/gmail/nossr50/util/ChimaeraWing.java b/src/main/java/com/gmail/nossr50/util/ChimaeraWing.java index c1a82f9af..07bace1a5 100644 --- a/src/main/java/com/gmail/nossr50/util/ChimaeraWing.java +++ b/src/main/java/com/gmail/nossr50/util/ChimaeraWing.java @@ -1,6 +1,5 @@ package com.gmail.nossr50.util; -import com.gmail.nossr50.config.Config; import com.gmail.nossr50.datatypes.interactions.NotificationType; import com.gmail.nossr50.datatypes.player.McMMOPlayer; import com.gmail.nossr50.locale.LocaleLoader; @@ -37,7 +36,7 @@ public final class ChimaeraWing { * @param player Player whose item usage to check */ public static void activationCheck(Player player) { - if (!Config.getInstance().getChimaeraEnabled()) { + if (!mcMMO.p.getGeneralConfig().getChimaeraEnabled()) { return; } @@ -64,13 +63,13 @@ public final class ChimaeraWing { int amount = inHand.getAmount(); - if (amount < Config.getInstance().getChimaeraUseCost()) { - NotificationManager.sendPlayerInformation(player, NotificationType.REQUIREMENTS_NOT_MET, "Item.ChimaeraWing.NotEnough",String.valueOf(Config.getInstance().getChimaeraUseCost() - amount), "Item.ChimaeraWing.Name"); + if (amount < mcMMO.p.getGeneralConfig().getChimaeraUseCost()) { + NotificationManager.sendPlayerInformation(player, NotificationType.REQUIREMENTS_NOT_MET, "Item.ChimaeraWing.NotEnough",String.valueOf(mcMMO.p.getGeneralConfig().getChimaeraUseCost() - amount), "Item.ChimaeraWing.Name"); return; } long lastTeleport = mcMMOPlayer.getChimeraWingLastUse(); - int cooldown = Config.getInstance().getChimaeraCooldown(); + int cooldown = mcMMO.p.getGeneralConfig().getChimaeraCooldown(); if (cooldown > 0) { int timeRemaining = SkillUtils.calculateTimeLeft(lastTeleport * Misc.TIME_CONVERSION_FACTOR, cooldown, player); @@ -82,7 +81,7 @@ public final class ChimaeraWing { } long recentlyHurt = mcMMOPlayer.getRecentlyHurt(); - int hurtCooldown = Config.getInstance().getChimaeraRecentlyHurtCooldown(); + int hurtCooldown = mcMMO.p.getGeneralConfig().getChimaeraRecentlyHurtCooldown(); if (hurtCooldown > 0) { int timeRemaining = SkillUtils.calculateTimeLeft(recentlyHurt * Misc.TIME_CONVERSION_FACTOR, hurtCooldown, player); @@ -95,9 +94,9 @@ public final class ChimaeraWing { location = player.getLocation(); - if (Config.getInstance().getChimaeraPreventUseUnderground()) { + if (mcMMO.p.getGeneralConfig().getChimaeraPreventUseUnderground()) { if (location.getY() < player.getWorld().getHighestBlockYAt(location)) { - player.getInventory().setItemInMainHand(new ItemStack(getChimaeraWing(amount - Config.getInstance().getChimaeraUseCost()))); + player.getInventory().setItemInMainHand(new ItemStack(getChimaeraWing(amount - mcMMO.p.getGeneralConfig().getChimaeraUseCost()))); NotificationManager.sendPlayerInformation(player, NotificationType.REQUIREMENTS_NOT_MET, "Item.ChimaeraWing.Fail"); player.updateInventory(); player.setVelocity(new Vector(0, 0.5D, 0)); @@ -109,7 +108,7 @@ public final class ChimaeraWing { mcMMOPlayer.actualizeTeleportCommenceLocation(player); - long warmup = Config.getInstance().getChimaeraWarmup(); + long warmup = mcMMO.p.getGeneralConfig().getChimaeraWarmup(); if (warmup > 0) { NotificationManager.sendPlayerInformation(player, NotificationType.ITEM_MESSAGE, "Teleport.Commencing", String.valueOf(warmup)); @@ -123,7 +122,7 @@ public final class ChimaeraWing { public static void chimaeraExecuteTeleport() { Player player = mcMMOPlayer.getPlayer(); - if (Config.getInstance().getChimaeraUseBedSpawn() && player.getBedSpawnLocation() != null) { + if (mcMMO.p.getGeneralConfig().getChimaeraUseBedSpawn() && player.getBedSpawnLocation() != null) { player.teleport(player.getBedSpawnLocation()); } else { @@ -136,12 +135,12 @@ public final class ChimaeraWing { } } - player.getInventory().setItemInMainHand(new ItemStack(getChimaeraWing(player.getInventory().getItemInMainHand().getAmount() - Config.getInstance().getChimaeraUseCost()))); + player.getInventory().setItemInMainHand(new ItemStack(getChimaeraWing(player.getInventory().getItemInMainHand().getAmount() - mcMMO.p.getGeneralConfig().getChimaeraUseCost()))); player.updateInventory(); mcMMOPlayer.actualizeChimeraWingLastUse(); mcMMOPlayer.setTeleportCommenceLocation(null); - if (Config.getInstance().getChimaeraSoundEnabled()) { + if (mcMMO.p.getGeneralConfig().getChimaeraSoundEnabled()) { SoundManager.sendSound(player, location, SoundType.CHIMAERA_WING); } @@ -149,12 +148,13 @@ public final class ChimaeraWing { } public static ItemStack getChimaeraWing(int amount) { - ItemStack itemStack = new ItemStack(Config.getInstance().getChimaeraItem(), amount); + ItemStack itemStack = new ItemStack(mcMMO.p.getGeneralConfig().getChimaeraItem(), amount); ItemMeta itemMeta = itemStack.getItemMeta(); + //noinspection ConstantConditions itemMeta.setDisplayName(ChatColor.GOLD + LocaleLoader.getString("Item.ChimaeraWing.Name")); - List itemLore = new ArrayList(); + List itemLore = new ArrayList<>(); itemLore.add("mcMMO Item"); itemLore.add(LocaleLoader.getString("Item.ChimaeraWing.Lore")); itemMeta.setLore(itemLore); @@ -164,8 +164,8 @@ public final class ChimaeraWing { } public static ShapelessRecipe getChimaeraWingRecipe() { - Material ingredient = Config.getInstance().getChimaeraItem(); - int amount = Config.getInstance().getChimaeraRecipeCost(); + Material ingredient = mcMMO.p.getGeneralConfig().getChimaeraItem(); + int amount = mcMMO.p.getGeneralConfig().getChimaeraRecipeCost(); ShapelessRecipe chimeraWing = new ShapelessRecipe(new NamespacedKey(mcMMO.p, "Chimera"), getChimaeraWing(1)); chimeraWing.addIngredient(amount, ingredient); diff --git a/src/main/java/com/gmail/nossr50/util/EnchantmentUtils.java b/src/main/java/com/gmail/nossr50/util/EnchantmentUtils.java index ad71ea747..6aab49b3d 100644 --- a/src/main/java/com/gmail/nossr50/util/EnchantmentUtils.java +++ b/src/main/java/com/gmail/nossr50/util/EnchantmentUtils.java @@ -6,7 +6,7 @@ import java.util.HashMap; public class EnchantmentUtils { - private static final HashMap enchants = new HashMap(); + private static final HashMap enchants = new HashMap<>(); static { enchants.put("SHARPNESS", Enchantment.DAMAGE_ALL); diff --git a/src/main/java/com/gmail/nossr50/util/EventUtils.java b/src/main/java/com/gmail/nossr50/util/EventUtils.java index 2793a446e..acec911dd 100644 --- a/src/main/java/com/gmail/nossr50/util/EventUtils.java +++ b/src/main/java/com/gmail/nossr50/util/EventUtils.java @@ -27,12 +27,15 @@ import com.gmail.nossr50.events.skills.fishing.McMMOPlayerFishingTreasureEvent; import com.gmail.nossr50.events.skills.fishing.McMMOPlayerMagicHunterEvent; import com.gmail.nossr50.events.skills.repair.McMMOPlayerRepairCheckEvent; import com.gmail.nossr50.events.skills.salvage.McMMOPlayerSalvageCheckEvent; +import com.gmail.nossr50.events.skills.secondaryabilities.SubSkillBlockEvent; import com.gmail.nossr50.events.skills.secondaryabilities.SubSkillEvent; import com.gmail.nossr50.events.skills.unarmed.McMMOPlayerDisarmEvent; import com.gmail.nossr50.locale.LocaleLoader; import com.gmail.nossr50.mcMMO; +import com.gmail.nossr50.util.player.NotificationManager; import com.gmail.nossr50.util.player.UserManager; import com.gmail.nossr50.util.skills.CombatUtils; +import com.gmail.nossr50.util.skills.SkillTools; import org.bukkit.block.Block; import org.bukkit.enchantments.Enchantment; import org.bukkit.entity.Entity; @@ -43,7 +46,9 @@ import org.bukkit.event.Event; import org.bukkit.event.entity.EntityDamageEvent; import org.bukkit.event.player.PlayerFishEvent; import org.bukkit.inventory.ItemStack; +import org.bukkit.plugin.Plugin; import org.bukkit.plugin.PluginManager; +import org.jetbrains.annotations.NotNull; import java.util.HashMap; import java.util.Map; @@ -51,10 +56,30 @@ import java.util.Map; /** * This class is meant to help make event related code less boilerplate */ -public class EventUtils { +public final class EventUtils { + + /** + * This is a static utility class, therefore we don't want any instances of + * this class. Making the constructor private prevents accidents like that. + */ + private EventUtils() {} + /* * Quality of Life methods */ + + /** + * This is a simple check to see if an {@link Event} is fake or not. + * {@link FakeEvent FakeEvents} should not be processed like normally and maybe even + * be ignored by other {@link Plugin plugins} completely. + * + * @param event The {@link Event} in question + * @return Whether this {@link Event} has been faked by mcMMO and should not be processed normally. + */ + public static boolean isFakeEvent(@NotNull Event event) { + return event instanceof FakeEvent; + } + /** * Checks to see if damage is from natural sources * This cannot be used to determine if damage is from vanilla MC, it just checks to see if the damage is from a complex behaviour in mcMMO such as bleed. @@ -62,16 +87,17 @@ public class EventUtils { * @param event this event * @return true if damage is NOT from an unnatural mcMMO skill (such as bleed DOTs) */ - public static boolean isDamageFromMcMMOComplexBehaviour(Event event) { + public static boolean isDamageFromMcMMOComplexBehaviour(@NotNull Event event) { return event instanceof FakeEntityDamageEvent; } /** * This little method is just to make the code more readable + * * @param entity target entity * @return the associated McMMOPlayer for this entity */ - public static McMMOPlayer getMcMMOPlayer(Entity entity) + public static McMMOPlayer getMcMMOPlayer(@NotNull Entity entity) { return UserManager.getPlayer((Player)entity); } @@ -89,7 +115,7 @@ public class EventUtils { * @param entityDamageEvent * @return */ - public static boolean isRealPlayerDamaged(EntityDamageEvent entityDamageEvent) + public static boolean isRealPlayerDamaged(@NotNull EntityDamageEvent entityDamageEvent) { //Make sure the damage is above 0 double damage = entityDamageEvent.getFinalDamage(); @@ -144,14 +170,14 @@ public class EventUtils { * Others */ - public static McMMOPlayerAbilityActivateEvent callPlayerAbilityActivateEvent(Player player, PrimarySkillType skill) { + public static @NotNull McMMOPlayerAbilityActivateEvent callPlayerAbilityActivateEvent(@NotNull Player player, @NotNull PrimarySkillType skill) { McMMOPlayerAbilityActivateEvent event = new McMMOPlayerAbilityActivateEvent(player, skill); mcMMO.p.getServer().getPluginManager().callEvent(event); return event; } - public static McMMOPlayerProfileLoadEvent callPlayerProfileLoadEvent(Player player, PlayerProfile profile){ + public static @NotNull McMMOPlayerProfileLoadEvent callPlayerProfileLoadEvent(@NotNull Player player, @NotNull PlayerProfile profile){ McMMOPlayerProfileLoadEvent event = new McMMOPlayerProfileLoadEvent(player, profile); mcMMO.p.getServer().getPluginManager().callEvent(event); @@ -165,13 +191,28 @@ public class EventUtils { * @return the event after it has been fired */ @Deprecated - public static SubSkillEvent callSubSkillEvent(Player player, SubSkillType subSkillType) { + public static @NotNull SubSkillEvent callSubSkillEvent(Player player, SubSkillType subSkillType) { SubSkillEvent event = new SubSkillEvent(player, subSkillType); mcMMO.p.getServer().getPluginManager().callEvent(event); return event; } + /** + * Calls a new SubSkillBlockEvent for this SubSkill and its related block and then returns it + * @param player target player + * @param subSkillType target subskill + * @param block associated block + * @return the event after it has been fired + */ + @Deprecated + public static @NotNull SubSkillBlockEvent callSubSkillBlockEvent(@NotNull Player player, @NotNull SubSkillType subSkillType, @NotNull Block block) { + SubSkillBlockEvent event = new SubSkillBlockEvent(player, subSkillType, block); + mcMMO.p.getServer().getPluginManager().callEvent(event); + + return event; + } + /** * Calls a new SubSkillEvent for this SubSkill and then returns it * @param player target player @@ -208,6 +249,26 @@ public class EventUtils { return isCancelled; } + public static boolean tryLevelChangeEvent(@NotNull McMMOPlayer mmoPlayer, PrimarySkillType skill, int levelsChanged, float xpRemoved, boolean isLevelUp, XPGainReason xpGainReason) { + McMMOPlayerLevelChangeEvent event = isLevelUp ? new McMMOPlayerLevelUpEvent(mmoPlayer.getPlayer(), skill, levelsChanged, xpGainReason) : new McMMOPlayerLevelDownEvent(mmoPlayer.getPlayer(), skill, levelsChanged, xpGainReason); + mcMMO.p.getServer().getPluginManager().callEvent(event); + + boolean isCancelled = event.isCancelled(); + + if (isCancelled) { + mmoPlayer.modifySkill(skill, mmoPlayer.getSkillLevel(skill) - (isLevelUp ? levelsChanged : -levelsChanged)); + mmoPlayer.addXp(skill, xpRemoved); + } else { + if (isLevelUp) { + NotificationManager.processLevelUpBroadcasting(mmoPlayer, skill, mmoPlayer.getSkillLevel(skill)); + NotificationManager.processPowerLevelUpBroadcasting(mmoPlayer, mmoPlayer.getPowerLevel()); + + } + } + + return isCancelled; + } + public static boolean tryLevelEditEvent(Player player, PrimarySkillType skill, int levelsChanged, float xpRemoved, boolean isLevelUp, XPGainReason xpGainReason, int oldLevel) { McMMOPlayerLevelChangeEvent event = isLevelUp ? new McMMOPlayerLevelUpEvent(player, skill, levelsChanged - oldLevel, xpGainReason) : new McMMOPlayerLevelDownEvent(player, skill, levelsChanged, xpGainReason); mcMMO.p.getServer().getPluginManager().callEvent(event); @@ -224,6 +285,25 @@ public class EventUtils { return isCancelled; } + public static boolean tryLevelEditEvent(@NotNull McMMOPlayer mmoPlayer, PrimarySkillType skill, int levelsChanged, float xpRemoved, boolean isLevelUp, XPGainReason xpGainReason, int oldLevel) { + McMMOPlayerLevelChangeEvent event = isLevelUp ? new McMMOPlayerLevelUpEvent(mmoPlayer.getPlayer(), skill, levelsChanged - oldLevel, xpGainReason) : new McMMOPlayerLevelDownEvent(mmoPlayer.getPlayer(), skill, levelsChanged, xpGainReason); + mcMMO.p.getServer().getPluginManager().callEvent(event); + + boolean isCancelled = event.isCancelled(); + + if (isCancelled) { + mmoPlayer.modifySkill(skill, mmoPlayer.getSkillLevel(skill) - (isLevelUp ? levelsChanged : -levelsChanged)); + mmoPlayer.addXp(skill, xpRemoved); + } else { + if (isLevelUp) { + NotificationManager.processLevelUpBroadcasting(mmoPlayer, skill, mmoPlayer.getSkillLevel(skill)); + NotificationManager.processPowerLevelUpBroadcasting(mmoPlayer, mmoPlayer.getPowerLevel()); + } + } + + return isCancelled; + } + /** * Simulate a block break event. * @@ -290,7 +370,6 @@ public class EventUtils { boolean isCancelled = event.isCancelled(); if (isCancelled) { - party.setLevel(party.getLevel() + levelsChanged); party.addXp(xpRemoved); } @@ -299,14 +378,18 @@ public class EventUtils { } public static boolean handleXpGainEvent(Player player, PrimarySkillType skill, float xpGained, XPGainReason xpGainReason) { + McMMOPlayer mmoPlayer = UserManager.getPlayer(player); + if(mmoPlayer == null) + return true; + McMMOPlayerXpGainEvent event = new McMMOPlayerXpGainEvent(player, skill, xpGained, xpGainReason); mcMMO.p.getServer().getPluginManager().callEvent(event); boolean isCancelled = event.isCancelled(); if (!isCancelled) { - UserManager.getPlayer(player).addXp(skill, event.getRawXpGained()); - UserManager.getPlayer(player).getProfile().registerXpGain(skill, event.getRawXpGained()); + mmoPlayer.addXp(skill, event.getRawXpGained()); + mmoPlayer.getProfile().registerXpGain(skill, event.getRawXpGained()); } return !isCancelled; @@ -326,19 +409,21 @@ public class EventUtils { experienceChanged = event.getExperienceChanged(); PlayerProfile playerProfile = UserManager.getPlayer(player).getProfile(); - for (PrimarySkillType primarySkillType : PrimarySkillType.NON_CHILD_SKILLS) { + for (PrimarySkillType primarySkillType : SkillTools.NON_CHILD_SKILLS) { String skillName = primarySkillType.toString(); int playerSkillLevel = playerProfile.getSkillLevel(primarySkillType); + int threshold = mcMMO.p.getGeneralConfig().getHardcoreDeathStatPenaltyLevelThreshold(); + if(playerSkillLevel > threshold) { + playerProfile.modifySkill(primarySkillType, Math.max(threshold, playerSkillLevel - levelChanged.get(skillName))); + playerProfile.removeXp(primarySkillType, experienceChanged.get(skillName)); - playerProfile.modifySkill(primarySkillType, playerSkillLevel - levelChanged.get(skillName)); - playerProfile.removeXp(primarySkillType, experienceChanged.get(skillName)); + if (playerProfile.getSkillXpLevel(primarySkillType) < 0) { + playerProfile.setSkillXpLevel(primarySkillType, 0); + } - if (playerProfile.getSkillXpLevel(primarySkillType) < 0) { - playerProfile.setSkillXpLevel(primarySkillType, 0); - } - - if (playerProfile.getSkillLevel(primarySkillType) < 0) { - playerProfile.modifySkill(primarySkillType, 0); + if (playerProfile.getSkillLevel(primarySkillType) < 0) { + playerProfile.modifySkill(primarySkillType, 0); + } } } } @@ -373,7 +458,7 @@ public class EventUtils { PlayerProfile victimProfile = UserManager.getPlayer(victim).getProfile(); - for (PrimarySkillType primarySkillType : PrimarySkillType.NON_CHILD_SKILLS) { + for (PrimarySkillType primarySkillType : SkillTools.NON_CHILD_SKILLS) { String skillName = primarySkillType.toString(); int victimSkillLevel = victimProfile.getSkillLevel(primarySkillType); @@ -397,7 +482,7 @@ public class EventUtils { } public static McMMOPlayerAbilityDeactivateEvent callAbilityDeactivateEvent(Player player, SuperAbilityType ability) { - McMMOPlayerAbilityDeactivateEvent event = new McMMOPlayerAbilityDeactivateEvent(player, PrimarySkillType.byAbility(ability)); + McMMOPlayerAbilityDeactivateEvent event = new McMMOPlayerAbilityDeactivateEvent(player, mcMMO.p.getSkillTools().getPrimarySkillBySuperAbility(ability)); mcMMO.p.getServer().getPluginManager().callEvent(event); return event; diff --git a/src/main/java/com/gmail/nossr50/util/FixSpellingNetheriteUtil.java b/src/main/java/com/gmail/nossr50/util/FixSpellingNetheriteUtil.java new file mode 100644 index 000000000..3db284a9f --- /dev/null +++ b/src/main/java/com/gmail/nossr50/util/FixSpellingNetheriteUtil.java @@ -0,0 +1,60 @@ +package com.gmail.nossr50.util; + +import com.gmail.nossr50.datatypes.database.UpgradeType; +import com.gmail.nossr50.mcMMO; + +import java.io.*; + +public class FixSpellingNetheriteUtil { + + public static void processFileCheck(mcMMO pluginRef, String fileName, UpgradeType upgradeType) { + pluginRef.getLogger().info("Checking " + fileName + " config material names..."); + + File configFile = new File(pluginRef.getDataFolder(), fileName); + if(configFile.exists()) { + BufferedReader bufferedReader = null; + FileWriter fileWriter = null; + try { + bufferedReader = new BufferedReader(new FileReader(configFile)); + StringBuilder stringBuilder = new StringBuilder(); + String curLine; + + while ((curLine = bufferedReader.readLine()) != null) { + String fixedLine = curLine.replace("NETHERRITE", "NETHERITE"); + stringBuilder.append(fixedLine); + stringBuilder.append("\r\n"); + } + + //Close + bufferedReader.close(); + + fileWriter = new FileWriter(configFile); + fileWriter.write(stringBuilder.toString()); + fileWriter.close(); + + } catch (IOException e) { + e.printStackTrace(); + } finally { + if(bufferedReader != null) { + try { + bufferedReader.close(); + } catch (IOException e) { + e.printStackTrace(); + } + + if(fileWriter != null) { + try { + fileWriter.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + } + } + } + + pluginRef.getLogger().info("Finished checking "+fileName+" for certain misspelled material names."); + + mcMMO.getUpgradeManager().setUpgradeCompleted(upgradeType); + } +} diff --git a/src/main/java/com/gmail/nossr50/util/HardcoreManager.java b/src/main/java/com/gmail/nossr50/util/HardcoreManager.java index ee2ad8092..491074a5e 100644 --- a/src/main/java/com/gmail/nossr50/util/HardcoreManager.java +++ b/src/main/java/com/gmail/nossr50/util/HardcoreManager.java @@ -1,11 +1,12 @@ package com.gmail.nossr50.util; -import com.gmail.nossr50.config.Config; import com.gmail.nossr50.datatypes.interactions.NotificationType; import com.gmail.nossr50.datatypes.player.PlayerProfile; import com.gmail.nossr50.datatypes.skills.PrimarySkillType; +import com.gmail.nossr50.mcMMO; import com.gmail.nossr50.util.player.NotificationManager; import com.gmail.nossr50.util.player.UserManager; +import com.gmail.nossr50.util.skills.SkillTools; import com.gmail.nossr50.worldguard.WorldGuardManager; import com.gmail.nossr50.worldguard.WorldGuardUtils; import org.bukkit.entity.Player; @@ -22,8 +23,8 @@ public final class HardcoreManager { return; } - double statLossPercentage = Config.getInstance().getHardcoreDeathStatPenaltyPercentage(); - int levelThreshold = Config.getInstance().getHardcoreDeathStatPenaltyLevelThreshold(); + double statLossPercentage = mcMMO.p.getGeneralConfig().getHardcoreDeathStatPenaltyPercentage(); + int levelThreshold = mcMMO.p.getGeneralConfig().getHardcoreDeathStatPenaltyLevelThreshold(); if(UserManager.getPlayer(player) == null) return; @@ -31,11 +32,11 @@ public final class HardcoreManager { PlayerProfile playerProfile = UserManager.getPlayer(player).getProfile(); int totalLevelsLost = 0; - HashMap levelChanged = new HashMap(); - HashMap experienceChanged = new HashMap(); + HashMap levelChanged = new HashMap<>(); + HashMap experienceChanged = new HashMap<>(); - for (PrimarySkillType primarySkillType : PrimarySkillType.NON_CHILD_SKILLS) { - if (!primarySkillType.getHardcoreStatLossEnabled()) { + for (PrimarySkillType primarySkillType : SkillTools.NON_CHILD_SKILLS) { + if (!mcMMO.p.getGeneralConfig().getHardcoreStatLossEnabled(primarySkillType)) { levelChanged.put(primarySkillType.toString(), 0); experienceChanged.put(primarySkillType.toString(), 0F); continue; @@ -50,7 +51,7 @@ public final class HardcoreManager { continue; } - double statsLost = playerSkillLevel * (statLossPercentage * 0.01D); + double statsLost = Math.max(0, (playerSkillLevel - levelThreshold)) * (statLossPercentage * 0.01D); int levelsLost = (int) statsLost; int xpLost = (int) Math.floor(playerSkillXpLevel * (statsLost - levelsLost)); levelChanged.put(primarySkillType.toString(), levelsLost); @@ -73,8 +74,8 @@ public final class HardcoreManager { return; } - double vampirismStatLeechPercentage = Config.getInstance().getHardcoreVampirismStatLeechPercentage(); - int levelThreshold = Config.getInstance().getHardcoreVampirismLevelThreshold(); + double vampirismStatLeechPercentage = mcMMO.p.getGeneralConfig().getHardcoreVampirismStatLeechPercentage(); + int levelThreshold = mcMMO.p.getGeneralConfig().getHardcoreVampirismLevelThreshold(); if(UserManager.getPlayer(killer) == null || UserManager.getPlayer(victim) == null) return; @@ -83,11 +84,11 @@ public final class HardcoreManager { PlayerProfile victimProfile = UserManager.getPlayer(victim).getProfile(); int totalLevelsStolen = 0; - HashMap levelChanged = new HashMap(); - HashMap experienceChanged = new HashMap(); + HashMap levelChanged = new HashMap<>(); + HashMap experienceChanged = new HashMap<>(); - for (PrimarySkillType primarySkillType : PrimarySkillType.NON_CHILD_SKILLS) { - if (!primarySkillType.getHardcoreVampirismEnabled()) { + for (PrimarySkillType primarySkillType : SkillTools.NON_CHILD_SKILLS) { + if (!mcMMO.p.getGeneralConfig().getHardcoreVampirismEnabled(primarySkillType)) { levelChanged.put(primarySkillType.toString(), 0); experienceChanged.put(primarySkillType.toString(), 0F); continue; @@ -135,8 +136,8 @@ public final class HardcoreManager { public static boolean isStatLossEnabled() { boolean enabled = false; - for (PrimarySkillType primarySkillType : PrimarySkillType.NON_CHILD_SKILLS) { - if (primarySkillType.getHardcoreStatLossEnabled()) { + for (PrimarySkillType primarySkillType : SkillTools.NON_CHILD_SKILLS) { + if (mcMMO.p.getGeneralConfig().getHardcoreStatLossEnabled(primarySkillType)) { enabled = true; break; } @@ -153,8 +154,8 @@ public final class HardcoreManager { public static boolean isVampirismEnabled() { boolean enabled = false; - for (PrimarySkillType primarySkillType : PrimarySkillType.NON_CHILD_SKILLS) { - if (primarySkillType.getHardcoreVampirismEnabled()) { + for (PrimarySkillType primarySkillType : SkillTools.NON_CHILD_SKILLS) { + if (mcMMO.p.getGeneralConfig().getHardcoreVampirismEnabled(primarySkillType)) { enabled = true; break; } diff --git a/src/main/java/com/gmail/nossr50/util/HolidayManager.java b/src/main/java/com/gmail/nossr50/util/HolidayManager.java index 7ae7fb2fc..f89937844 100644 --- a/src/main/java/com/gmail/nossr50/util/HolidayManager.java +++ b/src/main/java/com/gmail/nossr50/util/HolidayManager.java @@ -1,387 +1,388 @@ -package com.gmail.nossr50.util; - -import com.gmail.nossr50.commands.skills.AprilCommand; -import com.gmail.nossr50.config.Config; -import com.gmail.nossr50.datatypes.interactions.NotificationType; -import com.gmail.nossr50.datatypes.player.McMMOPlayer; -import com.gmail.nossr50.datatypes.skills.PrimarySkillType; -import com.gmail.nossr50.locale.LocaleLoader; -import com.gmail.nossr50.mcMMO; -import com.gmail.nossr50.util.player.NotificationManager; -import com.gmail.nossr50.util.player.UserManager; -import com.gmail.nossr50.util.sounds.SoundManager; -import com.gmail.nossr50.util.sounds.SoundType; -import com.google.common.collect.ImmutableList; -import org.bukkit.ChatColor; -import org.bukkit.Color; -import org.bukkit.Statistic; -import org.bukkit.command.CommandSender; -import org.bukkit.command.PluginCommand; -import org.bukkit.entity.Player; -import org.bukkit.event.player.PlayerStatisticIncrementEvent; - -import java.io.*; -import java.util.*; -import java.util.regex.Pattern; - -public final class HolidayManager { - private ArrayList hasCelebrated; - private int currentYear; - private static final int START_YEAR = 2011; - - private static final List ALL_COLORS; - private static final List ALL_CHAT_COLORS; - private static final List CHAT_FORMATS; - - public enum FakeSkillType { - MACHO, - JUMPING, - THROWING, - WRECKING, - CRAFTING, - WALKING, - SWIMMING, - FALLING, - CLIMBING, - FLYING, - DIVING, - PIGGY, - UNKNOWN; - - public static FakeSkillType getByName(String skillName) { - for (FakeSkillType type : values()) { - if (type.name().equalsIgnoreCase(skillName)) { - return type; - } - } - return null; - } - - public static FakeSkillType getByStatistic(Statistic statistic) { - switch (statistic) { - case DAMAGE_TAKEN: - return FakeSkillType.MACHO; - case JUMP: - return FakeSkillType.JUMPING; - case DROP: - return FakeSkillType.THROWING; - case MINE_BLOCK: - case BREAK_ITEM: - return FakeSkillType.WRECKING; - case CRAFT_ITEM: - return FakeSkillType.CRAFTING; - case WALK_ONE_CM: - return FakeSkillType.WALKING; - case SWIM_ONE_CM: - return FakeSkillType.SWIMMING; - case FALL_ONE_CM: - return FakeSkillType.FALLING; - case CLIMB_ONE_CM: - return FakeSkillType.CLIMBING; - case FLY_ONE_CM: - return FakeSkillType.FLYING; - case WALK_UNDER_WATER_ONE_CM: - return FakeSkillType.DIVING; - case PIG_ONE_CM: - return FakeSkillType.PIGGY; - default: - return FakeSkillType.UNKNOWN; - } - } - } - - public final Set movementStatistics = EnumSet.of( - Statistic.WALK_ONE_CM, Statistic.SWIM_ONE_CM, Statistic.FALL_ONE_CM, - Statistic.CLIMB_ONE_CM, Statistic.FLY_ONE_CM, Statistic.WALK_UNDER_WATER_ONE_CM, - Statistic.PIG_ONE_CM); - - static { - List colors = new ArrayList(); - List chatColors = new ArrayList(); - List chatFormats = new ArrayList(); - - for (ChatColor color : ChatColor.values()) { - if (color.isColor()) { - chatColors.add(color); - } - else { - chatFormats.add(color); - } - } - -// for (DyeColor color : DyeColor.values()) { -// colors.add(color.getFireworkColor()); -// } - - Collections.shuffle(chatColors, Misc.getRandom()); - Collections.shuffle(colors, Misc.getRandom()); - Collections.shuffle(chatFormats, Misc.getRandom()); - - ALL_CHAT_COLORS = ImmutableList.copyOf(chatColors); - ALL_COLORS = ImmutableList.copyOf(colors); - CHAT_FORMATS = ImmutableList.copyOf(chatFormats); - } - - // This gets called onEnable - public HolidayManager() { - currentYear = Calendar.getInstance().get(Calendar.YEAR); - - File anniversaryFile = new File(mcMMO.getFlatFileDirectory(), "anniversary." + currentYear + ".yml"); - - if (!anniversaryFile.exists()) { - try { - anniversaryFile.createNewFile(); - } - catch (IOException ex) { - mcMMO.p.getLogger().severe(ex.toString()); - } - } - - hasCelebrated = new ArrayList(); - - try { - hasCelebrated.clear(); - BufferedReader reader = new BufferedReader(new FileReader(anniversaryFile.getPath())); - String line = reader.readLine(); - - while (line != null) { - hasCelebrated.add(line); - line = reader.readLine(); - } - - reader.close(); - } - catch (Exception ex) { - mcMMO.p.getLogger().severe(ex.toString()); - } - - cleanupFiles(); - } - - private void cleanupFiles() { - File FlatFileDir = new File(mcMMO.getFlatFileDirectory()); - File legacy = new File(FlatFileDir, "anniversary.yml"); - List toDelete = new ArrayList(); - - if (legacy.exists()) { - toDelete.add(legacy); - } - - Pattern pattern = Pattern.compile("anniversary\\.(?:.+)\\.yml"); - - for (String fileName : FlatFileDir.list()) { - if (!pattern.matcher(fileName).matches() || fileName.equals("anniversary." + currentYear + ".yml")) { - continue; - } - - File file = new File(FlatFileDir, fileName); - - if (file.isDirectory()) { - continue; - } - - toDelete.add(file); - } - - for (File file : toDelete) { - if (file.delete()) { - mcMMO.p.debug("Deleted: " + file.getName()); - } - } - } - - // This gets called onDisable - public void saveAnniversaryFiles() { - mcMMO.p.debug("Saving anniversary files..."); - String anniversaryFilePath = mcMMO.getFlatFileDirectory() + "anniversary." + currentYear + ".yml"; - - try { - BufferedWriter writer = new BufferedWriter(new FileWriter(anniversaryFilePath)); - for (String player : hasCelebrated) { - writer.write(player); - writer.newLine(); - } - writer.close(); - } - catch (Exception ex) { - mcMMO.p.getLogger().severe(ex.toString()); - } - } - - // This gets called from /mcmmo command - public void anniversaryCheck(final CommandSender sender) { - GregorianCalendar anniversaryStart = new GregorianCalendar(currentYear, Calendar.FEBRUARY, 3); - GregorianCalendar anniversaryEnd = new GregorianCalendar(currentYear, Calendar.FEBRUARY, 6); - GregorianCalendar day = new GregorianCalendar(); - - if (hasCelebrated.contains(sender.getName())) { - return; - } - - if (!getDateRange(day.getTime(), anniversaryStart.getTime(), anniversaryEnd.getTime())) { - return; - } - - sender.sendMessage(LocaleLoader.getString("Holiday.Anniversary", (currentYear - START_YEAR))); - /*if (sender instanceof Player) { - final int firework_amount = 10; - for (int i = 0; i < firework_amount; i++) { - int delay = (int) (Misc.getRandom().nextDouble() * 3 * Misc.TICK_CONVERSION_FACTOR) + 4; - mcMMO.p.getServer().getScheduler().runTaskLater(mcMMO.p, new Runnable() { - @Override - public void run() { - spawnFireworks((Player) sender); - } - }, delay); - } - }*/ -// else { - /* - * Credit: http://www.geocities.com/spunk1111/ - * (good luck finding that in 3 years heh) - * .''. . *''* :_\/_: . - * :_\/_: _\(/_ .:.*_\/_* : /\ : .'.:.'. - * .''.: /\ : /)\ ':'* /\ * : '..'. -=:o:=- - * :_\/_:'.:::. ' *''* * '.\'/.'_\(/_ '.':'.' - * : /\ : ::::: *_\/_* -= o =- /)\ ' - * '..' ':::' * /\ * .'/.\'. ' * - * * *..* : * - * * * * - * * * * - */ - - /* - * Color map - * AAAA D GGGG JJJJJJ K - * AAAAAA DDDDD EEEGGGGGG JJJJJJ KKKKKKK - * BBBBAAAAAA DDD EEEGGGGGG I JJJJJ KKKKKKK - * BBBBBBACCCCC D FFFF G IIIIIIIHHHHH KKKKKKK - * BBBBBB CCCCC FFFFFF IIIIIII HHH K - * BBBB CCCCC FFFFFF IIIIIII H k - * b FFFF I k - * b i k - * b i k - */ - Object[] colorParams = new Object[]{chatColorChoose(), chatColorChoose(), chatColorChoose(), chatColorChoose(), chatColorChoose(), chatColorChoose(), chatColorChoose(), chatColorChoose(), chatColorChoose(), chatColorChoose(), chatColorChoose()}; - sender.sendMessage(String.format(" %1$s.''. %4$s. %7$s*''* %10$s:_\\/_: %11$s.", colorParams)); - sender.sendMessage(String.format(" %1$s:_\\/_: %4$s_\\(/_ %5$s.:.%7$s*_\\/_* %10$s: /\\ : %11$s.'.:.'.", colorParams)); - sender.sendMessage(String.format(" %2$s.''.%1$s: /\\ : %4$s/)\\ %5$s':'%7$s* /\\ * %9$s: %10$s'..'. %11$s-=:o:=-", colorParams)); - sender.sendMessage(String.format("%2$s:_\\/_:%1$s'%3$s.:::. %4$s' %6$s*''* %7$s* %9$s'.\\'/.'%8$s_\\(/_ %11$s'.':'.'", colorParams)); - sender.sendMessage(String.format("%2$s: /\\ : %3$s::::: %6$s*_\\/_* %9$s-= o =-%8$s /)\\ %11$s'", colorParams)); - sender.sendMessage(String.format(" %2$s'..' %3$s':::' %6$s* /\\ * %9$s.'/.\\'. %8$s' %11$s*", colorParams)); - sender.sendMessage(String.format(" %2$s* %6$s*..* %9$s: %11$s*", colorParams)); - sender.sendMessage(String.format(" %2$s* %9$s* %11$s*", colorParams)); - sender.sendMessage(String.format(" %2$s* %9$s* %11$s*", colorParams)); -// } - - hasCelebrated.add(sender.getName()); - } - - public boolean getDateRange(Date date, Date start, Date end) { - return !(date.before(start) || date.after(end)); - } - -// public void spawnFireworks(Player player) { -// int power = Misc.getRandom().nextInt(3) + 1; -// Type fireworkType = Type.values()[Misc.getRandom().nextInt(Type.values().length)]; -// double varX = Misc.getRandom().nextGaussian() * 3; -// double varZ = Misc.getRandom().nextGaussian() * 3; +//package com.gmail.nossr50.util; // -// Firework fireworks = (Firework) player.getWorld().spawnEntity(player.getLocation().add(varX, 0, varZ), EntityType.FIREWORK); -// FireworkMeta fireworkmeta = fireworks.getFireworkMeta(); -// FireworkEffect effect = FireworkEffect.builder().flicker(Misc.getRandom().nextBoolean()).withColor(colorChoose()).withFade(colorChoose()).with(fireworkType).trail(Misc.getRandom().nextBoolean()).build(); -// fireworkmeta.addEffect(effect); -// fireworkmeta.setPower(power); -// fireworks.setFireworkMeta(fireworkmeta); +//import com.gmail.nossr50.commands.skills.AprilCommand; +//import com.gmail.nossr50.config.Config; +//import com.gmail.nossr50.datatypes.interactions.NotificationType; +//import com.gmail.nossr50.datatypes.player.McMMOPlayer; +//import com.gmail.nossr50.datatypes.skills.PrimarySkillType; +//import com.gmail.nossr50.locale.LocaleLoader; +//import com.gmail.nossr50.mcMMO; +//import com.gmail.nossr50.util.player.NotificationManager; +//import com.gmail.nossr50.util.player.UserManager; +//import com.gmail.nossr50.util.sounds.SoundManager; +//import com.gmail.nossr50.util.sounds.SoundType; +//import com.gmail.nossr50.util.text.StringUtils; +//import com.google.common.collect.ImmutableList; +//import org.bukkit.ChatColor; +//import org.bukkit.Color; +//import org.bukkit.Statistic; +//import org.bukkit.command.CommandSender; +//import org.bukkit.command.PluginCommand; +//import org.bukkit.entity.Player; +//import org.bukkit.event.player.PlayerStatisticIncrementEvent; +// +//import java.io.*; +//import java.util.*; +//import java.util.regex.Pattern; +// +//public final class HolidayManager { +// private final ArrayList hasCelebrated; +// private final int currentYear; +// private static final int START_YEAR = 2011; +// +// private static final List ALL_COLORS; +// private static final List ALL_CHAT_COLORS; +// private static final List CHAT_FORMATS; +// +// public enum FakeSkillType { +// MACHO, +// JUMPING, +// THROWING, +// WRECKING, +// CRAFTING, +// WALKING, +// SWIMMING, +// FALLING, +// CLIMBING, +// FLYING, +// DIVING, +// PIGGY, +// UNKNOWN; +// +// public static FakeSkillType getByName(String skillName) { +// for (FakeSkillType type : values()) { +// if (type.name().equalsIgnoreCase(skillName)) { +// return type; +// } +// } +// return null; +// } +// +// public static FakeSkillType getByStatistic(Statistic statistic) { +// switch (statistic) { +// case DAMAGE_TAKEN: +// return FakeSkillType.MACHO; +// case JUMP: +// return FakeSkillType.JUMPING; +// case DROP: +// return FakeSkillType.THROWING; +// case MINE_BLOCK: +// case BREAK_ITEM: +// return FakeSkillType.WRECKING; +// case CRAFT_ITEM: +// return FakeSkillType.CRAFTING; +// case WALK_ONE_CM: +// return FakeSkillType.WALKING; +// case SWIM_ONE_CM: +// return FakeSkillType.SWIMMING; +// case FALL_ONE_CM: +// return FakeSkillType.FALLING; +// case CLIMB_ONE_CM: +// return FakeSkillType.CLIMBING; +// case FLY_ONE_CM: +// return FakeSkillType.FLYING; +// case WALK_UNDER_WATER_ONE_CM: +// return FakeSkillType.DIVING; +// case PIG_ONE_CM: +// return FakeSkillType.PIGGY; +// default: +// return FakeSkillType.UNKNOWN; +// } +// } // } - - private static List colorChoose() { - return ALL_COLORS.subList(0, Math.max(Misc.getRandom().nextInt(ALL_COLORS.size() + 1), 1)); - } - - private static String chatColorChoose() { - StringBuilder ret = new StringBuilder(ALL_CHAT_COLORS.get(Misc.getRandom().nextInt(ALL_CHAT_COLORS.size())).toString()); - - for (ChatColor chatFormat : CHAT_FORMATS) { - if (Misc.getRandom().nextInt(CHAT_FORMATS.size()) == 0) { - ret.append(chatFormat); - } - } - - return ret.toString(); - } - - public boolean isAprilFirst() { - if(!Config.getInstance().isAprilFoolsAllowed()) - return false; - - GregorianCalendar aprilFirst = new GregorianCalendar(currentYear, Calendar.APRIL, 1); - GregorianCalendar aprilSecond = new GregorianCalendar(currentYear, Calendar.APRIL, 2); - GregorianCalendar day = new GregorianCalendar(); - return getDateRange(day.getTime(), aprilFirst.getTime(), aprilSecond.getTime()); - } - - public boolean nearingAprilFirst() { - if(!Config.getInstance().isAprilFoolsAllowed()) - return false; - - GregorianCalendar start = new GregorianCalendar(Calendar.getInstance().get(Calendar.YEAR), Calendar.MARCH, 28); - GregorianCalendar end = new GregorianCalendar(Calendar.getInstance().get(Calendar.YEAR), Calendar.APRIL, 2); - GregorianCalendar day = new GregorianCalendar(); - - return mcMMO.getHolidayManager().getDateRange(day.getTime(), start.getTime(), end.getTime()); - } - - public void handleStatisticEvent(PlayerStatisticIncrementEvent event) { - Player player = event.getPlayer(); - Statistic statistic = event.getStatistic(); - int newValue = event.getNewValue(); - - int modifier; - switch (statistic) { - case DAMAGE_TAKEN: - modifier = 500; - break; - case JUMP: - modifier = 500; - break; - case DROP: - modifier = 200; - break; - case MINE_BLOCK: - case BREAK_ITEM: - modifier = 500; - break; - case CRAFT_ITEM: - modifier = 100; - break; - default: - return; - } - - if (newValue % modifier == 0) { - mcMMO.getHolidayManager().levelUpApril(player, FakeSkillType.getByStatistic(statistic)); - } - } - - public void levelUpApril(Player player, FakeSkillType fakeSkillType) { - if(!Config.getInstance().isAprilFoolsAllowed()) - return; - - final McMMOPlayer mmoPlayer = UserManager.getPlayer(player); - if (mmoPlayer == null) return; - - int levelTotal = Misc.getRandom().nextInt(1 + mmoPlayer.getSkillLevel(PrimarySkillType.MINING)) + 1; - SoundManager.sendSound(player, player.getLocation(), SoundType.LEVEL_UP); - NotificationManager.sendPlayerInformation(player, NotificationType.HOLIDAY, "Holiday.AprilFools.Levelup", StringUtils.getCapitalized(fakeSkillType.toString()), String.valueOf(levelTotal)); -// ParticleEffectUtils.fireworkParticleShower(player, ALL_COLORS.get(Misc.getRandom().nextInt(ALL_COLORS.size()))); - } - - public void registerAprilCommand() { - if(!Config.getInstance().isAprilFoolsAllowed()) - return; - - PluginCommand command = mcMMO.p.getCommand("crafting"); - command.setExecutor(new AprilCommand()); - } -} +// +// public final Set movementStatistics = EnumSet.of( +// Statistic.WALK_ONE_CM, Statistic.SWIM_ONE_CM, Statistic.FALL_ONE_CM, +// Statistic.CLIMB_ONE_CM, Statistic.FLY_ONE_CM, Statistic.WALK_UNDER_WATER_ONE_CM, +// Statistic.PIG_ONE_CM); +// +// static { +// List colors = new ArrayList<>(); +// List chatColors = new ArrayList<>(); +// List chatFormats = new ArrayList<>(); +// +// for (ChatColor color : ChatColor.values()) { +// if (color.isColor()) { +// chatColors.add(color); +// } +// else { +// chatFormats.add(color); +// } +// } +// +//// for (DyeColor color : DyeColor.values()) { +//// colors.add(color.getFireworkColor()); +//// } +// +// Collections.shuffle(chatColors, Misc.getRandom()); +// Collections.shuffle(colors, Misc.getRandom()); +// Collections.shuffle(chatFormats, Misc.getRandom()); +// +// ALL_CHAT_COLORS = ImmutableList.copyOf(chatColors); +// ALL_COLORS = ImmutableList.copyOf(colors); +// CHAT_FORMATS = ImmutableList.copyOf(chatFormats); +// } +// +// // This gets called onEnable +// public HolidayManager() { +// currentYear = Calendar.getInstance().get(Calendar.YEAR); +// +// File anniversaryFile = new File(mcMMO.getFlatFileDirectory(), "anniversary." + currentYear + ".yml"); +// +// if (!anniversaryFile.exists()) { +// try { +// anniversaryFile.createNewFile(); +// } +// catch (IOException ex) { +// mcMMO.p.getLogger().severe(ex.toString()); +// } +// } +// +// hasCelebrated = new ArrayList<>(); +// +// try { +// hasCelebrated.clear(); +// BufferedReader reader = new BufferedReader(new FileReader(anniversaryFile.getPath())); +// String line = reader.readLine(); +// +// while (line != null) { +// hasCelebrated.add(line); +// line = reader.readLine(); +// } +// +// reader.close(); +// } +// catch (Exception ex) { +// mcMMO.p.getLogger().severe(ex.toString()); +// } +// +// cleanupFiles(); +// } +// +// private void cleanupFiles() { +// File FlatFileDir = new File(mcMMO.getFlatFileDirectory()); +// File legacy = new File(FlatFileDir, "anniversary.yml"); +// List toDelete = new ArrayList<>(); +// +// if (legacy.exists()) { +// toDelete.add(legacy); +// } +// +// Pattern pattern = Pattern.compile("anniversary\\.(?:.+)\\.yml"); +// +// for (String fileName : FlatFileDir.list()) { +// if (!pattern.matcher(fileName).matches() || fileName.equals("anniversary." + currentYear + ".yml")) { +// continue; +// } +// +// File file = new File(FlatFileDir, fileName); +// +// if (file.isDirectory()) { +// continue; +// } +// +// toDelete.add(file); +// } +// +// for (File file : toDelete) { +// if (file.delete()) { +// mcMMO.p.debug("Deleted: " + file.getName()); +// } +// } +// } +// +// // This gets called onDisable +// public void saveAnniversaryFiles() { +// mcMMO.p.debug("Saving anniversary files..."); +// String anniversaryFilePath = mcMMO.getFlatFileDirectory() + "anniversary." + currentYear + ".yml"; +// +// try { +// BufferedWriter writer = new BufferedWriter(new FileWriter(anniversaryFilePath)); +// for (String player : hasCelebrated) { +// writer.write(player); +// writer.newLine(); +// } +// writer.close(); +// } +// catch (Exception ex) { +// mcMMO.p.getLogger().severe(ex.toString()); +// } +// } +// +// // This gets called from /mcmmo command +// public void anniversaryCheck(final CommandSender sender) { +// GregorianCalendar anniversaryStart = new GregorianCalendar(currentYear, Calendar.FEBRUARY, 3); +// GregorianCalendar anniversaryEnd = new GregorianCalendar(currentYear, Calendar.FEBRUARY, 6); +// GregorianCalendar day = new GregorianCalendar(); +// +// if (hasCelebrated.contains(sender.getName())) { +// return; +// } +// +// if (!getDateRange(day.getTime(), anniversaryStart.getTime(), anniversaryEnd.getTime())) { +// return; +// } +// +// sender.sendMessage(LocaleLoader.getString("Holiday.Anniversary", (currentYear - START_YEAR))); +// /*if (sender instanceof Player) { +// final int firework_amount = 10; +// for (int i = 0; i < firework_amount; i++) { +// int delay = (int) (Misc.getRandom().nextDouble() * 3 * Misc.TICK_CONVERSION_FACTOR) + 4; +// mcMMO.p.getServer().getScheduler().runTaskLater(mcMMO.p, new Runnable() { +// @Override +// public void run() { +// spawnFireworks((Player) sender); +// } +// }, delay); +// } +// }*/ +//// else { +// /* +// * Credit: http://www.geocities.com/spunk1111/ +// * (good luck finding that in 3 years heh) +// * .''. . *''* :_\/_: . +// * :_\/_: _\(/_ .:.*_\/_* : /\ : .'.:.'. +// * .''.: /\ : /)\ ':'* /\ * : '..'. -=:o:=- +// * :_\/_:'.:::. ' *''* * '.\'/.'_\(/_ '.':'.' +// * : /\ : ::::: *_\/_* -= o =- /)\ ' +// * '..' ':::' * /\ * .'/.\'. ' * +// * * *..* : * +// * * * * +// * * * * +// */ +// +// /* +// * Color map +// * AAAA D GGGG JJJJJJ K +// * AAAAAA DDDDD EEEGGGGGG JJJJJJ KKKKKKK +// * BBBBAAAAAA DDD EEEGGGGGG I JJJJJ KKKKKKK +// * BBBBBBACCCCC D FFFF G IIIIIIIHHHHH KKKKKKK +// * BBBBBB CCCCC FFFFFF IIIIIII HHH K +// * BBBB CCCCC FFFFFF IIIIIII H k +// * b FFFF I k +// * b i k +// * b i k +// */ +// Object[] colorParams = new Object[]{chatColorChoose(), chatColorChoose(), chatColorChoose(), chatColorChoose(), chatColorChoose(), chatColorChoose(), chatColorChoose(), chatColorChoose(), chatColorChoose(), chatColorChoose(), chatColorChoose()}; +// sender.sendMessage(String.format(" %1$s.''. %4$s. %7$s*''* %10$s:_\\/_: %11$s.", colorParams)); +// sender.sendMessage(String.format(" %1$s:_\\/_: %4$s_\\(/_ %5$s.:.%7$s*_\\/_* %10$s: /\\ : %11$s.'.:.'.", colorParams)); +// sender.sendMessage(String.format(" %2$s.''.%1$s: /\\ : %4$s/)\\ %5$s':'%7$s* /\\ * %9$s: %10$s'..'. %11$s-=:o:=-", colorParams)); +// sender.sendMessage(String.format("%2$s:_\\/_:%1$s'%3$s.:::. %4$s' %6$s*''* %7$s* %9$s'.\\'/.'%8$s_\\(/_ %11$s'.':'.'", colorParams)); +// sender.sendMessage(String.format("%2$s: /\\ : %3$s::::: %6$s*_\\/_* %9$s-= o =-%8$s /)\\ %11$s'", colorParams)); +// sender.sendMessage(String.format(" %2$s'..' %3$s':::' %6$s* /\\ * %9$s.'/.\\'. %8$s' %11$s*", colorParams)); +// sender.sendMessage(String.format(" %2$s* %6$s*..* %9$s: %11$s*", colorParams)); +// sender.sendMessage(String.format(" %2$s* %9$s* %11$s*", colorParams)); +// sender.sendMessage(String.format(" %2$s* %9$s* %11$s*", colorParams)); +//// } +// +// hasCelebrated.add(sender.getName()); +// } +// +// public boolean getDateRange(Date date, Date start, Date end) { +// return !(date.before(start) || date.after(end)); +// } +// +//// public void spawnFireworks(Player player) { +//// int power = Misc.getRandom().nextInt(3) + 1; +//// Type fireworkType = Type.values()[Misc.getRandom().nextInt(Type.values().length)]; +//// double varX = Misc.getRandom().nextGaussian() * 3; +//// double varZ = Misc.getRandom().nextGaussian() * 3; +//// +//// Firework fireworks = (Firework) player.getWorld().spawnEntity(player.getLocation().add(varX, 0, varZ), EntityType.FIREWORK); +//// FireworkMeta fireworkmeta = fireworks.getFireworkMeta(); +//// FireworkEffect effect = FireworkEffect.builder().flicker(Misc.getRandom().nextBoolean()).withColor(colorChoose()).withFade(colorChoose()).with(fireworkType).trail(Misc.getRandom().nextBoolean()).build(); +//// fireworkmeta.addEffect(effect); +//// fireworkmeta.setPower(power); +//// fireworks.setFireworkMeta(fireworkmeta); +//// } +// +// private static List colorChoose() { +// return ALL_COLORS.subList(0, Math.max(Misc.getRandom().nextInt(ALL_COLORS.size() + 1), 1)); +// } +// +// private static String chatColorChoose() { +// StringBuilder ret = new StringBuilder(ALL_CHAT_COLORS.get(Misc.getRandom().nextInt(ALL_CHAT_COLORS.size())).toString()); +// +// for (ChatColor chatFormat : CHAT_FORMATS) { +// if (Misc.getRandom().nextInt(CHAT_FORMATS.size()) == 0) { +// ret.append(chatFormat); +// } +// } +// +// return ret.toString(); +// } +// +// public boolean isAprilFirst() { +// if(!Config.getInstance().isAprilFoolsAllowed()) +// return false; +// +// GregorianCalendar aprilFirst = new GregorianCalendar(currentYear, Calendar.APRIL, 1); +// GregorianCalendar aprilSecond = new GregorianCalendar(currentYear, Calendar.APRIL, 2); +// GregorianCalendar day = new GregorianCalendar(); +// return getDateRange(day.getTime(), aprilFirst.getTime(), aprilSecond.getTime()); +// } +// +// public boolean nearingAprilFirst() { +// if(!Config.getInstance().isAprilFoolsAllowed()) +// return false; +// +// GregorianCalendar start = new GregorianCalendar(Calendar.getInstance().get(Calendar.YEAR), Calendar.MARCH, 28); +// GregorianCalendar end = new GregorianCalendar(Calendar.getInstance().get(Calendar.YEAR), Calendar.APRIL, 2); +// GregorianCalendar day = new GregorianCalendar(); +// +// return mcMMO.getHolidayManager().getDateRange(day.getTime(), start.getTime(), end.getTime()); +// } +// +// public void handleStatisticEvent(PlayerStatisticIncrementEvent event) { +// Player player = event.getPlayer(); +// Statistic statistic = event.getStatistic(); +// int newValue = event.getNewValue(); +// +// int modifier; +// switch (statistic) { +// case DAMAGE_TAKEN: +// modifier = 500; +// break; +// case JUMP: +// modifier = 500; +// break; +// case DROP: +// modifier = 200; +// break; +// case MINE_BLOCK: +// case BREAK_ITEM: +// modifier = 500; +// break; +// case CRAFT_ITEM: +// modifier = 100; +// break; +// default: +// return; +// } +// +// if (newValue % modifier == 0) { +// mcMMO.getHolidayManager().levelUpApril(player, FakeSkillType.getByStatistic(statistic)); +// } +// } +// +// public void levelUpApril(Player player, FakeSkillType fakeSkillType) { +// if(!Config.getInstance().isAprilFoolsAllowed()) +// return; +// +// final McMMOPlayer mmoPlayer = UserManager.getPlayer(player); +// if (mmoPlayer == null) return; +// +// int levelTotal = Misc.getRandom().nextInt(1 + mmoPlayer.getSkillLevel(PrimarySkillType.MINING)) + 1; +// SoundManager.sendSound(player, player.getLocation(), SoundType.LEVEL_UP); +// NotificationManager.sendPlayerInformation(player, NotificationType.HOLIDAY, "Holiday.AprilFools.Levelup", StringUtils.getCapitalized(fakeSkillType.toString()), String.valueOf(levelTotal)); +//// ParticleEffectUtils.fireworkParticleShower(player, ALL_COLORS.get(Misc.getRandom().nextInt(ALL_COLORS.size()))); +// } +// +// public void registerAprilCommand() { +// if(!Config.getInstance().isAprilFoolsAllowed()) +// return; +// +// PluginCommand command = mcMMO.p.getCommand("crafting"); +// command.setExecutor(new AprilCommand()); +// } +//} diff --git a/src/main/java/com/gmail/nossr50/util/ItemUtils.java b/src/main/java/com/gmail/nossr50/util/ItemUtils.java index a0bfd5dee..2e46341c2 100644 --- a/src/main/java/com/gmail/nossr50/util/ItemUtils.java +++ b/src/main/java/com/gmail/nossr50/util/ItemUtils.java @@ -1,18 +1,33 @@ package com.gmail.nossr50.util; -import com.gmail.nossr50.config.Config; +import com.gmail.nossr50.config.experience.ExperienceConfig; import com.gmail.nossr50.config.party.ItemWeightConfig; +import com.gmail.nossr50.datatypes.treasure.EnchantmentWrapper; +import com.gmail.nossr50.datatypes.treasure.FishingTreasureBook; import com.gmail.nossr50.locale.LocaleLoader; import com.gmail.nossr50.mcMMO; +import com.gmail.nossr50.skills.smelting.Smelting; import org.bukkit.ChatColor; import org.bukkit.Material; +import org.bukkit.NamespacedKey; +import org.bukkit.enchantments.Enchantment; import org.bukkit.entity.Player; import org.bukkit.inventory.FurnaceRecipe; import org.bukkit.inventory.ItemStack; import org.bukkit.inventory.Recipe; +import org.bukkit.inventory.meta.EnchantmentStorageMeta; import org.bukkit.inventory.meta.ItemMeta; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +import java.util.Collections; +import java.util.List; public final class ItemUtils { + /** + * This is a static utility class, therefore we don't want any instances of + * this class. Making the constructor private prevents accidents like that. + */ private ItemUtils() {} /** @@ -21,21 +36,105 @@ public final class ItemUtils { * @param item Item to check * @return true if the item is a bow, false otherwise */ - public static boolean isBow(ItemStack item) { + public static boolean isBow(@NotNull ItemStack item) { return mcMMO.getMaterialMapStore().isBow(item.getType().getKey().getKey()); } - public static boolean hasItemInEitherHand(Player player, Material material) { + public static boolean isCrossbow(@NotNull ItemStack item) { + return mcMMO.getMaterialMapStore().isCrossbow(item.getType().getKey().getKey()); + } + + public static boolean hasItemInEitherHand(@NotNull Player player, Material material) { return player.getInventory().getItemInMainHand().getType() == material || player.getInventory().getItemInOffHand().getType() == material; } + public static boolean doesPlayerHaveEnchantmentOnArmor(@NotNull Player player, @NotNull String enchantmentByName) { + Enchantment enchantment = getEnchantment(enchantmentByName); + + if(enchantment == null) + return false; + + return doesPlayerHaveEnchantmentOnArmor(player, enchantment); + } + + public static boolean doesPlayerHaveEnchantmentOnArmor(@NotNull Player player, @NotNull Enchantment enchantment) { + for(ItemStack itemStack : player.getInventory().getArmorContents()) { + if(itemStack != null) { + if(hasEnchantment(itemStack, enchantment)) + return true; + } + } + + return false; + } + + public static boolean doesPlayerHaveEnchantmentOnArmorOrHands(@NotNull Player player, @NotNull String enchantmentName) { + Enchantment enchantment = getEnchantment(enchantmentName); + + if(enchantment == null) + return false; + + return doesPlayerHaveEnchantmentOnArmorOrHands(player, enchantment); + } + + public static boolean doesPlayerHaveEnchantmentOnArmorOrHands(@NotNull Player player, @NotNull Enchantment enchantment) { + if(doesPlayerHaveEnchantmentOnArmor(player, enchantment)) + return true; + + if(doesPlayerHaveEnchantmentInHands(player, enchantment)) + return true; + + return false; + } + + public static boolean doesPlayerHaveEnchantmentInHands(@NotNull Player player, @NotNull NamespacedKey enchantmentNameKey) { + Enchantment enchantment = Enchantment.getByKey(enchantmentNameKey); + + if(enchantment == null) + return false; + + return doesPlayerHaveEnchantmentInHands(player, enchantment); + } + + public static boolean doesPlayerHaveEnchantmentInHands(@NotNull Player player, @NotNull String enchantmentName) { + Enchantment enchantment = getEnchantment(enchantmentName); + + if(enchantment == null) + return false; + + return doesPlayerHaveEnchantmentInHands(player, enchantment); + } + + public static boolean doesPlayerHaveEnchantmentInHands(@NotNull Player player, @NotNull Enchantment enchantment) { + return hasEnchantment(player.getInventory().getItemInMainHand(), enchantment) || + hasEnchantment(player.getInventory().getItemInOffHand(), enchantment); + } + + public static boolean hasEnchantment(@NotNull ItemStack itemStack, @NotNull Enchantment enchantment) { + if(itemStack.getItemMeta() != null) { + return itemStack.getItemMeta().hasEnchant(enchantment); + } + + return false; + } + + public static @Nullable Enchantment getEnchantment(@NotNull String enchantmentName) { + for(Enchantment enchantment : Enchantment.values()) { + if(enchantment.getKey().getKey().equalsIgnoreCase(enchantmentName)) { + return enchantment; + } + } + + return null; + } + /** * Checks if the item is a sword. * * @param item Item to check * @return true if the item is a sword, false otherwise */ - public static boolean isSword(ItemStack item) { + public static boolean isSword(@NotNull ItemStack item) { return mcMMO.getMaterialMapStore().isSword(item.getType().getKey().getKey()); } @@ -45,7 +144,7 @@ public final class ItemUtils { * @param item Item to check * @return true if the item is a hoe, false otherwise */ - public static boolean isHoe(ItemStack item) { + public static boolean isHoe(@NotNull ItemStack item) { return mcMMO.getMaterialMapStore().isHoe(item.getType().getKey().getKey()); } @@ -55,7 +154,7 @@ public final class ItemUtils { * @param item Item to check * @return true if the item is a shovel, false otherwise */ - public static boolean isShovel(ItemStack item) { + public static boolean isShovel(@NotNull ItemStack item) { return mcMMO.getMaterialMapStore().isShovel(item.getType().getKey().getKey()); } @@ -65,7 +164,7 @@ public final class ItemUtils { * @param item Item to check * @return true if the item is an axe, false otherwise */ - public static boolean isAxe(ItemStack item) { + public static boolean isAxe(@NotNull ItemStack item) { return mcMMO.getMaterialMapStore().isAxe(item.getType().getKey().getKey()); } @@ -75,7 +174,7 @@ public final class ItemUtils { * @param item Item to check * @return true if the item is a pickaxe, false otherwise */ - public static boolean isPickaxe(ItemStack item) { + public static boolean isPickaxe(@NotNull ItemStack item) { return mcMMO.getMaterialMapStore().isPickAxe(item.getType().getKey().getKey()); } @@ -86,7 +185,7 @@ public final class ItemUtils { * @return true if the item counts as unarmed, false otherwise */ public static boolean isUnarmed(ItemStack item) { - if (Config.getInstance().getUnarmedItemsAsUnarmed()) { + if (mcMMO.p.getGeneralConfig().getUnarmedItemsAsUnarmed()) { return !isMinecraftTool(item); } @@ -242,7 +341,7 @@ public final class ItemUtils { } public static boolean isSmeltable(ItemStack item) { - return item != null && item.getType().isBlock() && MaterialUtils.isOre(item.getType()); + return item != null && Smelting.getSmeltXP(item) >= 1; } public static boolean isSmelted(ItemStack item) { @@ -322,6 +421,7 @@ public final class ItemUtils { case CHORUS_FLOWER: case POTATO: case BEETROOT: + case BEETROOTS: case BEETROOT_SEEDS: case NETHER_WART: case BROWN_MUSHROOM: @@ -459,7 +559,12 @@ public final class ItemUtils { } ItemMeta itemMeta = item.getItemMeta(); - return itemMeta.hasLore() && itemMeta.getLore().contains("mcMMO Item"); + + if(itemMeta == null) + return false; + + return itemMeta.getLore() != null + && itemMeta.getLore().contains("mcMMO Item"); } public static boolean isChimaeraWing(ItemStack item) { @@ -468,6 +573,82 @@ public final class ItemUtils { } ItemMeta itemMeta = item.getItemMeta(); + + if(itemMeta == null) + return false; + return itemMeta.hasDisplayName() && itemMeta.getDisplayName().equals(ChatColor.GOLD + LocaleLoader.getString("Item.ChimaeraWing.Name")); } + +// public static void addAbilityLore(@NotNull ItemStack itemStack) { +// ItemMeta itemMeta = itemStack.getItemMeta(); +// List itemLore = new ArrayList<>(); +// +// if(itemMeta == null) +// return; +// +// if (itemMeta.hasLore()) { +// itemLore = itemMeta.getLore(); +// } +// +// itemLore.add("mcMMO Ability Tool"); +// +// itemMeta.setLore(itemLore); +// itemStack.setItemMeta(itemMeta); +// } + + public static void removeAbilityLore(@NotNull ItemStack itemStack) { + ItemMeta itemMeta = itemStack.getItemMeta(); + + if(itemMeta == null) + return; + + if (itemMeta.hasLore()) { + List itemLore = itemMeta.getLore(); + + if(itemLore == null) + return; + + if (itemLore.remove("mcMMO Ability Tool")) { + itemMeta.setLore(itemLore); + itemStack.setItemMeta(itemMeta); + } + } + } + + public static void addDigSpeedToItem(@NotNull ItemStack itemStack, int existingEnchantLevel) { + ItemMeta itemMeta = itemStack.getItemMeta(); + + if(itemMeta == null) + return; + + itemMeta.addEnchant(Enchantment.DIG_SPEED, existingEnchantLevel + mcMMO.p.getAdvancedConfig().getEnchantBuff(), true); + itemStack.setItemMeta(itemMeta); + } + + public static boolean canBeSuperAbilityDigBoosted(@NotNull ItemStack itemStack) { + return isShovel(itemStack) || isPickaxe(itemStack); + } + + public static @NotNull ItemStack createEnchantBook(@NotNull FishingTreasureBook fishingTreasureBook) { + ItemStack itemStack = fishingTreasureBook.getDrop().clone(); + EnchantmentWrapper enchantmentWrapper = getRandomEnchantment(fishingTreasureBook.getLegalEnchantments()); + ItemMeta itemMeta = itemStack.getItemMeta(); + + if(itemMeta == null) { + return itemStack; + } + + EnchantmentStorageMeta enchantmentStorageMeta = (EnchantmentStorageMeta) itemMeta; + enchantmentStorageMeta.addStoredEnchant(enchantmentWrapper.getEnchantment(), enchantmentWrapper.getEnchantmentLevel(), ExperienceConfig.getInstance().allowUnsafeEnchantments()); + itemStack.setItemMeta(enchantmentStorageMeta); + return itemStack; + } + + public static @NotNull EnchantmentWrapper getRandomEnchantment(@NotNull List enchantmentWrappers) { + Collections.shuffle(enchantmentWrappers, Misc.getRandom()); + + int randomIndex = Misc.getRandom().nextInt(enchantmentWrappers.size()); + return enchantmentWrappers.get(randomIndex); + } } diff --git a/src/main/java/com/gmail/nossr50/util/LogFilter.java b/src/main/java/com/gmail/nossr50/util/LogFilter.java index fde20cd1e..355c070e7 100644 --- a/src/main/java/com/gmail/nossr50/util/LogFilter.java +++ b/src/main/java/com/gmail/nossr50/util/LogFilter.java @@ -6,7 +6,7 @@ import java.util.logging.Filter; import java.util.logging.LogRecord; public class LogFilter implements Filter { - private boolean debug; + private final boolean debug; public LogFilter(mcMMO plugin) { // Doing a config loading lite here, because we can't depend on the config loader to have loaded before any debug messages are sent diff --git a/src/main/java/com/gmail/nossr50/util/MaterialMapStore.java b/src/main/java/com/gmail/nossr50/util/MaterialMapStore.java index ef5e6891d..90104acce 100644 --- a/src/main/java/com/gmail/nossr50/util/MaterialMapStore.java +++ b/src/main/java/com/gmail/nossr50/util/MaterialMapStore.java @@ -1,6 +1,7 @@ package com.gmail.nossr50.util; import org.bukkit.Material; +import org.jetbrains.annotations.NotNull; import java.util.HashMap; import java.util.HashSet; @@ -15,46 +16,49 @@ import java.util.Locale; */ public class MaterialMapStore { - private HashSet abilityBlackList; - private HashSet toolBlackList; - private HashSet mossyWhiteList; - private HashSet leavesWhiteList; - private HashSet herbalismAbilityBlackList; - private HashSet blockCrackerWhiteList; - private HashSet canMakeShroomyWhiteList; - private HashSet multiBlockPlant; - private HashSet foodItemWhiteList; - private HashSet glassBlocks; + private final @NotNull HashSet abilityBlackList; + private final @NotNull HashSet toolBlackList; + private final @NotNull HashSet mossyWhiteList; + private final @NotNull HashSet treeFellerDestructibleWhiteList; + private final @NotNull HashSet herbalismAbilityBlackList; + private final @NotNull HashSet blockCrackerWhiteList; + private final @NotNull HashSet canMakeShroomyWhiteList; + private final @NotNull HashSet multiBlockPlant; + private final @NotNull HashSet foodItemWhiteList; + private final @NotNull HashSet glassBlocks; - private HashSet netheriteArmor; - private HashSet netheriteTools; - private HashSet woodTools; - private HashSet stoneTools; - private HashSet leatherArmor; - private HashSet ironArmor; - private HashSet ironTools; - private HashSet stringTools; - private HashSet goldArmor; - private HashSet goldTools; - private HashSet chainmailArmor; - private HashSet diamondArmor; - private HashSet diamondTools; - private HashSet armors; + private final @NotNull HashSet netheriteArmor; + private final @NotNull HashSet netheriteTools; + private final @NotNull HashSet woodTools; + private final @NotNull HashSet stoneTools; + private final @NotNull HashSet leatherArmor; + private final @NotNull HashSet ironArmor; + private final @NotNull HashSet ironTools; + private final @NotNull HashSet stringTools; + private final @NotNull HashSet goldArmor; + private final @NotNull HashSet goldTools; + private final @NotNull HashSet chainmailArmor; + private final @NotNull HashSet diamondArmor; + private final @NotNull HashSet diamondTools; + private final @NotNull HashSet armors; - private HashSet swords; - private HashSet axes; - private HashSet hoes; - private HashSet shovels; - private HashSet pickAxes; - private HashSet tridents; - private HashSet bows; - private HashSet tools; + private final @NotNull HashSet swords; + private final @NotNull HashSet axes; + private final @NotNull HashSet hoes; + private final @NotNull HashSet shovels; + private final @NotNull HashSet pickAxes; + private final @NotNull HashSet tridents; + private final @NotNull HashSet bows; + private final @NotNull HashSet crossbows; + private final @NotNull HashSet tools; - private HashSet enchantables; + private final @NotNull HashSet enchantables; - private HashSet ores; + private final @NotNull HashSet ores; + private final @NotNull HashSet intendedToolPickAxe; + private final @NotNull HashSet intendedToolShovel; - private HashMap tierValue; + private final @NotNull HashMap tierValue; public MaterialMapStore() @@ -62,7 +66,7 @@ public class MaterialMapStore { abilityBlackList = new HashSet<>(); toolBlackList = new HashSet<>(); mossyWhiteList = new HashSet<>(); - leavesWhiteList = new HashSet<>(); + treeFellerDestructibleWhiteList = new HashSet<>(); herbalismAbilityBlackList = new HashSet<>(); blockCrackerWhiteList = new HashSet<>(); canMakeShroomyWhiteList = new HashSet<>(); @@ -85,6 +89,7 @@ public class MaterialMapStore { diamondTools = new HashSet<>(); netheriteTools = new HashSet<>(); bows = new HashSet<>(); + crossbows = new HashSet<>(); stringTools = new HashSet<>(); tools = new HashSet<>(); @@ -98,58 +103,20 @@ public class MaterialMapStore { enchantables = new HashSet<>(); ores = new HashSet<>(); + intendedToolPickAxe = new HashSet<>(); + intendedToolShovel = new HashSet<>(); tierValue = new HashMap<>(); fillVanillaMaterialRegisters(); } - public boolean isMultiBlockPlant(Material material) - { - return multiBlockPlant.contains(material.getKey().getKey()); - } - - public boolean isAbilityActivationBlackListed(Material material) - { - return abilityBlackList.contains(material.getKey().getKey()); - } - - public boolean isToolActivationBlackListed(Material material) - { - return toolBlackList.contains(material.getKey().getKey()); - } - - public boolean isMossyWhiteListed(Material material) - { - return mossyWhiteList.contains(material.getKey().getKey()); - } - - public boolean isLeavesWhiteListed(Material material) - { - return leavesWhiteList.contains(material.getKey().getKey()); - } - - public boolean isHerbalismAbilityWhiteListed(Material material) - { - return herbalismAbilityBlackList.contains(material.getKey().getKey()); - } - - public boolean isBlockCrackerWhiteListed(Material material) - { - return blockCrackerWhiteList.contains(material.getKey().getKey()); - } - - public boolean isShroomyWhiteListed(Material material) - { - return canMakeShroomyWhiteList.contains(material.getKey().getKey()); - } - - private void fillVanillaMaterialRegisters() - { + private void fillVanillaMaterialRegisters() { + //The order matters fillAbilityBlackList(); fillToolBlackList(); fillMossyWhiteList(); - fillLeavesWhiteList(); + fillTreeFellerDestructibleWhiteList(); fillHerbalismAbilityBlackList(); fillBlockCrackerWhiteList(); fillShroomyWhiteList(); @@ -160,10 +127,51 @@ public class MaterialMapStore { fillTools(); fillEnchantables(); fillOres(); + fillIntendedTools(); fillTierMap(); } + public boolean isMultiBlockPlant(@NotNull Material material) + { + return multiBlockPlant.contains(material.getKey().getKey()); + } + + public boolean isAbilityActivationBlackListed(@NotNull Material material) + { + return abilityBlackList.contains(material.getKey().getKey()); + } + + public boolean isToolActivationBlackListed(@NotNull Material material) + { + return toolBlackList.contains(material.getKey().getKey()); + } + + public boolean isMossyWhiteListed(@NotNull Material material) + { + return mossyWhiteList.contains(material.getKey().getKey()); + } + + public boolean isTreeFellerDestructible(@NotNull Material material) + { + return treeFellerDestructibleWhiteList.contains(material.getKey().getKey()); + } + + public boolean isHerbalismAbilityWhiteListed(@NotNull Material material) + { + return herbalismAbilityBlackList.contains(material.getKey().getKey()); + } + + public boolean isBlockCrackerWhiteListed(@NotNull Material material) + { + return blockCrackerWhiteList.contains(material.getKey().getKey()); + } + + public boolean isShroomyWhiteListed(@NotNull Material material) + { + return canMakeShroomyWhiteList.contains(material.getKey().getKey()); + } + private void fillTierMap() { for(String id : leatherArmor) { tierValue.put(id, 1); @@ -198,9 +206,217 @@ public class MaterialMapStore { ores.add("gold_ore"); ores.add("iron_ore"); ores.add("lapis_ore"); + ores.add("lapis_lazuli_ore"); ores.add("redstone_ore"); ores.add("emerald_ore"); ores.add("ancient_debris"); + ores.add("nether_gold_ore"); + ores.add("gilded_blackstone"); + + //1.17 Mining Ore Blocks + ores.add("deepslate_redstone_ore"); + ores.add("deepslate_copper_ore"); + ores.add("deepslate_coal_ore"); + ores.add("deepslate_diamond_ore"); + ores.add("deepslate_emerald_ore"); + ores.add("deepslate_iron_ore"); + ores.add("deepslate_gold_ore"); +// ores.add("deepslate_lapis_lazuli_ore"); + ores.add("deepslate_lapis_ore"); + ores.add("copper_ore"); + } + + private void fillIntendedTools() { + intendedToolPickAxe.addAll(ores); + + intendedToolPickAxe.add("lapis_lazuli_ore"); + intendedToolPickAxe.add("ice"); + intendedToolPickAxe.add("packed_ice"); + intendedToolPickAxe.add("blue_ice"); + intendedToolPickAxe.add("frosted_ice"); + intendedToolPickAxe.add("anvil"); + intendedToolPickAxe.add("bell"); + intendedToolPickAxe.add("block_of_redstone"); + intendedToolPickAxe.add("brewing_stand"); + intendedToolPickAxe.add("cauldron"); + intendedToolPickAxe.add("chain"); + intendedToolPickAxe.add("hopper"); + intendedToolPickAxe.add("iron_bars"); + intendedToolPickAxe.add("iron_door"); + intendedToolPickAxe.add("iron_trapdoor"); + intendedToolPickAxe.add("lantern"); + intendedToolPickAxe.add("weighted_pressure_plates"); + intendedToolPickAxe.add("block_of_iron"); + intendedToolPickAxe.add("copper_blocks"); + intendedToolPickAxe.add("cut_copper"); + intendedToolPickAxe.add("cut_copper_slab"); + intendedToolPickAxe.add("cut_copper_stairs"); + intendedToolPickAxe.add("lapis_lazuli_block"); + intendedToolPickAxe.add("lightning_rod"); + intendedToolPickAxe.add("block_of_diamond"); + intendedToolPickAxe.add("block_of_emerald"); + intendedToolPickAxe.add("block_of_gold"); + intendedToolPickAxe.add("block_of_netherite"); + intendedToolPickAxe.add("piston"); + intendedToolPickAxe.add("sticky_piston"); + intendedToolPickAxe.add("conduit"); + intendedToolPickAxe.add("shulker_box"); + intendedToolPickAxe.add("element_constructor"); //be & ee + intendedToolPickAxe.add("compound_creator"); //be & ee + intendedToolPickAxe.add("material_reducer"); //be & ee + intendedToolPickAxe.add("activator_rail"); + intendedToolPickAxe.add("detector_rail"); + intendedToolPickAxe.add("powered_rail"); + intendedToolPickAxe.add("rail"); + intendedToolPickAxe.add("andesite"); + intendedToolPickAxe.add("basalt"); + intendedToolPickAxe.add("blackstone"); + intendedToolPickAxe.add("blast_furnace"); + intendedToolPickAxe.add("block_of_coal"); + intendedToolPickAxe.add("block_of_quartz"); + intendedToolPickAxe.add("bricks"); + intendedToolPickAxe.add("cobblestone"); + intendedToolPickAxe.add("cobblestone_wall"); + intendedToolPickAxe.add("concrete"); + intendedToolPickAxe.add("dark_prismarine"); + intendedToolPickAxe.add("diorite"); + intendedToolPickAxe.add("dispenser"); + intendedToolPickAxe.add("dripstone_block"); + intendedToolPickAxe.add("dropper"); + intendedToolPickAxe.add("enchantment_table"); + intendedToolPickAxe.add("end_stone"); + intendedToolPickAxe.add("ender_chest"); + intendedToolPickAxe.add("furnace"); + intendedToolPickAxe.add("glazed_terracotta"); + intendedToolPickAxe.add("granite"); + intendedToolPickAxe.add("grindstone"); + intendedToolPickAxe.add("heat_block"); //be & ee + intendedToolPickAxe.add("lodestone"); + intendedToolPickAxe.add("mossy_cobblestone"); + intendedToolPickAxe.add("nether_bricks"); + intendedToolPickAxe.add("nether_brick_fence"); + intendedToolPickAxe.add("nether_gold_ore"); + intendedToolPickAxe.add("nether_quartz_ore"); + intendedToolPickAxe.add("netherrack"); + intendedToolPickAxe.add("observer"); + intendedToolPickAxe.add("prismarine"); + intendedToolPickAxe.add("prismarine_bricks"); + intendedToolPickAxe.add("pointed_dripstone"); + intendedToolPickAxe.add("polished_andesite"); + intendedToolPickAxe.add("polished_blackstone"); + intendedToolPickAxe.add("polished_blackstone_bricks"); + intendedToolPickAxe.add("polished_diorite"); + intendedToolPickAxe.add("polished_granite"); + intendedToolPickAxe.add("red_sandstone"); + intendedToolPickAxe.add("sandstone"); + intendedToolPickAxe.add("smoker"); + intendedToolPickAxe.add("spawner"); + intendedToolPickAxe.add("stonecutter"); +// intendedToolPickAxe.add("slabs"); + intendedToolPickAxe.add("colored_terracotta"); +// intendedToolPickAxe.add("stairs"); + intendedToolPickAxe.add("smooth_stone"); + intendedToolPickAxe.add("stone"); + intendedToolPickAxe.add("stone_bricks"); + intendedToolPickAxe.add("stone_button"); + intendedToolPickAxe.add("stone_pressure_plate"); + intendedToolPickAxe.add("terracotta"); + intendedToolPickAxe.add("ancient_debris"); + intendedToolPickAxe.add("crying_obsidian"); + intendedToolPickAxe.add("glowing_obsidian"); //be + intendedToolPickAxe.add("obsidian"); + intendedToolPickAxe.add("respawn_anchor"); + + //slabs + intendedToolPickAxe.add("petrified_oak_slab"); + intendedToolPickAxe.add("stone_slab"); + intendedToolPickAxe.add("smooth_stone_slab"); + intendedToolPickAxe.add("cobblestone_slab"); + intendedToolPickAxe.add("mossy_cobblestone_slab"); + intendedToolPickAxe.add("stone_brick_slab"); + intendedToolPickAxe.add("mossy_stone_brick_slab"); + intendedToolPickAxe.add("andesite_slab"); + intendedToolPickAxe.add("polished_andesite_slab"); + intendedToolPickAxe.add("diorite_slab"); + intendedToolPickAxe.add("polished_diorite_slab"); + intendedToolPickAxe.add("granite_slab"); + intendedToolPickAxe.add("polished_granite_slab"); + intendedToolPickAxe.add("sandstone_slab"); + intendedToolPickAxe.add("cut_sandstone_slab"); + intendedToolPickAxe.add("smooth_sandstone_slab"); + intendedToolPickAxe.add("red_sandstone_slab"); + intendedToolPickAxe.add("cut_red_sandstone_slab"); + intendedToolPickAxe.add("smooth_red_sandstone_slab"); + intendedToolPickAxe.add("brick_slab"); + intendedToolPickAxe.add("prismarine_brick_slab"); + intendedToolPickAxe.add("dark_prismarine_slab"); + intendedToolPickAxe.add("nether_brick_slab"); + intendedToolPickAxe.add("red_netherbrick_slab"); + intendedToolPickAxe.add("quartz_slab"); + intendedToolPickAxe.add("smooth_quartz_slab"); + intendedToolPickAxe.add("purpur_slab"); + intendedToolPickAxe.add("end_stone_brick_slab"); + intendedToolPickAxe.add("blackstone_slab"); + intendedToolPickAxe.add("polished_blackstone_slab"); + intendedToolPickAxe.add("polished_blackstone_brick_slab"); + intendedToolPickAxe.add("lightly_weathered_cut_copper_slab"); + intendedToolPickAxe.add("semi_weathered_cut_copper_slab"); + intendedToolPickAxe.add("waxed_semi_weathered_cut_copper_slab"); + intendedToolPickAxe.add("weathered_cut_copper_slab"); + intendedToolPickAxe.add("waxed_cut_copper_slab"); + intendedToolPickAxe.add("waxed_lightly_weathered_cut_copper_slab"); + + //stairs (not all of these exist, just copied the above list and replaced slab with stairs) + intendedToolPickAxe.add("petrified_oak_stairs"); + intendedToolPickAxe.add("stone_stairs"); + intendedToolPickAxe.add("smooth_stone_stairs"); + intendedToolPickAxe.add("cobblestone_stairs"); + intendedToolPickAxe.add("mossy_cobblestone_stairs"); + intendedToolPickAxe.add("stone_brick_stairs"); + intendedToolPickAxe.add("mossy_stone_brick_stairs"); + intendedToolPickAxe.add("andesite_stairs"); + intendedToolPickAxe.add("polished_andesite_stairs"); + intendedToolPickAxe.add("diorite_stairs"); + intendedToolPickAxe.add("polished_diorite_stairs"); + intendedToolPickAxe.add("granite_stairs"); + intendedToolPickAxe.add("polished_granite_stairs"); + intendedToolPickAxe.add("sandstone_stairs"); + intendedToolPickAxe.add("cut_sandstone_stairs"); + intendedToolPickAxe.add("smooth_sandstone_stairs"); + intendedToolPickAxe.add("red_sandstone_stairs"); + intendedToolPickAxe.add("cut_red_sandstone_stairs"); + intendedToolPickAxe.add("smooth_red_sandstone_stairs"); + intendedToolPickAxe.add("brick_stairs"); + intendedToolPickAxe.add("prismarine_brick_stairs"); + intendedToolPickAxe.add("dark_prismarine_stairs"); + intendedToolPickAxe.add("nether_brick_stairs"); + intendedToolPickAxe.add("red_netherbrick_stairs"); + intendedToolPickAxe.add("quartz_stairs"); + intendedToolPickAxe.add("smooth_quartz_stairs"); + intendedToolPickAxe.add("purpur_stairs"); + intendedToolPickAxe.add("end_stone_brick_stairs"); + intendedToolPickAxe.add("blackstone_stairs"); + intendedToolPickAxe.add("polished_blackstone_stairs"); + intendedToolPickAxe.add("polished_blackstone_brick_stairs"); + intendedToolPickAxe.add("lightly_weathered_cut_copper_stairs"); + intendedToolPickAxe.add("semi_weathered_cut_copper_stairs"); + intendedToolPickAxe.add("waxed_semi_weathered_cut_copper_stairs"); + intendedToolPickAxe.add("weathered_cut_copper_stairs"); + intendedToolPickAxe.add("waxed_cut_copper_stairs"); + intendedToolPickAxe.add("waxed_lightly_weathered_cut_copper_stairs"); + + //1.17 Mining (non-ores) + intendedToolPickAxe.add("calcite"); + intendedToolPickAxe.add("smooth_basalt"); + intendedToolPickAxe.add("block_of_amethyst"); + intendedToolPickAxe.add("small_amethyst_bud"); + intendedToolPickAxe.add("medium_amethyst_bud"); + intendedToolPickAxe.add("large_amethyst_bud"); + intendedToolPickAxe.add("amethyst_cluster"); + intendedToolPickAxe.add("budding_amethyst"); + intendedToolPickAxe.add("deepslate"); + intendedToolPickAxe.add("cobbled_deepslate"); + intendedToolPickAxe.add("tuff"); } private void fillArmors() { @@ -230,6 +446,7 @@ public class MaterialMapStore { enchantables.addAll(pickAxes); enchantables.addAll(tridents); enchantables.addAll(bows); + enchantables.addAll(crossbows); enchantables.add("shears"); enchantables.add("fishing_rod"); @@ -255,6 +472,7 @@ public class MaterialMapStore { fillTridents(); fillStringTools(); fillBows(); + fillCrossbows(); //Tools collection tools.addAll(woodTools); @@ -272,6 +490,10 @@ public class MaterialMapStore { bows.add("bow"); } + private void fillCrossbows() { + crossbows.add("crossbow"); + } + private void fillStringTools() { stringTools.add("bow"); stringTools.add("fishing_rod"); @@ -416,26 +638,7 @@ public class MaterialMapStore { ironTools.add("iron_shovel"); //Used for repair, remove in 2.2 - //TODO: Remove in 2.2 - //TODO: Remove in 2.2 - //TODO: Remove in 2.2 - //TODO: Remove in 2.2 - //TODO: Remove in 2.2 - //TODO: Remove in 2.2 - //TODO: Remove in 2.2 - //TODO: Remove in 2.2 - //TODO: Remove in 2.2 - //TODO: Remove in 2.2 - //TODO: Remove in 2.2 - //TODO: Remove in 2.2 - //TODO: Remove in 2.2 - //TODO: Remove in 2.2 - //TODO: Remove in 2.2 - //TODO: Remove in 2.2 - //TODO: Remove in 2.2 - //TODO: Remove in 2.2 - //TODO: Remove in 2.2 - //TODO: Remove in 2.2 + //TODO: Remove in config update ironTools.add("bucket"); ironTools.add("flint_and_steel"); ironTools.add("shears"); @@ -553,7 +756,7 @@ public class MaterialMapStore { * @param material target material * @return true if it is used for armor */ - public boolean isArmor(Material material) { + public boolean isArmor(@NotNull Material material) { return isArmor(material.getKey().getKey()); } @@ -562,207 +765,204 @@ public class MaterialMapStore { * @param id target item id * @return true if the item id matches armor */ - public boolean isArmor(String id) { + public boolean isArmor(@NotNull String id) { return armors.contains(id); } - public boolean isTool(Material material) { + public boolean isTool(@NotNull Material material) { return isTool(material.getKey().getKey()); } - public boolean isTool(String id) { + public boolean isTool(@NotNull String id) { return tools.contains(id); } - public boolean isEnchantable(Material material) { + public boolean isEnchantable(@NotNull Material material) { return isEnchantable(material.getKey().getKey()); } - public boolean isEnchantable(String id) { + public boolean isEnchantable(@NotNull String id) { return enchantables.contains(id); } - public boolean isOre(Material material) { + public boolean isOre(@NotNull Material material) { return isOre(material.getKey().getKey()); } - public boolean isOre(String id) { + public boolean isOre(@NotNull String id) { return ores.contains(id); } - public boolean isBow(Material material) { + public boolean isBow(@NotNull Material material) { return isBow(material.getKey().getKey()); } - public boolean isBow(String id) { + public boolean isBow(@NotNull String id) { return bows.contains(id); } - public boolean isLeatherArmor(Material material) { + public boolean isCrossbow(@NotNull Material material) { + return isCrossbow(material.getKey().getKey()); + } + + public boolean isCrossbow(@NotNull String id) { + return crossbows.contains(id); + } + + public boolean isLeatherArmor(@NotNull Material material) { return isLeatherArmor(material.getKey().getKey()); } - public boolean isLeatherArmor(String id) { + public boolean isLeatherArmor(@NotNull String id) { return leatherArmor.contains(id); } - public boolean isIronArmor(Material material) { + public boolean isIronArmor(@NotNull Material material) { return isIronArmor(material.getKey().getKey()); } - public boolean isIronArmor(String id) { + public boolean isIronArmor(@NotNull String id) { return ironArmor.contains(id); } - public boolean isGoldArmor(Material material) { + public boolean isGoldArmor(@NotNull Material material) { return isGoldArmor(material.getKey().getKey()); } - public boolean isGoldArmor(String id) { + public boolean isGoldArmor(@NotNull String id) { return goldArmor.contains(id); } - public boolean isDiamondArmor(Material material) { + public boolean isDiamondArmor(@NotNull Material material) { return isDiamondArmor(material.getKey().getKey()); } - public boolean isDiamondArmor(String id) { + public boolean isDiamondArmor(@NotNull String id) { return diamondArmor.contains(id); } - public boolean isChainmailArmor(Material material) { + public boolean isChainmailArmor(@NotNull Material material) { return isChainmailArmor(material.getKey().getKey()); } - public boolean isChainmailArmor(String id) { + public boolean isChainmailArmor(@NotNull String id) { return chainmailArmor.contains(id); } - public boolean isNetheriteArmor(Material material) { + public boolean isNetheriteArmor(@NotNull Material material) { return isNetheriteArmor(material.getKey().getKey()); } - public boolean isNetheriteArmor(String id) { + public boolean isNetheriteArmor(@NotNull String id) { return netheriteArmor.contains(id); } - public boolean isWoodTool(Material material) { + public boolean isWoodTool(@NotNull Material material) { return isWoodTool(material.getKey().getKey()); } - public boolean isWoodTool(String id) { + public boolean isWoodTool(@NotNull String id) { return woodTools.contains(id); } - public boolean isStoneTool(Material material) { + public boolean isStoneTool(@NotNull Material material) { return isStoneTool(material.getKey().getKey()); } - public boolean isStoneTool(String id) { + public boolean isStoneTool(@NotNull String id) { return stoneTools.contains(id); } - public boolean isIronTool(Material material) { + public boolean isIronTool(@NotNull Material material) { return isIronTool(material.getKey().getKey()); } - public boolean isIronTool(String id) { + public boolean isIronTool(@NotNull String id) { return ironTools.contains(id); } - public boolean isGoldTool(Material material) { + public boolean isGoldTool(@NotNull Material material) { return isGoldTool(material.getKey().getKey()); } - public boolean isGoldTool(String id) { + public boolean isGoldTool(@NotNull String id) { return goldTools.contains(id); } - public boolean isDiamondTool(Material material) { + public boolean isDiamondTool(@NotNull Material material) { return isDiamondTool(material.getKey().getKey()); } - public boolean isDiamondTool(String id) { + public boolean isDiamondTool(@NotNull String id) { return diamondTools.contains(id); } - public boolean isSword(Material material) { + public boolean isSword(@NotNull Material material) { return isSword(material.getKey().getKey()); } - public boolean isSword(String id) { + public boolean isSword(@NotNull String id) { return swords.contains(id); } - public boolean isAxe(Material material) { + public boolean isAxe(@NotNull Material material) { return isAxe(material.getKey().getKey()); } - public boolean isAxe(String id) { + public boolean isAxe(@NotNull String id) { return axes.contains(id); } - public boolean isPickAxe(Material material) { + public boolean isPickAxe(@NotNull Material material) { return isPickAxe(material.getKey().getKey()); } - public boolean isPickAxe(String id) { + public boolean isPickAxe(@NotNull String id) { return pickAxes.contains(id); } - public boolean isShovel(Material material) { + public boolean isShovel(@NotNull Material material) { return isShovel(material.getKey().getKey()); } - public boolean isShovel(String id) { + public boolean isShovel(@NotNull String id) { return shovels.contains(id); } - public boolean isHoe(Material material) { + public boolean isHoe(@NotNull Material material) { return isHoe(material.getKey().getKey()); } - public boolean isHoe(String id) { + public boolean isHoe(@NotNull String id) { return hoes.contains(id); } - public boolean isNetheriteTool(Material material) { + public boolean isNetheriteTool(@NotNull Material material) { return isNetheriteTool(material.getKey().getKey()); } - public boolean isNetheriteTool(String id) { + public boolean isNetheriteTool(@NotNull String id) { return netheriteTools.contains(id); } - public boolean isStringTool(Material material) { + public boolean isStringTool(@NotNull Material material) { return isStringTool(material.getKey().getKey()); } - public boolean isStringTool(String id) { + public boolean isStringTool(@NotNull String id) { return stringTools.contains(id); } - public boolean isGlass(Material material) { + public boolean isGlass(@NotNull Material material) { return glassBlocks.contains(material.getKey().getKey()); } - public boolean isFood(Material material) { + public boolean isFood(@NotNull Material material) { return foodItemWhiteList.contains(material.getKey().getKey()); } private void fillMultiBlockPlantSet() { - //Single Block Plants -// plantBlockSet.add("melon"); -// plantBlockSet.add("pumpkin"); -// plantBlockSet.add("potatoes"); -// plantBlockSet.add("carrots"); -// plantBlockSet.add("beetroots"); -// plantBlockSet.add("nether_wart"); -// plantBlockSet.add("grass"); -// plantBlockSet.add("fern"); -// plantBlockSet.add("large_fern"); - //Multi-Block Plants multiBlockPlant.add("cactus"); multiBlockPlant.add("chorus_plant"); @@ -800,16 +1000,20 @@ public class MaterialMapStore { herbalismAbilityBlackList.add("farmland"); } - private void fillLeavesWhiteList() + private void fillTreeFellerDestructibleWhiteList() { - leavesWhiteList.add("oak_leaves"); - leavesWhiteList.add("acacia_leaves"); - leavesWhiteList.add("birch_leaves"); - leavesWhiteList.add("dark_oak_leaves"); - leavesWhiteList.add("jungle_leaves"); - leavesWhiteList.add("spruce_leaves"); - leavesWhiteList.add("nether_wart_block"); - leavesWhiteList.add("warped_wart_block"); + treeFellerDestructibleWhiteList.add("oak_leaves"); + treeFellerDestructibleWhiteList.add("acacia_leaves"); + treeFellerDestructibleWhiteList.add("birch_leaves"); + treeFellerDestructibleWhiteList.add("dark_oak_leaves"); + treeFellerDestructibleWhiteList.add("jungle_leaves"); + treeFellerDestructibleWhiteList.add("spruce_leaves"); + treeFellerDestructibleWhiteList.add("azalea_leaves"); + treeFellerDestructibleWhiteList.add("flowering_azalea_leaves"); + treeFellerDestructibleWhiteList.add("nether_wart_block"); + treeFellerDestructibleWhiteList.add("warped_wart_block"); + treeFellerDestructibleWhiteList.add("brown_mushroom_block"); + treeFellerDestructibleWhiteList.add("red_mushroom_block"); } private void fillMossyWhiteList() @@ -943,7 +1147,10 @@ public class MaterialMapStore { abilityBlackList.add("barrel"); abilityBlackList.add("blast_furnace"); abilityBlackList.add("campfire"); + abilityBlackList.add("soul_campfire"); abilityBlackList.add("composter"); + abilityBlackList.add("lodestone"); + abilityBlackList.add("respawn_anchor"); } private void fillToolBlackList() @@ -1073,6 +1280,7 @@ public class MaterialMapStore { toolBlackList.add("barrel"); toolBlackList.add("blast_furnace"); toolBlackList.add("campfire"); + toolBlackList.add("soul_campfire"); toolBlackList.add("cartography_table"); toolBlackList.add("composter"); toolBlackList.add("grindstone"); @@ -1080,17 +1288,37 @@ public class MaterialMapStore { toolBlackList.add("loom"); toolBlackList.add("smoker"); toolBlackList.add("stonecutter"); + toolBlackList.add("lodestone"); + toolBlackList.add("respawn_anchor"); + toolBlackList.add("sweet_berry_bush"); } - public int getTier(Material material) { + public boolean isIntendedToolPickaxe(@NotNull Material material) { + return intendedToolPickAxe.contains(material.getKey().getKey()); + } + + public boolean isIntendedToolPickaxe(@NotNull String string) { + return intendedToolPickAxe.contains(string); + } + + public @NotNull HashSet getNetheriteArmor() { + return netheriteArmor; + } + + public @NotNull HashSet getNetheriteTools() { + return netheriteTools; + } + + + public int getTier(@NotNull Material material) { return getTier(material.getKey().getKey()); } - public int getTier(String id) { + public int getTier(@NotNull String id) { return tierValue.getOrDefault(id, 1); //1 for unknown items } - private void addToHashSet(String string, HashSet stringHashSet) + private void addToHashSet(@NotNull String string, @NotNull HashSet stringHashSet) { stringHashSet.add(string.toLowerCase(Locale.ENGLISH)); } diff --git a/src/main/java/com/gmail/nossr50/util/MetadataConstants.java b/src/main/java/com/gmail/nossr50/util/MetadataConstants.java new file mode 100644 index 000000000..090e04d17 --- /dev/null +++ b/src/main/java/com/gmail/nossr50/util/MetadataConstants.java @@ -0,0 +1,72 @@ +package com.gmail.nossr50.util; + +import com.google.common.collect.ImmutableSet; +import org.bukkit.metadata.FixedMetadataValue; +import org.jetbrains.annotations.NotNull; + +import java.util.HashSet; + +/** + * Stores our constants related to metadata + */ +public class MetadataConstants { + /* Metadata Values + * Take great care if you ever modify the value of these keys + */ + public static final @NotNull String METADATA_KEY_REPLANT = "mcMMO: Recently Replanted"; + public static final @NotNull String METADATA_KEY_EXPLOSION_FROM_RUPTURE = "mcMMO: Rupture Explosion"; + public static final @NotNull String METADATA_KEY_FISH_HOOK_REF = "mcMMO: Fish Hook Tracker"; + public static final @NotNull String METADATA_KEY_DODGE_TRACKER = "mcMMO: Dodge Tracker"; + public static final @NotNull String METADATA_KEY_CUSTOM_DAMAGE = "mcMMO: Custom Damage"; + public static final @NotNull String METADATA_KEY_TRAVELING_BLOCK = "mcMMO: Traveling Block"; + public static final @NotNull String METADATA_KEY_PISTON_TRACKING = "mcMMO: Piston Tracking"; + public static final @NotNull String METADATA_KEY_TRACKED_TNT = "mcMMO: Tracked TNT"; + public static final @NotNull String METADATA_KEY_NAME_VISIBILITY = "mcMMO: Name Visibility"; + public static final @NotNull String METADATA_KEY_TRACKED_ITEM = "mcMMO: Tracked Item"; + public static final @NotNull String METADATA_KEY_INF_ARROW = "mcMMO: Infinite Arrow"; + public static final @NotNull String METADATA_KEY_TRACKED_ARROW = "mcMMO: Tracked Arrow"; + public static final @NotNull String METADATA_KEY_BOW_FORCE = "mcMMO: Bow Force"; + public static final @NotNull String METADATA_KEY_ARROW_DISTANCE = "mcMMO: Arrow Distance"; + public static final @NotNull String METADATA_KEY_BONUS_DROPS = "mcMMO: Double Drops"; + public static final @NotNull String METADATA_KEY_DISARMED_ITEM = "mcMMO: Disarmed Item"; + public static final @NotNull String METADATA_KEY_PLAYER_DATA = "mcMMO: Player Data"; + public static final @NotNull String METADATA_KEY_DATABASE_COMMAND = "mcMMO: Processing Database Command"; + public static final @NotNull String METADATA_KEY_FURNACE_UUID_MOST_SIG = "furnace_uuid_most_sig"; + public static final @NotNull String METADATA_KEY_FURNACE_UUID_LEAST_SIG = "furnace_uuid_least_sig"; + public static final @NotNull String METADATA_KEY_SUPER_ABILITY_BOOSTED_ITEM = "super_ability_boosted"; + public static final @NotNull String METADATA_KEY_MOB_SPAWNER_MOB = "mcmmo_mob_spawner_mob"; + public static final @NotNull String METADATA_KEY_EGG_MOB = "mcmmo_egg_mob"; + public static final @NotNull String METADATA_KEY_NETHER_PORTAL_MOB = "mcmmo_nethergate_mob"; + public static final @NotNull String METADATA_KEY_COTW_SUMMONED_MOB = "mcmmo_cotw_summoned_mob"; + public static final @NotNull String METADATA_KEY_PLAYER_BRED_MOB = "mcmmo_player_bred_mob"; + public static final @NotNull String METADATA_KEY_PLAYER_TAMED_MOB = "mcmmo_player_tamed_mob"; + public static final @NotNull String METADATA_KEY_VILLAGER_TRADE_ORIGIN_ITEM = "mcmmo_villager_trade_origin_item"; + public static final @NotNull String METADATA_KEY_EXPLOITED_ENDERMEN = "mcmmo_exploited_endermen"; + public static final @NotNull String METADATA_KEY_CUSTOM_NAME = "mcmmo_custom_name"; + public static final @NotNull String METADATA_KEY_OLD_NAME_KEY = "mcmmo_old_name"; + public static final @NotNull String METADATA_KEY_RUPTURE = "mcmmo_rupture"; + + public static final byte SIMPLE_FLAG_VALUE = (byte) 0x1; + + public static final @NotNull ImmutableSet MOB_METADATA_KEYS; + + public static FixedMetadataValue MCMMO_METADATA_VALUE; + + static { + HashSet temp = new HashSet<>(); + temp.add(MetadataConstants.METADATA_KEY_MOB_SPAWNER_MOB); + temp.add(MetadataConstants.METADATA_KEY_EGG_MOB); + temp.add(MetadataConstants.METADATA_KEY_NETHER_PORTAL_MOB); + temp.add(MetadataConstants.METADATA_KEY_COTW_SUMMONED_MOB); + temp.add(MetadataConstants.METADATA_KEY_PLAYER_BRED_MOB); + temp.add(MetadataConstants.METADATA_KEY_PLAYER_TAMED_MOB); + temp.add(MetadataConstants.METADATA_KEY_EXPLOITED_ENDERMEN); + temp.add(MetadataConstants.METADATA_KEY_CUSTOM_NAME); + temp.add(MetadataConstants.METADATA_KEY_RUPTURE); + temp.add(MetadataConstants.METADATA_KEY_EXPLOSION_FROM_RUPTURE); + temp.add(MetadataConstants.METADATA_KEY_OLD_NAME_KEY); + temp.add(MetadataConstants.METADATA_KEY_DODGE_TRACKER); + + MOB_METADATA_KEYS = ImmutableSet.copyOf(temp); + } +} diff --git a/src/main/java/com/gmail/nossr50/util/Misc.java b/src/main/java/com/gmail/nossr50/util/Misc.java index cbb60ee46..03821dccd 100644 --- a/src/main/java/com/gmail/nossr50/util/Misc.java +++ b/src/main/java/com/gmail/nossr50/util/Misc.java @@ -1,5 +1,7 @@ package com.gmail.nossr50.util; +import com.gmail.nossr50.api.ItemSpawnReason; +import com.gmail.nossr50.datatypes.player.McMMOPlayer; import com.gmail.nossr50.events.items.McMMOItemSpawnEvent; import com.gmail.nossr50.mcMMO; import com.gmail.nossr50.runnables.player.PlayerProfileLoadingTask; @@ -10,7 +12,10 @@ import org.bukkit.Material; import org.bukkit.block.BlockState; import org.bukkit.entity.*; import org.bukkit.inventory.ItemStack; +import org.bukkit.scheduler.BukkitRunnable; import org.bukkit.util.Vector; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; import java.util.Collection; import java.util.Locale; @@ -18,7 +23,7 @@ import java.util.Random; import java.util.Set; public final class Misc { - private static Random random = new Random(); + private static final @NotNull Random random = new Random(); public static final int TIME_CONVERSION_FACTOR = 1000; public static final int TICK_CONVERSION_FACTOR = 20; @@ -37,9 +42,9 @@ public final class Misc { public static final float LEVELUP_PITCH = 0.5F; // Reduced to differentiate between vanilla level-up public static final float LEVELUP_VOLUME = 0.75F * Config.getInstance().getMasterVolume(); // Use max volume always*/ - public static final Set modNames = ImmutableSet.of("LOTR", "BUILDCRAFT", "ENDERIO", "ENHANCEDBIOMES", "IC2", "METALLURGY", "FORESTRY", "GALACTICRAFT", "RAILCRAFT", "TWILIGHTFOREST", "THAUMCRAFT", "GRAVESTONEMOD", "GROWTHCRAFT", "ARCTICMOBS", "DEMONMOBS", "INFERNOMOBS", "SWAMPMOBS", "MARICULTURE", "MINESTRAPPOLATION"); + public static final @NotNull Set modNames = ImmutableSet.of("LOTR", "BUILDCRAFT", "ENDERIO", "ENHANCEDBIOMES", "IC2", "METALLURGY", "FORESTRY", "GALACTICRAFT", "RAILCRAFT", "TWILIGHTFOREST", "THAUMCRAFT", "GRAVESTONEMOD", "GROWTHCRAFT", "ARCTICMOBS", "DEMONMOBS", "INFERNOMOBS", "SWAMPMOBS", "MARICULTURE", "MINESTRAPPOLATION"); - private Misc() {}; + private Misc() {} /** * Determines if an entity is an NPC but not a villager @@ -54,7 +59,7 @@ public final class Misc { * @param entity target entity * @return true if the entity is not a Villager and is not a "NPC" */ - public static boolean isNPCEntityExcludingVillagers(Entity entity) { + public static boolean isNPCEntityExcludingVillagers(@NotNull Entity entity) { return (!isVillager(entity) && isNPCIncludingVillagers(entity)); //Compatibility with some mod.. } @@ -73,7 +78,7 @@ public final class Misc { return entityType.equalsIgnoreCase("wandering_trader") || entity instanceof Villager; } - public static boolean isNPCIncludingVillagers(Entity entity) { + public static boolean isNPCIncludingVillagers(@Nullable Entity entity) { return (entity == null || (hasNPCMetadataTag(entity)) || (isNPCClassType(entity)) @@ -88,7 +93,7 @@ public final class Misc { * @param maxDistance The max distance apart * @return true if the distance between {@code first} and {@code second} is less than {@code maxDistance}, false otherwise */ - public static boolean isNear(Location first, Location second, double maxDistance) { + public static boolean isNear(@NotNull Location first, @NotNull Location second, double maxDistance) { return (first.getWorld() == second.getWorld()) && (first.distanceSquared(second) < (maxDistance * maxDistance) || maxDistance == 0); } @@ -102,9 +107,25 @@ public final class Misc { return blockState.getLocation().add(0.5, 0.5, 0.5); } - public static void dropItems(Location location, Collection drops) { + public static void spawnItemsFromCollection(@NotNull Player player, @NotNull Location location, @NotNull Collection drops, @NotNull ItemSpawnReason itemSpawnReason) { for (ItemStack drop : drops) { - dropItem(location, drop); + spawnItem(player, location, drop, itemSpawnReason); + } + } + + /** + * Drops only the first n items in a collection + * Size should always be a positive integer above 0 + * + * @param location target drop location + * @param drops collection to iterate over + * @param sizeLimit the number of drops to process + */ + public static void spawnItemsFromCollection(@Nullable Player player, @NotNull Location location, @NotNull Collection drops, @NotNull ItemSpawnReason itemSpawnReason, int sizeLimit) { + ItemStack[] arrayDrops = drops.toArray(new ItemStack[0]); + + for(int i = 0; i < sizeLimit-1; i++) { + spawnItem(player, location, arrayDrops[i], itemSpawnReason); } } @@ -115,9 +136,9 @@ public final class Misc { * @param is The items to drop * @param quantity The amount of items to drop */ - public static void dropItems(Location location, ItemStack is, int quantity) { + public static void spawnItems(@Nullable Player player, @NotNull Location location, @NotNull ItemStack is, int quantity, @NotNull ItemSpawnReason itemSpawnReason) { for (int i = 0; i < quantity; i++) { - dropItem(location, is); + spawnItem(player, location, is, itemSpawnReason); } } @@ -126,15 +147,16 @@ public final class Misc { * * @param location The location to drop the item at * @param itemStack The item to drop + * @param itemSpawnReason the reason for the item drop * @return Dropped Item entity or null if invalid or cancelled */ - public static Item dropItem(Location location, ItemStack itemStack) { - if (itemStack.getType() == Material.AIR) { + public static @Nullable Item spawnItem(@Nullable Player player, @NotNull Location location, @NotNull ItemStack itemStack, @NotNull ItemSpawnReason itemSpawnReason) { + if (itemStack.getType() == Material.AIR || location.getWorld() == null) { return null; } // We can't get the item until we spawn it and we want to make it cancellable, so we have a custom event. - McMMOItemSpawnEvent event = new McMMOItemSpawnEvent(location, itemStack); + McMMOItemSpawnEvent event = new McMMOItemSpawnEvent(location, itemStack, itemSpawnReason, player); mcMMO.p.getServer().getPluginManager().callEvent(event); if (event.isCancelled()) { @@ -149,22 +171,23 @@ public final class Misc { * * @param location The location to drop the item at * @param itemStack The item to drop + * @param itemSpawnReason the reason for the item drop * @return Dropped Item entity or null if invalid or cancelled */ - public static Item dropItem(Location location, ItemStack itemStack, int count) { - if (itemStack.getType() == Material.AIR) { + public static @Nullable Item spawnItemNaturally(@Nullable Player player, @NotNull Location location, @NotNull ItemStack itemStack, @NotNull ItemSpawnReason itemSpawnReason) { + if (itemStack.getType() == Material.AIR || location.getWorld() == null) { return null; } // We can't get the item until we spawn it and we want to make it cancellable, so we have a custom event. - McMMOItemSpawnEvent event = new McMMOItemSpawnEvent(location, itemStack); + McMMOItemSpawnEvent event = new McMMOItemSpawnEvent(location, itemStack, itemSpawnReason, player); mcMMO.p.getServer().getPluginManager().callEvent(event); if (event.isCancelled()) { return null; } - return location.getWorld().dropItem(location, itemStack); + return location.getWorld().dropItemNaturally(location, itemStack); } /** @@ -175,9 +198,9 @@ public final class Misc { * @param speed the speed that the item should travel * @param quantity The amount of items to drop */ - public static void spawnItemsTowardsLocation(Location fromLocation, Location toLocation, ItemStack is, int quantity, double speed) { + public static void spawnItemsTowardsLocation(@Nullable Player player, @NotNull Location fromLocation, @NotNull Location toLocation, @NotNull ItemStack is, int quantity, double speed, @NotNull ItemSpawnReason itemSpawnReason) { for (int i = 0; i < quantity; i++) { - spawnItemTowardsLocation(fromLocation, toLocation, is, speed); + spawnItemTowardsLocation(player, fromLocation, toLocation, is, speed, itemSpawnReason); } } @@ -191,7 +214,7 @@ public final class Misc { * @param speed the speed that the item should travel * @return Dropped Item entity or null if invalid or cancelled */ - public static Item spawnItemTowardsLocation(Location fromLocation, Location toLocation, ItemStack itemToSpawn, double speed) { + public static @Nullable Item spawnItemTowardsLocation(@Nullable Player player, @NotNull Location fromLocation, @NotNull Location toLocation, @NotNull ItemStack itemToSpawn, double speed, @NotNull ItemSpawnReason itemSpawnReason) { if (itemToSpawn.getType() == Material.AIR) { return null; } @@ -201,12 +224,15 @@ public final class Misc { Location spawnLocation = fromLocation.clone(); Location targetLocation = toLocation.clone(); + if(spawnLocation.getWorld() == null) + return null; + // We can't get the item until we spawn it and we want to make it cancellable, so we have a custom event. - McMMOItemSpawnEvent event = new McMMOItemSpawnEvent(spawnLocation, clonedItem); + McMMOItemSpawnEvent event = new McMMOItemSpawnEvent(spawnLocation, clonedItem, itemSpawnReason, player); mcMMO.p.getServer().getPluginManager().callEvent(event); //Something cancelled the event so back out - if (event.isCancelled() || event.getItemStack() == null) { + if (event.isCancelled()) { return null; } @@ -224,7 +250,7 @@ public final class Misc { return spawnedItem; } - public static void profileCleanup(String playerName) { + public static void profileCleanup(@NotNull String playerName) { Player player = mcMMO.p.getServer().getPlayerExact(playerName); if (player != null) { @@ -239,7 +265,7 @@ public final class Misc { } } - public static String getModName(String materialName) { + public static String getModName(@NotNull String materialName) { for (String mod : modNames) { if (materialName.contains(mod)) { return mod; @@ -258,7 +284,7 @@ public final class Misc { /** * Gets a random location near the specified location */ - public static Location getLocationOffset(Location location, double strength) { + public static Location getLocationOffset(@NotNull Location location, double strength) { double blockX = location.getBlockX(); double blockZ = location.getBlockZ(); @@ -272,7 +298,50 @@ public final class Misc { return new Location(location.getWorld(), blockX, location.getY(), blockZ); } - public static Random getRandom() { + public static @NotNull Random getRandom() { return random; } + + /** + * Whether or not a player is the party leader of a party + * + * @param mmoPlayer target player + * @return true if the player is the party leader + */ + public static boolean isPartyLeader(@NotNull McMMOPlayer mmoPlayer) { + return mmoPlayer.getParty().getLeader().getUniqueId().equals(mmoPlayer.getPlayer().getUniqueId()); + } + +// public static void spawnExperienceOrb(@NotNull Location location, int orbAmount, int experienceValue) { +// for (int i = 0; i < orbAmount; i++) { +// new SpawnOrbTask(location, experienceValue).runTaskLater(mcMMO.p, 20); +// } +// } + + public static void spawnExperienceOrb(@NotNull Location location, int experienceValue) { + if(location.getWorld() == null) + return; + + ExperienceOrb experienceOrb = (ExperienceOrb) location.getWorld().spawnEntity(location, EntityType.EXPERIENCE_ORB); + experienceOrb.setExperience(experienceValue); + } + + private static class SpawnOrbTask extends BukkitRunnable { + private final Location location; + private int orbExpValue; + + private SpawnOrbTask(Location location, int orbExpValue) { + this.location = location; + this.orbExpValue = orbExpValue; + } + + @Override + public void run() { + if(location == null || location.getWorld() == null) + return; + + ExperienceOrb experienceOrb = (ExperienceOrb) location.getWorld().spawnEntity(location, EntityType.EXPERIENCE_ORB); + experienceOrb.setExperience(orbExpValue); + } + } } diff --git a/src/main/java/com/gmail/nossr50/util/MobHealthbarUtils.java b/src/main/java/com/gmail/nossr50/util/MobHealthbarUtils.java index 4f17d0955..638a9f488 100644 --- a/src/main/java/com/gmail/nossr50/util/MobHealthbarUtils.java +++ b/src/main/java/com/gmail/nossr50/util/MobHealthbarUtils.java @@ -1,11 +1,10 @@ package com.gmail.nossr50.util; -import com.gmail.nossr50.config.AdvancedConfig; -import com.gmail.nossr50.config.Config; import com.gmail.nossr50.datatypes.MobHealthbarType; import com.gmail.nossr50.datatypes.meta.OldName; import com.gmail.nossr50.mcMMO; import com.gmail.nossr50.runnables.MobHealthDisplayUpdaterTask; +import com.gmail.nossr50.util.text.StringUtils; import org.bukkit.ChatColor; import org.bukkit.entity.LivingEntity; import org.bukkit.entity.Player; @@ -27,7 +26,7 @@ public final class MobHealthbarUtils { EntityDamageEvent lastDamageCause = player.getLastDamageCause(); String replaceString = lastDamageCause instanceof EntityDamageByEntityEvent ? StringUtils.getPrettyEntityTypeString(((EntityDamageByEntityEvent) lastDamageCause).getDamager().getType()) : "a mob"; - return deathMessage.replaceAll("(?:\u00A7(?:[0-9A-FK-ORa-fk-or]){1}(?:[\u2764\u25A0]{1,10})){1,2}", replaceString); + return deathMessage.replaceAll("(?:(\u00A7(?:[0-9A-FK-ORa-fk-or]))*(?:[\u2764\u25A0]{1,10})){1,2}", replaceString); } /** @@ -36,7 +35,7 @@ public final class MobHealthbarUtils { * @param damage damage done by the attack triggering this */ public static void handleMobHealthbars(LivingEntity target, double damage, mcMMO plugin) { - if (mcMMO.isHealthBarPluginEnabled() || !Config.getInstance().getMobHealthbarEnabled()) { + if (mcMMO.isHealthBarPluginEnabled() || !mcMMO.p.getGeneralConfig().getMobHealthbarEnabled()) { return; } @@ -55,35 +54,31 @@ public final class MobHealthbarUtils { /* * Store the name in metadata */ - if(target.getMetadata("mcMMO_oldName").size() <= 0 && originalName != null) - target.setMetadata("mcMMO_oldName", new OldName(originalName, plugin)); + if(target.getMetadata(MetadataConstants.METADATA_KEY_OLD_NAME_KEY).size() <= 0) + target.setMetadata(MetadataConstants.METADATA_KEY_OLD_NAME_KEY, new OldName(originalName, plugin)); if (oldName == null) { oldName = ""; } - else if (oldName.equalsIgnoreCase(AdvancedConfig.getInstance().getKrakenName())) { - return; - } - boolean oldNameVisible = target.isCustomNameVisible(); - String newName = createHealthDisplay(Config.getInstance().getMobHealthbarDefault(), target, damage); + String newName = createHealthDisplay(mcMMO.p.getGeneralConfig().getMobHealthbarDefault(), target, damage); target.setCustomName(newName); target.setCustomNameVisible(true); - int displayTime = Config.getInstance().getMobHealthbarTime(); + int displayTime = mcMMO.p.getGeneralConfig().getMobHealthbarTime(); if (displayTime != -1) { boolean updateName = !ChatColor.stripColor(oldName).equalsIgnoreCase(ChatColor.stripColor(newName)); if (updateName) { - target.setMetadata(mcMMO.customNameKey, new FixedMetadataValue(mcMMO.p, oldName)); - target.setMetadata(mcMMO.customVisibleKey, new FixedMetadataValue(mcMMO.p, oldNameVisible)); + target.setMetadata(MetadataConstants.METADATA_KEY_CUSTOM_NAME, new FixedMetadataValue(mcMMO.p, oldName)); + target.setMetadata(MetadataConstants.METADATA_KEY_NAME_VISIBILITY, new FixedMetadataValue(mcMMO.p, oldNameVisible)); } - else if (!target.hasMetadata(mcMMO.customNameKey)) { - target.setMetadata(mcMMO.customNameKey, new FixedMetadataValue(mcMMO.p, "")); - target.setMetadata(mcMMO.customVisibleKey, new FixedMetadataValue(mcMMO.p, false)); + else if (!target.hasMetadata(MetadataConstants.METADATA_KEY_CUSTOM_NAME)) { + target.setMetadata(MetadataConstants.METADATA_KEY_CUSTOM_NAME, new FixedMetadataValue(mcMMO.p, "")); + target.setMetadata(MetadataConstants.METADATA_KEY_NAME_VISIBILITY, new FixedMetadataValue(mcMMO.p, false)); } new MobHealthDisplayUpdaterTask(target).runTaskLater(mcMMO.p, displayTime * Misc.TICK_CONVERSION_FACTOR); // Clear health display after 3 seconds @@ -135,22 +130,22 @@ public final class MobHealthbarUtils { return null; } - int coloredDisplay = (int) Math.ceil(fullDisplay * (healthPercentage / 100.0D)); + int coloredDisplay = (int) Math.max(Math.ceil(fullDisplay * (healthPercentage / 100.0D)), 0.5); int grayDisplay = fullDisplay - coloredDisplay; - String healthbar = color + ""; + StringBuilder healthbar = new StringBuilder(color + ""); for (int i = 0; i < coloredDisplay; i++) { - healthbar += symbol; + healthbar.append(symbol); } - healthbar += ChatColor.GRAY; + healthbar.append(ChatColor.GRAY); for (int i = 0; i < grayDisplay; i++) { - healthbar += symbol; + healthbar.append(symbol); } - return healthbar; + return healthbar.toString(); } /** diff --git a/src/main/java/com/gmail/nossr50/util/ModManager.java b/src/main/java/com/gmail/nossr50/util/ModManager.java index 025775801..62646466a 100644 --- a/src/main/java/com/gmail/nossr50/util/ModManager.java +++ b/src/main/java/com/gmail/nossr50/util/ModManager.java @@ -1,6 +1,5 @@ package com.gmail.nossr50.util; -import com.gmail.nossr50.config.Config; import com.gmail.nossr50.config.mods.CustomArmorConfig; import com.gmail.nossr50.config.mods.CustomBlockConfig; import com.gmail.nossr50.config.mods.CustomEntityConfig; @@ -22,36 +21,36 @@ import java.util.HashMap; import java.util.List; public class ModManager { - private List repairables = new ArrayList(); + private final List repairables = new ArrayList<>(); // Armor Mods - private List customBoots = new ArrayList(); - private List customChestplates = new ArrayList(); - private List customHelmets = new ArrayList(); - private List customLeggings = new ArrayList(); + private final List customBoots = new ArrayList<>(); + private final List customChestplates = new ArrayList<>(); + private final List customHelmets = new ArrayList<>(); + private final List customLeggings = new ArrayList<>(); // Block Mods - private List customExcavationBlocks = new ArrayList(); - private List customHerbalismBlocks = new ArrayList(); - private List customMiningBlocks = new ArrayList(); - private List customOres = new ArrayList(); - private List customLogs = new ArrayList(); - private List customLeaves = new ArrayList(); - private List customAbilityBlocks = new ArrayList(); - private HashMap customBlockMap = new HashMap<>(); + private final List customExcavationBlocks = new ArrayList<>(); + private final List customHerbalismBlocks = new ArrayList<>(); + private final List customMiningBlocks = new ArrayList<>(); + private final List customOres = new ArrayList<>(); + private final List customLogs = new ArrayList<>(); + private final List customLeaves = new ArrayList<>(); + private final List customAbilityBlocks = new ArrayList<>(); + private final HashMap customBlockMap = new HashMap<>(); // Entity Mods - private HashMap customEntityClassMap = new HashMap(); - private HashMap customEntityTypeMap = new HashMap(); + private final HashMap customEntityClassMap = new HashMap<>(); + private final HashMap customEntityTypeMap = new HashMap<>(); // Tool Mods - private List customAxes = new ArrayList(); - private List customBows = new ArrayList(); - private List customHoes = new ArrayList(); - private List customPickaxes = new ArrayList(); - private List customShovels = new ArrayList(); - private List customSwords = new ArrayList(); - private HashMap customToolMap = new HashMap(); + private final List customAxes = new ArrayList<>(); + private final List customBows = new ArrayList<>(); + private final List customHoes = new ArrayList<>(); + private final List customPickaxes = new ArrayList<>(); + private final List customShovels = new ArrayList<>(); + private final List customSwords = new ArrayList<>(); + private final HashMap customToolMap = new HashMap<>(); public void registerCustomArmor(CustomArmorConfig config) { customBoots.addAll(config.customBoots); @@ -89,71 +88,67 @@ public class ModManager { } public boolean isCustomBoots(Material material) { - return Config.getInstance().getArmorModsEnabled() && customBoots.contains(material); + return mcMMO.p.getGeneralConfig().getArmorModsEnabled() && customBoots.contains(material); } public boolean isCustomChestplate(Material material) { - return Config.getInstance().getArmorModsEnabled() && customChestplates.contains(material); + return mcMMO.p.getGeneralConfig().getArmorModsEnabled() && customChestplates.contains(material); } public boolean isCustomHelmet(Material material) { - return Config.getInstance().getArmorModsEnabled() && customHelmets.contains(material); + return mcMMO.p.getGeneralConfig().getArmorModsEnabled() && customHelmets.contains(material); } public boolean isCustomLeggings(Material material) { - return Config.getInstance().getArmorModsEnabled() && customLeggings.contains(material); + return mcMMO.p.getGeneralConfig().getArmorModsEnabled() && customLeggings.contains(material); } public boolean isCustomAxe(Material material) { - return Config.getInstance().getToolModsEnabled() && customAxes.contains(material); + return mcMMO.p.getGeneralConfig().getToolModsEnabled() && customAxes.contains(material); } public boolean isCustomBow(Material material) { - return Config.getInstance().getToolModsEnabled() && customBows.contains(material); + return mcMMO.p.getGeneralConfig().getToolModsEnabled() && customBows.contains(material); } public boolean isCustomHoe(Material material) { - return Config.getInstance().getToolModsEnabled() && customHoes.contains(material); + return mcMMO.p.getGeneralConfig().getToolModsEnabled() && customHoes.contains(material); } public boolean isCustomPickaxe(Material material) { - return Config.getInstance().getToolModsEnabled() && customPickaxes.contains(material); + return mcMMO.p.getGeneralConfig().getToolModsEnabled() && customPickaxes.contains(material); } public boolean isCustomShovel(Material material) { - return Config.getInstance().getToolModsEnabled() && customShovels.contains(material); + return mcMMO.p.getGeneralConfig().getToolModsEnabled() && customShovels.contains(material); } public boolean isCustomSword(Material material) { - return Config.getInstance().getToolModsEnabled() && customSwords.contains(material); + return mcMMO.p.getGeneralConfig().getToolModsEnabled() && customSwords.contains(material); } public boolean isCustomOre(Material data) { - return Config.getInstance().getBlockModsEnabled() && customOres.contains(data); + return mcMMO.p.getGeneralConfig().getBlockModsEnabled() && customOres.contains(data); } public boolean isCustomLog(BlockState state) { - return Config.getInstance().getBlockModsEnabled() && customLogs.contains(state.getType()); - } - - public boolean isCustomLeaf(BlockState state) { - return Config.getInstance().getBlockModsEnabled() && customLeaves.contains(state.getType()); + return mcMMO.p.getGeneralConfig().getBlockModsEnabled() && customLogs.contains(state.getType()); } public boolean isCustomAbilityBlock(BlockState state) { - return Config.getInstance().getBlockModsEnabled() && customAbilityBlocks.contains(state.getType()); + return mcMMO.p.getGeneralConfig().getBlockModsEnabled() && customAbilityBlocks.contains(state.getType()); } public boolean isCustomExcavationBlock(BlockState state) { - return Config.getInstance().getBlockModsEnabled() && customExcavationBlocks.contains(state.getType()); + return mcMMO.p.getGeneralConfig().getBlockModsEnabled() && customExcavationBlocks.contains(state.getType()); } public boolean isCustomHerbalismBlock(BlockState state) { - return Config.getInstance().getBlockModsEnabled() && customHerbalismBlocks.contains(state.getType()); + return mcMMO.p.getGeneralConfig().getBlockModsEnabled() && customHerbalismBlocks.contains(state.getType()); } public boolean isCustomMiningBlock(BlockState state) { - return Config.getInstance().getBlockModsEnabled() && customMiningBlocks.contains(state.getType()); + return mcMMO.p.getGeneralConfig().getBlockModsEnabled() && customMiningBlocks.contains(state.getType()); } public CustomBlock getBlock(BlockState state) { @@ -171,7 +166,7 @@ public class ModManager { * @return true if the item is a custom tool, false otherwise */ public boolean isCustomTool(ItemStack item) { - return Config.getInstance().getToolModsEnabled() && item != null && customToolMap.containsKey(item.getType()); + return mcMMO.p.getGeneralConfig().getToolModsEnabled() && item != null && customToolMap.containsKey(item.getType()); } /** @@ -189,7 +184,7 @@ public class ModManager { } public boolean isCustomEntity(Entity entity) { - if (!Config.getInstance().getEntityModsEnabled()) { + if (!mcMMO.p.getGeneralConfig().getEntityModsEnabled()) { return false; } @@ -231,7 +226,7 @@ public class ModManager { } public void addCustomEntity(Entity entity) { - if (!Config.getInstance().getEntityModsEnabled()) { + if (!mcMMO.p.getGeneralConfig().getEntityModsEnabled()) { return; } diff --git a/src/main/java/com/gmail/nossr50/util/Motd.java b/src/main/java/com/gmail/nossr50/util/Motd.java index ac3fd4e70..ddad205c0 100644 --- a/src/main/java/com/gmail/nossr50/util/Motd.java +++ b/src/main/java/com/gmail/nossr50/util/Motd.java @@ -1,6 +1,5 @@ package com.gmail.nossr50.util; -import com.gmail.nossr50.config.Config; import com.gmail.nossr50.datatypes.skills.PrimarySkillType; import com.gmail.nossr50.locale.LocaleLoader; import com.gmail.nossr50.mcMMO; @@ -70,11 +69,11 @@ public final class Motd { player.sendMessage(LocaleLoader.getString("MOTD.Hardcore.Enabled", statLossInfo + seperator + vampirismInfo)); if (deathStatLossEnabled) { - player.sendMessage(LocaleLoader.getString("MOTD.Hardcore.DeathStatLoss.Stats", Config.getInstance().getHardcoreDeathStatPenaltyPercentage())); + player.sendMessage(LocaleLoader.getString("MOTD.Hardcore.DeathStatLoss.Stats", mcMMO.p.getGeneralConfig().getHardcoreDeathStatPenaltyPercentage())); } if (vampirismEnabled) { - player.sendMessage(LocaleLoader.getString("MOTD.Hardcore.Vampirism.Stats", Config.getInstance().getHardcoreVampirismStatLeechPercentage())); + player.sendMessage(LocaleLoader.getString("MOTD.Hardcore.Vampirism.Stats", mcMMO.p.getGeneralConfig().getHardcoreVampirismStatLeechPercentage())); } } diff --git a/src/main/java/com/gmail/nossr50/util/Permissions.java b/src/main/java/com/gmail/nossr50/util/Permissions.java index b1acacdb1..2dabff51e 100644 --- a/src/main/java/com/gmail/nossr50/util/Permissions.java +++ b/src/main/java/com/gmail/nossr50/util/Permissions.java @@ -25,7 +25,7 @@ public final class Permissions { * GENERAL */ public static boolean motd(Permissible permissible) { return permissible.hasPermission("mcmmo.motd"); } - public static boolean mobHealthDisplay(Permissible permissible) { return permissible.hasPermission("mcmmo.mobhealthdisplay"); } + public static boolean levelUpBroadcast(Permissible permissible) { return permissible.hasPermission("mcmmo.broadcast.levelup"); } public static boolean updateNotifications(Permissible permissible) {return permissible.hasPermission("mcmmo.tools.updatecheck"); } public static boolean chimaeraWing(Permissible permissible) { return permissible.hasPermission("mcmmo.item.chimaerawing"); } public static boolean showversion(Permissible permissible) { return permissible.hasPermission("mcmmo.showversion"); } @@ -33,12 +33,11 @@ public final class Permissions { /* BYPASS */ public static boolean hardcoreBypass(Permissible permissible) { return permissible.hasPermission("mcmmo.bypass.hardcoremode"); } public static boolean arcaneBypass(Permissible permissible) { return permissible.hasPermission("mcmmo.bypass.arcanebypass"); } - public static boolean krakenBypass(Permissible permissible) { return permissible.hasPermission("mcmmo.bypass.kraken"); } - public static boolean trapsBypass(Permissible permissible) { return permissible.hasPermission("mcmmo.bypass.fishingtraps"); } /* CHAT */ public static boolean partyChat(Permissible permissible) { return permissible.hasPermission("mcmmo.chat.partychat"); } public static boolean adminChat(Permissible permissible) { return permissible.hasPermission("mcmmo.chat.adminchat"); } + public static boolean colorChat(Permissible permissible) { return permissible.hasPermission("mcmmo.chat.colors"); } /* * COMMANDS @@ -58,9 +57,6 @@ public final class Permissions { public static boolean inspectFar(Permissible permissible) { return (permissible.hasPermission("mcmmo.commands.inspect.far")); } public static boolean inspectHidden(Permissible permissible) { return (permissible.hasPermission("mcmmo.commands.inspect.hidden")); } - public static boolean kraken(Permissible permissible) { return permissible.hasPermission("mcmmo.commands.kraken"); } - public static boolean krakenOthers(Permissible permissible) { return permissible.hasPermission("mcmmo.commands.kraken.others"); } - public static boolean mcability(Permissible permissible) { return (permissible.hasPermission("mcmmo.commands.mcability")); } public static boolean mcabilityOthers(Permissible permissible) { return (permissible.hasPermission("mcmmo.commands.mcability.others")); } @@ -96,9 +92,6 @@ public final class Permissions { public static boolean xprateSet(Permissible permissible) { return permissible.hasPermission("mcmmo.commands.xprate.set"); } public static boolean xprateReset(Permissible permissible) { return permissible.hasPermission("mcmmo.commands.xprate.reset"); } - public static boolean vampirismModify(Permissible permissible) { return permissible.hasPermission("mcmmo.commands.vampirism.modify"); } - public static boolean vampirismToggle(Permissible permissible) { return permissible.hasPermission("mcmmo.commands.vampirism.toggle"); } - public static boolean mcpurge(Permissible permissible) { return permissible.hasPermission("mcmmo.commands.mcpurge"); } public static boolean mcremove(Permissible permissible) { return permissible.hasPermission("mcmmo.commands.mcremove"); } public static boolean mmoupdate(Permissible permissible) { return permissible.hasPermission("mcmmo.commands.mmoupdate"); } @@ -116,13 +109,41 @@ public final class Permissions { public static boolean lucky(Permissible permissible, PrimarySkillType skill) { return permissible.hasPermission("mcmmo.perks.lucky." + skill.toString().toLowerCase(Locale.ENGLISH)); } /* XP PERKS */ - public static boolean quadrupleXp(Permissible permissible, PrimarySkillType skill) { return permissible.hasPermission("mcmmo.perks.xp.quadruple." + skill.toString().toLowerCase(Locale.ENGLISH)); } - public static boolean tripleXp(Permissible permissible, PrimarySkillType skill) { return permissible.hasPermission("mcmmo.perks.xp.triple." + skill.toString().toLowerCase(Locale.ENGLISH)); } - public static boolean doubleAndOneHalfXp(Permissible permissible, PrimarySkillType skill) { return permissible.hasPermission("mcmmo.perks.xp.150percentboost." + skill.toString().toLowerCase(Locale.ENGLISH)); } - public static boolean doubleXp(Permissible permissible, PrimarySkillType skill) { return permissible.hasPermission("mcmmo.perks.xp.double." + skill.toString().toLowerCase(Locale.ENGLISH)); } - public static boolean oneAndOneHalfXp(Permissible permissible, PrimarySkillType skill) { return permissible.hasPermission("mcmmo.perks.xp.50percentboost." + skill.toString().toLowerCase(Locale.ENGLISH)); } - public static boolean oneAndOneTenthXp(Permissible permissible, PrimarySkillType skill) { return permissible.hasPermission("mcmmo.perks.xp.10percentboost." + skill.toString().toLowerCase(Locale.ENGLISH)); } - public static boolean customXpBoost(Permissible permissible, PrimarySkillType skill) { return permissible.hasPermission("mcmmo.perks.xp.customboost." + skill.toString().toLowerCase(Locale.ENGLISH)); } + public static boolean quadrupleXp(Permissible permissible, PrimarySkillType skill) { + return permissible.hasPermission("mcmmo.perks.xp.quadruple.all") + || permissible.hasPermission("mcmmo.perks.xp.quadruple." + skill.toString().toLowerCase(Locale.ENGLISH)); + } + + public static boolean tripleXp(Permissible permissible, PrimarySkillType skill) { + return permissible.hasPermission("mcmmo.perks.xp.triple.all") + || permissible.hasPermission("mcmmo.perks.xp.triple." + skill.toString().toLowerCase(Locale.ENGLISH)); + } + + public static boolean doubleAndOneHalfXp(Permissible permissible, PrimarySkillType skill) { + return permissible.hasPermission("mcmmo.perks.xp.150percentboost.all") + || permissible.hasPermission("mcmmo.perks.xp.150percentboost." + skill.toString().toLowerCase(Locale.ENGLISH)); + } + + public static boolean doubleXp(Permissible permissible, PrimarySkillType skill) { + return permissible.hasPermission("mcmmo.perks.xp.double.all") + || permissible.hasPermission("mcmmo.perks.xp.double." + skill.toString().toLowerCase(Locale.ENGLISH)); + } + + public static boolean oneAndOneHalfXp(Permissible permissible, PrimarySkillType skill) { + return permissible.hasPermission("mcmmo.perks.xp.50percentboost.all") + || permissible.hasPermission("mcmmo.perks.xp.50percentboost." + skill.toString().toLowerCase(Locale.ENGLISH)); + } + + public static boolean oneAndOneTenthXp(Permissible permissible, PrimarySkillType skill) { + return permissible.hasPermission("mcmmo.perks.xp.10percentboost.all") + || permissible.hasPermission("mcmmo.perks.xp.10percentboost." + skill.toString().toLowerCase(Locale.ENGLISH)); + } + + public static boolean customXpBoost(Permissible permissible, PrimarySkillType skill) { + return permissible.hasPermission("mcmmo.perks.xp.customboost.all") + || permissible.hasPermission("mcmmo.perks.xp.customboost." + skill.toString().toLowerCase(Locale.ENGLISH)); + } + /* ACTIVATION PERKS */ public static boolean twelveSecondActivationBoost(Permissible permissible) { return permissible.hasPermission("mcmmo.perks.activationtime.twelveseconds"); } @@ -142,7 +163,6 @@ public final class Permissions { public static boolean vanillaXpBoost(Permissible permissible, PrimarySkillType skill) { return permissible.hasPermission("mcmmo.ability." + skill.toString().toLowerCase(Locale.ENGLISH) + ".vanillaxpboost"); } public static boolean isSubSkillEnabled(Permissible permissible, SubSkillType subSkillType) { return permissible.hasPermission(subSkillType.getPermissionNodeAddress()); } public static boolean isSubSkillEnabled(Permissible permissible, AbstractSubSkill abstractSubSkill) { return permissible.hasPermission(abstractSubSkill.getPermissionNode()); } - public static boolean bonusDamage(Permissible permissible, PrimarySkillType skill) { return permissible.hasPermission("mcmmo.ability." + skill.toString().toLowerCase(Locale.ENGLISH) + ".bonusdamage"); } /* ACROBATICS */ public static boolean dodge(Permissible permissible) { return permissible.hasPermission("mcmmo.ability.acrobatics.dodge"); } @@ -179,7 +199,6 @@ public final class Permissions { public static boolean repairMaterialType(Permissible permissible, MaterialType repairMaterialType) { return permissible.hasPermission("mcmmo.ability.repair." + repairMaterialType.toString().toLowerCase(Locale.ENGLISH) + "repair"); } /* SALVAGE */ - public static boolean advancedSalvage(Permissible permissible) { return permissible.hasPermission("mcmmo.ability.salvage.advancedsalvage"); } public static boolean arcaneSalvage(Permissible permissible) { return permissible.hasPermission("mcmmo.ability.salvage.arcanesalvage"); } public static boolean salvageItemType(Permissible permissible, ItemType salvageItemType) { return permissible.hasPermission("mcmmo.ability.salvage." + salvageItemType.toString().toLowerCase(Locale.ENGLISH) + "salvage"); } diff --git a/src/main/java/com/gmail/nossr50/util/TextComponentFactory.java b/src/main/java/com/gmail/nossr50/util/TextComponentFactory.java deleted file mode 100644 index 70791e3b2..000000000 --- a/src/main/java/com/gmail/nossr50/util/TextComponentFactory.java +++ /dev/null @@ -1,554 +0,0 @@ -package com.gmail.nossr50.util; - -import com.gmail.nossr50.config.Config; -import com.gmail.nossr50.config.RankConfig; -import com.gmail.nossr50.datatypes.json.McMMOUrl; -import com.gmail.nossr50.datatypes.json.McMMOWebLinks; -import com.gmail.nossr50.datatypes.skills.PrimarySkillType; -import com.gmail.nossr50.datatypes.skills.SubSkillType; -import com.gmail.nossr50.datatypes.skills.subskills.AbstractSubSkill; -import com.gmail.nossr50.listeners.InteractionManager; -import com.gmail.nossr50.locale.LocaleLoader; -import com.gmail.nossr50.util.skills.RankUtils; -import net.md_5.bungee.api.ChatColor; -import net.md_5.bungee.api.ChatMessageType; -import net.md_5.bungee.api.chat.*; -import org.bukkit.entity.Player; - -import java.util.ArrayList; -import java.util.List; -import java.util.Locale; - -/** - * This class handles many of the JSON components that mcMMO makes and uses - */ -public class TextComponentFactory { - - /** - * Makes a text component using strings from a locale and supports passing an undefined number of variables to the LocaleLoader - * @param localeKey target locale string address - * @param values vars to be passed to the locale loader - * @return - */ - public static TextComponent getNotificationMultipleValues(String localeKey, String... values) - { - String preColoredString = LocaleLoader.getString(localeKey, (Object[]) values); - TextComponent msg = new TextComponent(preColoredString); - return new TextComponent(msg); - } - - public static TextComponent getNotificationTextComponentFromLocale(String localeKey) - { - return getNotificationTextComponent(LocaleLoader.getString(localeKey)); - } - - public static TextComponent getNotificationLevelUpTextComponent(PrimarySkillType skill, int levelsGained, int currentLevel) - { - TextComponent textComponent = new TextComponent(LocaleLoader.getString("Overhaul.Levelup", LocaleLoader.getString("Overhaul.Name."+StringUtils.getCapitalized(skill.toString())), levelsGained, currentLevel)); - return textComponent; - } - - private static TextComponent getNotificationTextComponent(String text) - { - //textComponent.setColor(getNotificationColor(notificationType)); - return new TextComponent(text); - } - - public static void sendPlayerSubSkillWikiLink(Player player, String subskillformatted) - { - if(!Config.getInstance().getUrlLinksEnabled()) - return; - - Player.Spigot spigotPlayer = player.spigot(); - - TextComponent wikiLinkComponent = new TextComponent(LocaleLoader.getString("Overhaul.mcMMO.MmoInfo.Wiki")); - wikiLinkComponent.setUnderlined(true); - - String wikiUrl = "https://mcmmo.org/wiki/"+subskillformatted; - - wikiLinkComponent.setClickEvent(new ClickEvent(ClickEvent.Action.OPEN_URL, wikiUrl)); - - ComponentBuilder componentBuilder = new ComponentBuilder(subskillformatted).append("\n").append(wikiUrl).color(ChatColor.GRAY).italic(true); - - wikiLinkComponent.setHoverEvent(new HoverEvent(HoverEvent.Action.SHOW_TEXT, componentBuilder.create())); - - spigotPlayer.sendMessage(ChatMessageType.SYSTEM, wikiLinkComponent); - } - - public static void sendPlayerUrlHeader(Player player) { - Player.Spigot spigotPlayer = player.spigot(); - - TextComponent prefix = new TextComponent(LocaleLoader.getString("Overhaul.mcMMO.Url.Wrap.Prefix") + " "); - /*prefix.setColor(ChatColor.DARK_AQUA);*/ - TextComponent suffix = new TextComponent(" "+LocaleLoader.getString("Overhaul.mcMMO.Url.Wrap.Suffix")); - /*suffix.setColor(ChatColor.DARK_AQUA);*/ - - TextComponent emptySpace = new TextComponent(" "); - - BaseComponent[] baseComponents = {new TextComponent(prefix), - getWebLinkTextComponent(McMMOWebLinks.WEBSITE), - emptySpace, - getWebLinkTextComponent(McMMOWebLinks.DISCORD), - emptySpace, - getWebLinkTextComponent(McMMOWebLinks.PATREON), - emptySpace, - getWebLinkTextComponent(McMMOWebLinks.WIKI), - emptySpace, - getWebLinkTextComponent(McMMOWebLinks.SPIGOT), - emptySpace, - getWebLinkTextComponent(McMMOWebLinks.HELP_TRANSLATE), - new TextComponent(suffix)}; - - spigotPlayer.sendMessage(baseComponents); - } - - public static void sendPlayerSubSkillList(Player player, List textComponents) - { - TextComponent emptySpace = new TextComponent(" "); - - ArrayList bulkMessage = new ArrayList<>(); - int newLineCount = 0; //Hacky solution to wordwrap problems - - for (TextComponent textComponent : textComponents) { - //Don't send more than 3 subskills per line to avoid MOST wordwrap problems - if(newLineCount > 2) - { - TextComponent[] bulkArray = new TextComponent[bulkMessage.size()]; - bulkArray = bulkMessage.toArray(bulkArray); - - player.spigot().sendMessage(bulkArray); - bulkMessage = new ArrayList<>(); - newLineCount = 0; - } - //Style the skills into @links - final String originalTxt = textComponent.getText(); - - TextComponent stylizedText = new TextComponent(LocaleLoader.getString("JSON.Hover.AtSymbolSkills")); - addChild(stylizedText, originalTxt); - - if(textComponent.getHoverEvent() != null) - stylizedText.setHoverEvent(textComponent.getHoverEvent()); - - if(textComponent.getClickEvent() != null) - stylizedText.setClickEvent(textComponent.getClickEvent()); - - bulkMessage.add(stylizedText); - bulkMessage.add(emptySpace); - - newLineCount++; - } - - /* - * Convert our list into an array - */ - TextComponent[] bulkArray = new TextComponent[bulkMessage.size()]; - bulkArray = bulkMessage.toArray(bulkArray); - - player.spigot().sendMessage(bulkArray); - } - - private static TextComponent getWebLinkTextComponent(McMMOWebLinks webLinks) - { - TextComponent webTextComponent; - - switch(webLinks) - { - case WEBSITE: - webTextComponent = new TextComponent(LocaleLoader.getString("JSON.Hover.AtSymbolURL")); - addChild(webTextComponent, "Web"); - webTextComponent.setClickEvent(getUrlClickEvent(McMMOUrl.urlWebsite)); - break; - case SPIGOT: - webTextComponent = new TextComponent(LocaleLoader.getString("JSON.Hover.AtSymbolURL")); - addChild(webTextComponent, "Spigot"); - webTextComponent.setClickEvent(getUrlClickEvent(McMMOUrl.urlSpigot)); - break; - case DISCORD: - webTextComponent = new TextComponent(LocaleLoader.getString("JSON.Hover.AtSymbolURL")); - addChild(webTextComponent, "Discord"); - webTextComponent.setClickEvent(getUrlClickEvent(McMMOUrl.urlDiscord)); - break; - case PATREON: - webTextComponent = new TextComponent(LocaleLoader.getString("JSON.Hover.AtSymbolURL")); - addChild(webTextComponent, "Patreon"); - webTextComponent.setClickEvent(getUrlClickEvent(McMMOUrl.urlPatreon)); - break; - case WIKI: - webTextComponent = new TextComponent(LocaleLoader.getString("JSON.Hover.AtSymbolURL")); - addChild(webTextComponent, "Wiki"); - webTextComponent.setClickEvent(getUrlClickEvent(McMMOUrl.urlWiki)); - break; - case HELP_TRANSLATE: - webTextComponent = new TextComponent(LocaleLoader.getString("JSON.Hover.AtSymbolURL")); - addChild(webTextComponent, "Lang"); - webTextComponent.setClickEvent(getUrlClickEvent(McMMOUrl.urlTranslate)); - break; - default: - webTextComponent = new TextComponent("NOT DEFINED"); - } - - addNewHoverComponentToTextComponent(webTextComponent, getUrlHoverEvent(webLinks)); - webTextComponent.setInsertion(webLinks.getUrl()); - - return webTextComponent; - } - - private static void addChild(TextComponent webTextComponent, String childName) { - TextComponent childComponent = new TextComponent(childName); - childComponent.setColor(ChatColor.BLUE); - webTextComponent.addExtra(childComponent); - } - - private static BaseComponent[] getUrlHoverEvent(McMMOWebLinks webLinks) - { - ComponentBuilder componentBuilder = new ComponentBuilder(webLinks.getNiceTitle()); - - switch(webLinks) - { - case WEBSITE: - addUrlHeaderHover(webLinks, componentBuilder); - componentBuilder.append("\n\n").italic(false); - componentBuilder.append(webLinks.getLocaleDescription()).color(ChatColor.GREEN); - componentBuilder.append("\nDev Blogs, and information related to mcMMO can be found here").color(ChatColor.GRAY); - break; - case SPIGOT: - addUrlHeaderHover(webLinks, componentBuilder); - componentBuilder.append("\n\n").italic(false); - componentBuilder.append(webLinks.getLocaleDescription()).color(ChatColor.GREEN); - componentBuilder.append("\nI post regularly in the discussion thread here!").color(ChatColor.GRAY); - break; - case PATREON: - addUrlHeaderHover(webLinks, componentBuilder); - componentBuilder.append("\n\n").italic(false); - componentBuilder.append(webLinks.getLocaleDescription()).color(ChatColor.GREEN); - componentBuilder.append("\n"); - componentBuilder.append("Show support by buying me a coffee :)").italic(false).color(ChatColor.GRAY); - break; - case WIKI: - addUrlHeaderHover(webLinks, componentBuilder); - componentBuilder.append("\n\n").italic(false); - componentBuilder.append(webLinks.getLocaleDescription()).color(ChatColor.GREEN); - componentBuilder.append("\n"); - componentBuilder.append("I'm looking for more wiki staff, contact me on our discord!").italic(false).color(ChatColor.DARK_GRAY); - break; - case DISCORD: - addUrlHeaderHover(webLinks, componentBuilder); - componentBuilder.append("\n\n").italic(false); - componentBuilder.append(webLinks.getLocaleDescription()).color(ChatColor.GREEN); - break; - case HELP_TRANSLATE: - addUrlHeaderHover(webLinks, componentBuilder); - componentBuilder.append("\n\n").italic(false); - componentBuilder.append(webLinks.getLocaleDescription()).color(ChatColor.GREEN); - componentBuilder.append("\n"); - componentBuilder.append("You can use this website to help translate mcMMO into your language!" + - "\nIf you want to know more contact me in discord.").italic(false).color(ChatColor.DARK_GRAY); - } - - return componentBuilder.create(); - } - - private static void addUrlHeaderHover(McMMOWebLinks webLinks, ComponentBuilder componentBuilder) { - componentBuilder.append("\n"); - componentBuilder.append(webLinks.getUrl()).color(ChatColor.GRAY).italic(true); - } - - private static ClickEvent getUrlClickEvent(String url) - { - return new ClickEvent(ClickEvent.Action.OPEN_URL, url); - } - - private static TextComponent getSubSkillTextComponent(Player player, SubSkillType subSkillType) - { - //Get skill name - String skillName = subSkillType.getLocaleName(); - - boolean skillUnlocked = RankUtils.hasUnlockedSubskill(player, subSkillType); - - TextComponent textComponent = initNewSkillTextComponent(player, skillName, subSkillType, skillUnlocked); - - //Hover Event - addNewHoverComponentToTextComponent(textComponent, getSubSkillHoverComponent(player, subSkillType)); - - //Insertion - textComponent.setInsertion(skillName); - - return textComponent; - } - - private static void addNewHoverComponentToTextComponent(TextComponent textComponent, BaseComponent[] baseComponent) { - textComponent.setHoverEvent(new HoverEvent(HoverEvent.Action.SHOW_TEXT, baseComponent)); - } - - private static TextComponent getSubSkillTextComponent(Player player, AbstractSubSkill abstractSubSkill) - { - //String key = abstractSubSkill.getConfigKeyName(); - String skillName = abstractSubSkill.getNiceName(); - - //Setup Text Component - SubSkillType subSkillType = abstractSubSkill.getSubSkillType(); - - boolean skillUnlocked = RankUtils.hasUnlockedSubskill(player, subSkillType); - - TextComponent textComponent = initNewSkillTextComponent(player, skillName, subSkillType, skillUnlocked); - - //Hover Event - addNewHoverComponentToTextComponent(textComponent, getSubSkillHoverComponent(player, abstractSubSkill)); - - //Insertion - textComponent.setInsertion(skillName); - - return textComponent; - } - - private static TextComponent initNewSkillTextComponent(Player player, String skillName, SubSkillType subSkillType, boolean skillUnlocked) { - TextComponent textComponent; - if (skillUnlocked) { - if (RankUtils.getHighestRank(subSkillType) == RankUtils.getRank(player, subSkillType) && subSkillType.getNumRanks() > 1) - textComponent = new TextComponent(LocaleLoader.getString("JSON.Hover.MaxRankSkillName", skillName)); - else - textComponent = new TextComponent(LocaleLoader.getString("JSON.Hover.SkillName", skillName)); - - textComponent.setClickEvent(new ClickEvent(ClickEvent.Action.RUN_COMMAND, "/mmoinfo " + subSkillType.getNiceNameNoSpaces(subSkillType))); - - } else { - textComponent = new TextComponent(LocaleLoader.getString("JSON.Hover.Mystery", - String.valueOf(RankUtils.getUnlockLevel(subSkillType)))); - - textComponent.setClickEvent(new ClickEvent(ClickEvent.Action.RUN_COMMAND, "/mmoinfo ???")); - } - return textComponent; - } - - private static BaseComponent[] getSubSkillHoverComponent(Player player, AbstractSubSkill abstractSubSkill) - { - return getSubSkillHoverEventJSON(abstractSubSkill, player); - } - - private static BaseComponent[] getSubSkillHoverComponent(Player player, SubSkillType subSkillType) - { - return getSubSkillHoverEventJSON(subSkillType, player); - } - - /** - * Used for the skill in the new skill system (Deriving from AbstractSubSkill) - * @param abstractSubSkill this subskill - * @param player the player who owns this subskill - * @return the hover basecomponent object for this subskill - */ - private static BaseComponent[] getSubSkillHoverEventJSON(AbstractSubSkill abstractSubSkill, Player player) - { - String skillName = abstractSubSkill.getNiceName(); - - /* - * Hover Event BaseComponent color table - */ - ChatColor ccSubSkillHeader = ChatColor.GOLD; - ChatColor ccRank = ChatColor.BLUE; - ChatColor ccCurRank = ChatColor.GREEN; - ChatColor ccPossessive = ChatColor.WHITE; - ChatColor ccNumRanks = ccCurRank; - //ChatColor ccDescriptionHeader = ChatColor.DARK_PURPLE; - //ChatColor ccDescription = ChatColor.WHITE; - ChatColor ccLocked = ChatColor.DARK_GRAY; - ChatColor ccLevelRequirement = ChatColor.BLUE; - ChatColor ccLevelRequired = ChatColor.RED; - - SubSkillType subSkillType = abstractSubSkill.getSubSkillType(); - - //SubSkillType Name - ComponentBuilder componentBuilder = setupSkillComponentNameStyle(player, skillName, subSkillType, RankUtils.hasUnlockedSubskill(player, abstractSubSkill)); - - if(!RankUtils.hasUnlockedSubskill(player, abstractSubSkill)) - { - //Skill is not unlocked yet - addLocked(abstractSubSkill, ccLocked, ccLevelRequirement, ccLevelRequired, componentBuilder); - } else { - addSubSkillTypeToHoverEventJSON(abstractSubSkill, componentBuilder); - - //RANK - int curRank = RankUtils.getRank(player, abstractSubSkill); - int nextRank = 0; - - if(curRank < abstractSubSkill.getNumRanks() && abstractSubSkill.getNumRanks() > 0) - { - nextRank = RankUtils.getRankUnlockLevel(abstractSubSkill, curRank+1); - } - - addRanked(ccRank, ccCurRank, ccPossessive, ccNumRanks, componentBuilder, abstractSubSkill.getNumRanks(), RankUtils.getRank(player, abstractSubSkill), nextRank); - - componentBuilder.append(LocaleLoader.getString("JSON.DescriptionHeader")); - componentBuilder.append("\n").append(abstractSubSkill.getDescription()).append("\n"); - - //Empty line - componentBuilder.append("\n").bold(false); - componentBuilder.append("\n"); - - //Finally, add details to the tooltip - abstractSubSkill.addStats(componentBuilder, player); - } - - return componentBuilder.create(); - } - - private static ComponentBuilder setupSkillComponentNameStyle(Player player, String skillName, SubSkillType subSkillType, boolean skillUnlocked) { - ComponentBuilder componentBuilder; - if (skillUnlocked) { - if (RankUtils.getHighestRank(subSkillType) == RankUtils.getRank(player, subSkillType) && subSkillType.getNumRanks() > 1) - componentBuilder = getNewComponentBuilder(LocaleLoader.getString("JSON.Hover.MaxRankSkillName", skillName)); - else - componentBuilder = getNewComponentBuilder(LocaleLoader.getString("JSON.Hover.SkillName", skillName)); - } else - componentBuilder = getNewComponentBuilder(LocaleLoader.getString("JSON.Hover.Mystery", - String.valueOf(RankUtils.getUnlockLevel(subSkillType)))); - return componentBuilder; - } - - private static ComponentBuilder getNewComponentBuilder(String skillName) { - ComponentBuilder componentBuilder = new ComponentBuilder(skillName); - componentBuilder.append("\n"); - return componentBuilder; - } - - private static void addRanked(ChatColor ccRank, ChatColor ccCurRank, ChatColor ccPossessive, ChatColor ccNumRanks, ComponentBuilder componentBuilder, int numRanks, int rank, int nextRank) { - if (numRanks > 0) { - //Rank: x - componentBuilder.append(LocaleLoader.getString("JSON.Hover.Rank", String.valueOf(rank))).append("\n") - .bold(false).italic(false).strikethrough(false).underlined(false); - - //Next Rank: x - if(nextRank > rank) - componentBuilder.append(LocaleLoader.getString("JSON.Hover.NextRank", String.valueOf(nextRank))).append("\n") - .bold(false).italic(false).strikethrough(false).underlined(false); - - /*componentBuilder.append(" " + LocaleLoader.getString("JSON.RankPossesive") + " ").color(ccPossessive); - componentBuilder.append(String.valueOf(numRanks)).color(ccNumRanks);*/ - } - } - - private static void addLocked(SubSkillType subSkillType, ChatColor ccLocked, ChatColor ccLevelRequirement, ChatColor ccLevelRequired, ComponentBuilder componentBuilder) { - addLocked(ccLocked, ccLevelRequirement, componentBuilder); - componentBuilder.append(String.valueOf(RankConfig.getInstance().getSubSkillUnlockLevel(subSkillType, 1))).color(ccLevelRequired); - //componentBuilder.append("\n"); - } - - private static void addLocked(AbstractSubSkill abstractSubSkill, ChatColor ccLocked, ChatColor ccLevelRequirement, ChatColor ccLevelRequired, ComponentBuilder componentBuilder) { - addLocked(ccLocked, ccLevelRequirement, componentBuilder); - componentBuilder.append(String.valueOf(RankConfig.getInstance().getSubSkillUnlockLevel(abstractSubSkill, 1))).color(ccLevelRequired); - //componentBuilder.append("\n"); - } - - private static void addLocked(ChatColor ccLocked, ChatColor ccLevelRequirement, ComponentBuilder componentBuilder) { - componentBuilder.append(LocaleLoader.getString("JSON.Locked")).color(ccLocked).bold(true); - componentBuilder.append("\n").append("\n").bold(false); - componentBuilder.append(LocaleLoader.getString("JSON.LevelRequirement") + ": ").color(ccLevelRequirement); - } - - @Deprecated - private static BaseComponent[] getSubSkillHoverEventJSON(SubSkillType subSkillType, Player player) - { - String skillName = subSkillType.getLocaleName(); - - /* - * Hover Event BaseComponent color table - */ - ChatColor ccSubSkillHeader = ChatColor.GOLD; - ChatColor ccRank = ChatColor.BLUE; - ChatColor ccCurRank = ChatColor.GREEN; - ChatColor ccPossessive = ChatColor.WHITE; - ChatColor ccNumRanks = ccCurRank; - ChatColor ccDescriptionHeader = ChatColor.DARK_PURPLE; - ChatColor ccDescription = ChatColor.DARK_GRAY; - ChatColor ccLocked = ChatColor.DARK_GRAY; - ChatColor ccLevelRequirement = ChatColor.BLUE; - ChatColor ccLevelRequired = ChatColor.RED; - - //SubSkillType Name - ComponentBuilder componentBuilder = setupSkillComponentNameStyle(player, skillName, subSkillType, RankUtils.hasUnlockedSubskill(player, subSkillType)); - - if(!RankUtils.hasUnlockedSubskill(player, subSkillType)) - { - //Skill is not unlocked yet - addLocked(subSkillType, ccLocked, ccLevelRequirement, ccLevelRequired, componentBuilder); - } else { - //addSubSkillTypeToHoverEventJSON(subSkillType, componentBuilder); - - //RANK - if(subSkillType.getNumRanks() > 0) - { - int curRank = RankUtils.getRank(player, subSkillType); - int nextRank = 0; - - if(curRank < subSkillType.getNumRanks() && subSkillType.getNumRanks() > 0) - { - nextRank = RankUtils.getRankUnlockLevel(subSkillType, curRank+1); - } - - addRanked(ccRank, ccCurRank, ccPossessive, ccNumRanks, componentBuilder, subSkillType.getNumRanks(), RankUtils.getRank(player, subSkillType), nextRank); - - } - - componentBuilder.append("\n").bold(false); - componentBuilder.append(LocaleLoader.getString("JSON.DescriptionHeader")); - componentBuilder.color(ccDescriptionHeader); - componentBuilder.append("\n"); - componentBuilder.append(subSkillType.getLocaleDescription()); - componentBuilder.color(ccDescription); - } - - return componentBuilder.create(); - } - - private static void addSubSkillTypeToHoverEventJSON(AbstractSubSkill abstractSubSkill, ComponentBuilder componentBuilder) - { - if(abstractSubSkill.isSuperAbility()) - { - componentBuilder.append(LocaleLoader.getString("JSON.Type.SuperAbility")).color(ChatColor.LIGHT_PURPLE); - componentBuilder.bold(true); - } else if(abstractSubSkill.isActiveUse()) - { - componentBuilder.append(LocaleLoader.getString("JSON.Type.Active")).color(ChatColor.DARK_RED); - componentBuilder.bold(true); - } else { - componentBuilder.append(LocaleLoader.getString("JSON.Type.Passive")).color(ChatColor.GREEN); - componentBuilder.bold(true); - } - - componentBuilder.append("\n"); - } - - public static void getSubSkillTextComponents(Player player, List textComponents, PrimarySkillType parentSkill) { - for(SubSkillType subSkillType : SubSkillType.values()) - { - if(subSkillType.getParentSkill() == parentSkill) - { - if(Permissions.isSubSkillEnabled(player, subSkillType)) - { - if(!InteractionManager.hasSubSkill(subSkillType)) - textComponents.add(TextComponentFactory.getSubSkillTextComponent(player, subSkillType)); - } - } - } - - /* NEW SKILL SYSTEM */ - for(AbstractSubSkill abstractSubSkill : InteractionManager.getSubSkillList()) - { - if(abstractSubSkill.getPrimarySkill() == parentSkill) - { - if(Permissions.isSubSkillEnabled(player, abstractSubSkill)) - textComponents.add(TextComponentFactory.getSubSkillTextComponent(player, abstractSubSkill)); - } - } - } - - public static TextComponent getSubSkillUnlockedNotificationComponents(Player player, SubSkillType subSkillType) - { - TextComponent unlockMessage = new TextComponent(""); - unlockMessage.setText(LocaleLoader.getString("JSON.SkillUnlockMessage", subSkillType.getLocaleName(), RankUtils.getRank(player, subSkillType))); - unlockMessage.setHoverEvent(new HoverEvent(HoverEvent.Action.SHOW_TEXT, getSubSkillHoverComponent(player, subSkillType))); - unlockMessage.setClickEvent(new ClickEvent(ClickEvent.Action.RUN_COMMAND, "/"+subSkillType.getParentSkill().toString().toLowerCase(Locale.ENGLISH))); - return unlockMessage; - } -} - - diff --git a/src/main/java/com/gmail/nossr50/util/TransientEntityTracker.java b/src/main/java/com/gmail/nossr50/util/TransientEntityTracker.java new file mode 100644 index 000000000..e9d2fca83 --- /dev/null +++ b/src/main/java/com/gmail/nossr50/util/TransientEntityTracker.java @@ -0,0 +1,316 @@ +package com.gmail.nossr50.util; + +import com.gmail.nossr50.datatypes.skills.subskills.taming.CallOfTheWildType; +import com.gmail.nossr50.mcMMO; +import com.gmail.nossr50.skills.taming.TrackedTamingEntity; +import com.gmail.nossr50.util.player.NotificationManager; +import com.gmail.nossr50.util.skills.ParticleEffectUtils; +import com.gmail.nossr50.util.text.StringUtils; +import com.google.common.collect.ImmutableSet; +import org.bukkit.Bukkit; +import org.bukkit.Chunk; +import org.bukkit.Location; +import org.bukkit.Sound; +import org.bukkit.entity.LivingEntity; +import org.bukkit.entity.Player; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +import java.util.*; + +public class TransientEntityTracker { + //These two are updated in step with each other + private final @NotNull HashMap>> perPlayerTransientEntityMap; + private final @NotNull HashSet chunkLookupCache; + + public TransientEntityTracker() { + perPlayerTransientEntityMap = new HashMap<>(); + chunkLookupCache = new HashSet<>(); + } + + public synchronized @NotNull HashSet getChunkLookupCache() { + return chunkLookupCache; + } + + public synchronized @NotNull HashMap>> getPerPlayerTransientEntityMap() { + return perPlayerTransientEntityMap; + } + + public synchronized void initPlayer(@NotNull Player player) { + if (!isPlayerRegistered(player.getUniqueId())) { + registerPlayer(player.getUniqueId()); + } + } + + /** + * Removes a player from the tracker + * + * @param playerUUID target player + */ + public synchronized void cleanupPlayer(@NotNull UUID playerUUID) { + cleanPlayer(null, playerUUID); + } + + /** + * Removes a player from the tracker + * + * @param player target player + */ + public synchronized void cleanupPlayer(@NotNull Player player) { + cleanPlayer(player, player.getUniqueId()); + } + + /** + * Removes a player from the tracker + * + * @param player target player + * @param playerUUID target player UUID + */ + private void cleanPlayer(@Nullable Player player, @NotNull UUID playerUUID) { + cleanupAllSummons(player, player.getUniqueId()); + removePlayerFromMap(playerUUID); + } + + private void removePlayerFromMap(@NotNull UUID playerUUID) { + getPerPlayerTransientEntityMap().remove(playerUUID); + } + + /** + * Checks if a player has already been registered + * Being registered constitutes having necessary values initialized in our per-player map + * + * @param playerUUID target player + * @return true if the player is registered + */ + private synchronized boolean isPlayerRegistered(@NotNull UUID playerUUID) { + return getPerPlayerTransientEntityMap().get(playerUUID) != null; + } + + /** + * Register a player to our tracker, which initializes the necessary values in our per-player map + * + * @param playerUUID player to register + */ + private synchronized void registerPlayer(@NotNull UUID playerUUID) { + getPerPlayerTransientEntityMap().put(playerUUID, new HashMap>()); + + for(CallOfTheWildType callOfTheWildType : CallOfTheWildType.values()) { + getPerPlayerTransientEntityMap().get(playerUUID).put(callOfTheWildType, new HashSet<>()); + } + } + + /** + * Get the tracked transient entities map for a specific player + * + * @param playerUUID the target uuid of the player + * @return the tracked entities map for the player, null if the player isn't registered + */ + public synchronized @Nullable HashMap> getPlayerTrackedEntityMap(@NotNull UUID playerUUID) { + return getPerPlayerTransientEntityMap().get(playerUUID); + } + + /** + * Registers an entity to a player + * This includes registration to our per-player map and our chunk lookup cache + * + * @param playerUUID target player's UUID + * @param trackedTamingEntity target entity + */ + public synchronized void registerEntity(@NotNull UUID playerUUID, @NotNull TrackedTamingEntity trackedTamingEntity) { + //Add to map entry + getTrackedEntities(playerUUID, trackedTamingEntity.getCallOfTheWildType()).add(trackedTamingEntity); + + //Add to cache for chunk lookups + addToChunkLookupCache(trackedTamingEntity); + } + + /** + * Checks if a living entity is a summon + * + * @param livingEntity target livinig entity + * @return true if target living entity is a summon + */ + public synchronized boolean isTransientSummon(@NotNull LivingEntity livingEntity) { + return getChunkLookupCache().contains(livingEntity); + } + + /** + * Get the tracked taming entities for a player + * If the player isn't registered this will return null + * + * @param playerUUID the target uuid of the player + * @param callOfTheWildType target type + * @return the set of tracked entities for the player, null if the player isn't registered, the set can be empty + */ + private synchronized @Nullable HashSet getTrackedEntities(@NotNull UUID playerUUID, @NotNull CallOfTheWildType callOfTheWildType) { + HashMap> playerEntityMap = getPlayerTrackedEntityMap(playerUUID); + + if(playerEntityMap == null) + return null; + + return playerEntityMap.get(callOfTheWildType); + } + + /** + * Adds an entity to our chunk lookup cache + * + * @param trackedTamingEntity target tracked taming entity + */ + private synchronized void addToChunkLookupCache(@NotNull TrackedTamingEntity trackedTamingEntity) { + getChunkLookupCache().add(trackedTamingEntity.getLivingEntity()); + } + + /** + * Removes an entity from our tracker + * This includes removal from our per-player map and our chunk lookup cache + * + * @param livingEntity target entity + */ + private void unregisterEntity(@NotNull LivingEntity livingEntity) { + chunkLookupCacheCleanup(livingEntity); + perPlayerTransientMapCleanup(livingEntity); + } + + /** + * Removes an entity from our chunk lookup cache + * + * @param livingEntity target entity + */ + private void chunkLookupCacheCleanup(@NotNull LivingEntity livingEntity) { + getChunkLookupCache().remove(livingEntity); + } + + /** + * Clean a living entity from our tracker + * Iterates over all players and their registered entities + * Doesn't do any kind of failure checking, if it doesn't find any player with a registered entity nothing bad happens or is reported + * However it should never happen like that, so maybe we could consider adding some failure to execute checking in the future + * + * @param livingEntity + */ + private void perPlayerTransientMapCleanup(@NotNull LivingEntity livingEntity) { + for(UUID uuid : getPerPlayerTransientEntityMap().keySet()) { + for(CallOfTheWildType callOfTheWildType : CallOfTheWildType.values()) { + + HashSet trackedEntities = getTrackedEntities(uuid, callOfTheWildType); + + if(trackedEntities == null) + continue; + + Iterator iterator = trackedEntities.iterator(); + while (iterator.hasNext()) { + if(iterator.next().getLivingEntity().equals(livingEntity)) { + iterator.remove(); + return; + } + } + } + } + } + + /** + * Get all transient entities that exist in a specific chunk + * + * @param chunk the chunk to match + * @return a list of transient entities that are located in the provided chunk + */ + public synchronized @NotNull List getAllTransientEntitiesInChunk(@NotNull Chunk chunk) { + ArrayList matchingEntities = new ArrayList<>(); + + for(LivingEntity livingEntity : getChunkLookupCache()) { + if(livingEntity.getLocation().getChunk().equals(chunk)) { + matchingEntities.add(livingEntity); + } + } + + return matchingEntities; + } + + /** + * Get the amount of a summon currently active for a player + * + * @param playerUUID target player + * @param callOfTheWildType summon type + * @return the amount of summons currently active for player of target type + */ + public synchronized int getAmountCurrentlySummoned(@NotNull UUID playerUUID, @NotNull CallOfTheWildType callOfTheWildType) { + HashSet trackedEntities = getTrackedEntities(playerUUID, callOfTheWildType); + + if(trackedEntities == null) + return 0; + + return trackedEntities.size(); + } + + /** + * Kills a summon and removes its metadata + * Then it removes it from the tracker / chunk lookup cache + * + * @param livingEntity entity to remove + * @param player associated player + */ + public synchronized void removeSummon(@NotNull LivingEntity livingEntity, @Nullable Player player, boolean timeExpired) { + //Kill the summon & remove it + if(livingEntity.isValid()) { + livingEntity.setHealth(0); //Should trigger entity death events + livingEntity.remove(); + + Location location = livingEntity.getLocation(); + + if (location.getWorld() != null) { + location.getWorld().playSound(location, Sound.BLOCK_FIRE_EXTINGUISH, 0.8F, 0.8F); + ParticleEffectUtils.playCallOfTheWildEffect(livingEntity); + } + + //Inform player of summon death + if(player != null && player.isOnline()) { + if(timeExpired) { + NotificationManager.sendPlayerInformationChatOnly(player, "Taming.Summon.COTW.TimeExpired", StringUtils.getPrettyEntityTypeString(livingEntity.getType())); + } else { + NotificationManager.sendPlayerInformationChatOnly(player, "Taming.Summon.COTW.Removed", StringUtils.getPrettyEntityTypeString(livingEntity.getType())); + } + } + } + + //Remove our metadata + mcMMO.getMetadataService().getMobMetadataService().removeMobFlags(livingEntity); + + //Clean from trackers + unregisterEntity(livingEntity); + } + + /** + * Remove all tracked entities from existence if they currently exist + * Clear the tracked entity lists afterwards + * + * @deprecated use {@link #cleanupAllSummons(Player, UUID)} instead + */ + @Deprecated + private void cleanupAllSummons(@NotNull UUID playerUUID) { + cleanupAllSummons(Bukkit.getPlayer(playerUUID), playerUUID); + } + + /** + * Kills and cleans up all data related to all summoned entities for a player + * + * @param player used to send messages, can be null + * @param playerUUID used to grab associated data, cannot be null + */ + private void cleanupAllSummons(@Nullable Player player, @NotNull UUID playerUUID) { + for(CallOfTheWildType callOfTheWildType : CallOfTheWildType.values()) { + HashSet trackedEntities = getTrackedEntities(playerUUID, callOfTheWildType); + + if(trackedEntities == null) { + continue; + } + + ImmutableSet immutableSet = ImmutableSet.copyOf(trackedEntities); + + for(TrackedTamingEntity trackedTamingEntity : immutableSet) { + //Remove from existence + removeSummon(trackedTamingEntity.getLivingEntity(), player, false); + } + + } + } +} diff --git a/src/main/java/com/gmail/nossr50/util/TransientMetadataTools.java b/src/main/java/com/gmail/nossr50/util/TransientMetadataTools.java new file mode 100644 index 000000000..8b21e9d1a --- /dev/null +++ b/src/main/java/com/gmail/nossr50/util/TransientMetadataTools.java @@ -0,0 +1,42 @@ +package com.gmail.nossr50.util; + +import com.gmail.nossr50.mcMMO; +import org.bukkit.entity.LivingEntity; +import org.jetbrains.annotations.NotNull; + +public class TransientMetadataTools { + private final mcMMO pluginRef; + + public TransientMetadataTools(@NotNull mcMMO pluginRef) { + this.pluginRef = pluginRef; + } + + public void cleanLivingEntityMetadata(@NotNull LivingEntity entity) { + //Since it's not written anywhere, apparently the GC won't touch objects with metadata still present on them + if (entity.hasMetadata(MetadataConstants.METADATA_KEY_CUSTOM_NAME)) { + entity.setCustomName(entity.getMetadata(MetadataConstants.METADATA_KEY_CUSTOM_NAME).get(0).asString()); + entity.removeMetadata(MetadataConstants.METADATA_KEY_CUSTOM_NAME, pluginRef); + } + + //Involved in changing mob names to hearts + if (entity.hasMetadata(MetadataConstants.METADATA_KEY_NAME_VISIBILITY)) { + entity.setCustomNameVisible(entity.getMetadata(MetadataConstants.METADATA_KEY_NAME_VISIBILITY).get(0).asBoolean()); + entity.removeMetadata(MetadataConstants.METADATA_KEY_NAME_VISIBILITY, pluginRef); + } + + //Gets assigned to endermen, potentially doesn't get cleared before this point + if(entity.hasMetadata(MetadataConstants.METADATA_KEY_TRAVELING_BLOCK)) { + entity.removeMetadata(MetadataConstants.METADATA_KEY_TRAVELING_BLOCK, pluginRef); + } + + //Cleanup mob metadata + mcMMO.getMetadataService().getMobMetadataService().removeMobFlags(entity); + + //TODO: This loop has some redundancy, this whole method needs to be rewritten + for(String key : MetadataConstants.MOB_METADATA_KEYS) { + if(entity.hasMetadata(key)) { + entity.removeMetadata(key, pluginRef); + } + } + } +} diff --git a/src/main/java/com/gmail/nossr50/util/adapter/BiomeAdapter.java b/src/main/java/com/gmail/nossr50/util/adapter/BiomeAdapter.java index 2de65c9fc..b9d19e6eb 100644 --- a/src/main/java/com/gmail/nossr50/util/adapter/BiomeAdapter.java +++ b/src/main/java/com/gmail/nossr50/util/adapter/BiomeAdapter.java @@ -10,8 +10,8 @@ public class BiomeAdapter { static { List allBiomes = Arrays.asList(Biome.values()); - List waterBiomes = new ArrayList(); - List iceBiomes = new ArrayList(); + List waterBiomes = new ArrayList<>(); + List iceBiomes = new ArrayList<>(); for (Biome biome : allBiomes) { if (isWater(biome.name()) && !isCold(biome.name())) { waterBiomes.add(biome); diff --git a/src/main/java/com/gmail/nossr50/util/blockmeta/BitSetChunkStore.java b/src/main/java/com/gmail/nossr50/util/blockmeta/BitSetChunkStore.java new file mode 100644 index 000000000..bdee4a3b9 --- /dev/null +++ b/src/main/java/com/gmail/nossr50/util/blockmeta/BitSetChunkStore.java @@ -0,0 +1,318 @@ +package com.gmail.nossr50.util.blockmeta; + +import org.bukkit.Bukkit; +import org.bukkit.World; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +import java.io.*; +import java.util.BitSet; +import java.util.UUID; + +public class BitSetChunkStore implements ChunkStore { + private static final int CURRENT_VERSION = 9; + private static final int MAGIC_NUMBER = 0xEA5EDEBB; + + private final int cx; + private final int cz; + private final int worldMin; + private final int worldMax; + private final @NotNull UUID worldUid; + // Bitset store conforms to a "bottom-up" bit ordering consisting of a stack of {worldHeight} Y planes, each Y plane consists of 16 Z rows of 16 X bits. + private final @NotNull BitSet store; + + private transient boolean dirty = false; + + public BitSetChunkStore(@NotNull World world, int cx, int cz) { + this(world.getUID(), world.getMinHeight(), world.getMaxHeight(), cx, cz); + } + + private BitSetChunkStore(@NotNull UUID worldUid, int worldMin, int worldMax, int cx, int cz) { + this.cx = cx; + this.cz = cz; + this.worldUid = worldUid; + this.worldMin = worldMin; + this.worldMax = worldMax; + this.store = new BitSet(16 * 16 * (worldMax - worldMin)); + } + + @Override + public boolean isDirty() { + return dirty; + } + + @Override + public void setDirty(boolean dirty) { + this.dirty = dirty; + } + + @Override + public int getChunkX() { + return cx; + } + + @Override + public int getChunkZ() { + return cz; + } + + @Override + public int getChunkMin() { + return worldMin; + } + + @Override + public int getChunkMax() { + return worldMax; + } + + @Override + public @NotNull UUID getWorldId() { + return worldUid; + } + + @Override + public boolean isTrue(int x, int y, int z) { + return store.get(coordToIndex(x, y, z)); + } + + @Override + public void setTrue(int x, int y, int z) { + set(x, y, z, true); + } + + @Override + public void setFalse(int x, int y, int z) { + set(x, y, z, false); + } + + @Override + public void set(int x, int y, int z, boolean value) { + store.set(coordToIndex(x, y, z), value); + dirty = true; + } + + @Override + public boolean isEmpty() { + return store.isEmpty(); + } + + private int coordToIndex(int x, int y, int z) { + return coordToIndex(x, y, z, worldMin, worldMax); + } + + private static int coordToIndex(int x, int y, int z, int worldMin, int worldMax) { + if (x < 0 || x >= 16 || y < worldMin || y >= worldMax || z < 0 || z >= 16) + throw new IndexOutOfBoundsException(String.format("x: %d y: %d z: %d World Min: %d World Max: %d", x, y, z, worldMin, worldMax)); + int yOffset = -worldMin; // Ensures y multiplier remains positive + return (z * 16 + x) + (256 * (y + yOffset)); + } + + private static int getWorldMin(@NotNull UUID worldUid) { + World world = Bukkit.getWorld(worldUid); + + // Not sure how this case could come up, but might as well handle it gracefully. Loading a chunkstore for an unloaded world? + if (world == null) + throw new RuntimeException("Cannot grab a minimum world height for an unloaded world"); + + return world.getMinHeight(); + } + + private static int getWorldMax(@NotNull UUID worldUid) + { + World world = Bukkit.getWorld(worldUid); + + // Not sure how this case could come up, but might as well handle it gracefully. Loading a chunkstore for an unloaded world? + if (world == null) + throw new RuntimeException("Cannot grab a maximum world height for an unloaded world"); + + return world.getMaxHeight(); + } + + private void serialize(@NotNull DataOutputStream out) throws IOException { + out.writeInt(MAGIC_NUMBER); + out.writeInt(CURRENT_VERSION); + + out.writeLong(worldUid.getLeastSignificantBits()); + out.writeLong(worldUid.getMostSignificantBits()); + out.writeInt(cx); + out.writeInt(cz); + out.writeInt(worldMin); + out.writeInt(worldMax); + + // Store the byte array directly so we don't have the object type info overhead + byte[] storeData = store.toByteArray(); + out.writeInt(storeData.length); + out.write(storeData); + + dirty = false; + } + + private static @NotNull BitSetChunkStore deserialize(@NotNull DataInputStream in) throws IOException { + int magic = in.readInt(); + // Can be used to determine the format of the file + int fileVersionNumber = in.readInt(); + + if (magic != MAGIC_NUMBER || fileVersionNumber < 8) + throw new IOException(); + + long lsb = in.readLong(); + long msb = in.readLong(); + UUID worldUid = new UUID(msb, lsb); + int cx = in.readInt(); + int cz = in.readInt(); + + int worldMin = 0; + if (fileVersionNumber >= 9) + worldMin = in.readInt(); + int worldMax = in.readInt(); + byte[] temp = new byte[in.readInt()]; + in.readFully(temp); + BitSet stored = BitSet.valueOf(temp); + + int currentWorldMin = getWorldMin(worldUid); + int currentWorldMax = getWorldMax(worldUid); + + // The order in which the world height update code occurs here is important, the world max truncate math only holds up if done before adjusting for min changes + // Lop off extra data if world max has shrunk + if (currentWorldMax < worldMax) + stored.clear(coordToIndex(16, currentWorldMax, 16, worldMin, worldMax), stored.length()); + // Left shift store if world min has shrunk + if (currentWorldMin > worldMin) + stored = stored.get(currentWorldMin, stored.length()); // Because BitSet's aren't fixed size, a "substring" operation is equivalent to a left shift + // Right shift store if world min has expanded + if (currentWorldMin < worldMin) + { + int offset = (worldMin - currentWorldMin) * 16 * 16; // We are adding this many bits to the front + // This isn't the most efficient way to do this, however, its a rare case to occur, and in the grand scheme of things, the small performance we could gain would cost us significant reduced readability of the code + BitSet shifted = new BitSet(); + for (int i = 0; i < stored.length(); i++) + shifted.set(i + offset, stored.get(i)); + stored = shifted; + } + + BitSetChunkStore chunkStore = new BitSetChunkStore(worldUid, currentWorldMin, currentWorldMax, cx, cz); + chunkStore.store.or(stored); + chunkStore.dirty = currentWorldMin != worldMin || currentWorldMax != worldMax; + + return chunkStore; + } + + public static class Serialization { + + public static final short STREAM_MAGIC = (short)0xACDC; // Rock on + + public static @Nullable ChunkStore readChunkStore(@NotNull DataInputStream inputStream) throws IOException { + if (inputStream.markSupported()) + inputStream.mark(2); + short magicNumber = inputStream.readShort(); + + if (magicNumber == ObjectStreamConstants.STREAM_MAGIC) // Java serializable, use legacy serialization + { + // "Un-read" the magic number for Serializables, they need it to still be in the stream + if (inputStream.markSupported()) + inputStream.reset(); // Pretend we never read those bytes + else + { + // Creates a new stream with the two magic number bytes and then the rest of the original stream... Java is so dumb. I just wanted to look at two bytes. + PushbackInputStream pushbackInputStream = new PushbackInputStream(inputStream, 2); + pushbackInputStream.unread((magicNumber) & 0xFF); + pushbackInputStream.unread((magicNumber >>> 8) & 0xFF); + inputStream = new DataInputStream(pushbackInputStream); + } + return new LegacyDeserializationInputStream(inputStream).readLegacyChunkStore(); + } + else if (magicNumber == STREAM_MAGIC) // Pure bytes format + { + return BitSetChunkStore.deserialize(inputStream); + } + throw new IOException("Bad Data Format"); + } + + public static void writeChunkStore(@NotNull DataOutputStream outputStream, @NotNull ChunkStore chunkStore) throws IOException { + if (!(chunkStore instanceof BitSetChunkStore)) + throw new InvalidClassException("ChunkStore must be instance of BitSetChunkStore"); + outputStream.writeShort(STREAM_MAGIC); + ((BitSetChunkStore)chunkStore).serialize(outputStream); + } + + // Handles loading the old serialized class + private static class LegacyDeserializationInputStream extends ObjectInputStream { + private static class LegacyChunkStoreDeserializer implements Serializable + { + private static final long serialVersionUID = -1L; + + private int cx; + private int cz; + private int worldMax; + private UUID worldUid; + private boolean[][][] store; + + private LegacyChunkStoreDeserializer() {} + + @Deprecated + private void writeObject(@NotNull ObjectOutputStream out) throws IOException { + throw new UnsupportedOperationException("You goofed."); + } + + @Deprecated + private void readObject(@NotNull ObjectInputStream in) throws IOException, ClassNotFoundException { + in.readInt(); // Magic number + in.readInt(); // Format version + long lsb = in.readLong(); + long msb = in.readLong(); + + worldUid = new UUID(msb, lsb); + cx = in.readInt(); + cz = in.readInt(); + + store = (boolean[][][]) in.readObject(); + worldMax = store[0][0].length; + } + + public @NotNull BitSetChunkStore convert() + { + int currentWorldMin = getWorldMin(worldUid); + int currentWorldMax = getWorldMax(worldUid); + + BitSetChunkStore converted = new BitSetChunkStore(worldUid, currentWorldMin, currentWorldMax, cx, cz); + + // Read old data into new chunkstore + for (int x = 0; x < 16; x++) { + for (int z = 0; z < 16; z++) { + for (int y = 0; y < worldMax && y < currentWorldMax; y++) { + converted.store.set(converted.coordToIndex(x, y, z), store[x][z][y]); + } + } + } + // Mark dirty so it will be re-written in new format on close + converted.dirty = true; + return converted; + } + } + + + public LegacyDeserializationInputStream(@NotNull InputStream in) throws IOException { + super(in); + enableResolveObject(true); + } + + @Override + protected @NotNull ObjectStreamClass readClassDescriptor() throws IOException, ClassNotFoundException { + ObjectStreamClass read = super.readClassDescriptor(); + if (read.getName().contentEquals("com.gmail.nossr50.util.blockmeta.chunkmeta.PrimitiveChunkStore")) + return ObjectStreamClass.lookup(LegacyChunkStoreDeserializer.class); + return read; + } + + public @Nullable ChunkStore readLegacyChunkStore(){ + try { + LegacyChunkStoreDeserializer deserializer = (LegacyChunkStoreDeserializer)readObject(); + return deserializer.convert(); + } catch (IOException | ClassNotFoundException e) { + return null; + } + } + } + } +} diff --git a/src/main/java/com/gmail/nossr50/util/blockmeta/ChunkManager.java b/src/main/java/com/gmail/nossr50/util/blockmeta/ChunkManager.java new file mode 100644 index 000000000..a0b61ba6f --- /dev/null +++ b/src/main/java/com/gmail/nossr50/util/blockmeta/ChunkManager.java @@ -0,0 +1,10 @@ +package com.gmail.nossr50.util.blockmeta; + +import org.bukkit.World; +import org.jetbrains.annotations.NotNull; + +public interface ChunkManager extends UserBlockTracker { + void closeAll(); + void chunkUnloaded(int cx, int cz, @NotNull World world); + void unloadWorld(@NotNull World world); +} diff --git a/src/main/java/com/gmail/nossr50/util/blockmeta/ChunkManagerFactory.java b/src/main/java/com/gmail/nossr50/util/blockmeta/ChunkManagerFactory.java new file mode 100644 index 000000000..a1e61fd5c --- /dev/null +++ b/src/main/java/com/gmail/nossr50/util/blockmeta/ChunkManagerFactory.java @@ -0,0 +1,15 @@ +package com.gmail.nossr50.util.blockmeta; + +import com.gmail.nossr50.config.PersistentDataConfig; +import org.jetbrains.annotations.NotNull; + +public class ChunkManagerFactory { + public static @NotNull ChunkManager getChunkManager() { + + if (PersistentDataConfig.getInstance().useBlockTracker()) { + return new HashChunkManager(); + } + + return new NullChunkManager(); + } +} diff --git a/src/main/java/com/gmail/nossr50/util/blockmeta/chunkmeta/ChunkStore.java b/src/main/java/com/gmail/nossr50/util/blockmeta/ChunkStore.java old mode 100755 new mode 100644 similarity index 65% rename from src/main/java/com/gmail/nossr50/util/blockmeta/chunkmeta/ChunkStore.java rename to src/main/java/com/gmail/nossr50/util/blockmeta/ChunkStore.java index d4f585f9a..632cde2e2 --- a/src/main/java/com/gmail/nossr50/util/blockmeta/chunkmeta/ChunkStore.java +++ b/src/main/java/com/gmail/nossr50/util/blockmeta/ChunkStore.java @@ -1,40 +1,45 @@ -package com.gmail.nossr50.util.blockmeta.chunkmeta; +package com.gmail.nossr50.util.blockmeta; -import com.gmail.nossr50.util.blockmeta.ChunkletStore; +import org.jetbrains.annotations.NotNull; -import java.io.Serializable; +import java.util.UUID; /** * A ChunkStore should be responsible for a 16x16xWorldHeight area of data */ -public interface ChunkStore extends Serializable { +public interface ChunkStore { /** * Checks the chunk's save state * * @return true if the has been modified since it was last saved */ - public boolean isDirty(); + boolean isDirty(); /** * Checks the chunk's save state * * @param dirty the save state of the current chunk */ - public void setDirty(boolean dirty); + void setDirty(boolean dirty); /** * Checks the chunk's x coordinate * * @return the chunk's x coordinate. */ - public int getChunkX(); + int getChunkX(); /** * Checks the chunk's z coordinate * * @return the chunk's z coordinate. */ - public int getChunkZ(); + int getChunkZ(); + + int getChunkMin(); + int getChunkMax(); + + @NotNull UUID getWorldId(); /** * Checks the value at the given coordinates @@ -44,7 +49,7 @@ public interface ChunkStore extends Serializable { * @param z z coordinate in current chunklet * @return true if the value is true at the given coordinates, false if otherwise */ - public boolean isTrue(int x, int y, int z); + boolean isTrue(int x, int y, int z); /** * Set the value to true at the given coordinates @@ -53,7 +58,7 @@ public interface ChunkStore extends Serializable { * @param y y coordinate in current chunklet * @param z z coordinate in current chunklet */ - public void setTrue(int x, int y, int z); + void setTrue(int x, int y, int z); /** * Set the value to false at the given coordinates @@ -62,17 +67,20 @@ public interface ChunkStore extends Serializable { * @param y y coordinate in current chunklet * @param z z coordinate in current chunklet */ - public void setFalse(int x, int y, int z); + void setFalse(int x, int y, int z); + + /** + * Set the value at the given coordinates + * + * @param x x coordinate in current chunklet + * @param y y coordinate in current chunklet + * @param z z coordinate in current chunklet + * @param value value to set + */ + void set(int x, int y, int z, boolean value); /** * @return true if all values in the chunklet are false, false if otherwise */ - public boolean isEmpty(); - - /** - * Set all values in this ChunkletStore to the values from another provided ChunkletStore - * - * @param otherStore Another ChunkletStore that this one should copy all data from - */ - public void copyFrom(ChunkletStore otherStore); + boolean isEmpty(); } diff --git a/src/main/java/com/gmail/nossr50/util/blockmeta/ChunkletManager.java b/src/main/java/com/gmail/nossr50/util/blockmeta/ChunkletManager.java deleted file mode 100755 index e3e3d0b2e..000000000 --- a/src/main/java/com/gmail/nossr50/util/blockmeta/ChunkletManager.java +++ /dev/null @@ -1,151 +0,0 @@ -package com.gmail.nossr50.util.blockmeta; - -import org.bukkit.World; -import org.bukkit.block.Block; - -public interface ChunkletManager { - /** - * Loads a specific chunklet - * - * @param cx Chunklet X coordinate that needs to be loaded - * @param cy Chunklet Y coordinate that needs to be loaded - * @param cz Chunklet Z coordinate that needs to be loaded - * @param world World that the chunklet needs to be loaded in - */ - public void loadChunklet(int cx, int cy, int cz, World world); - - /** - * Unload a specific chunklet - * - * @param cx Chunklet X coordinate that needs to be unloaded - * @param cy Chunklet Y coordinate that needs to be unloaded - * @param cz Chunklet Z coordinate that needs to be unloaded - * @param world World that the chunklet needs to be unloaded from - */ - public void unloadChunklet(int cx, int cy, int cz, World world); - - /** - * Load a given Chunk's Chunklet data - * - * @param cx Chunk X coordinate that is to be loaded - * @param cz Chunk Z coordinate that is to be loaded - * @param world World that the Chunk is in - */ - public void loadChunk(int cx, int cz, World world); - - /** - * Unload a given Chunk's Chunklet data - * - * @param cx Chunk X coordinate that is to be unloaded - * @param cz Chunk Z coordinate that is to be unloaded - * @param world World that the Chunk is in - */ - public void unloadChunk(int cx, int cz, World world); - - /** - * Informs the ChunkletManager a chunk is loaded - * - * @param cx Chunk X coordinate that is loaded - * @param cz Chunk Z coordinate that is loaded - * @param world World that the chunk was loaded in - */ - public void chunkLoaded(int cx, int cz, World world); - - /** - * Informs the ChunkletManager a chunk is unloaded - * - * @param cx Chunk X coordinate that is unloaded - * @param cz Chunk Z coordinate that is unloaded - * @param world World that the chunk was unloaded in - */ - public void chunkUnloaded(int cx, int cz, World world); - - /** - * Save all ChunkletStores related to the given world - * - * @param world World to save - */ - public void saveWorld(World world); - - /** - * Unload all ChunkletStores from memory related to the given world after saving them - * - * @param world World to unload - */ - public void unloadWorld(World world); - - /** - * Load all ChunkletStores from all loaded chunks from this world into memory - * - * @param world World to load - */ - public void loadWorld(World world); - - /** - * Save all ChunkletStores - */ - public void saveAll(); - - /** - * Unload all ChunkletStores after saving them - */ - public void unloadAll(); - - /** - * Check to see if a given location is set to true - * - * @param x X coordinate to check - * @param y Y coordinate to check - * @param z Z coordinate to check - * @param world World to check in - * @return true if the given location is set to true, false if otherwise - */ - public boolean isTrue(int x, int y, int z, World world); - - /** - * Check to see if a given block location is set to true - * - * @param block Block location to check - * @return true if the given block location is set to true, false if otherwise - */ - public boolean isTrue(Block block); - - /** - * Set a given location to true, should create stores as necessary if the location does not exist - * - * @param x X coordinate to set - * @param y Y coordinate to set - * @param z Z coordinate to set - * @param world World to set in - */ - public void setTrue(int x, int y, int z, World world); - - /** - * Set a given block location to true, should create stores as necessary if the location does not exist - * - * @param block Block location to set - */ - public void setTrue(Block block); - - /** - * Set a given location to false, should not create stores if one does not exist for the given location - * - * @param x X coordinate to set - * @param y Y coordinate to set - * @param z Z coordinate to set - * @param world World to set in - */ - public void setFalse(int x, int y, int z, World world); - - /** - * Set a given block location to false, should not create stores if one does not exist for the given location - * - * @param block Block location to set - */ - public void setFalse(Block block); - - /** - * Delete any ChunkletStores that are empty - */ - public void cleanUp(); -} diff --git a/src/main/java/com/gmail/nossr50/util/blockmeta/ChunkletManagerFactory.java b/src/main/java/com/gmail/nossr50/util/blockmeta/ChunkletManagerFactory.java deleted file mode 100755 index 39f8732d3..000000000 --- a/src/main/java/com/gmail/nossr50/util/blockmeta/ChunkletManagerFactory.java +++ /dev/null @@ -1,15 +0,0 @@ -package com.gmail.nossr50.util.blockmeta; - -import com.gmail.nossr50.config.HiddenConfig; - -public class ChunkletManagerFactory { - public static ChunkletManager getChunkletManager() { - HiddenConfig hConfig = HiddenConfig.getInstance(); - - if (hConfig.getChunkletsEnabled()) { - return new HashChunkletManager(); - } - - return new NullChunkletManager(); - } -} diff --git a/src/main/java/com/gmail/nossr50/util/blockmeta/ChunkletStore.java b/src/main/java/com/gmail/nossr50/util/blockmeta/ChunkletStore.java deleted file mode 100755 index 5514df13c..000000000 --- a/src/main/java/com/gmail/nossr50/util/blockmeta/ChunkletStore.java +++ /dev/null @@ -1,48 +0,0 @@ -package com.gmail.nossr50.util.blockmeta; - -import java.io.Serializable; - -/** - * A ChunkletStore should be responsible for a 16x16x64 area of data - */ -public interface ChunkletStore extends Serializable { - /** - * Checks the value at the given coordinates - * - * @param x x coordinate in current chunklet - * @param y y coordinate in current chunklet - * @param z z coordinate in current chunklet - * @return true if the value is true at the given coordinates, false if otherwise - */ - public boolean isTrue(int x, int y, int z); - - /** - * Set the value to true at the given coordinates - * - * @param x x coordinate in current chunklet - * @param y y coordinate in current chunklet - * @param z z coordinate in current chunklet - */ - public void setTrue(int x, int y, int z); - - /** - * Set the value to false at the given coordinates - * - * @param x x coordinate in current chunklet - * @param y y coordinate in current chunklet - * @param z z coordinate in current chunklet - */ - public void setFalse(int x, int y, int z); - - /** - * @return true if all values in the chunklet are false, false if otherwise - */ - public boolean isEmpty(); - - /** - * Set all values in this ChunkletStore to the values from another provided ChunkletStore - * - * @param otherStore Another ChunkletStore that this one should copy all data from - */ - public void copyFrom(ChunkletStore otherStore); -} diff --git a/src/main/java/com/gmail/nossr50/util/blockmeta/ChunkletStoreFactory.java b/src/main/java/com/gmail/nossr50/util/blockmeta/ChunkletStoreFactory.java deleted file mode 100755 index 1fb4a315a..000000000 --- a/src/main/java/com/gmail/nossr50/util/blockmeta/ChunkletStoreFactory.java +++ /dev/null @@ -1,8 +0,0 @@ -package com.gmail.nossr50.util.blockmeta; - -public class ChunkletStoreFactory { - protected static ChunkletStore getChunkletStore() { - // TODO: Add in loading from config what type of store we want. - return new PrimitiveExChunkletStore(); - } -} diff --git a/src/main/java/com/gmail/nossr50/util/blockmeta/HashChunkManager.java b/src/main/java/com/gmail/nossr50/util/blockmeta/HashChunkManager.java new file mode 100644 index 000000000..5f38022d5 --- /dev/null +++ b/src/main/java/com/gmail/nossr50/util/blockmeta/HashChunkManager.java @@ -0,0 +1,284 @@ +package com.gmail.nossr50.util.blockmeta; + +import org.bukkit.Bukkit; +import org.bukkit.World; +import org.bukkit.block.Block; +import org.bukkit.block.BlockState; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +import java.io.DataInputStream; +import java.io.DataOutputStream; +import java.io.File; +import java.io.IOException; +import java.util.*; + +public class HashChunkManager implements ChunkManager { + private final HashMap regionMap = new HashMap<>(); // Tracks active regions + private final HashMap> chunkUsageMap = new HashMap<>(); // Tracks active chunks by region + private final HashMap chunkMap = new HashMap<>(); // Tracks active chunks + + @Override + public synchronized void closeAll() { + // Save all dirty chunkstores + for (ChunkStore chunkStore : chunkMap.values()) + { + if (!chunkStore.isDirty()) + continue; + World world = Bukkit.getWorld(chunkStore.getWorldId()); + if (world == null) + continue; // Oh well + writeChunkStore(world, chunkStore); + } + // Clear in memory chunks + chunkMap.clear(); + chunkUsageMap.clear(); + // Close all region files + for (McMMOSimpleRegionFile rf : regionMap.values()) + rf.close(); + regionMap.clear(); + } + + private synchronized @Nullable ChunkStore readChunkStore(@NotNull World world, int cx, int cz) throws IOException { + McMMOSimpleRegionFile rf = getReadableSimpleRegionFile(world, cx, cz); + if (rf == null) + return null; // If there is no region file, there can't be a chunk + try (DataInputStream in = rf.getInputStream(cx, cz)) { // Get input stream for chunk + if (in == null) + return null; // No chunk + return BitSetChunkStore.Serialization.readChunkStore(in); // Read in the chunkstore + } + } + + private synchronized void writeChunkStore(@NotNull World world, @NotNull ChunkStore data) { + if (!data.isDirty()) + return; // Don't save unchanged data + try { + McMMOSimpleRegionFile rf = getWriteableSimpleRegionFile(world, data.getChunkX(), data.getChunkZ()); + try (DataOutputStream out = rf.getOutputStream(data.getChunkX(), data.getChunkZ())) { + BitSetChunkStore.Serialization.writeChunkStore(out, data); + } + data.setDirty(false); + } + catch (IOException e) { + throw new RuntimeException("Unable to write chunk meta data for " + data.getChunkX() + ", " + data.getChunkZ(), e); + } + } + + private synchronized @NotNull McMMOSimpleRegionFile getWriteableSimpleRegionFile(@NotNull World world, int cx, int cz) { + CoordinateKey regionKey = toRegionKey(world.getUID(), cx, cz); + + return regionMap.computeIfAbsent(regionKey, k -> { + File regionFile = getRegionFile(world, regionKey); + regionFile.getParentFile().mkdirs(); + return new McMMOSimpleRegionFile(regionFile, regionKey.x, regionKey.z); + }); + } + + private synchronized @Nullable McMMOSimpleRegionFile getReadableSimpleRegionFile(@NotNull World world, int cx, int cz) { + CoordinateKey regionKey = toRegionKey(world.getUID(), cx, cz); + + return regionMap.computeIfAbsent(regionKey, k -> { + File regionFile = getRegionFile(world, regionKey); + if (!regionFile.exists()) + return null; // Don't create the file on read-only operations + return new McMMOSimpleRegionFile(regionFile, regionKey.x, regionKey.z); + }); + } + + private @NotNull File getRegionFile(@NotNull World world, @NotNull CoordinateKey regionKey) { + if (world.getUID() != regionKey.worldID) + throw new IllegalArgumentException(); + return new File(new File(world.getWorldFolder(), "mcmmo_regions"), "mcmmo_" + regionKey.x + "_" + regionKey.z + "_.mcm"); + } + + private @Nullable ChunkStore loadChunk(int cx, int cz, @NotNull World world) { + try { + return readChunkStore(world, cx, cz); + } + catch (Exception ignored) {} + + return null; + } + + private void unloadChunk(int cx, int cz, @NotNull World world) { + CoordinateKey chunkKey = toChunkKey(world.getUID(), cx, cz); + ChunkStore chunkStore = chunkMap.remove(chunkKey); // Remove from chunk map + if (chunkStore == null) + return; + + if (chunkStore.isDirty()) + writeChunkStore(world, chunkStore); + + CoordinateKey regionKey = toRegionKey(world.getUID(), cx, cz); + HashSet chunkKeys = chunkUsageMap.get(regionKey); + chunkKeys.remove(chunkKey); // remove from region file in-use set + if (chunkKeys.isEmpty()) // If it was last chunk in region, close the region file and remove it from memory + { + chunkUsageMap.remove(regionKey); + regionMap.remove(regionKey).close(); + } + } + + @Override + public synchronized void chunkUnloaded(int cx, int cz, @NotNull World world) { + unloadChunk(cx, cz, world); + } + + @Override + public synchronized void unloadWorld(@NotNull World world) { + UUID wID = world.getUID(); + + // Save and remove all the chunks + List chunkKeys = new ArrayList<>(chunkMap.keySet()); + for (CoordinateKey chunkKey : chunkKeys) { + if (!wID.equals(chunkKey.worldID)) + continue; + ChunkStore chunkStore = chunkMap.remove(chunkKey); + if (!chunkStore.isDirty()) + continue; + try { + writeChunkStore(world, chunkStore); + } + catch (Exception ignore) { } + } + // Clear all the region files + List regionKeys = new ArrayList<>(regionMap.keySet()); + for (CoordinateKey regionKey : regionKeys) { + if (!wID.equals(regionKey.worldID)) + continue; + regionMap.remove(regionKey).close(); + chunkUsageMap.remove(regionKey); + } + } + + private synchronized boolean isTrue(int x, int y, int z, @NotNull World world) { + CoordinateKey chunkKey = blockCoordinateToChunkKey(world.getUID(), x, y, z); + + // Get chunk, load from file if necessary + // Get/Load/Create chunkstore + ChunkStore check = chunkMap.computeIfAbsent(chunkKey, k -> { + // Load from file + ChunkStore loaded = loadChunk(chunkKey.x, chunkKey.z, world); + if (loaded == null) + return null; + // Mark chunk in-use for region tracking + chunkUsageMap.computeIfAbsent(toRegionKey(chunkKey.worldID, chunkKey.x, chunkKey.z), j -> new HashSet<>()).add(chunkKey); + return loaded; + }); + + // No chunk, return false + if (check == null) + return false; + + int ix = Math.abs(x) % 16; + int iz = Math.abs(z) % 16; + + return check.isTrue(ix, y, iz); + } + + @Override + public synchronized boolean isTrue(@NotNull Block block) { + return isTrue(block.getX(), block.getY(), block.getZ(), block.getWorld()); + } + + @Override + public synchronized boolean isTrue(@NotNull BlockState blockState) { + return isTrue(blockState.getX(), blockState.getY(), blockState.getZ(), blockState.getWorld()); + } + + @Override + public synchronized void setTrue(@NotNull Block block) { + set(block.getX(), block.getY(), block.getZ(), block.getWorld(), true); + } + + @Override + public synchronized void setTrue(@NotNull BlockState blockState) { + set(blockState.getX(), blockState.getY(), blockState.getZ(), blockState.getWorld(), true); + } + + @Override + public synchronized void setFalse(@NotNull Block block) { + set(block.getX(), block.getY(), block.getZ(), block.getWorld(), false); + } + + @Override + public synchronized void setFalse(@NotNull BlockState blockState) { + set(blockState.getX(), blockState.getY(), blockState.getZ(), blockState.getWorld(), false); + } + + private synchronized void set(int x, int y, int z, @NotNull World world, boolean value){ + CoordinateKey chunkKey = blockCoordinateToChunkKey(world.getUID(), x, y, z); + + // Get/Load/Create chunkstore + ChunkStore cStore = chunkMap.computeIfAbsent(chunkKey, k -> { + // Load from file + ChunkStore loaded = loadChunk(chunkKey.x, chunkKey.z, world); + if (loaded != null) + { + chunkUsageMap.computeIfAbsent(toRegionKey(chunkKey.worldID, chunkKey.x, chunkKey.z), j -> new HashSet<>()).add(chunkKey); + return loaded; + } + // If setting to false, no need to create an empty chunkstore + if (!value) + return null; + // Mark chunk in-use for region tracking + chunkUsageMap.computeIfAbsent(toRegionKey(chunkKey.worldID, chunkKey.x, chunkKey.z), j -> new HashSet<>()).add(chunkKey); + // Create a new chunkstore + return new BitSetChunkStore(world, chunkKey.x, chunkKey.z); + }); + + // Indicates setting false on empty chunkstore + if (cStore == null) + return; + + // Get block offset (offset from chunk corner) + int ix = Math.abs(x) % 16; + int iz = Math.abs(z) % 16; + + // Set chunk store value + cStore.set(ix, y, iz, value); + } + + private @NotNull CoordinateKey blockCoordinateToChunkKey(@NotNull UUID worldUid, int x, int y, int z) { + return toChunkKey(worldUid, x >> 4, z >> 4); + } + + private @NotNull CoordinateKey toChunkKey(@NotNull UUID worldUid, int cx, int cz){ + return new CoordinateKey(worldUid, cx, cz); + } + + private @NotNull CoordinateKey toRegionKey(@NotNull UUID worldUid, int cx, int cz) { + // Compute region index (32x32 chunk regions) + int rx = cx >> 5; + int rz = cz >> 5; + return new CoordinateKey(worldUid, rx, rz); + } + + private static final class CoordinateKey { + public final @NotNull UUID worldID; + public final int x; + public final int z; + + private CoordinateKey(@NotNull UUID worldID, int x, int z) { + this.worldID = worldID; + this.x = x; + this.z = z; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + CoordinateKey coordinateKey = (CoordinateKey) o; + return x == coordinateKey.x && + z == coordinateKey.z && + worldID.equals(coordinateKey.worldID); + } + + @Override + public int hashCode() { + return Objects.hash(worldID, x, z); + } + } +} diff --git a/src/main/java/com/gmail/nossr50/util/blockmeta/HashChunkletManager.java b/src/main/java/com/gmail/nossr50/util/blockmeta/HashChunkletManager.java deleted file mode 100755 index f591cdafa..000000000 --- a/src/main/java/com/gmail/nossr50/util/blockmeta/HashChunkletManager.java +++ /dev/null @@ -1,410 +0,0 @@ -package com.gmail.nossr50.util.blockmeta; - -import com.gmail.nossr50.mcMMO; -import org.bukkit.World; -import org.bukkit.block.Block; - -import java.io.*; -import java.util.HashMap; - -public class HashChunkletManager implements ChunkletManager { - public HashMap store = new HashMap(); - - @Override - public void loadChunklet(int cx, int cy, int cz, World world) { - File dataDir = new File(world.getWorldFolder(), "mcmmo_data"); - File cxDir = new File(dataDir, "" + cx); - if (!cxDir.exists()) { - return; - } - File czDir = new File(cxDir, "" + cz); - if (!czDir.exists()) { - return; - } - File yFile = new File(czDir, "" + cy); - if (!yFile.exists()) { - return; - } - - ChunkletStore in = deserializeChunkletStore(yFile); - if (in != null) { - store.put(world.getName() + "," + cx + "," + cz + "," + cy, in); - } - } - - @Override - public void unloadChunklet(int cx, int cy, int cz, World world) { - File dataDir = new File(world.getWorldFolder(), "mcmmo_data"); - if (store.containsKey(world.getName() + "," + cx + "," + cz + "," + cy)) { - File cxDir = new File(dataDir, "" + cx); - if (!cxDir.exists()) { - cxDir.mkdir(); - } - File czDir = new File(cxDir, "" + cz); - if (!czDir.exists()) { - czDir.mkdir(); - } - File yFile = new File(czDir, "" + cy); - - ChunkletStore out = store.get(world.getName() + "," + cx + "," + cz + "," + cy); - serializeChunkletStore(out, yFile); - store.remove(world.getName() + "," + cx + "," + cz + "," + cy); - } - } - - @Override - public void loadChunk(int cx, int cz, World world) { - File dataDir = new File(world.getWorldFolder(), "mcmmo_data"); - File cxDir = new File(dataDir, "" + cx); - if (!cxDir.exists()) { - return; - } - File czDir = new File(cxDir, "" + cz); - if (!czDir.exists()) { - return; - } - - for (int y = 0; y < 4; y++) { - File yFile = new File(czDir, "" + y); - if (!yFile.exists()) { - continue; - } - - ChunkletStore in = deserializeChunkletStore(yFile); - if (in != null) { - store.put(world.getName() + "," + cx + "," + cz + "," + y, in); - } - } - } - - @Override - public void unloadChunk(int cx, int cz, World world) { - File dataDir = new File(world.getWorldFolder(), "mcmmo_data"); - - for (int y = 0; y < 4; y++) { - if (store.containsKey(world.getName() + "," + cx + "," + cz + "," + y)) { - File cxDir = new File(dataDir, "" + cx); - if (!cxDir.exists()) { - cxDir.mkdir(); - } - File czDir = new File(cxDir, "" + cz); - if (!czDir.exists()) { - czDir.mkdir(); - } - File yFile = new File(czDir, "" + y); - - ChunkletStore out = store.get(world.getName() + "," + cx + "," + cz + "," + y); - serializeChunkletStore(out, yFile); - store.remove(world.getName() + "," + cx + "," + cz + "," + y); - } - } - } - - @Override - public void chunkLoaded(int cx, int cz, World world) { - //loadChunk(cx, cz, world); - } - - @Override - public void chunkUnloaded(int cx, int cz, World world) { - unloadChunk(cx, cx, world); - } - - @Override - public void saveWorld(World world) { - String worldName = world.getName(); - File dataDir = new File(world.getWorldFolder(), "mcmmo_data"); - if (!dataDir.exists()) { - dataDir.mkdirs(); - } - - for (String key : store.keySet()) { - String[] info = key.split(","); - if (worldName.equals(info[0])) { - File cxDir = new File(dataDir, "" + info[1]); - if (!cxDir.exists()) { - cxDir.mkdir(); - } - File czDir = new File(cxDir, "" + info[2]); - if (!czDir.exists()) { - czDir.mkdir(); - } - - File yFile = new File(czDir, "" + info[3]); - serializeChunkletStore(store.get(key), yFile); - } - } - } - - @Override - public void unloadWorld(World world) { - saveWorld(world); - - String worldName = world.getName(); - - for (String key : store.keySet()) { - String tempWorldName = key.split(",")[0]; - if (tempWorldName.equals(worldName)) { - store.remove(key); - return; - } - } - } - - @Override - public void loadWorld(World world) { - //for (Chunk chunk : world.getLoadedChunks()) { - // this.chunkLoaded(chunk.getX(), chunk.getZ(), world); - //} - } - - @Override - public void saveAll() { - for (World world : mcMMO.p.getServer().getWorlds()) { - saveWorld(world); - } - } - - @Override - public void unloadAll() { - saveAll(); - for (World world : mcMMO.p.getServer().getWorlds()) { - unloadWorld(world); - } - } - - @Override - public boolean isTrue(int x, int y, int z, World world) { - int cx = x >> 4; - int cz = z >> 4; - int cy = y >> 6; - - String key = world.getName() + "," + cx + "," + cz + "," + cy; - - if (!store.containsKey(key)) { - loadChunklet(cx, cy, cz, world); - } - - if (!store.containsKey(key)) { - return false; - } - - ChunkletStore check = store.get(world.getName() + "," + cx + "," + cz + "," + cy); - int ix = Math.abs(x) % 16; - int iz = Math.abs(z) % 16; - int iy = Math.abs(y) % 64; - - return check.isTrue(ix, iy, iz); - } - - @Override - public boolean isTrue(Block block) { - return isTrue(block.getX(), block.getY(), block.getZ(), block.getWorld()); - } - - @Override - public void setTrue(int x, int y, int z, World world) { - int cx = x >> 4; - int cz = z >> 4; - int cy = y >> 6; - - int ix = Math.abs(x) % 16; - int iz = Math.abs(z) % 16; - int iy = Math.abs(y) % 64; - - String key = world.getName() + "," + cx + "," + cz + "," + cy; - - if (!store.containsKey(key)) { - loadChunklet(cx, cy, cz, world); - } - - ChunkletStore cStore = store.get(key); - - if (cStore == null) { - cStore = ChunkletStoreFactory.getChunkletStore(); - - store.put(world.getName() + "," + cx + "," + cz + "," + cy, cStore); - } - - cStore.setTrue(ix, iy, iz); - } - - @Override - public void setTrue(Block block) { - setTrue(block.getX(), block.getY(), block.getZ(), block.getWorld()); - } - - @Override - public void setFalse(int x, int y, int z, World world) { - int cx = x >> 4; - int cz = z >> 4; - int cy = y >> 6; - - int ix = Math.abs(x) % 16; - int iz = Math.abs(z) % 16; - int iy = Math.abs(y) % 64; - - String key = world.getName() + "," + cx + "," + cz + "," + cy; - - if (!store.containsKey(key)) { - loadChunklet(cx, cy, cz, world); - } - - ChunkletStore cStore = store.get(key); - - if (cStore == null) { - return; // No need to make a store for something we will be setting to false - } - - cStore.setFalse(ix, iy, iz); - } - - @Override - public void setFalse(Block block) { - setFalse(block.getX(), block.getY(), block.getZ(), block.getWorld()); - } - - @Override - public void cleanUp() { - for (String key : store.keySet()) { - if (store.get(key).isEmpty()) { - String[] info = key.split(","); - File dataDir = new File(mcMMO.p.getServer().getWorld(info[0]).getWorldFolder(), "mcmmo_data"); - - File cxDir = new File(dataDir, "" + info[1]); - if (!cxDir.exists()) { - continue; - } - File czDir = new File(cxDir, "" + info[2]); - if (!czDir.exists()) { - continue; - } - - File yFile = new File(czDir, "" + info[3]); - yFile.delete(); - - // Delete empty directories - if (czDir.list().length == 0) { - czDir.delete(); - } - if (cxDir.list().length == 0) { - cxDir.delete(); - } - } - } - } - - /** - * @param cStore ChunkletStore to save - * @param location Where on the disk to put it - */ - private void serializeChunkletStore(ChunkletStore cStore, File location) { - FileOutputStream fileOut = null; - ObjectOutputStream objOut = null; - - try { - if (!location.exists()) { - location.createNewFile(); - } - fileOut = new FileOutputStream(location); - objOut = new ObjectOutputStream(fileOut); - objOut.writeObject(cStore); - } - catch (IOException ex) { - ex.printStackTrace(); - } - finally { - if (objOut != null) { - try { - objOut.flush(); - objOut.close(); - } - catch (IOException ex) { - ex.printStackTrace(); - } - } - - if (fileOut != null) { - try { - fileOut.close(); - } - catch (IOException ex) { - ex.printStackTrace(); - } - } - } - } - - /** - * @param location Where on the disk to read from - * @return ChunkletStore from the specified location - */ - private ChunkletStore deserializeChunkletStore(File location) { - ChunkletStore storeIn = null; - FileInputStream fileIn = null; - ObjectInputStream objIn = null; - - try { - fileIn = new FileInputStream(location); - objIn = new ObjectInputStream(fileIn); - storeIn = (ChunkletStore) objIn.readObject(); - } - catch (IOException ex) { - if (ex instanceof EOFException) { - // EOF should only happen on Chunklets that somehow have been corrupted. - //mcMMO.p.getLogger().severe("Chunklet data at " + location.toString() + " could not be read due to an EOFException, data in this area will be lost."); - return ChunkletStoreFactory.getChunkletStore(); - } - else if (ex instanceof StreamCorruptedException) { - // StreamCorrupted happens when the Chunklet is no good. - //mcMMO.p.getLogger().severe("Chunklet data at " + location.toString() + " is corrupted, data in this area will be lost."); - return ChunkletStoreFactory.getChunkletStore(); - } - else if (ex instanceof UTFDataFormatException) { - // UTF happens when the Chunklet cannot be read or is corrupted - //mcMMO.p.getLogger().severe("Chunklet data at " + location.toString() + " could not be read due to an UTFDataFormatException, data in this area will be lost."); - return ChunkletStoreFactory.getChunkletStore(); - } - - ex.printStackTrace(); - } - catch (ClassNotFoundException ex) { - ex.printStackTrace(); - } - finally { - if (objIn != null) { - try { - objIn.close(); - } - catch (IOException ex) { - ex.printStackTrace(); - } - } - - if (fileIn != null) { - try { - fileIn.close(); - } - catch (IOException ex) { - ex.printStackTrace(); - } - } - } - - // TODO: Make this less messy, as it is, it's kinda... depressing to do it like this. - // Might also make a mess when we move to stacks, but at that point I think I will write a new Manager... - // IMPORTANT! If ChunkletStoreFactory is going to be returning something other than PrimitiveEx we need to remove this, as it will be breaking time for old maps - - /* - if (!(storeIn instanceof PrimitiveExChunkletStore)) { - ChunkletStore tempStore = ChunkletStoreFactory.getChunkletStore(); - if (storeIn != null) { - tempStore.copyFrom(storeIn); - } - storeIn = tempStore; - } - */ - - return storeIn; - } -} diff --git a/src/main/java/com/gmail/nossr50/util/blockmeta/McMMOSimpleRegionFile.java b/src/main/java/com/gmail/nossr50/util/blockmeta/McMMOSimpleRegionFile.java new file mode 100644 index 000000000..3f61c9bef --- /dev/null +++ b/src/main/java/com/gmail/nossr50/util/blockmeta/McMMOSimpleRegionFile.java @@ -0,0 +1,260 @@ +/* + * This file is part of SpoutPlugin. + * + * Copyright (c) 2011-2012, SpoutDev + * SpoutPlugin is licensed under the GNU Lesser General Public License. + * + * SpoutPlugin is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * SpoutPlugin is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this program. If not, see . + */ +package com.gmail.nossr50.util.blockmeta; + +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +import java.io.*; +import java.util.BitSet; +import java.util.zip.DeflaterOutputStream; +import java.util.zip.InflaterInputStream; + +/** + * File format: + * bytes 0-4096 contain 1024 integer values representing the segment index of each chunk + * bytes 4096-8192 contain 1024 integer values representing the byte length of each chunk + * bytes 8192-8196 is the integer value of the segment exponent + * bytes 8196-12288 are reserved for future use + * bytes 12288+ contain the data segments, by default 1024 byte segments. + * Chunk data is compressed and stored in 1 or more segments as needed. + */ +public class McMMOSimpleRegionFile { + private static final int DEFAULT_SEGMENT_EXPONENT = 10; // TODO, analyze real world usage and determine if a smaller segment(512) is worth it or not. (need to know average chunkstore bytesize) + private static final int DEFAULT_SEGMENT_SIZE = (int)Math.pow(2, DEFAULT_SEGMENT_EXPONENT); // 1024 + private static final int RESERVED_HEADER_BYTES = 12288; // This needs to be divisible by segment size + private static final int NUM_CHUNKS = 1024; // 32x32 + private static final int SEEK_CHUNK_SEGMENT_INDICES = 0; + private static final int SEEK_CHUNK_BYTE_LENGTHS = 4096; + private static final int SEEK_FILE_INFO = 8192; + // Chunk info + private final int[] chunkSegmentIndex = new int[NUM_CHUNKS]; + private final int[] chunkNumBytes = new int[NUM_CHUNKS]; + private final int[] chunkNumSegments = new int[NUM_CHUNKS]; + + // Segments + private final BitSet segments = new BitSet(); // Used to denote which segments are in use or not + + // Segment size/mask + private final int segmentExponent; + private final int segmentMask; + + // File location + private final @NotNull File parent; + // File access + private final RandomAccessFile file; + + // Region index + private final int rx; + private final int rz; + + public McMMOSimpleRegionFile(@NotNull File f, int rx, int rz) { + this.rx = rx; + this.rz = rz; + this.parent = f; + + try { + this.file = new RandomAccessFile(parent, "rw"); + + // New file, write out header bytes + if (file.length() < RESERVED_HEADER_BYTES) { + file.write(new byte[RESERVED_HEADER_BYTES]); + file.seek(SEEK_FILE_INFO); + file.writeInt(DEFAULT_SEGMENT_EXPONENT); + } + + file.seek(SEEK_FILE_INFO); + this.segmentExponent = file.readInt(); + this.segmentMask = (1 << segmentExponent) - 1; + + // Mark reserved segments reserved + int reservedSegments = this.bytesToSegments(RESERVED_HEADER_BYTES); + segments.set(0, reservedSegments, true); + + // Read chunk header data + file.seek(SEEK_CHUNK_SEGMENT_INDICES); + for (int i = 0; i < NUM_CHUNKS; i++) + chunkSegmentIndex[i] = file.readInt(); + + file.seek(SEEK_CHUNK_BYTE_LENGTHS); + for (int i = 0; i < NUM_CHUNKS; i++) { + chunkNumBytes[i] = file.readInt(); + chunkNumSegments[i] = bytesToSegments(chunkNumBytes[i]); + markChunkSegments(i, true); + } + + fixFileLength(); + } + catch (IOException fnfe) { + throw new RuntimeException(fnfe); + } + } + + public synchronized @NotNull DataOutputStream getOutputStream(int x, int z) { + int index = getChunkIndex(x, z); // Get chunk index + return new DataOutputStream(new DeflaterOutputStream(new McMMOSimpleChunkBuffer(this, index))); + } + + private static class McMMOSimpleChunkBuffer extends ByteArrayOutputStream { + final McMMOSimpleRegionFile rf; + final int index; + + McMMOSimpleChunkBuffer(McMMOSimpleRegionFile rf, int index) { + super(DEFAULT_SEGMENT_SIZE); + this.rf = rf; + this.index = index; + } + + @Override + public void close() throws IOException { + rf.write(index, buf, count); + } + } + + private synchronized void write(int index, byte[] buffer, int size) throws IOException { + int oldSegmentIndex = chunkSegmentIndex[index]; // Get current segment index + markChunkSegments(index, false); // Clear our old segments + int newSegmentIndex = findContiguousSegments(oldSegmentIndex, size); // Find contiguous segments to save to + file.seek(newSegmentIndex << segmentExponent); // Seek to file location + file.write(buffer, 0, size); // Write data + // update in memory info + chunkSegmentIndex[index] = newSegmentIndex; + chunkNumBytes[index] = size; + chunkNumSegments[index] = bytesToSegments(size); + // Mark segments in use + markChunkSegments(index, true); + // Update header info + file.seek(SEEK_CHUNK_SEGMENT_INDICES + (4 * index)); + file.writeInt(chunkSegmentIndex[index]); + file.seek(SEEK_CHUNK_BYTE_LENGTHS + (4 * index)); + file.writeInt(chunkNumBytes[index]); + } + + public synchronized @Nullable DataInputStream getInputStream(int x, int z) throws IOException { + int index = getChunkIndex(x, z); // Get chunk index + int byteLength = chunkNumBytes[index]; // Get byte length of data + + // No bytes + if (byteLength == 0) + return null; + + byte[] data = new byte[byteLength]; + + file.seek(chunkSegmentIndex[index] << segmentExponent); // Seek to file location + file.readFully(data); // Read in the data + return new DataInputStream(new InflaterInputStream(new ByteArrayInputStream(data))); + } + + public synchronized void close() { + try { + file.close(); + segments.clear(); + } + catch (IOException ioe) { + throw new RuntimeException("Unable to close file", ioe); + } + } + + private synchronized void markChunkSegments(int index, boolean inUse) { + // No bytes used + if (chunkNumBytes[index] == 0) + return; + + int start = chunkSegmentIndex[index]; + int end = start + chunkNumSegments[index]; + + // If we are writing, assert we don't write over any in-use segments + if (inUse) + { + int nextSetBit = segments.nextSetBit(start); + if (nextSetBit != -1 && nextSetBit < end) + throw new IllegalStateException("Attempting to overwrite an in-use segment"); + } + + segments.set(start, end, inUse); + } + + private synchronized void fixFileLength() throws IOException { + int fileLength = (int)file.length(); + int extend = -fileLength & segmentMask; // how many bytes do we need to be divisible by segment size + + // Go to end of file + file.seek(fileLength); + // Append bytes + file.write(new byte[extend], 0, extend); + } + + private synchronized int findContiguousSegments(int hint, int size) { + if (size == 0) + return 0; // Zero byte data will not claim any chunks anyways + + int segments = bytesToSegments(size); // Number of segments we need + + // Check the hinted location (previous location of chunk) most of the time we can fit where we were. + boolean oldFree = true; + for (int i = hint; i < this.segments.size() && i < hint + segments; i++) { + if (this.segments.get(i)) { + oldFree = false; + break; + } + } + + // We fit! + if (oldFree) + return hint; + + // Find somewhere to put us + int start = 0; + int current = 0; + + while (current < this.segments.size()) { + boolean segmentInUse = this.segments.get(current); // check if segment is in use + current++; // Move up a segment + + // Move up start if the segment was in use + if (segmentInUse) + start = current; + + // If we have enough segments now, return + if (current - start >= segments) + return start; + } + + // Return the end of the segments (will expand to fit them) + return start; + } + + private synchronized int bytesToSegments(int bytes) { + if (bytes <= 0) + return 1; + + return ((bytes - 1) >> segmentExponent) + 1; // ((bytes - 1) / segmentSize) + 1 + } + + private synchronized int getChunkIndex(int x, int z) { + if (rx != (x >> 5) || rz != (z >> 5)) + throw new IndexOutOfBoundsException(); + + x = x & 0x1F; // 5 bits (mod 32) + z = z & 0x1F; // 5 bits (mod 32) + + return (x << 5) + z; // x in the upper 5 bits, z in the lower 5 bits + } +} diff --git a/src/main/java/com/gmail/nossr50/util/blockmeta/NullChunkManager.java b/src/main/java/com/gmail/nossr50/util/blockmeta/NullChunkManager.java new file mode 100644 index 000000000..203376780 --- /dev/null +++ b/src/main/java/com/gmail/nossr50/util/blockmeta/NullChunkManager.java @@ -0,0 +1,40 @@ +package com.gmail.nossr50.util.blockmeta; + +import org.bukkit.World; +import org.bukkit.block.Block; +import org.bukkit.block.BlockState; +import org.jetbrains.annotations.NotNull; + +public class NullChunkManager implements ChunkManager { + + @Override + public void closeAll() {} + + @Override + public void chunkUnloaded(int cx, int cz, @NotNull World world) {} + + @Override + public void unloadWorld(@NotNull World world) {} + + @Override + public boolean isTrue(@NotNull Block block) { + return false; + } + + @Override + public boolean isTrue(@NotNull BlockState blockState) { + return false; + } + + @Override + public void setTrue(@NotNull Block block) {} + + @Override + public void setTrue(@NotNull BlockState blockState) {} + + @Override + public void setFalse(@NotNull Block block) {} + + @Override + public void setFalse(@NotNull BlockState blockState) {} +} diff --git a/src/main/java/com/gmail/nossr50/util/blockmeta/NullChunkletManager.java b/src/main/java/com/gmail/nossr50/util/blockmeta/NullChunkletManager.java deleted file mode 100755 index 89bd46967..000000000 --- a/src/main/java/com/gmail/nossr50/util/blockmeta/NullChunkletManager.java +++ /dev/null @@ -1,101 +0,0 @@ -package com.gmail.nossr50.util.blockmeta; - -import org.bukkit.World; -import org.bukkit.block.Block; - -/** - * A ChunkletManager implementation that does nothing and returns false for all checks. - * - * Useful for turning off Chunklets without actually doing much work - */ -public class NullChunkletManager implements ChunkletManager { - @Override - public void loadChunklet(int cx, int cy, int cz, World world) { - return; - } - - @Override - public void unloadChunklet(int cx, int cy, int cz, World world) { - return; - } - - @Override - public void loadChunk(int cx, int cz, World world) { - return; - } - - @Override - public void unloadChunk(int cx, int cz, World world) { - return; - } - - @Override - public void chunkLoaded(int cx, int cz, World world) { - return; - } - - @Override - public void chunkUnloaded(int cx, int cz, World world) { - return; - } - - @Override - public void saveWorld(World world) { - return; - } - - @Override - public void unloadWorld(World world) { - return; - } - - @Override - public void loadWorld(World world) { - return; - } - - @Override - public void saveAll() { - return; - } - - @Override - public void unloadAll() { - return; - } - - @Override - public boolean isTrue(int x, int y, int z, World world) { - return false; - } - - @Override - public boolean isTrue(Block block) { - return false; - } - - @Override - public void setTrue(int x, int y, int z, World world) { - return; - } - - @Override - public void setTrue(Block block) { - return; - } - - @Override - public void setFalse(int x, int y, int z, World world) { - return; - } - - @Override - public void setFalse(Block block) { - return; - } - - @Override - public void cleanUp() { - return; - } -} diff --git a/src/main/java/com/gmail/nossr50/util/blockmeta/PrimitiveChunkletStore.java b/src/main/java/com/gmail/nossr50/util/blockmeta/PrimitiveChunkletStore.java deleted file mode 100755 index 8dfe3cb8d..000000000 --- a/src/main/java/com/gmail/nossr50/util/blockmeta/PrimitiveChunkletStore.java +++ /dev/null @@ -1,48 +0,0 @@ -package com.gmail.nossr50.util.blockmeta; - -public class PrimitiveChunkletStore implements ChunkletStore { - private static final long serialVersionUID = -3453078050608607478L; - - /** X, Z, Y */ - public boolean[][][] store = new boolean[16][16][64]; - - @Override - public boolean isTrue(int x, int y, int z) { - return store[x][z][y]; - } - - @Override - public void setTrue(int x, int y, int z) { - store[x][z][y] = true; - } - - @Override - public void setFalse(int x, int y, int z) { - store[x][z][y] = false; - } - - @Override - public boolean isEmpty() { - for (int x = 0; x < 16; x++) { - for (int z = 0; z < 16; z++) { - for (int y = 0; y < 64; y++) { - if (store[x][z][y]) { - return false; - } - } - } - } - return true; - } - - @Override - public void copyFrom(ChunkletStore otherStore) { - for (int x = 0; x < 16; x++) { - for (int z = 0; z < 16; z++) { - for (int y = 0; y < 64; y++) { - store[x][z][y] = otherStore.isTrue(x, y, z); - } - } - } - } -} diff --git a/src/main/java/com/gmail/nossr50/util/blockmeta/PrimitiveExChunkletStore.java b/src/main/java/com/gmail/nossr50/util/blockmeta/PrimitiveExChunkletStore.java deleted file mode 100755 index 187ad0dff..000000000 --- a/src/main/java/com/gmail/nossr50/util/blockmeta/PrimitiveExChunkletStore.java +++ /dev/null @@ -1,180 +0,0 @@ -package com.gmail.nossr50.util.blockmeta; - -import java.io.Externalizable; -import java.io.IOException; -import java.io.ObjectInput; -import java.io.ObjectOutput; - -public class PrimitiveExChunkletStore implements ChunkletStore, Externalizable { - private static final long serialVersionUID = 8603603827094383873L; - - /** X, Z, Y */ - public boolean[][][] store = new boolean[16][16][64]; - - @Override - public boolean isTrue(int x, int y, int z) { - return store[x][z][y]; - } - - @Override - public void setTrue(int x, int y, int z) { - store[x][z][y] = true; - } - - @Override - public void setFalse(int x, int y, int z) { - store[x][z][y] = false; - } - - @Override - public boolean isEmpty() { - for (int x = 0; x < 16; x++) { - for (int z = 0; z < 16; z++) { - for (int y = 0; y < 64; y++) { - if (store[x][z][y]) { - return false; - } - } - } - } - return true; - } - - @Override - public void copyFrom(ChunkletStore otherStore) { - for (int x = 0; x < 16; x++) { - for (int z = 0; z < 16; z++) { - for (int y = 0; y < 64; y++) { - store[x][z][y] = otherStore.isTrue(x, y, z); - } - } - } - } - - @Override - public void writeExternal(ObjectOutput out) throws IOException { - byte[] buffer = new byte[2304]; // 2304 is 16*16*9 - int bufferIndex = 0; - - for (int x = 0; x < 16; x++) { - for (int z = 0; z < 16; z++) { - for (int y = 0; y < 64; y++) { - if (store[x][z][y]) { - byte[] temp = constructColumn(x, z); - - for (int i = 0; i < 9; i++) { - buffer[bufferIndex] = temp[i]; - bufferIndex++; - } - - break; - } - } - } - } - - out.write(buffer, 0, bufferIndex); - out.flush(); - } - - // For this we assume that store has been initialized to be all false by now - @Override - public void readExternal(ObjectInput in) throws IOException { - byte[] temp = new byte[9]; - - // Could probably reorganize this loop to print nasty things if it does not equal 9 or -1 - while (in.read(temp, 0, 9) == 9) { - int x = addressByteX(temp[0]); - int z = addressByteZ(temp[0]); - boolean[] yColumn = new boolean[64]; - - for (int i = 0; i < 8; i++) { - for (int j = 0; j < 8; j++) { - yColumn[j + (i * 8)] = (temp[i + 1] & (1 << j)) != 0; - } - } - - store[x][z] = yColumn; - } - } - - /* - * The column: An array of 9 bytes which represent all y values for a given (x,z) Chunklet-coordinate - * - * The first byte is an address byte, this provides the x and z values. - * The next 8 bytes are all y values from 0 to 63, with each byte containing 8 bits of true/false data - * - * Each of these 8 bytes address to a y value from right to left - * - * Examples: - * 00000001 represents that the lowest y value in this byte is true, all others are off - * 10000000 represents that the highest y value in this byte is true, all others are off - * 10000001 represents that the lowest and highest y values in this byte are true, all others are off - * - * Full columns: - * See comment on Address byte for information on how to use that byte - * - * Example: - * ADDRESS_BYTE 10000000 00000001 00000000 00000000 00000000 00000000 00000000 00000000 - * - x, z from ADDRESS_BYTE - * - The next byte contains data from 0 to 7 - * - 1 is set in the highest bit position, this is 7 in y coordinate - * - The next byte contains data from 8 to 15 - * - 1 is set in the lowest bit position, this is 8 in the y coordinate - * Therefore, for this column: There are true values at (x, 7, z) and (x, 8, z) - */ - private byte[] constructColumn(int x, int z) { - byte[] column = new byte[9]; - int index = 1; - - column[0] = makeAddressByte(x, z); - - for (int i = 0; i < 8; i++) { - byte yCompressed = 0x0; - int subColumnIndex = 8 * i; - int subColumnEnd = subColumnIndex + 8; - - for (int y = subColumnIndex; y < subColumnEnd; y++) { - if (store[x][z][y]) { - yCompressed |= 1 << (y % 8); - } - } - - column[index] = yCompressed; - index++; - } - - return column; - } - - /* - * The address byte: A single byte which contains x and z values which correspond to the x and z Chunklet-coordinates - * - * In Chunklet-coordinates, the only valid values are 0-15, so we can fit both into a single byte. - * - * The top 4 bits of the address byte are for the x value - * The bottom 4 bits of the address byte are for the z value - * - * Examples: - * An address byte with a value 00000001 would be split like so: - * - x = 0000 = 0 - * - z = 0001 = 1 - * => Chunklet coordinates (0, 1) - * - * 01011111 - * - x = 0101 = 5 - * - z = 1111 = 15 - * => Chunklet coordinates (5, 15) - */ - protected static byte makeAddressByte(int x, int z) { - return (byte) ((x << 4) + z); - } - - protected static int addressByteX(byte address) { - return (address & 0xF0) >>> 4; - } - - protected static int addressByteZ(byte address) { - return address & 0x0F; - } -} diff --git a/src/main/java/com/gmail/nossr50/util/blockmeta/UserBlockTracker.java b/src/main/java/com/gmail/nossr50/util/blockmeta/UserBlockTracker.java new file mode 100644 index 000000000..e5428b0c1 --- /dev/null +++ b/src/main/java/com/gmail/nossr50/util/blockmeta/UserBlockTracker.java @@ -0,0 +1,56 @@ +package com.gmail.nossr50.util.blockmeta; + +import com.gmail.nossr50.mcMMO; +import org.bukkit.block.Block; +import org.bukkit.block.BlockState; +import org.jetbrains.annotations.NotNull; + +/** + * Contains blockstore methods that are safe for external plugins to access. + * An instance can be retrieved via {@link mcMMO#getPlaceStore() mcMMO.getPlaceStore()} + */ +public interface UserBlockTracker { + /** + * Check to see if a given block location is set to true + * + * @param block Block location to check + * @return true if the given block location is set to true, false if otherwise + */ + boolean isTrue(@NotNull Block block); + + /** + * Check to see if a given BlockState location is set to true + * + * @param blockState BlockState to check + * @return true if the given BlockState location is set to true, false if otherwise + */ + boolean isTrue(@NotNull BlockState blockState); + + /** + * Set a given block location to true + * + * @param block Block location to set + */ + void setTrue(@NotNull Block block); + + /** + * Set a given BlockState location to true + * + * @param blockState BlockState location to set + */ + void setTrue(@NotNull BlockState blockState); + + /** + * Set a given block location to false + * + * @param block Block location to set + */ + void setFalse(@NotNull Block block); + + /** + * Set a given BlockState location to false + * + * @param blockState BlockState location to set + */ + void setFalse(@NotNull BlockState blockState); +} diff --git a/src/main/java/com/gmail/nossr50/util/blockmeta/chunkmeta/ChunkManager.java b/src/main/java/com/gmail/nossr50/util/blockmeta/chunkmeta/ChunkManager.java deleted file mode 100755 index 3cf9b1faa..000000000 --- a/src/main/java/com/gmail/nossr50/util/blockmeta/chunkmeta/ChunkManager.java +++ /dev/null @@ -1,196 +0,0 @@ -package com.gmail.nossr50.util.blockmeta.chunkmeta; - -import org.bukkit.World; -import org.bukkit.block.Block; -import org.bukkit.block.BlockState; -import org.bukkit.entity.Entity; - -import java.io.IOException; - -public interface ChunkManager { - public void closeAll(); - - public ChunkStore readChunkStore(World world, int x, int z) throws IOException; - - public void writeChunkStore(World world, int x, int z, ChunkStore data); - - public void closeChunkStore(World world, int x, int z); - - /** - * Loads a specific chunklet - * - * @param cx Chunklet X coordinate that needs to be loaded - * @param cy Chunklet Y coordinate that needs to be loaded - * @param cz Chunklet Z coordinate that needs to be loaded - * @param world World that the chunklet needs to be loaded in - */ - public void loadChunklet(int cx, int cy, int cz, World world); - - /** - * Unload a specific chunklet - * - * @param cx Chunklet X coordinate that needs to be unloaded - * @param cy Chunklet Y coordinate that needs to be unloaded - * @param cz Chunklet Z coordinate that needs to be unloaded - * @param world World that the chunklet needs to be unloaded from - */ - public void unloadChunklet(int cx, int cy, int cz, World world); - - /** - * Load a given Chunk's Chunklet data - * - * @param cx Chunk X coordinate that is to be loaded - * @param cz Chunk Z coordinate that is to be loaded - * @param world World that the Chunk is in - */ - public void loadChunk(int cx, int cz, World world, Entity[] entities); - - /** - * Unload a given Chunk's Chunklet data - * - * @param cx Chunk X coordinate that is to be unloaded - * @param cz Chunk Z coordinate that is to be unloaded - * @param world World that the Chunk is in - */ - public void unloadChunk(int cx, int cz, World world); - - /** - * Saves a given Chunk's Chunklet data - * - * @param cx Chunk X coordinate that is to be saved - * @param cz Chunk Z coordinate that is to be saved - * @param world World that the Chunk is in - */ - public void saveChunk(int cx, int cz, World world); - - public boolean isChunkLoaded(int cx, int cz, World world); - - /** - * Informs the ChunkletManager a chunk is loaded - * - * @param cx Chunk X coordinate that is loaded - * @param cz Chunk Z coordinate that is loaded - * @param world World that the chunk was loaded in - */ - public void chunkLoaded(int cx, int cz, World world); - - /** - * Informs the ChunkletManager a chunk is unloaded - * - * @param cx Chunk X coordinate that is unloaded - * @param cz Chunk Z coordinate that is unloaded - * @param world World that the chunk was unloaded in - */ - public void chunkUnloaded(int cx, int cz, World world); - - /** - * Save all ChunkletStores related to the given world - * - * @param world World to save - */ - public void saveWorld(World world); - - /** - * Unload all ChunkletStores from memory related to the given world after saving them - * - * @param world World to unload - */ - public void unloadWorld(World world); - - /** - * Load all ChunkletStores from all loaded chunks from this world into memory - * - * @param world World to load - */ - public void loadWorld(World world); - - /** - * Save all ChunkletStores - */ - public void saveAll(); - - /** - * Unload all ChunkletStores after saving them - */ - public void unloadAll(); - - /** - * Check to see if a given location is set to true - * - * @param x X coordinate to check - * @param y Y coordinate to check - * @param z Z coordinate to check - * @param world World to check in - * @return true if the given location is set to true, false if otherwise - */ - public boolean isTrue(int x, int y, int z, World world); - - /** - * Check to see if a given block location is set to true - * - * @param block Block location to check - * @return true if the given block location is set to true, false if otherwise - */ - public boolean isTrue(Block block); - - /** - * Check to see if a given BlockState location is set to true - * - * @param blockState BlockState to check - * @return true if the given BlockState location is set to true, false if otherwise - */ - public boolean isTrue(BlockState blockState); - - /** - * Set a given location to true, should create stores as necessary if the location does not exist - * - * @param x X coordinate to set - * @param y Y coordinate to set - * @param z Z coordinate to set - * @param world World to set in - */ - public void setTrue(int x, int y, int z, World world); - - /** - * Set a given block location to true, should create stores as necessary if the location does not exist - * - * @param block Block location to set - */ - public void setTrue(Block block); - - /** - * Set a given BlockState location to true, should create stores as necessary if the location does not exist - * - * @param blockState BlockState location to set - */ - public void setTrue(BlockState blockState); - - /** - * Set a given location to false, should not create stores if one does not exist for the given location - * - * @param x X coordinate to set - * @param y Y coordinate to set - * @param z Z coordinate to set - * @param world World to set in - */ - public void setFalse(int x, int y, int z, World world); - - /** - * Set a given block location to false, should not create stores if one does not exist for the given location - * - * @param block Block location to set - */ - public void setFalse(Block block); - - /** - * Set a given BlockState location to false, should not create stores if one does not exist for the given location - * - * @param blockState BlockState location to set - */ - public void setFalse(BlockState blockState); - - /** - * Delete any ChunkletStores that are empty - */ - public void cleanUp(); -} diff --git a/src/main/java/com/gmail/nossr50/util/blockmeta/chunkmeta/ChunkManagerFactory.java b/src/main/java/com/gmail/nossr50/util/blockmeta/chunkmeta/ChunkManagerFactory.java deleted file mode 100755 index 2b4d90349..000000000 --- a/src/main/java/com/gmail/nossr50/util/blockmeta/chunkmeta/ChunkManagerFactory.java +++ /dev/null @@ -1,15 +0,0 @@ -package com.gmail.nossr50.util.blockmeta.chunkmeta; - -import com.gmail.nossr50.config.HiddenConfig; - -public class ChunkManagerFactory { - public static ChunkManager getChunkManager() { - HiddenConfig hConfig = HiddenConfig.getInstance(); - - if (hConfig.getChunkletsEnabled()) { - return new HashChunkManager(); - } - - return new NullChunkManager(); - } -} diff --git a/src/main/java/com/gmail/nossr50/util/blockmeta/chunkmeta/ChunkStoreFactory.java b/src/main/java/com/gmail/nossr50/util/blockmeta/chunkmeta/ChunkStoreFactory.java deleted file mode 100755 index 53528ab66..000000000 --- a/src/main/java/com/gmail/nossr50/util/blockmeta/chunkmeta/ChunkStoreFactory.java +++ /dev/null @@ -1,10 +0,0 @@ -package com.gmail.nossr50.util.blockmeta.chunkmeta; - -import org.bukkit.World; - -public class ChunkStoreFactory { - protected static ChunkStore getChunkStore(World world, int x, int z) { - // TODO: Add in loading from config what type of store we want. - return new PrimitiveChunkStore(world, x, z); - } -} diff --git a/src/main/java/com/gmail/nossr50/util/blockmeta/chunkmeta/HashChunkManager.java b/src/main/java/com/gmail/nossr50/util/blockmeta/chunkmeta/HashChunkManager.java deleted file mode 100755 index 532f87d66..000000000 --- a/src/main/java/com/gmail/nossr50/util/blockmeta/chunkmeta/HashChunkManager.java +++ /dev/null @@ -1,464 +0,0 @@ -package com.gmail.nossr50.util.blockmeta.chunkmeta; - -import com.gmail.nossr50.mcMMO; -import com.gmail.nossr50.util.blockmeta.conversion.BlockStoreConversionZDirectory; -import org.bukkit.World; -import org.bukkit.block.Block; -import org.bukkit.block.BlockState; -import org.bukkit.entity.Entity; - -import java.io.*; -import java.util.*; - -public class HashChunkManager implements ChunkManager { - private HashMap> regionFiles = new HashMap>(); - public HashMap store = new HashMap(); - public ArrayList converters = new ArrayList(); - private HashMap oldData = new HashMap(); - - @Override - public synchronized void closeAll() { - for (UUID uid : regionFiles.keySet()) { - HashMap worldRegions = regionFiles.get(uid); - for (Iterator worldRegionIterator = worldRegions.values().iterator(); worldRegionIterator.hasNext(); ) { - McMMOSimpleRegionFile rf = worldRegionIterator.next(); - if (rf != null) { - rf.close(); - worldRegionIterator.remove(); - } - } - } - regionFiles.clear(); - } - - @Override - public synchronized ChunkStore readChunkStore(World world, int x, int z) throws IOException { - McMMOSimpleRegionFile rf = getSimpleRegionFile(world, x, z); - InputStream in = rf.getInputStream(x, z); - if (in == null) { - return null; - } - ObjectInputStream objectStream = new ObjectInputStream(in); - try { - Object o = objectStream.readObject(); - if (o instanceof ChunkStore) { - return (ChunkStore) o; - } - - throw new RuntimeException("Wrong class type read for chunk meta data for " + x + ", " + z); - } - catch (IOException e) { - e.printStackTrace(); - // Assume the format changed - return null; - //throw new RuntimeException("Unable to process chunk meta data for " + x + ", " + z, e); - } - catch (ClassNotFoundException e) { - e.printStackTrace(); - // Assume the format changed - //System.out.println("[SpoutPlugin] is Unable to find serialized class for " + x + ", " + z + ", " + e.getMessage()); - return null; - //throw new RuntimeException("Unable to find serialized class for " + x + ", " + z, e); - } - finally { - objectStream.close(); - } - } - - @Override - public synchronized void writeChunkStore(World world, int x, int z, ChunkStore data) { - if (!data.isDirty()) { - return; - } - try { - McMMOSimpleRegionFile rf = getSimpleRegionFile(world, x, z); - ObjectOutputStream objectStream = new ObjectOutputStream(rf.getOutputStream(x, z)); - objectStream.writeObject(data); - objectStream.flush(); - objectStream.close(); - data.setDirty(false); - } - catch (IOException e) { - throw new RuntimeException("Unable to write chunk meta data for " + x + ", " + z, e); - } - } - - @Override - public synchronized void closeChunkStore(World world, int x, int z) { - McMMOSimpleRegionFile rf = getSimpleRegionFile(world, x, z); - if (rf != null) { - rf.close(); - } - } - - private synchronized McMMOSimpleRegionFile getSimpleRegionFile(World world, int x, int z) { - File directory = new File(world.getWorldFolder(), "mcmmo_regions"); - - directory.mkdirs(); - - UUID key = world.getUID(); - - HashMap worldRegions = regionFiles.get(key); - - if (worldRegions == null) { - worldRegions = new HashMap(); - regionFiles.put(key, worldRegions); - } - - int rx = x >> 5; - int rz = z >> 5; - - long key2 = (((long) rx) << 32) | ((rz) & 0xFFFFFFFFL); - - McMMOSimpleRegionFile regionFile = worldRegions.get(key2); - - if (regionFile == null) { - File file = new File(directory, "mcmmo_" + rx + "_" + rz + "_.mcm"); - regionFile = new McMMOSimpleRegionFile(file, rx, rz); - worldRegions.put(key2, regionFile); - } - - return regionFile; - } - - @Override - public synchronized void loadChunklet(int cx, int cy, int cz, World world) { - loadChunk(cx, cz, world, null); - } - - @Override - public synchronized void unloadChunklet(int cx, int cy, int cz, World world) { - unloadChunk(cx, cz, world); - } - - @Override - public synchronized void loadChunk(int cx, int cz, World world, Entity[] entities) { - if (world == null || store.containsKey(world.getName() + "," + cx + "," + cz)) { - return; - } - - UUID key = world.getUID(); - - if (!oldData.containsKey(key)) { - oldData.put(key, (new File(world.getWorldFolder(), "mcmmo_data")).exists()); - } - else if (oldData.get(key)) { - if (convertChunk(new File(world.getWorldFolder(), "mcmmo_data"), cx, cz, world, true)) { - return; - } - } - - ChunkStore chunkStore = null; - - try { - chunkStore = readChunkStore(world, cx, cz); - } - catch (Exception e) { e.printStackTrace(); } - - if (chunkStore == null) { - return; - } - - store.put(world.getName() + "," + cx + "," + cz, chunkStore); - } - - @Override - public synchronized void unloadChunk(int cx, int cz, World world) { - saveChunk(cx, cz, world); - - if (store.containsKey(world.getName() + "," + cx + "," + cz)) { - store.remove(world.getName() + "," + cx + "," + cz); - - //closeChunkStore(world, cx, cz); - } - } - - @Override - public synchronized void saveChunk(int cx, int cz, World world) { - if (world == null) { - return; - } - - String key = world.getName() + "," + cx + "," + cz; - - if (store.containsKey(key)) { - ChunkStore out = store.get(world.getName() + "," + cx + "," + cz); - - if (!out.isDirty()) { - return; - } - - writeChunkStore(world, cx, cz, out); - } - } - - @Override - public synchronized boolean isChunkLoaded(int cx, int cz, World world) { - if (world == null) { - return false; - } - - return store.containsKey(world.getName() + "," + cx + "," + cz); - } - - @Override - public synchronized void chunkLoaded(int cx, int cz, World world) {} - - @Override - public synchronized void chunkUnloaded(int cx, int cz, World world) { - if (world == null) { - return; - } - - unloadChunk(cx, cz, world); - } - - @Override - public synchronized void saveWorld(World world) { - if (world == null) { - return; - } - - closeAll(); - String worldName = world.getName(); - - List keys = new ArrayList(store.keySet()); - for (String key : keys) { - String[] info = key.split(","); - if (worldName.equals(info[0])) { - try { - saveChunk(Integer.parseInt(info[1]), Integer.parseInt(info[2]), world); - } - catch (Exception e) { - // Ignore - } - } - } - } - - @Override - public synchronized void unloadWorld(World world) { - if (world == null) { - return; - } - - String worldName = world.getName(); - - List keys = new ArrayList(store.keySet()); - for (String key : keys) { - String[] info = key.split(","); - if (worldName.equals(info[0])) { - try { - unloadChunk(Integer.parseInt(info[1]), Integer.parseInt(info[2]), world); - } - catch (Exception e) { - // Ignore - } - } - } - closeAll(); - } - - @Override - public synchronized void loadWorld(World world) {} - - @Override - public synchronized void saveAll() { - closeAll(); - - for (World world : mcMMO.p.getServer().getWorlds()) { - saveWorld(world); - } - } - - @Override - public synchronized void unloadAll() { - closeAll(); - - for (World world : mcMMO.p.getServer().getWorlds()) { - unloadWorld(world); - } - } - - @Override - public synchronized boolean isTrue(int x, int y, int z, World world) { - if (world == null) { - return false; - } - - int cx = x >> 4; - int cz = z >> 4; - - String key = world.getName() + "," + cx + "," + cz; - - if (!store.containsKey(key)) { - loadChunk(cx, cz, world, null); - } - - if (!store.containsKey(key)) { - return false; - } - - ChunkStore check = store.get(key); - int ix = Math.abs(x) % 16; - int iz = Math.abs(z) % 16; - - return check.isTrue(ix, y, iz); - } - - @Override - public synchronized boolean isTrue(Block block) { - if (block == null) { - return false; - } - - return isTrue(block.getX(), block.getY(), block.getZ(), block.getWorld()); - } - - @Override - public synchronized boolean isTrue(BlockState blockState) { - if (blockState == null) { - return false; - } - - return isTrue(blockState.getX(), blockState.getY(), blockState.getZ(), blockState.getWorld()); - } - - @Override - public synchronized void setTrue(int x, int y, int z, World world) { - if (world == null) { - return; - } - - int cx = x >> 4; - int cz = z >> 4; - - int ix = Math.abs(x) % 16; - int iz = Math.abs(z) % 16; - - String key = world.getName() + "," + cx + "," + cz; - - if (!store.containsKey(key)) { - loadChunk(cx, cz, world, null); - } - - ChunkStore cStore = store.get(key); - - if (cStore == null) { - cStore = ChunkStoreFactory.getChunkStore(world, cx, cz); - store.put(key, cStore); - } - - cStore.setTrue(ix, y, iz); - } - - @Override - public synchronized void setTrue(Block block) { - if (block == null) { - return; - } - - setTrue(block.getX(), block.getY(), block.getZ(), block.getWorld()); - } - - @Override - public void setTrue(BlockState blockState) { - if (blockState == null) { - return; - } - - setTrue(blockState.getX(), blockState.getY(), blockState.getZ(), blockState.getWorld()); - } - - @Override - public synchronized void setFalse(int x, int y, int z, World world) { - if (world == null) { - return; - } - - int cx = x >> 4; - int cz = z >> 4; - - int ix = Math.abs(x) % 16; - int iz = Math.abs(z) % 16; - - String key = world.getName() + "," + cx + "," + cz; - - if (!store.containsKey(key)) { - loadChunk(cx, cz, world, null); - } - - ChunkStore cStore = store.get(key); - - if (cStore == null) { - return; // No need to make a store for something we will be setting to false - } - - cStore.setFalse(ix, y, iz); - } - - @Override - public synchronized void setFalse(Block block) { - if (block == null) { - return; - } - - setFalse(block.getX(), block.getY(), block.getZ(), block.getWorld()); - } - - @Override - public synchronized void setFalse(BlockState blockState) { - if (blockState == null) { - return; - } - - setFalse(blockState.getX(), blockState.getY(), blockState.getZ(), blockState.getWorld()); - } - - @Override - public synchronized void cleanUp() {} - - public synchronized void convertChunk(File dataDir, int cx, int cz, World world) { - convertChunk(dataDir, cx, cz, world, false); - } - - public synchronized boolean convertChunk(File dataDir, int cx, int cz, World world, boolean actually) { - if (!actually || !dataDir.exists()) { - return false; - } - - File cxDir = new File(dataDir, "" + cx); - if (!cxDir.exists()) { - return false; - } - - File czDir = new File(cxDir, "" + cz); - if (!czDir.exists()) { - return false; - } - - boolean conversionSet = false; - - for (BlockStoreConversionZDirectory converter : this.converters) { - if (converter == null) { - continue; - } - - if (converter.taskID >= 0) { - continue; - } - - converter.start(world, cxDir, czDir); - conversionSet = true; - break; - } - - if (!conversionSet) { - BlockStoreConversionZDirectory converter = new BlockStoreConversionZDirectory(); - converter.start(world, cxDir, czDir); - converters.add(converter); - } - - return true; - } -} diff --git a/src/main/java/com/gmail/nossr50/util/blockmeta/chunkmeta/McMMOSimpleChunkBuffer.java b/src/main/java/com/gmail/nossr50/util/blockmeta/chunkmeta/McMMOSimpleChunkBuffer.java deleted file mode 100644 index c2f158b95..000000000 --- a/src/main/java/com/gmail/nossr50/util/blockmeta/chunkmeta/McMMOSimpleChunkBuffer.java +++ /dev/null @@ -1,39 +0,0 @@ -/* - * This file is part of SpoutPlugin. - * - * Copyright (c) 2011-2012, SpoutDev - * SpoutPlugin is licensed under the GNU Lesser General Public License. - * - * SpoutPlugin is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * SpoutPlugin is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with this program. If not, see . - */ -package com.gmail.nossr50.util.blockmeta.chunkmeta; - -import java.io.ByteArrayOutputStream; -import java.io.IOException; - -public class McMMOSimpleChunkBuffer extends ByteArrayOutputStream { - final McMMOSimpleRegionFile rf; - final int index; - - McMMOSimpleChunkBuffer(McMMOSimpleRegionFile rf, int index) { - super(1024); - this.rf = rf; - this.index = index; - } - - @Override - public void close() throws IOException { - rf.write(index, buf, count); - } -} diff --git a/src/main/java/com/gmail/nossr50/util/blockmeta/chunkmeta/McMMOSimpleRegionFile.java b/src/main/java/com/gmail/nossr50/util/blockmeta/chunkmeta/McMMOSimpleRegionFile.java deleted file mode 100644 index 6a506d2ef..000000000 --- a/src/main/java/com/gmail/nossr50/util/blockmeta/chunkmeta/McMMOSimpleRegionFile.java +++ /dev/null @@ -1,306 +0,0 @@ -/* - * This file is part of SpoutPlugin. - * - * Copyright (c) 2011-2012, SpoutDev - * SpoutPlugin is licensed under the GNU Lesser General Public License. - * - * SpoutPlugin is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * SpoutPlugin is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with this program. If not, see . - */ -package com.gmail.nossr50.util.blockmeta.chunkmeta; - -import java.io.*; -import java.util.ArrayList; -import java.util.zip.DeflaterOutputStream; -import java.util.zip.InflaterInputStream; - -public class McMMOSimpleRegionFile { - private RandomAccessFile file; - private final int[] dataStart = new int[1024]; - private final int[] dataActualLength = new int[1024]; - private final int[] dataLength = new int[1024]; - private final ArrayList inuse = new ArrayList(); - private int segmentSize; - private int segmentMask; - private final int rx; - private final int rz; - private final int defaultSegmentSize; - private final File parent; - @SuppressWarnings("unused") - private long lastAccessTime = System.currentTimeMillis(); - @SuppressWarnings("unused") - private static long TIMEOUT_TIME = 300000; // 5 min - - public McMMOSimpleRegionFile(File f, int rx, int rz) { - this(f, rx, rz, 10); - } - - public McMMOSimpleRegionFile(File f, int rx, int rz, int defaultSegmentSize) { - this.rx = rx; - this.rz = rz; - this.defaultSegmentSize = defaultSegmentSize; - this.parent = f; - - lastAccessTime = System.currentTimeMillis(); - if (file == null) { - try { - this.file = new RandomAccessFile(parent, "rw"); - - if (file.length() < 4096 * 3) { - for (int i = 0; i < 1024 * 3; i++) { - file.writeInt(0); - } - file.seek(4096 * 2); - file.writeInt(defaultSegmentSize); - } - - file.seek(4096 * 2); - - this.segmentSize = file.readInt(); - this.segmentMask = (1 << segmentSize) - 1; - - int reservedSegments = this.sizeToSegments(4096 * 3); - - for (int i = 0; i < reservedSegments; i++) { - while (inuse.size() <= i) { - inuse.add(false); - } - inuse.set(i, true); - } - - file.seek(0); - - for (int i = 0; i < 1024; i++) { - dataStart[i] = file.readInt(); - } - - for (int i = 0; i < 1024; i++) { - dataActualLength[i] = file.readInt(); - dataLength[i] = sizeToSegments(dataActualLength[i]); - setInUse(i, true); - } - - extendFile(); - } - catch (IOException fnfe) { - throw new RuntimeException(fnfe); - } - } - } - - public synchronized final RandomAccessFile getFile() { - lastAccessTime = System.currentTimeMillis(); - if (file == null) { - try { - this.file = new RandomAccessFile(parent, "rw"); - - if (file.length() < 4096 * 3) { - for (int i = 0; i < 1024 * 3; i++) { - file.writeInt(0); - } - file.seek(4096 * 2); - file.writeInt(defaultSegmentSize); - } - - file.seek(4096 * 2); - - this.segmentSize = file.readInt(); - this.segmentMask = (1 << segmentSize) - 1; - - int reservedSegments = this.sizeToSegments(4096 * 3); - - for (int i = 0; i < reservedSegments; i++) { - while (inuse.size() <= i) { - inuse.add(false); - } - inuse.set(i, true); - } - - file.seek(0); - - for (int i = 0; i < 1024; i++) { - dataStart[i] = file.readInt(); - } - - for (int i = 0; i < 1024; i++) { - dataActualLength[i] = file.readInt(); - dataLength[i] = sizeToSegments(dataActualLength[i]); - setInUse(i, true); - } - - extendFile(); - } - catch (IOException fnfe) { - throw new RuntimeException(fnfe); - } - } - return file; - } - - public synchronized boolean testCloseTimeout() { - /* - if (System.currentTimeMillis() - TIMEOUT_TIME > lastAccessTime) { - close(); - return true; - } - */ - return false; - } - - public synchronized DataOutputStream getOutputStream(int x, int z) { - int index = getChunkIndex(x, z); - return new DataOutputStream(new DeflaterOutputStream(new McMMOSimpleChunkBuffer(this, index))); - } - - public synchronized DataInputStream getInputStream(int x, int z) throws IOException { - int index = getChunkIndex(x, z); - int actualLength = dataActualLength[index]; - - if (actualLength == 0) { - return null; - } - - byte[] data = new byte[actualLength]; - - getFile().seek(dataStart[index] << segmentSize); - getFile().readFully(data); - return new DataInputStream(new InflaterInputStream(new ByteArrayInputStream(data))); - } - - synchronized void write(int index, byte[] buffer, int size) throws IOException { - int oldStart = setInUse(index, false); - int start = findSpace(oldStart, size); - getFile().seek(start << segmentSize); - getFile().write(buffer, 0, size); - dataStart[index] = start; - dataActualLength[index] = size; - dataLength[index] = sizeToSegments(size); - setInUse(index, true); - saveFAT(); - } - - public synchronized void close() { - try { - if (file != null) { - file.seek(4096 * 2); - file.close(); - } - - file = null; - } - catch (IOException ioe) { - throw new RuntimeException("Unable to close file", ioe); - } - } - - private synchronized int setInUse(int index, boolean used) { - if (dataActualLength[index] == 0) { - return dataStart[index]; - } - - int start = dataStart[index]; - int end = start + dataLength[index]; - - for (int i = start; i < end; i++) { - while (i > inuse.size() - 1) { - inuse.add(false); - } - - Boolean old = inuse.set(i, used); - if (old != null && old == used) { - if (old) { - throw new IllegalStateException("Attempting to overwrite an in-use segment"); - } - - throw new IllegalStateException("Attempting to delete empty segment"); - } - } - - return dataStart[index]; - } - - private synchronized void extendFile() throws IOException { - long extend = (-getFile().length()) & segmentMask; - - getFile().seek(getFile().length()); - - while ((extend--) > 0) { - getFile().write(0); - } - } - - private synchronized int findSpace(int oldStart, int size) { - int segments = sizeToSegments(size); - - boolean oldFree = true; - for (int i = oldStart; i < inuse.size() && i < oldStart + segments; i++) { - if (inuse.get(i)) { - oldFree = false; - break; - } - } - - if (oldFree) { - return oldStart; - } - - int start = 0; - int end = 0; - - while (end < inuse.size()) { - if (inuse.get(end)) { - end++; - start = end; - } - else { - end++; - } - - if (end - start >= segments) { - return start; - } - } - - return start; - } - - private synchronized int sizeToSegments(int size) { - if (size <= 0) { - return 1; - } - - return ((size - 1) >> segmentSize) + 1; - } - - private synchronized Integer getChunkIndex(int x, int z) { - if (rx != (x >> 5) || rz != (z >> 5)) { - throw new RuntimeException(x + ", " + z + " not in region " + rx + ", " + rz); - } - - x = x & 0x1F; - z = z & 0x1F; - - return (x << 5) + z; - } - - private synchronized void saveFAT() throws IOException { - getFile().seek(0); - for (int i = 0; i < 1024; i++) { - getFile().writeInt(dataStart[i]); - } - - for (int i = 0; i < 1024; i++) { - getFile().writeInt(dataActualLength[i]); - } - } -} diff --git a/src/main/java/com/gmail/nossr50/util/blockmeta/chunkmeta/NullChunkManager.java b/src/main/java/com/gmail/nossr50/util/blockmeta/chunkmeta/NullChunkManager.java deleted file mode 100755 index 3081b0938..000000000 --- a/src/main/java/com/gmail/nossr50/util/blockmeta/chunkmeta/NullChunkManager.java +++ /dev/null @@ -1,102 +0,0 @@ -package com.gmail.nossr50.util.blockmeta.chunkmeta; - -import org.bukkit.World; -import org.bukkit.block.Block; -import org.bukkit.block.BlockState; -import org.bukkit.entity.Entity; - -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() {} -} diff --git a/src/main/java/com/gmail/nossr50/util/blockmeta/chunkmeta/PrimitiveChunkStore.java b/src/main/java/com/gmail/nossr50/util/blockmeta/chunkmeta/PrimitiveChunkStore.java deleted file mode 100755 index d1866acab..000000000 --- a/src/main/java/com/gmail/nossr50/util/blockmeta/chunkmeta/PrimitiveChunkStore.java +++ /dev/null @@ -1,147 +0,0 @@ -package com.gmail.nossr50.util.blockmeta.chunkmeta; - -import com.gmail.nossr50.util.blockmeta.ChunkletStore; -import org.bukkit.Bukkit; -import org.bukkit.World; - -import java.io.IOException; -import java.io.ObjectInputStream; -import java.io.ObjectOutputStream; -import java.util.UUID; - -public class PrimitiveChunkStore implements ChunkStore { - private static final long serialVersionUID = -1L; - transient private boolean dirty = false; - /** X, Z, Y */ - public boolean[][][] store; - private static final int CURRENT_VERSION = 7; - private static final int MAGIC_NUMBER = 0xEA5EDEBB; - private int cx; - private int cz; - private UUID worldUid; - - public PrimitiveChunkStore(World world, int cx, int cz) { - this.cx = cx; - this.cz = cz; - this.worldUid = world.getUID(); - this.store = new boolean[16][16][world.getMaxHeight()]; - } - - @Override - public boolean isDirty() { - return dirty; - } - - @Override - public void setDirty(boolean dirty) { - this.dirty = dirty; - } - - @Override - public int getChunkX() { - return cx; - } - - @Override - public int getChunkZ() { - return cz; - } - - @Override - public boolean isTrue(int x, int y, int z) { - return store[x][z][y]; - } - - @Override - public void setTrue(int x, int y, int z) { - if (y >= store[0][0].length || y < 0) - return; - store[x][z][y] = true; - dirty = true; - } - - @Override - public void setFalse(int x, int y, int z) { - if (y >= store[0][0].length || y < 0) - return; - store[x][z][y] = false; - dirty = true; - } - - @Override - public boolean isEmpty() { - for (int x = 0; x < 16; x++) { - for (int z = 0; z < 16; z++) { - for (int y = 0; y < store[0][0].length; y++) { - if (store[x][z][y]) { - return false; - } - } - } - } - return true; - } - - @Override - public void copyFrom(ChunkletStore otherStore) { - for (int x = 0; x < 16; x++) { - for (int z = 0; z < 16; z++) { - for (int y = 0; y < store[0][0].length; y++) { - store[x][z][y] = otherStore.isTrue(x, y, z); - } - } - } - dirty = true; - } - - private void writeObject(ObjectOutputStream out) throws IOException { - out.writeInt(MAGIC_NUMBER); - out.writeInt(CURRENT_VERSION); - - out.writeLong(worldUid.getLeastSignificantBits()); - out.writeLong(worldUid.getMostSignificantBits()); - out.writeInt(cx); - out.writeInt(cz); - out.writeObject(store); - - dirty = false; - } - - private void readObject(ObjectInputStream in) throws IOException, ClassNotFoundException { - int magic = in.readInt(); - // Can be used to determine the format of the file - int fileVersionNumber = in.readInt(); - - if (magic != MAGIC_NUMBER) { - fileVersionNumber = 0; - } - - long lsb = in.readLong(); - long msb = in.readLong(); - worldUid = new UUID(msb, lsb); - cx = in.readInt(); - cz = in.readInt(); - - store = (boolean[][][]) in.readObject(); - - if (fileVersionNumber < 5) { - fixArray(); - dirty = true; - } - } - - private void fixArray() { - boolean[][][] temp = this.store; - this.store = new boolean[16][16][Bukkit.getWorld(worldUid).getMaxHeight()]; - for (int x = 0; x < 16; x++) { - for (int z = 0; z < 16; z++) { - for (int y = 0; y < store[0][0].length; y++) { - try { - store[x][z][y] = temp[x][y][z]; - } - catch (Exception e) { e.printStackTrace(); } - } - } - } - } -} diff --git a/src/main/java/com/gmail/nossr50/util/blockmeta/conversion/BlockStoreConversionMain.java b/src/main/java/com/gmail/nossr50/util/blockmeta/conversion/BlockStoreConversionMain.java deleted file mode 100755 index 9558e429e..000000000 --- a/src/main/java/com/gmail/nossr50/util/blockmeta/conversion/BlockStoreConversionMain.java +++ /dev/null @@ -1,92 +0,0 @@ -package com.gmail.nossr50.util.blockmeta.conversion; - -import com.gmail.nossr50.config.HiddenConfig; -import com.gmail.nossr50.mcMMO; -import org.bukkit.scheduler.BukkitScheduler; - -import java.io.File; - -public class BlockStoreConversionMain implements Runnable { - private int taskID, i; - private org.bukkit.World world; - BukkitScheduler scheduler; - File dataDir; - File[] xDirs; - BlockStoreConversionXDirectory[] converters; - - public BlockStoreConversionMain(org.bukkit.World world) { - this.taskID = -1; - this.world = world; - this.scheduler = mcMMO.p.getServer().getScheduler(); - this.dataDir = new File(this.world.getWorldFolder(), "mcmmo_data"); - this.converters = new BlockStoreConversionXDirectory[HiddenConfig.getInstance().getConversionRate()]; - } - - public void start() { - if (this.taskID >= 0) { - return; - } - - this.taskID = this.scheduler.runTaskLater(mcMMO.p, this, 1).getTaskId(); - return; - } - - @Override - public void run() { - if (!this.dataDir.exists()) { - softStop(); - return; - } - - if (!this.dataDir.isDirectory()) { - this.dataDir.delete(); - softStop(); - return; - } - - if (this.dataDir.listFiles().length <= 0) { - this.dataDir.delete(); - softStop(); - return; - } - - this.xDirs = this.dataDir.listFiles(); - - for (this.i = 0; (this.i < HiddenConfig.getInstance().getConversionRate()) && (this.i < this.xDirs.length); this.i++) { - if (this.converters[this.i] == null) { - this.converters[this.i] = new BlockStoreConversionXDirectory(); - } - - this.converters[this.i].start(this.world, this.xDirs[this.i]); - } - - softStop(); - } - - public void stop() { - if (this.taskID < 0) { - return; - } - - this.scheduler.cancelTask(this.taskID); - this.taskID = -1; - } - - public void softStop() { - stop(); - - if (this.dataDir.exists() || this.dataDir.isDirectory()) { - start(); - return; - } - - mcMMO.p.getLogger().info("Finished converting the storage for " + world.getName() + "."); - - this.dataDir = null; - this.xDirs = null; - this.world = null; - this.scheduler = null; - this.converters = null; - return; - } -} diff --git a/src/main/java/com/gmail/nossr50/util/blockmeta/conversion/BlockStoreConversionXDirectory.java b/src/main/java/com/gmail/nossr50/util/blockmeta/conversion/BlockStoreConversionXDirectory.java deleted file mode 100755 index c05beb8ab..000000000 --- a/src/main/java/com/gmail/nossr50/util/blockmeta/conversion/BlockStoreConversionXDirectory.java +++ /dev/null @@ -1,81 +0,0 @@ -package com.gmail.nossr50.util.blockmeta.conversion; - -import com.gmail.nossr50.config.HiddenConfig; -import com.gmail.nossr50.mcMMO; -import org.bukkit.scheduler.BukkitScheduler; - -import java.io.File; - -public class BlockStoreConversionXDirectory implements Runnable { - private int taskID, i; - private org.bukkit.World world; - BukkitScheduler scheduler; - File dataDir; - File[] zDirs; - BlockStoreConversionZDirectory[] converters; - - public BlockStoreConversionXDirectory() { - this.taskID = -1; - } - - public void start(org.bukkit.World world, File dataDir) { - this.world = world; - this.scheduler = mcMMO.p.getServer().getScheduler(); - this.converters = new BlockStoreConversionZDirectory[HiddenConfig.getInstance().getConversionRate()]; - this.dataDir = dataDir; - - if (this.taskID >= 0) { - return; - } - - this.taskID = this.scheduler.runTaskLater(mcMMO.p, this, 1).getTaskId(); - return; - } - - @Override - public void run() { - if (!this.dataDir.exists()) { - stop(); - return; - } - - if (!this.dataDir.isDirectory()) { - this.dataDir.delete(); - stop(); - return; - } - - if (this.dataDir.listFiles().length <= 0) { - this.dataDir.delete(); - stop(); - return; - } - - this.zDirs = this.dataDir.listFiles(); - - for (this.i = 0; (this.i < HiddenConfig.getInstance().getConversionRate()) && (this.i < this.zDirs.length); this.i++) { - if (this.converters[this.i] == null) { - this.converters[this.i] = new BlockStoreConversionZDirectory(); - } - - this.converters[this.i].start(this.world, this.dataDir, this.zDirs[this.i]); - } - - stop(); - } - - public void stop() { - if (this.taskID < 0) { - return; - } - - this.scheduler.cancelTask(this.taskID); - this.taskID = -1; - - this.dataDir = null; - this.zDirs = null; - this.world = null; - this.scheduler = null; - this.converters = null; - } -} diff --git a/src/main/java/com/gmail/nossr50/util/blockmeta/conversion/BlockStoreConversionZDirectory.java b/src/main/java/com/gmail/nossr50/util/blockmeta/conversion/BlockStoreConversionZDirectory.java deleted file mode 100755 index 5c182b55b..000000000 --- a/src/main/java/com/gmail/nossr50/util/blockmeta/conversion/BlockStoreConversionZDirectory.java +++ /dev/null @@ -1,192 +0,0 @@ -package com.gmail.nossr50.util.blockmeta.conversion; - -import com.gmail.nossr50.mcMMO; -import com.gmail.nossr50.util.blockmeta.ChunkletStore; -import com.gmail.nossr50.util.blockmeta.HashChunkletManager; -import com.gmail.nossr50.util.blockmeta.PrimitiveChunkletStore; -import com.gmail.nossr50.util.blockmeta.PrimitiveExChunkletStore; -import com.gmail.nossr50.util.blockmeta.chunkmeta.HashChunkManager; -import com.gmail.nossr50.util.blockmeta.chunkmeta.PrimitiveChunkStore; -import org.bukkit.scheduler.BukkitScheduler; - -import java.io.File; - -public class BlockStoreConversionZDirectory implements Runnable { - public int taskID, cx, cz, x, y, z, y2, xPos, zPos, cxPos, czPos; - private String cxs, czs, chunkletName, chunkName; - private org.bukkit.World world; - private BukkitScheduler scheduler; - private File xDir, dataDir; - private HashChunkletManager manager; - private HashChunkManager newManager; - private ChunkletStore tempChunklet; - private PrimitiveChunkletStore primitiveChunklet = null; - private PrimitiveExChunkletStore primitiveExChunklet = null; - private PrimitiveChunkStore currentChunk; - private boolean[] oldArray, newArray; - - public BlockStoreConversionZDirectory() { - this.taskID = -1; - } - - public void start(org.bukkit.World world, File xDir, File dataDir) { - this.world = world; - this.scheduler = mcMMO.p.getServer().getScheduler(); - this.manager = new HashChunkletManager(); - this.newManager = (HashChunkManager) mcMMO.getPlaceStore(); - this.dataDir = dataDir; - this.xDir = xDir; - - if (this.taskID >= 0) { - return; - } - - this.taskID = this.scheduler.runTaskLater(mcMMO.p, this, 1).getTaskId(); - return; - } - - @Override - public void run() { - if (!this.dataDir.exists()) { - stop(); - return; - } - - if (!this.dataDir.isDirectory()) { - this.dataDir.delete(); - stop(); - return; - } - - if (this.dataDir.listFiles().length <= 0) { - this.dataDir.delete(); - stop(); - return; - } - - this.cxs = this.xDir.getName(); - this.czs = this.dataDir.getName(); - this.cx = 0; - this.cz = 0; - - try { - this.cx = Integer.parseInt(this.cxs); - this.cz = Integer.parseInt(this.czs); - } - catch (Exception e) { - this.dataDir.delete(); - stop(); - return; - } - - this.manager.loadChunk(this.cx, this.cz, this.world); - - for (this.y = 0; this.y < (this.world.getMaxHeight() / 64); this.y++) { - this.chunkletName = this.world.getName() + "," + this.cx + "," + this.cz + "," + this.y; - this.tempChunklet = this.manager.store.get(this.chunkletName); - - if (this.tempChunklet instanceof PrimitiveChunkletStore) { - this.primitiveChunklet = (PrimitiveChunkletStore) this.tempChunklet; - } - else if (this.tempChunklet instanceof PrimitiveExChunkletStore) { - this.primitiveExChunklet = (PrimitiveExChunkletStore) this.tempChunklet; - } - - if (this.tempChunklet == null) { - continue; - } - - this.chunkName = this.world.getName() + "," + this.cx + "," + this.cz; - this.currentChunk = (PrimitiveChunkStore) this.newManager.store.get(this.chunkName); - - if (this.currentChunk != null) { - this.xPos = this.cx * 16; - this.zPos = this.cz * 16; - - for (this.x = 0; this.x < 16; this.x++) { - for (this.z = 0; this.z < 16; this.z++) { - this.cxPos = this.xPos + this.x; - this.czPos = this.zPos + this.z; - - for (this.y2 = (64 * this.y); this.y2 < (64 * this.y + 64); this.y2++) { - try { - if (!this.manager.isTrue(this.cxPos, this.y2, this.czPos, this.world)) { - continue; - } - - this.newManager.setTrue(this.cxPos, this.y2, this.czPos, this.world); - } - catch (Exception e) { e.printStackTrace(); } - } - } - } - - continue; - } - - this.newManager.setTrue(this.cx * 16, 0, this.cz * 16, this.world); - this.newManager.setFalse(this.cx * 16, 0, this.cz * 16, this.world); - this.currentChunk = (PrimitiveChunkStore) this.newManager.store.get(this.chunkName); - - for (this.x = 0; this.x < 16; this.x++) { - for (this.z = 0; this.z < 16; this.z++) { - if (this.primitiveChunklet != null) { - this.oldArray = this.primitiveChunklet.store[x][z]; - } - - if (this.primitiveExChunklet != null) { - this.oldArray = this.primitiveExChunklet.store[x][z]; - } - else { - return; - } - - this.newArray = this.currentChunk.store[x][z]; - - if (this.oldArray.length < 64) { - return; - } - else if (this.newArray.length < ((this.y * 64) + 64)) { - return; - } - - System.arraycopy(this.oldArray, 0, this.newArray, (this.y * 64), 64); - } - } - } - - this.manager.unloadChunk(this.cx, this.cz, this.world); - this.newManager.unloadChunk(this.cx, this.cz, this.world); - - for (File yFile : dataDir.listFiles()) { - if (!yFile.exists()) { - continue; - } - - yFile.delete(); - } - - stop(); - } - - public void stop() { - if (this.taskID < 0) { - return; - } - - this.scheduler.cancelTask(taskID); - this.taskID = -1; - - this.cxs = null; - this.czs = null; - this.chunkletName = null; - this.chunkName = null; - this.manager = null; - this.xDir = null; - this.dataDir = null; - this.tempChunklet = null; - this.primitiveChunklet = null; - this.primitiveExChunklet = null; - this.currentChunk = null; - } -} diff --git a/src/main/java/com/gmail/nossr50/util/commands/CommandRegistrationManager.java b/src/main/java/com/gmail/nossr50/util/commands/CommandRegistrationManager.java index 4f4d628da..83d305486 100644 --- a/src/main/java/com/gmail/nossr50/util/commands/CommandRegistrationManager.java +++ b/src/main/java/com/gmail/nossr50/util/commands/CommandRegistrationManager.java @@ -4,9 +4,7 @@ import com.gmail.nossr50.commands.*; import com.gmail.nossr50.commands.admin.CompatibilityCommand; import com.gmail.nossr50.commands.admin.McmmoReloadLocaleCommand; import com.gmail.nossr50.commands.admin.PlayerDebugCommand; -import com.gmail.nossr50.commands.chat.AdminChatCommand; import com.gmail.nossr50.commands.chat.McChatSpy; -import com.gmail.nossr50.commands.chat.PartyChatCommand; import com.gmail.nossr50.commands.database.McpurgeCommand; import com.gmail.nossr50.commands.database.McremoveCommand; import com.gmail.nossr50.commands.database.MmoshowdbCommand; @@ -14,17 +12,14 @@ import com.gmail.nossr50.commands.experience.AddlevelsCommand; import com.gmail.nossr50.commands.experience.AddxpCommand; import com.gmail.nossr50.commands.experience.MmoeditCommand; import com.gmail.nossr50.commands.experience.SkillresetCommand; -import com.gmail.nossr50.commands.hardcore.HardcoreCommand; -import com.gmail.nossr50.commands.hardcore.VampirismCommand; import com.gmail.nossr50.commands.party.PartyCommand; import com.gmail.nossr50.commands.party.teleport.PtpCommand; import com.gmail.nossr50.commands.player.*; import com.gmail.nossr50.commands.skills.*; -import com.gmail.nossr50.config.Config; import com.gmail.nossr50.datatypes.skills.PrimarySkillType; import com.gmail.nossr50.locale.LocaleLoader; import com.gmail.nossr50.mcMMO; -import com.gmail.nossr50.util.StringUtils; +import com.gmail.nossr50.util.text.StringUtils; import org.bukkit.command.PluginCommand; import java.util.ArrayList; @@ -32,14 +27,14 @@ import java.util.List; import java.util.Locale; public final class CommandRegistrationManager { - private CommandRegistrationManager() {}; + private CommandRegistrationManager() {} - private static String permissionsMessage = LocaleLoader.getString("mcMMO.NoPermission"); + private static final String permissionsMessage = LocaleLoader.getString("mcMMO.NoPermission"); private static void registerSkillCommands() { for (PrimarySkillType skill : PrimarySkillType.values()) { String commandName = skill.toString().toLowerCase(Locale.ENGLISH); - String localizedName = skill.getName().toLowerCase(Locale.ENGLISH); + String localizedName = mcMMO.p.getSkillTools().getLocalizedSkillName(skill).toLowerCase(Locale.ENGLISH); PluginCommand command; @@ -122,7 +117,7 @@ public final class CommandRegistrationManager { command.setDescription(LocaleLoader.getString("Commands.Description.addlevels")); command.setPermission("mcmmo.commands.addlevels;mcmmo.commands.addlevels.others"); command.setPermissionMessage(permissionsMessage); - command.setUsage(LocaleLoader.getString("Commands.Usage.3", "addlevels", "[" + LocaleLoader.getString("Commands.Usage.Player") + "]", "<" + LocaleLoader.getString("Commands.Usage.Skill") + ">", "<" + LocaleLoader.getString("Commands.Usage.Level") + ">")); + command.setUsage(LocaleLoader.getString("Commands.Usage.3.XP", "addlevels", "[" + LocaleLoader.getString("Commands.Usage.Player") + "]", "<" + LocaleLoader.getString("Commands.Usage.Skill") + ">", "<" + LocaleLoader.getString("Commands.Usage.Level") + ">")); command.setExecutor(new AddlevelsCommand()); } @@ -131,7 +126,7 @@ public final class CommandRegistrationManager { command.setDescription(LocaleLoader.getString("Commands.Description.addxp")); command.setPermission("mcmmo.commands.addxp;mcmmo.commands.addxp.others"); command.setPermissionMessage(permissionsMessage); - command.setUsage(LocaleLoader.getString("Commands.Usage.3", "addxp", "[" + LocaleLoader.getString("Commands.Usage.Player") + "]", "<" + LocaleLoader.getString("Commands.Usage.Skill") + ">", "<" + LocaleLoader.getString("Commands.Usage.XP") + ">")); + command.setUsage(LocaleLoader.getString("Commands.Usage.3.XP", "addxp", "[" + LocaleLoader.getString("Commands.Usage.Player") + "]", "<" + LocaleLoader.getString("Commands.Usage.Skill") + ">", "<" + LocaleLoader.getString("Commands.Usage.XP") + ">")); command.setExecutor(new AddxpCommand()); } @@ -144,6 +139,15 @@ public final class CommandRegistrationManager { command.setExecutor(new McgodCommand()); } +// private static void registerDropTreasureCommand() { +// PluginCommand command = mcMMO.p.getCommand("mmodroptreasures"); +// command.setDescription(LocaleLoader.getString("Commands.Description.droptreasures")); +// command.setPermission("mcmmo.commands.droptreasures"); +// command.setPermissionMessage(permissionsMessage); +// command.setUsage(LocaleLoader.getString("Commands.Usage.0", "mcgod")); +// command.setExecutor(new DropTreasureCommand()); +// } + private static void registerMmoInfoCommand() { PluginCommand command = mcMMO.p.getCommand("mmoinfo"); command.setDescription(LocaleLoader.getString("Commands.Description.mmoinfo")); @@ -185,7 +189,7 @@ public final class CommandRegistrationManager { command.setDescription(LocaleLoader.getString("Commands.Description.mmoedit")); command.setPermission("mcmmo.commands.mmoedit;mcmmo.commands.mmoedit.others"); command.setPermissionMessage(permissionsMessage); - command.setUsage(LocaleLoader.getString("Commands.Usage.3", "mmoedit", "[" + LocaleLoader.getString("Commands.Usage.Player") + "]", "<" + LocaleLoader.getString("Commands.Usage.Skill") + ">", "<" + LocaleLoader.getString("Commands.Usage.Level") + ">")); + command.setUsage(LocaleLoader.getString("Commands.Usage.3.XP", "mmoedit", "[" + LocaleLoader.getString("Commands.Usage.Player") + "]", "<" + LocaleLoader.getString("Commands.Usage.Skill") + ">", "<" + LocaleLoader.getString("Commands.Usage.Level") + ">")); command.setExecutor(new MmoeditCommand()); } @@ -199,7 +203,7 @@ public final class CommandRegistrationManager { } private static void registerXprateCommand() { - List aliasList = new ArrayList(); + List aliasList = new ArrayList<>(); aliasList.add("mcxprate"); PluginCommand command = mcMMO.p.getCommand("xprate"); @@ -278,7 +282,7 @@ public final class CommandRegistrationManager { private static void registerMcpurgeCommand() { PluginCommand command = mcMMO.p.getCommand("mcpurge"); - command.setDescription(LocaleLoader.getString("Commands.Description.mcpurge", Config.getInstance().getOldUsersCutoff())); + command.setDescription(LocaleLoader.getString("Commands.Description.mcpurge", mcMMO.p.getGeneralConfig().getOldUsersCutoff())); command.setPermission("mcmmo.commands.mcpurge"); command.setPermissionMessage(permissionsMessage); command.setUsage(LocaleLoader.getString("Commands.Usage.0", "mcpurge")); @@ -313,27 +317,27 @@ public final class CommandRegistrationManager { command.setExecutor(new McconvertCommand()); } - private static void registerAdminChatCommand() { - PluginCommand command = mcMMO.p.getCommand("adminchat"); - command.setDescription(LocaleLoader.getString("Commands.Description.adminchat")); - command.setPermission("mcmmo.chat.adminchat"); - command.setPermissionMessage(permissionsMessage); - command.setUsage(LocaleLoader.getString("Commands.Usage.0", "adminchat")); - command.setUsage(command.getUsage() + "\n" + LocaleLoader.getString("Commands.Usage.1", "adminchat", "")); - command.setUsage(command.getUsage() + "\n" + LocaleLoader.getString("Commands.Usage.1", "adminchat", "<" + LocaleLoader.getString("Commands.Usage.Message") + ">")); - command.setExecutor(new AdminChatCommand()); - } +// private static void registerAdminChatCommand() { +// PluginCommand command = mcMMO.p.getCommand("adminchat"); +// command.setDescription(LocaleLoader.getString("Commands.Description.adminchat")); +// command.setPermission("mcmmo.chat.adminchat"); +// command.setPermissionMessage(permissionsMessage); +// command.setUsage(LocaleLoader.getString("Commands.Usage.0", "adminchat")); +// command.setUsage(command.getUsage() + "\n" + LocaleLoader.getString("Commands.Usage.1", "adminchat", "")); +// command.setUsage(command.getUsage() + "\n" + LocaleLoader.getString("Commands.Usage.1", "adminchat", "<" + LocaleLoader.getString("Commands.Usage.Message") + ">")); +// command.setExecutor(new AdminChatCommand()); +// } - private static void registerPartyChatCommand() { - PluginCommand command = mcMMO.p.getCommand("partychat"); - command.setDescription(LocaleLoader.getString("Commands.Description.partychat")); - command.setPermission("mcmmo.chat.partychat;mcmmo.commands.party"); - command.setPermissionMessage(permissionsMessage); - command.setUsage(LocaleLoader.getString("Commands.Usage.0", "partychat")); - command.setUsage(command.getUsage() + "\n" + LocaleLoader.getString("Commands.Usage.1", "partychat", "")); - command.setUsage(command.getUsage() + "\n" + LocaleLoader.getString("Commands.Usage.1", "partychat", "<" + LocaleLoader.getString("Commands.Usage.Message") + ">")); - command.setExecutor(new PartyChatCommand()); - } +// private static void registerPartyChatCommand() { +// PluginCommand command = mcMMO.p.getCommand("partychat"); +// command.setDescription(LocaleLoader.getString("Commands.Description.partychat")); +// command.setPermission("mcmmo.chat.partychat;mcmmo.commands.party"); +// command.setPermissionMessage(permissionsMessage); +// command.setUsage(LocaleLoader.getString("Commands.Usage.0", "partychat")); +// command.setUsage(command.getUsage() + "\n" + LocaleLoader.getString("Commands.Usage.1", "partychat", "")); +// command.setUsage(command.getUsage() + "\n" + LocaleLoader.getString("Commands.Usage.1", "partychat", "<" + LocaleLoader.getString("Commands.Usage.Message") + ">")); +// command.setExecutor(new PartyChatCommand()); +// } private static void registerPartyCommand() { PluginCommand command = mcMMO.p.getCommand("party"); @@ -356,25 +360,25 @@ public final class CommandRegistrationManager { command.setExecutor(new PtpCommand()); } - private static void registerHardcoreCommand() { - PluginCommand command = mcMMO.p.getCommand("hardcore"); - command.setDescription(LocaleLoader.getString("Commands.Description.hardcore")); - command.setPermission("mcmmo.commands.hardcore;mcmmo.commands.hardcore.toggle;mcmmo.commands.hardcore.modify"); - command.setPermissionMessage(permissionsMessage); - command.setUsage(LocaleLoader.getString("Commands.Usage.1", "hardcore", "[on|off]")); - command.setUsage(command.getUsage() + "\n" + LocaleLoader.getString("Commands.Usage.1", "hardcore", "<" + LocaleLoader.getString("Commands.Usage.Rate") + ">")); - command.setExecutor(new HardcoreCommand()); - } - - private static void registerVampirismCommand() { - PluginCommand command = mcMMO.p.getCommand("vampirism"); - command.setDescription(LocaleLoader.getString("Commands.Description.vampirism")); - command.setPermission("mcmmo.commands.vampirism;mcmmo.commands.vampirism.toggle;mcmmo.commands.vampirism.modify"); - command.setPermissionMessage(permissionsMessage); - command.setUsage(LocaleLoader.getString("Commands.Usage.1", "vampirism", "[on|off]")); - command.setUsage(command.getUsage() + "\n" + LocaleLoader.getString("Commands.Usage.1", "vampirism", "<" + LocaleLoader.getString("Commands.Usage.Rate") + ">")); - command.setExecutor(new VampirismCommand()); - } +// private static void registerHardcoreCommand() { +// PluginCommand command = mcMMO.p.getCommand("hardcore"); +// command.setDescription(LocaleLoader.getString("Commands.Description.hardcore")); +// command.setPermission("mcmmo.commands.hardcore;mcmmo.commands.hardcore.toggle;mcmmo.commands.hardcore.modify"); +// command.setPermissionMessage(permissionsMessage); +// command.setUsage(LocaleLoader.getString("Commands.Usage.1", "hardcore", "[on|off]")); +// command.setUsage(command.getUsage() + "\n" + LocaleLoader.getString("Commands.Usage.1", "hardcore", "<" + LocaleLoader.getString("Commands.Usage.Rate") + ">")); +// command.setExecutor(new HardcoreCommand()); +// } +// +// private static void registerVampirismCommand() { +// PluginCommand command = mcMMO.p.getCommand("vampirism"); +// command.setDescription(LocaleLoader.getString("Commands.Description.vampirism")); +// command.setPermission("mcmmo.commands.vampirism;mcmmo.commands.vampirism.toggle;mcmmo.commands.vampirism.modify"); +// command.setPermissionMessage(permissionsMessage); +// command.setUsage(LocaleLoader.getString("Commands.Usage.1", "vampirism", "[on|off]")); +// command.setUsage(command.getUsage() + "\n" + LocaleLoader.getString("Commands.Usage.1", "vampirism", "<" + LocaleLoader.getString("Commands.Usage.Rate") + ">")); +// command.setExecutor(new VampirismCommand()); +// } private static void registerMcnotifyCommand() { PluginCommand command = mcMMO.p.getCommand("mcnotify"); @@ -384,15 +388,6 @@ public final class CommandRegistrationManager { command.setUsage(LocaleLoader.getString("Commands.Usage.0", "mcnotify")); command.setExecutor(new McnotifyCommand()); } - - private static void registerMHDCommand() { - PluginCommand command = mcMMO.p.getCommand("mhd"); - command.setDescription("Resets all mob health bar settings for all players to the default"); //TODO: Localize - command.setPermission("mcmmo.commands.mhd"); - command.setPermissionMessage(permissionsMessage); - command.setUsage(LocaleLoader.getString("Commands.Usage.0", "mhd")); - command.setExecutor(new MHDCommand()); - } private static void registerMcscoreboardCommand() { PluginCommand command = mcMMO.p.getCommand("mcscoreboard"); @@ -418,19 +413,28 @@ public final class CommandRegistrationManager { command.setDescription("Reloads locale"); // TODO: Localize command.setPermission("mcmmo.commands.reloadlocale"); command.setPermissionMessage(permissionsMessage); - command.setUsage(LocaleLoader.formatString("Commands.Usage.0", "mcmmoreloadlocale")); + command.setUsage(LocaleLoader.getString("Commands.Usage.0", "mcmmoreloadlocale")); command.setExecutor(new McmmoReloadLocaleCommand()); } private static void registerCompatibilityCommand() { PluginCommand command = mcMMO.p.getCommand("mmocompat"); //TODO: Localize - command.setDescription("Information about mcMMO and whether or not its in compatibility mode or fully functional."); - command.setUsage(LocaleLoader.formatString("Commands.Usage.0", "mmocompat")); + command.setDescription(LocaleLoader.getString("Commands.Description.mmocompat")); + command.setUsage(LocaleLoader.getString("Commands.Usage.0", "mmocompat")); command.setExecutor(new CompatibilityCommand()); } + private static void registerXPBarCommand() { + PluginCommand command = mcMMO.p.getCommand("mmoxpbar"); //TODO: Localize + command.setDescription(LocaleLoader.getString("Commands.Description.mmoxpbar")); + command.setUsage(LocaleLoader.getString("Commands.Usage.1", "mmoxpbar", "")); + command.setUsage(command.getUsage() +"\n" + LocaleLoader.getString("Commands.Usage.2", "mmoxpbar", "", "")); + command.setExecutor(new XPBarCommand()); + } + public static void registerCommands() { // Generic Commands + registerXPBarCommand(); registerMmoInfoCommand(); registerMmoDebugCommand(); registerMcImportCommand(); @@ -441,13 +445,8 @@ public final class CommandRegistrationManager { registerMcnotifyCommand(); registerMcrefreshCommand(); registerMcscoreboardCommand(); - registerMHDCommand(); registerXprateCommand(); - // Chat Commands - registerPartyChatCommand(); - registerAdminChatCommand(); - // Database Commands registerMcpurgeCommand(); registerMcremoveCommand(); @@ -461,8 +460,8 @@ public final class CommandRegistrationManager { registerSkillresetCommand(); // Hardcore Commands - registerHardcoreCommand(); - registerVampirismCommand(); +// registerHardcoreCommand(); +// registerVampirismCommand(); // Party Commands registerPartyCommand(); diff --git a/src/main/java/com/gmail/nossr50/util/commands/CommandUtils.java b/src/main/java/com/gmail/nossr50/util/commands/CommandUtils.java index ab938f20e..fcbd2fdbe 100644 --- a/src/main/java/com/gmail/nossr50/util/commands/CommandUtils.java +++ b/src/main/java/com/gmail/nossr50/util/commands/CommandUtils.java @@ -1,15 +1,16 @@ package com.gmail.nossr50.util.commands; -import com.gmail.nossr50.config.Config; import com.gmail.nossr50.datatypes.player.McMMOPlayer; import com.gmail.nossr50.datatypes.player.PlayerProfile; import com.gmail.nossr50.datatypes.skills.PrimarySkillType; import com.gmail.nossr50.locale.LocaleLoader; import com.gmail.nossr50.mcMMO; +import com.gmail.nossr50.util.MetadataConstants; import com.gmail.nossr50.util.Misc; -import com.gmail.nossr50.util.StringUtils; import com.gmail.nossr50.util.player.UserManager; +import com.gmail.nossr50.util.skills.SkillTools; import com.gmail.nossr50.util.skills.SkillUtils; +import com.gmail.nossr50.util.text.StringUtils; import com.google.common.collect.ImmutableList; import org.bukkit.OfflinePlayer; import org.bukkit.command.CommandSender; @@ -26,7 +27,7 @@ public final class CommandUtils { private CommandUtils() {} public static boolean isChildSkill(CommandSender sender, PrimarySkillType skill) { - if (skill == null || !skill.isChildSkill()) { + if (skill == null || !SkillTools.isChildSkill(skill)) { return false; } @@ -38,7 +39,7 @@ public final class CommandUtils { if(!target.isOnline() && !hasPermission) { sender.sendMessage(LocaleLoader.getString("Inspect.Offline")); return true; - } else if (sender instanceof Player && !Misc.isNear(((Player) sender).getLocation(), target.getLocation(), Config.getInstance().getInspectDistance()) && !hasPermission) { + } else if (sender instanceof Player && !Misc.isNear(((Player) sender).getLocation(), target.getLocation(), mcMMO.p.getGeneralConfig().getInspectDistance()) && !hasPermission) { sender.sendMessage(LocaleLoader.getString("Inspect.TooFar")); return true; } @@ -86,7 +87,7 @@ public final class CommandUtils { return true; } - PlayerProfile profile = new PlayerProfile(playerName, false); + PlayerProfile profile = new PlayerProfile(playerName, false, 0); if (unloadedProfile(sender, profile)) { return false; @@ -106,11 +107,11 @@ public final class CommandUtils { } public static boolean hasPlayerDataKey(CommandSender sender) { - if (sender == null || !(sender instanceof Player)) { + if (!(sender instanceof Player)) { return false; } - boolean hasPlayerDataKey = ((Player) sender).hasMetadata(mcMMO.playerDataKey); + boolean hasPlayerDataKey = ((Player) sender).hasMetadata(MetadataConstants.METADATA_KEY_PLAYER_DATA); if (!hasPlayerDataKey) { sender.sendMessage(LocaleLoader.getString("Commands.NotLoaded")); @@ -170,7 +171,7 @@ public final class CommandUtils { * @param display The sender to display stats to */ public static void printGatheringSkills(Player inspect, CommandSender display) { - printGroupedSkillData(inspect, display, LocaleLoader.getString("Stats.Header.Gathering"), PrimarySkillType.GATHERING_SKILLS); + printGroupedSkillData(inspect, display, LocaleLoader.getString("Stats.Header.Gathering"), mcMMO.p.getSkillTools().GATHERING_SKILLS); } public static void printGatheringSkills(Player player) { @@ -184,7 +185,7 @@ public final class CommandUtils { * @param display The sender to display stats to */ public static void printCombatSkills(Player inspect, CommandSender display) { - printGroupedSkillData(inspect, display, LocaleLoader.getString("Stats.Header.Combat"), PrimarySkillType.COMBAT_SKILLS); + printGroupedSkillData(inspect, display, LocaleLoader.getString("Stats.Header.Combat"), mcMMO.p.getSkillTools().COMBAT_SKILLS); } public static void printCombatSkills(Player player) { @@ -198,7 +199,7 @@ public final class CommandUtils { * @param display The sender to display stats to */ public static void printMiscSkills(Player inspect, CommandSender display) { - printGroupedSkillData(inspect, display, LocaleLoader.getString("Stats.Header.Misc"), PrimarySkillType.MISC_SKILLS); + printGroupedSkillData(inspect, display, LocaleLoader.getString("Stats.Header.Misc"), mcMMO.p.getSkillTools().getMiscSkills()); } public static void printMiscSkills(Player player) { @@ -206,27 +207,27 @@ public final class CommandUtils { } public static String displaySkill(PlayerProfile profile, PrimarySkillType skill) { - if (skill.isChildSkill()) { + if (SkillTools.isChildSkill(skill)) { return LocaleLoader.getString("Skills.ChildStats", LocaleLoader.getString(StringUtils.getCapitalized(skill.toString()) + ".Listener") + " ", profile.getSkillLevel(skill)); } - if (profile.getSkillLevel(skill) == Config.getInstance().getLevelCap(skill)){ + if (profile.getSkillLevel(skill) == mcMMO.p.getSkillTools().getLevelCap(skill)){ return LocaleLoader.getString("Skills.Stats", LocaleLoader.getString(StringUtils.getCapitalized(skill.toString()) + ".Listener") + " ", profile.getSkillLevel(skill), profile.getSkillXpLevel(skill), LocaleLoader.getString("Skills.MaxXP")); } return LocaleLoader.getString("Skills.Stats", LocaleLoader.getString(StringUtils.getCapitalized(skill.toString()) + ".Listener") + " ", profile.getSkillLevel(skill), profile.getSkillXpLevel(skill), profile.getXpToLevel(skill)); } - private static void printGroupedSkillData(Player inspect, CommandSender display, String header, List skillGroup) { - if(UserManager.getPlayer(inspect) == null) + private static void printGroupedSkillData(Player inspectTarget, CommandSender display, String header, List skillGroup) { + if(UserManager.getPlayer(inspectTarget) == null) return; - PlayerProfile profile = UserManager.getPlayer(inspect).getProfile(); + PlayerProfile profile = UserManager.getPlayer(inspectTarget).getProfile(); - List displayData = new ArrayList(); + List displayData = new ArrayList<>(); displayData.add(header); - for (PrimarySkillType skill : skillGroup) { - if (skill.getPermissions(inspect)) { - displayData.add(displaySkill(profile, skill)); + for (PrimarySkillType primarySkillType : skillGroup) { + if (mcMMO.p.getSkillTools().doesPlayerHaveSkillPermission(inspectTarget, primarySkillType)) { + displayData.add(displaySkill(profile, primarySkillType)); } } @@ -239,7 +240,7 @@ public final class CommandUtils { public static List getOnlinePlayerNames(CommandSender sender) { Player player = sender instanceof Player ? (Player) sender : null; - List onlinePlayerNames = new ArrayList(); + List onlinePlayerNames = new ArrayList<>(); for (Player onlinePlayer : mcMMO.p.getServer().getOnlinePlayers()) { if (player != null && player.canSee(onlinePlayer)) { @@ -258,7 +259,7 @@ public final class CommandUtils { * @return Matched name or {@code partialName} if no match was found */ public static String getMatchedPlayerName(String partialName) { - if (Config.getInstance().getMatchOfflinePlayers()) { + if (mcMMO.p.getGeneralConfig().getMatchOfflinePlayers()) { List matches = matchPlayer(partialName); if (matches.size() == 1) { @@ -286,7 +287,7 @@ public final class CommandUtils { * @return List of all possible names */ private static List matchPlayer(String partialName) { - List matchedPlayers = new ArrayList(); + List matchedPlayers = new ArrayList<>(); for (OfflinePlayer offlinePlayer : mcMMO.p.getServer().getOfflinePlayers()) { String playerName = offlinePlayer.getName(); diff --git a/src/main/java/com/gmail/nossr50/util/compat/CompatibilityLayer.java b/src/main/java/com/gmail/nossr50/util/compat/CompatibilityLayer.java index d09c52f99..51b240338 100644 --- a/src/main/java/com/gmail/nossr50/util/compat/CompatibilityLayer.java +++ b/src/main/java/com/gmail/nossr50/util/compat/CompatibilityLayer.java @@ -8,5 +8,5 @@ public interface CompatibilityLayer { * Whether or not this CompatibilityLayer successfully initialized and in theory should be functional * @return true if this CompatibilityLayer is functional */ - boolean noErrorsOnInitialize(); + default boolean noErrorsOnInitialize() { return true; }; } diff --git a/src/main/java/com/gmail/nossr50/util/compat/CompatibilityManager.java b/src/main/java/com/gmail/nossr50/util/compat/CompatibilityManager.java index 4437ef577..063c858c5 100644 --- a/src/main/java/com/gmail/nossr50/util/compat/CompatibilityManager.java +++ b/src/main/java/com/gmail/nossr50/util/compat/CompatibilityManager.java @@ -2,11 +2,17 @@ package com.gmail.nossr50.util.compat; import com.gmail.nossr50.locale.LocaleLoader; import com.gmail.nossr50.mcMMO; -import com.gmail.nossr50.util.StringUtils; -import com.gmail.nossr50.util.compat.layers.PlayerAttackCooldownExploitPreventionLayer; +import com.gmail.nossr50.util.compat.layers.bungee.AbstractBungeeSerializerCompatibilityLayer; +import com.gmail.nossr50.util.compat.layers.bungee.BungeeLegacySerializerCompatibilityLayer; +import com.gmail.nossr50.util.compat.layers.bungee.BungeeModernSerializerCompatibilityLayer; +import com.gmail.nossr50.util.compat.layers.skills.AbstractMasterAnglerCompatibility; +import com.gmail.nossr50.util.compat.layers.skills.MasterAnglerCompatibilityLayer; import com.gmail.nossr50.util.nms.NMSVersion; import com.gmail.nossr50.util.platform.MinecraftGameVersion; +import com.gmail.nossr50.util.text.StringUtils; import org.bukkit.command.CommandSender; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; import java.util.HashMap; @@ -16,16 +22,18 @@ import java.util.HashMap; * In 2.2 we are switching to modules and that will clean things up significantly * */ +//TODO: I need to delete this crap public class CompatibilityManager { - private HashMap supportedLayers; + private @NotNull HashMap supportedLayers; private boolean isFullyCompatibleServerSoftware = true; //true if all compatibility layers load successfully - private final MinecraftGameVersion minecraftGameVersion; - private final NMSVersion nmsVersion; + private final @NotNull MinecraftGameVersion minecraftGameVersion; + private final @NotNull NMSVersion nmsVersion; /* Compatibility Layers */ - private PlayerAttackCooldownExploitPreventionLayer playerAttackCooldownExploitPreventionLayer; + private AbstractBungeeSerializerCompatibilityLayer bungeeSerializerCompatibilityLayer; + private AbstractMasterAnglerCompatibility masterAnglerCompatibility; - public CompatibilityManager(MinecraftGameVersion minecraftGameVersion) { + public CompatibilityManager(@NotNull MinecraftGameVersion minecraftGameVersion) { mcMMO.p.getLogger().info("Loading compatibility layers..."); this.minecraftGameVersion = minecraftGameVersion; this.nmsVersion = determineNMSVersion(); @@ -51,27 +59,32 @@ public class CompatibilityManager { * For any unsupported layers, load a dummy layer */ private void initCompatibilityLayers() { - if(nmsVersion == NMSVersion.UNSUPPORTED) { - mcMMO.p.getLogger().info("NMS not supported for this version of Minecraft, possible solutions include updating mcMMO or updating your server software. NMS Support is not available on every version of Minecraft."); - mcMMO.p.getLogger().info("Certain features of mcMMO that require NMS will be disabled, you can check what is disabled by running the /mmocompat command!"); - //Load dummy compatibility layers - isFullyCompatibleServerSoftware = false; - loadDummyCompatibilityLayers(); - } else { - playerAttackCooldownExploitPreventionLayer = new PlayerAttackCooldownExploitPreventionLayer(nmsVersion); + initBungeeSerializerLayer(); + initMasterAnglerLayer(); - //Mark as operational - if(playerAttackCooldownExploitPreventionLayer.noErrorsOnInitialize()) { - supportedLayers.put(CompatibilityType.PLAYER_ATTACK_COOLDOWN_EXPLOIT_PREVENTION, true); - } + isFullyCompatibleServerSoftware = true; + } + + private void initMasterAnglerLayer() { + if(minecraftGameVersion.isAtLeast(1, 16, 3)) { + masterAnglerCompatibility = new MasterAnglerCompatibilityLayer(); + } else { + masterAnglerCompatibility = null; } } - private void loadDummyCompatibilityLayers() { + private void initBungeeSerializerLayer() { + if(minecraftGameVersion.isAtLeast(1, 16, 0)) { + bungeeSerializerCompatibilityLayer = new BungeeModernSerializerCompatibilityLayer(); + } else { + bungeeSerializerCompatibilityLayer = new BungeeLegacySerializerCompatibilityLayer(); + } + supportedLayers.put(CompatibilityType.BUNGEE_SERIALIZER, true); } - public void reportCompatibilityStatus(CommandSender commandSender) { + //TODO: move to text manager + public void reportCompatibilityStatus(@NotNull CommandSender commandSender) { if(isFullyCompatibleServerSoftware) { commandSender.sendMessage(LocaleLoader.getString("mcMMO.Template.Prefix", "mcMMO is fully compatible with the currently running server software.")); @@ -80,7 +93,7 @@ public class CompatibilityManager { for(CompatibilityType compatibilityType : CompatibilityType.values()) { if(!supportedLayers.get(compatibilityType)) { commandSender.sendMessage(LocaleLoader.getString("mcMMO.Template.Prefix", - "Support layer for " + StringUtils.getCapitalized(compatibilityType.toString()) + "is not supported on this version of Minecraft.")); + LocaleLoader.getString("Compatibility.Layer.Unsupported", StringUtils.getCapitalized(compatibilityType.toString())))); } } } @@ -88,7 +101,7 @@ public class CompatibilityManager { commandSender.sendMessage(LocaleLoader.getString("mcMMO.Template.Prefix", "NMS Status - " + nmsVersion.toString())); } - public boolean isCompatibilityLayerOperational(CompatibilityType compatibilityType) { + public boolean isCompatibilityLayerOperational(@NotNull CompatibilityType compatibilityType) { return supportedLayers.get(compatibilityType); } @@ -96,30 +109,56 @@ public class CompatibilityManager { return isFullyCompatibleServerSoftware; } - public NMSVersion getNmsVersion() { + public @NotNull NMSVersion getNmsVersion() { return nmsVersion; } - private NMSVersion determineNMSVersion() { - switch(minecraftGameVersion.getMajorVersion().asInt()) { - case 1: - switch(minecraftGameVersion.getMinorVersion().asInt()) { - case 12: - return NMSVersion.NMS_1_12_2; - case 13: - return NMSVersion.NMS_1_13_2; - case 14: - return NMSVersion.NMS_1_14_4; - case 15: - return NMSVersion.NMS_1_15_2; - } + private @NotNull NMSVersion determineNMSVersion() { + //This bit here helps prevent mcMMO breaking if it isn't updated but the game continues to update + if(minecraftGameVersion.isAtLeast(1, 17, 0)) { + return NMSVersion.NMS_1_17; + } + + //Messy but it works + if (minecraftGameVersion.getMajorVersion().asInt() == 1) { + switch (minecraftGameVersion.getMinorVersion().asInt()) { + case 12: + return NMSVersion.NMS_1_12_2; + case 13: + return NMSVersion.NMS_1_13_2; + case 14: + return NMSVersion.NMS_1_14_4; + case 15: + return NMSVersion.NMS_1_15_2; + case 16: + if (minecraftGameVersion.getPatchVersion().asInt() == 1) { + return NMSVersion.NMS_1_16_1; + } else if(minecraftGameVersion.getPatchVersion().asInt() == 2) { + return NMSVersion.NMS_1_16_2; + } else if(minecraftGameVersion.getPatchVersion().asInt() == 3) { + return NMSVersion.NMS_1_16_3; + } else if(minecraftGameVersion.getPatchVersion().asInt() == 4) { + return NMSVersion.NMS_1_16_4; + } else if(minecraftGameVersion.getPatchVersion().asInt() >= 5) { + return NMSVersion.NMS_1_16_5; + } + case 17: + return NMSVersion.NMS_1_17; + } } return NMSVersion.UNSUPPORTED; } - public PlayerAttackCooldownExploitPreventionLayer getPlayerAttackCooldownExploitPreventionLayer() { - return playerAttackCooldownExploitPreventionLayer; + public AbstractBungeeSerializerCompatibilityLayer getBungeeSerializerCompatibilityLayer() { + return bungeeSerializerCompatibilityLayer; } + public @Nullable AbstractMasterAnglerCompatibility getMasterAnglerCompatibilityLayer() { + return masterAnglerCompatibility; + } + + public @Nullable MinecraftGameVersion getMinecraftGameVersion() { + return minecraftGameVersion; + } } diff --git a/src/main/java/com/gmail/nossr50/util/compat/CompatibilityType.java b/src/main/java/com/gmail/nossr50/util/compat/CompatibilityType.java index 36aa43bc9..9b6121008 100644 --- a/src/main/java/com/gmail/nossr50/util/compat/CompatibilityType.java +++ b/src/main/java/com/gmail/nossr50/util/compat/CompatibilityType.java @@ -1,5 +1,7 @@ package com.gmail.nossr50.util.compat; public enum CompatibilityType { - PLAYER_ATTACK_COOLDOWN_EXPLOIT_PREVENTION + PERSISTENT_DATA, + BUNGEE_SERIALIZER, + MASTER_ANGLER, } diff --git a/src/main/java/com/gmail/nossr50/util/compat/layers/AbstractCompatibilityLayer.java b/src/main/java/com/gmail/nossr50/util/compat/layers/AbstractCompatibilityLayer.java index 68a16938a..2ae4a61e1 100644 --- a/src/main/java/com/gmail/nossr50/util/compat/layers/AbstractCompatibilityLayer.java +++ b/src/main/java/com/gmail/nossr50/util/compat/layers/AbstractCompatibilityLayer.java @@ -1,8 +1,6 @@ package com.gmail.nossr50.util.compat.layers; import com.gmail.nossr50.util.compat.CompatibilityLayer; -import com.gmail.nossr50.util.nms.NMSVersion; -import org.jetbrains.annotations.NotNull; /** * @@ -13,11 +11,6 @@ import org.jetbrains.annotations.NotNull; public abstract class AbstractCompatibilityLayer implements CompatibilityLayer { protected boolean noErrorsOnInitialize = true; - protected final @NotNull NMSVersion nmsVersion; - - public AbstractCompatibilityLayer(@NotNull NMSVersion nmsVersion) { - this.nmsVersion = nmsVersion; - } /** * Initialize the CompatibilityLayer diff --git a/src/main/java/com/gmail/nossr50/util/compat/layers/AbstractNMSCompatibilityLayer.java b/src/main/java/com/gmail/nossr50/util/compat/layers/AbstractNMSCompatibilityLayer.java new file mode 100644 index 000000000..05136c189 --- /dev/null +++ b/src/main/java/com/gmail/nossr50/util/compat/layers/AbstractNMSCompatibilityLayer.java @@ -0,0 +1,30 @@ +package com.gmail.nossr50.util.compat.layers; + +import com.gmail.nossr50.util.nms.NMSVersion; +import org.jetbrains.annotations.NotNull; + +/** + * + * These classes are a band-aid solution for adding NMS support into 2.1.XXX + * In 2.2 we are switching to modules and that will clean things up significantly + * + */ +public abstract class AbstractNMSCompatibilityLayer extends AbstractCompatibilityLayer { + + protected final @NotNull NMSVersion nmsVersion; + + public AbstractNMSCompatibilityLayer(@NotNull NMSVersion nmsVersion) { + this.nmsVersion = nmsVersion; + } + + /** + * Initialize the CompatibilityLayer + * @return true if the CompatibilityLayer initialized and should be functional + */ + public abstract boolean initializeLayer(); + + @Override + public boolean noErrorsOnInitialize() { + return noErrorsOnInitialize; + } +} diff --git a/src/main/java/com/gmail/nossr50/util/compat/layers/DummyPlayerAttackCooldownExploitPreventionLayer.java b/src/main/java/com/gmail/nossr50/util/compat/layers/DummyPlayerAttackCooldownExploitPreventionLayer.java deleted file mode 100644 index cf9e3ee7f..000000000 --- a/src/main/java/com/gmail/nossr50/util/compat/layers/DummyPlayerAttackCooldownExploitPreventionLayer.java +++ /dev/null @@ -1,33 +0,0 @@ -package com.gmail.nossr50.util.compat.layers; - -import com.gmail.nossr50.util.nms.NMSVersion; -import org.bukkit.entity.Player; - -import java.lang.reflect.InvocationTargetException; - -public class DummyPlayerAttackCooldownExploitPreventionLayer extends PlayerAttackCooldownExploitPreventionLayer { - public DummyPlayerAttackCooldownExploitPreventionLayer() { - super(NMSVersion.UNSUPPORTED); - } - - @Override - public boolean initializeLayer() { - return noErrorsOnInitialize; - } - - @Override - public float getAttackStrength(Player player) throws InvocationTargetException, IllegalAccessException { - return 1.0F; //Always full strength - } - - @Override - public float getCooldownValue(Player player) throws InvocationTargetException, IllegalAccessException { - return 0F; - } - - @Override - public void resetAttackStrength(Player player) throws InvocationTargetException, IllegalAccessException { - //Do nothing - return; - } -} diff --git a/src/main/java/com/gmail/nossr50/util/compat/layers/PlayerAttackCooldownExploitPreventionLayer.java b/src/main/java/com/gmail/nossr50/util/compat/layers/PlayerAttackCooldownExploitPreventionLayer.java deleted file mode 100644 index e21182d2c..000000000 --- a/src/main/java/com/gmail/nossr50/util/compat/layers/PlayerAttackCooldownExploitPreventionLayer.java +++ /dev/null @@ -1,198 +0,0 @@ -package com.gmail.nossr50.util.compat.layers; - -import com.gmail.nossr50.mcMMO; -import com.gmail.nossr50.util.nms.NMSConstants; -import com.gmail.nossr50.util.nms.NMSVersion; -import org.bukkit.entity.Player; -import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; - -import java.lang.reflect.InvocationTargetException; -import java.lang.reflect.Method; - -/** - * - * These classes are a band-aid solution for adding NMS support into 2.1.XXX - * In 2.2 we are switching to modules and that will clean things up significantly - * - */ -public class PlayerAttackCooldownExploitPreventionLayer extends AbstractCompatibilityLayer implements PlayerAttackCooldownMethods{ - - private final String cbNMSVersionPath; - - protected Class craftPlayerClass; - protected Class entityHumanClass; - - protected Method playerAttackCooldownMethod; - protected Method playerAttackStrengthMethod; - protected Method resetPlayerAttackCooldownMethod; - protected Method getHandleMethod; - - public PlayerAttackCooldownExploitPreventionLayer(@NotNull NMSVersion nmsVersion) { - super(nmsVersion); - mcMMO.p.getLogger().info("Loading Compatibility Layer... (Player Attack Cooldown Exploit Prevention)"); - if(!isCompatibleWithMinecraftVersion()) { - mcMMO.p.getLogger().severe("this version of mcMMO does not support NMS for this version of Minecraft, try updating mcMMO or updating Minecraft. Not all versions of Minecraft will have NMS support built into mcMMO."); - cbNMSVersionPath = ""; - } else { - if(NMSConstants.getCraftBukkitVersionPath(nmsVersion) != null) { - cbNMSVersionPath = NMSConstants.getCraftBukkitVersionPath(nmsVersion); - noErrorsOnInitialize = initializeLayer(); - - if(noErrorsOnInitialize) { - mcMMO.p.getLogger().info("Successfully Loaded Compatibility Layer! (Player Attack Cooldown Exploit Prevention)"); - } - } else { - mcMMO.p.getLogger().info("Failed to load - CL (Player Attack Cooldown Exploit Prevention) Could not find CB NMS path for CL"); - flagErrorsDuringStartup(); - mcMMO.p.getLogger().warning("Could not wire NMS package path for CraftBukkit!"); - cbNMSVersionPath = ""; - } - } - } - - private boolean isCompatibleWithMinecraftVersion() { - switch(nmsVersion) { - case NMS_1_13_2: - case NMS_1_14_4: - case NMS_1_15_2: - return true; - default: - return false; - } - - } - - /** - * Cache all reflection methods/types/classes needed for the NMS of this CompatibilityLayer - * @param cooldownMethodName the cooldown method name - * @param attackStrengthMethodName the attack strength method name - * @param resetAttackCooldownMethodName the reset attack cooldown method name - * @param getHandleMethodName the get handle method name - * @return true if NMS was successfully wired - */ - public boolean wireNMS(@NotNull String cooldownMethodName, @NotNull String attackStrengthMethodName, @NotNull String resetAttackCooldownMethodName, @NotNull String getHandleMethodName) { - entityHumanClass = initEntityHumanClass(); - craftPlayerClass = initCraftPlayerClass(); - - try { - this.playerAttackCooldownMethod = entityHumanClass.getMethod(cooldownMethodName); - this.playerAttackStrengthMethod = entityHumanClass.getMethod(attackStrengthMethodName, float.class); - this.resetPlayerAttackCooldownMethod = entityHumanClass.getMethod(resetAttackCooldownMethodName); - if (craftPlayerClass != null) { - this.getHandleMethod = craftPlayerClass.getMethod(getHandleMethodName); - } else { - return false; - } - return true; - } catch (NoSuchMethodException e) { - flagErrorsDuringStartup(); - e.printStackTrace(); - return false; - } - } - - /** - * Get the cached player attack cooldown method - * @return the cached player attack cooldown method - */ - private @Nullable Method getPlayerAttackCooldownMethod() { - return playerAttackCooldownMethod; - } - - /** - * Get the cached player attack strength method - * @return the cached player attack strength method - */ - private @Nullable Method getPlayerAttackStrengthMethod() { - return playerAttackStrengthMethod; - } - - /** - * Get the cached player attack cooldown reset method - * @return the cached player attack cooldown reset method - */ - private @Nullable Method getResetPlayerAttackCooldownMethod() { - return resetPlayerAttackCooldownMethod; - } - - /** - * Grab the CraftPlayer class type from NMS - * @return the CraftPlayer class type from NMS - */ - private @Nullable Class initCraftPlayerClass() { - try { - return Class.forName(NMSConstants.getCraftPlayerClassPath(cbNMSVersionPath)); - } catch (ClassNotFoundException e) { - flagErrorsDuringStartup(); - e.printStackTrace(); - return null; - } - } - - /** - * Grab the EntityHuman class type from NMS - * @return the EntityHuman class type from NMS - */ - private @Nullable Class initEntityHumanClass() { - try { - return Class.forName(NMSConstants.getEntityHumanClassPath(cbNMSVersionPath)); - } catch (ClassNotFoundException e) { - flagErrorsDuringStartup(); - e.printStackTrace(); - return null; - } - } - - private void flagErrorsDuringStartup() { - noErrorsOnInitialize = false; - } - - /** - * Grabs the attack strength for a player - * Should be noted that as of today there is no way to capture a players current attack strength in spigot when they attack an entity outside of network packet listening - * @param player target player - * @return the float value of the player's attack strength - */ - @Override - public float getAttackStrength(Player player) throws InvocationTargetException, IllegalAccessException { - Object craftPlayer = craftPlayerClass.cast(player); - Object entityHuman = entityHumanClass.cast(getHandleMethod.invoke(craftPlayer)); - - return (float) playerAttackStrengthMethod.invoke(entityHuman, 0F); //Add no adjustment ticks - } - - @Override - public float getCooldownValue(Player player) throws InvocationTargetException, IllegalAccessException { - Object craftPlayer = craftPlayerClass.cast(player); - Object entityHuman = entityHumanClass.cast(getHandleMethod.invoke(craftPlayer)); - - return (float) playerAttackCooldownMethod.invoke(entityHuman); //Add no adjustment ticks - } - - @Override - public void resetAttackStrength(Player player) throws InvocationTargetException, IllegalAccessException { - Object craftPlayer = craftPlayerClass.cast(player); - Object entityHuman = entityHumanClass.cast(getHandleMethod.invoke(craftPlayer)); - - resetPlayerAttackCooldownMethod.invoke(entityHuman); - } - - @Override - public boolean initializeLayer() { - switch(nmsVersion) { - case NMS_1_12_2: - return wireNMS("dr", "n", "ds", "getHandle"); - case NMS_1_13_2: - return wireNMS("dG", "r", "dH", "getHandle"); - case NMS_1_14_4: - return wireNMS("dY", "s", "dZ", "getHandle"); - case NMS_1_15_2: - return wireNMS("ex", "s", "ey", "getHandle"); - default: - break; - } - - return false; - } -} diff --git a/src/main/java/com/gmail/nossr50/util/compat/layers/PlayerAttackCooldownMethods.java b/src/main/java/com/gmail/nossr50/util/compat/layers/PlayerAttackCooldownMethods.java deleted file mode 100644 index ae7cd9ae8..000000000 --- a/src/main/java/com/gmail/nossr50/util/compat/layers/PlayerAttackCooldownMethods.java +++ /dev/null @@ -1,19 +0,0 @@ -package com.gmail.nossr50.util.compat.layers; - -import org.bukkit.entity.Player; - -import java.lang.reflect.InvocationTargetException; - -public interface PlayerAttackCooldownMethods { - /** - * Grabs the attack strength for a player - * Should be noted that as of today there is no way to capture a players current attack strength in spigot when they attack an entity outside of network packet listening - * @param player target player - * @return the float value of the player's attack strength - */ - float getAttackStrength(Player player) throws InvocationTargetException, IllegalAccessException; - - float getCooldownValue(Player player) throws InvocationTargetException, IllegalAccessException; - - void resetAttackStrength(Player player) throws InvocationTargetException, IllegalAccessException; -} diff --git a/src/main/java/com/gmail/nossr50/util/compat/layers/attackcooldown/DummyPlayerAttackCooldownToolLayer.java b/src/main/java/com/gmail/nossr50/util/compat/layers/attackcooldown/DummyPlayerAttackCooldownToolLayer.java new file mode 100644 index 000000000..6cdb19037 --- /dev/null +++ b/src/main/java/com/gmail/nossr50/util/compat/layers/attackcooldown/DummyPlayerAttackCooldownToolLayer.java @@ -0,0 +1,42 @@ +//package com.gmail.nossr50.util.compat.layers.attackcooldown; +// +//import com.gmail.nossr50.util.nms.NMSVersion; +//import org.bukkit.entity.Player; +//import org.jetbrains.annotations.NotNull; +// +//import java.lang.reflect.InvocationTargetException; +// +//public class DummyPlayerAttackCooldownToolLayer extends PlayerAttackCooldownToolLayer { +// public DummyPlayerAttackCooldownToolLayer() { +// super(NMSVersion.UNSUPPORTED); +// } +// +// @Override +// public boolean initializeLayer() { +// return noErrorsOnInitialize; +// } +// +// @Override +// public float getAttackStrength(@NotNull Player player) throws InvocationTargetException, IllegalAccessException { +// return 1.0F; //Always full strength +// } +// +// @Override +// public float getCooldownValue(@NotNull Player player) throws InvocationTargetException, IllegalAccessException { +// return 0F; +// } +// +// @Override +// public void resetAttackStrength(@NotNull Player player) throws InvocationTargetException, IllegalAccessException { +// //Do nothing +// } +// +// @Override +// public int getCooldownFieldValue(@NotNull Player player) throws InvocationTargetException, IllegalAccessException { +// return 0; +// } +// +// @Override +// public void setCooldownFieldValue(@NotNull Player player, int fieldValue) throws InvocationTargetException, IllegalAccessException { +// } +//} diff --git a/src/main/java/com/gmail/nossr50/util/compat/layers/attackcooldown/PlayerAttackCooldownMethods.java b/src/main/java/com/gmail/nossr50/util/compat/layers/attackcooldown/PlayerAttackCooldownMethods.java new file mode 100644 index 000000000..510577a68 --- /dev/null +++ b/src/main/java/com/gmail/nossr50/util/compat/layers/attackcooldown/PlayerAttackCooldownMethods.java @@ -0,0 +1,24 @@ +package com.gmail.nossr50.util.compat.layers.attackcooldown; + +import org.bukkit.entity.Player; +import org.jetbrains.annotations.NotNull; + +import java.lang.reflect.InvocationTargetException; + +public interface PlayerAttackCooldownMethods { + /** + * Grabs the attack strength for a player + * Should be noted that as of today there is no way to capture a players current attack strength in spigot when they attack an entity outside of network packet listening + * @param player target player + * @return the float value of the player's attack strength + */ + float getAttackStrength(@NotNull Player player) throws InvocationTargetException, IllegalAccessException; + + float getCooldownValue(@NotNull Player player) throws InvocationTargetException, IllegalAccessException; + + void resetAttackStrength(@NotNull Player player) throws InvocationTargetException, IllegalAccessException; + + int getCooldownFieldValue(@NotNull Player player) throws InvocationTargetException, IllegalAccessException; + + void setCooldownFieldValue(@NotNull Player player, int fieldValue) throws InvocationTargetException, IllegalAccessException; +} diff --git a/src/main/java/com/gmail/nossr50/util/compat/layers/attackcooldown/PlayerAttackCooldownToolLayer.java b/src/main/java/com/gmail/nossr50/util/compat/layers/attackcooldown/PlayerAttackCooldownToolLayer.java new file mode 100644 index 000000000..5b0026198 --- /dev/null +++ b/src/main/java/com/gmail/nossr50/util/compat/layers/attackcooldown/PlayerAttackCooldownToolLayer.java @@ -0,0 +1,238 @@ +//package com.gmail.nossr50.util.compat.layers.attackcooldown; +// +//import com.gmail.nossr50.mcMMO; +//import com.gmail.nossr50.util.compat.layers.AbstractNMSCompatibilityLayer; +//import com.gmail.nossr50.util.nms.NMSConstants; +//import com.gmail.nossr50.util.nms.NMSVersion; +//import org.bukkit.entity.Player; +//import org.jetbrains.annotations.NotNull; +//import org.jetbrains.annotations.Nullable; +// +//import java.lang.reflect.Field; +//import java.lang.reflect.InvocationTargetException; +//import java.lang.reflect.Method; +// +///** +// * +// * These classes are a band-aid solution for adding NMS support into 2.1.XXX +// * In 2.2 we are switching to modules and that will clean things up significantly +// * +// */ +//public class PlayerAttackCooldownToolLayer extends AbstractNMSCompatibilityLayer implements PlayerAttackCooldownMethods { +// +// private final String cbNMSVersionPath; +// +// protected Class craftPlayerClass; +// protected Class entityHumanClass; +// protected Class entityLivingClass; +// +// protected Method playerAttackCooldownMethod; +// protected Method playerAttackStrengthMethod; +// protected Method resetPlayerAttackCooldownMethod; +// protected Method setPlayerAttackStrengthMethod; +// protected Method getHandleMethod; +// protected Field attackCooldownField; +// protected String attackStrengthFieldName; +// +// public PlayerAttackCooldownToolLayer(@NotNull NMSVersion nmsVersion) { +// super(nmsVersion); +// mcMMO.p.getLogger().info("Loading Compatibility Layer... (Player Attack Cooldown Exploit Prevention)"); +// if(!isCompatibleWithMinecraftVersion(nmsVersion)) { +// mcMMO.p.getLogger().severe("this version of mcMMO does not support NMS for this version of Minecraft, try updating mcMMO or updating Minecraft. Not all versions of Minecraft will have NMS support built into mcMMO."); +// cbNMSVersionPath = ""; +// } else { +// if(NMSConstants.getCraftBukkitVersionPath(nmsVersion) != null) { +// cbNMSVersionPath = NMSConstants.getCraftBukkitVersionPath(nmsVersion); +// noErrorsOnInitialize = initializeLayer(); +// +// if(noErrorsOnInitialize) { +// mcMMO.p.getLogger().info("Successfully Loaded Compatibility Layer! (Player Attack Cooldown Exploit Prevention)"); +// } +// } else { +// mcMMO.p.getLogger().info("Failed to load - CL (Player Attack Cooldown Exploit Prevention) Could not find CB NMS path for CL"); +// flagErrorsDuringStartup(); +// mcMMO.p.getLogger().warning("Could not wire NMS package path for CraftBukkit!"); +// cbNMSVersionPath = ""; +// } +// } +// } +// +// public static boolean isCompatibleWithMinecraftVersion(@NotNull NMSVersion nmsVersion) { +// switch(nmsVersion) { +// case NMS_1_13_2: +// case NMS_1_14_4: +// case NMS_1_15_2: +// case NMS_1_16_4: +// case NMS_1_16_5: +// return true; +// default: +// return false; +// } +// } +// +// /** +// * Cache all reflection methods/types/classes needed for the NMS of this CompatibilityLayer +// * @param cooldownMethodName the cooldown method name +// * @param attackStrengthMethodName the attack strength method name +// * @param resetAttackCooldownMethodName the reset attack cooldown method name +// * @param getHandleMethodName the get handle method name +// * @return true if NMS was successfully wired +// */ +// public boolean wireNMS(@NotNull String cooldownMethodName, @NotNull String attackStrengthMethodName, @NotNull String resetAttackCooldownMethodName, @NotNull String getHandleMethodName, @NotNull String attackStrengthFieldName) { +// entityHumanClass = initEntityHumanClass(); +// +// if (entityHumanClass != null) { +// entityLivingClass = entityHumanClass.getSuperclass(); +// } +// +// craftPlayerClass = initCraftPlayerClass(); +// this.attackStrengthFieldName = attackStrengthFieldName; +// +// try { +// this.attackCooldownField = entityLivingClass.getDeclaredField(attackStrengthFieldName); +// this.attackCooldownField.setAccessible(true); +// } catch (NoSuchFieldException e) { +// e.printStackTrace(); +// } +// +// try { +// this.playerAttackCooldownMethod = entityHumanClass.getMethod(cooldownMethodName); +// this.playerAttackStrengthMethod = entityHumanClass.getMethod(attackStrengthMethodName, float.class); +// this.resetPlayerAttackCooldownMethod = entityHumanClass.getMethod(resetAttackCooldownMethodName); +// +// if (craftPlayerClass != null) { +// this.getHandleMethod = craftPlayerClass.getMethod(getHandleMethodName); +// } else { +// return false; +// } +// return true; +// } catch (NoSuchMethodException e) { +// flagErrorsDuringStartup(); +// e.printStackTrace(); +// return false; +// } +// } +// +// /** +// * Get the cached player attack cooldown method +// * @return the cached player attack cooldown method +// */ +// private @Nullable Method getPlayerAttackCooldownMethod() { +// return playerAttackCooldownMethod; +// } +// +// /** +// * Get the cached player attack strength method +// * @return the cached player attack strength method +// */ +// private @Nullable Method getPlayerAttackStrengthMethod() { +// return playerAttackStrengthMethod; +// } +// +// /** +// * Get the cached player attack cooldown reset method +// * @return the cached player attack cooldown reset method +// */ +// private @Nullable Method getResetPlayerAttackCooldownMethod() { +// return resetPlayerAttackCooldownMethod; +// } +// +// /** +// * Grab the CraftPlayer class type from NMS +// * @return the CraftPlayer class type from NMS +// */ +// private @Nullable Class initCraftPlayerClass() { +// try { +// return Class.forName(NMSConstants.getCraftPlayerClassPath(cbNMSVersionPath)); +// } catch (ClassNotFoundException e) { +// flagErrorsDuringStartup(); +// e.printStackTrace(); +// return null; +// } +// } +// +// /** +// * Grab the EntityHuman class type from NMS +// * @return the EntityHuman class type from NMS +// */ +// private @Nullable Class initEntityHumanClass() { +// try { +// return Class.forName(NMSConstants.getEntityHumanClassPath(cbNMSVersionPath)); +// } catch (ClassNotFoundException e) { +// flagErrorsDuringStartup(); +// e.printStackTrace(); +// return null; +// } +// } +// +// private void flagErrorsDuringStartup() { +// noErrorsOnInitialize = false; +// } +// +// /** +// * Grabs the attack strength for a player +// * Should be noted that as of today there is no way to capture a players current attack strength in spigot when they attack an entity outside of network packet listening +// * @param player target player +// * @return the float value of the player's attack strength +// */ +// @Override +// public float getAttackStrength(@NotNull Player player) throws InvocationTargetException, IllegalAccessException { +// Object craftPlayer = craftPlayerClass.cast(player); +// Object entityHuman = entityHumanClass.cast(getHandleMethod.invoke(craftPlayer)); +// +// return (float) playerAttackStrengthMethod.invoke(entityHuman, 0F); //Add no adjustment ticks +// } +// +// @Override +// public float getCooldownValue(@NotNull Player player) throws InvocationTargetException, IllegalAccessException { +// Object craftPlayer = craftPlayerClass.cast(player); +// Object entityHuman = entityHumanClass.cast(getHandleMethod.invoke(craftPlayer)); +// +// return (float) playerAttackCooldownMethod.invoke(entityHuman); //Add no adjustment ticks +// } +// +// @Override +// public void resetAttackStrength(@NotNull Player player) throws InvocationTargetException, IllegalAccessException { +// Object craftPlayer = craftPlayerClass.cast(player); +// Object entityHuman = entityHumanClass.cast(getHandleMethod.invoke(craftPlayer)); +// Object entityLiving = entityLivingClass.cast(entityHuman); +// +// resetPlayerAttackCooldownMethod.invoke(entityLiving); +// } +// +// @Override +// public int getCooldownFieldValue(@NotNull Player player) throws InvocationTargetException, IllegalAccessException { +// Object craftPlayer = craftPlayerClass.cast(player); +// Object entityHuman = entityHumanClass.cast(getHandleMethod.invoke(craftPlayer)); +// Object entityLiving = entityLivingClass.cast(entityHuman); +// +// return attackCooldownField.getInt(entityLiving); +// } +// +// @Override +// public void setCooldownFieldValue(@NotNull Player player, int fieldValue) throws InvocationTargetException, IllegalAccessException { +// Object craftPlayer = craftPlayerClass.cast(player); +// Object entityHuman = entityHumanClass.cast(getHandleMethod.invoke(craftPlayer)); +// +// attackCooldownField.setInt(entityHuman, fieldValue); +// } +// +// @Override +// public boolean initializeLayer() { +// switch(nmsVersion) { +// case NMS_1_12_2: +// return wireNMS("dr", "n", "ds", "getHandle", "at"); +// case NMS_1_13_2: +// return wireNMS("dG", "r", "dH", "getHandle", "at"); +// case NMS_1_14_4: +// return wireNMS("dY", "s", "dZ", "getHandle", "at"); +// case NMS_1_15_2: +// return wireNMS("ex", "s", "ey", "getHandle", "at"); +// case NMS_1_16_4: +// return wireNMS("eR", "getAttackCooldown", "resetAttackCooldown", "getHandle", "at"); +// default: +// throw new RuntimeException("Unexpected NMS version support in PlayerAttackCooldown compatibility layer initialization!"); +// } +// } +//} +// diff --git a/src/main/java/com/gmail/nossr50/util/compat/layers/bungee/AbstractBungeeSerializerCompatibilityLayer.java b/src/main/java/com/gmail/nossr50/util/compat/layers/bungee/AbstractBungeeSerializerCompatibilityLayer.java new file mode 100644 index 000000000..590a65381 --- /dev/null +++ b/src/main/java/com/gmail/nossr50/util/compat/layers/bungee/AbstractBungeeSerializerCompatibilityLayer.java @@ -0,0 +1,11 @@ +package com.gmail.nossr50.util.compat.layers.bungee; + +import net.kyori.adventure.text.Component; +import net.md_5.bungee.api.chat.BaseComponent; +import org.checkerframework.checker.nullness.qual.NonNull; + +public abstract class AbstractBungeeSerializerCompatibilityLayer { + + public abstract @NonNull Component deserialize(final @NonNull BaseComponent @NonNull[] input); + +} diff --git a/src/main/java/com/gmail/nossr50/util/compat/layers/bungee/BungeeLegacySerializerCompatibilityLayer.java b/src/main/java/com/gmail/nossr50/util/compat/layers/bungee/BungeeLegacySerializerCompatibilityLayer.java new file mode 100644 index 000000000..09c44faaa --- /dev/null +++ b/src/main/java/com/gmail/nossr50/util/compat/layers/bungee/BungeeLegacySerializerCompatibilityLayer.java @@ -0,0 +1,13 @@ +package com.gmail.nossr50.util.compat.layers.bungee; + +import net.kyori.adventure.text.Component; +import net.kyori.adventure.text.serializer.bungeecord.BungeeComponentSerializer; +import net.md_5.bungee.api.chat.BaseComponent; +import org.checkerframework.checker.nullness.qual.NonNull; + +public class BungeeLegacySerializerCompatibilityLayer extends AbstractBungeeSerializerCompatibilityLayer { + @Override + public @NonNull Component deserialize(@NonNull BaseComponent @NonNull [] input) { + return BungeeComponentSerializer.legacy().deserialize(input); + } +} diff --git a/src/main/java/com/gmail/nossr50/util/compat/layers/bungee/BungeeModernSerializerCompatibilityLayer.java b/src/main/java/com/gmail/nossr50/util/compat/layers/bungee/BungeeModernSerializerCompatibilityLayer.java new file mode 100644 index 000000000..0fc93a702 --- /dev/null +++ b/src/main/java/com/gmail/nossr50/util/compat/layers/bungee/BungeeModernSerializerCompatibilityLayer.java @@ -0,0 +1,13 @@ +package com.gmail.nossr50.util.compat.layers.bungee; + +import net.kyori.adventure.text.Component; +import net.kyori.adventure.text.serializer.bungeecord.BungeeComponentSerializer; +import net.md_5.bungee.api.chat.BaseComponent; +import org.checkerframework.checker.nullness.qual.NonNull; + +public class BungeeModernSerializerCompatibilityLayer extends AbstractBungeeSerializerCompatibilityLayer { + @Override + public @NonNull Component deserialize(@NonNull BaseComponent @NonNull [] input) { + return BungeeComponentSerializer.get().deserialize(input); + } +} diff --git a/src/main/java/com/gmail/nossr50/util/compat/layers/skills/AbstractMasterAnglerCompatibility.java b/src/main/java/com/gmail/nossr50/util/compat/layers/skills/AbstractMasterAnglerCompatibility.java new file mode 100644 index 000000000..fdbfa792e --- /dev/null +++ b/src/main/java/com/gmail/nossr50/util/compat/layers/skills/AbstractMasterAnglerCompatibility.java @@ -0,0 +1,6 @@ +package com.gmail.nossr50.util.compat.layers.skills; + +import com.gmail.nossr50.util.compat.layers.AbstractCompatibilityLayer; + +public abstract class AbstractMasterAnglerCompatibility extends AbstractCompatibilityLayer { +} diff --git a/src/main/java/com/gmail/nossr50/util/compat/layers/skills/MasterAnglerCompatibilityLayer.java b/src/main/java/com/gmail/nossr50/util/compat/layers/skills/MasterAnglerCompatibilityLayer.java new file mode 100644 index 000000000..665bd1aec --- /dev/null +++ b/src/main/java/com/gmail/nossr50/util/compat/layers/skills/MasterAnglerCompatibilityLayer.java @@ -0,0 +1,91 @@ +package com.gmail.nossr50.util.compat.layers.skills; + +import org.bukkit.entity.FishHook; +import org.jetbrains.annotations.NotNull; + +public class MasterAnglerCompatibilityLayer extends AbstractMasterAnglerCompatibility { + @Override + public boolean initializeLayer() { + return true; + } + + /** + * Get the minimum number of ticks one has to wait for a fish biting. + *

+ * The default is 100 ticks (5 seconds).
+ * Note that this is before applying lure. + * + * @return Minimum number of ticks one has to wait for a fish biting + */ + public int getMinWaitTime(@NotNull FishHook fishHook) { + return fishHook.getMinWaitTime(); + } + + /** + * Set the minimum number of ticks one has to wait for a fish biting. + *

+ * The default is 100 ticks (5 seconds).
+ * Note that this is before applying lure. + * + * @param minWaitTime Minimum number of ticks one has to wait for a fish + * biting + */ + public void setMinWaitTime(@NotNull FishHook fishHook, int minWaitTime) { + fishHook.setMinWaitTime(minWaitTime); + } + + /** + * Get the maximum number of ticks one has to wait for a fish biting. + *

+ * The default is 600 ticks (30 seconds).
+ * Note that this is before applying lure. + * + * @return Maximum number of ticks one has to wait for a fish biting + */ + public int getMaxWaitTime(@NotNull FishHook fishHook) { + return fishHook.getMaxWaitTime(); + } + + /** + * Set the maximum number of ticks one has to wait for a fish biting. + *

+ * The default is 600 ticks (30 seconds).
+ * Note that this is before applying lure. + * + * @param maxWaitTime Maximum number of ticks one has to wait for a fish + * biting + */ + public void setMaxWaitTime(@NotNull FishHook fishHook, int maxWaitTime) { + fishHook.setMaxWaitTime(maxWaitTime); + } + + /** + * Get whether the lure enchantment should be applied to reduce the wait + * time. + *

+ * The default is true.
+ * Lure reduces the wait time by 100 ticks (5 seconds) for each level of the + * enchantment. + * + * @return Whether the lure enchantment should be applied to reduce the wait + * time + */ + public boolean getApplyLure(@NotNull FishHook fishHook) { + return fishHook.getApplyLure(); + } + + /** + * Set whether the lure enchantment should be applied to reduce the wait + * time. + *

+ * The default is true.
+ * Lure reduces the wait time by 100 ticks (5 seconds) for each level of the + * enchantment. + * + * @param applyLure Whether the lure enchantment should be applied to reduce + * the wait time + */ + public void setApplyLure(@NotNull FishHook fishHook, boolean applyLure) { + fishHook.setApplyLure(applyLure); + } +} diff --git a/src/main/java/com/gmail/nossr50/util/experience/ExperienceBarManager.java b/src/main/java/com/gmail/nossr50/util/experience/ExperienceBarManager.java index e21843c8a..ccc09be80 100644 --- a/src/main/java/com/gmail/nossr50/util/experience/ExperienceBarManager.java +++ b/src/main/java/com/gmail/nossr50/util/experience/ExperienceBarManager.java @@ -3,33 +3,51 @@ package com.gmail.nossr50.util.experience; import com.gmail.nossr50.config.experience.ExperienceConfig; import com.gmail.nossr50.datatypes.player.McMMOPlayer; import com.gmail.nossr50.datatypes.skills.PrimarySkillType; +import com.gmail.nossr50.mcMMO; import com.gmail.nossr50.runnables.skills.ExperienceBarHideTask; +import com.gmail.nossr50.util.player.NotificationManager; import org.bukkit.plugin.Plugin; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; import java.util.HashMap; +import java.util.HashSet; /** * ExperienceBarManager handles displaying and updating mcMMO experience bars for players * Each ExperienceBarManager only manages a single player */ public class ExperienceBarManager { - private McMMOPlayer mcMMOPlayer; + private final McMMOPlayer mcMMOPlayer; + int delaySeconds = 3; - HashMap experienceBars; - HashMap experienceBarHideTaskHashMap; + private HashMap experienceBars; + private HashMap experienceBarHideTaskHashMap; + + private HashSet alwaysVisible; + private HashSet disabledBars; public ExperienceBarManager(McMMOPlayer mcMMOPlayer) { - //Init map + this.mcMMOPlayer = mcMMOPlayer; + init(); + } + + public void init() { + //Init maps experienceBars = new HashMap<>(); experienceBarHideTaskHashMap = new HashMap<>(); - this.mcMMOPlayer = mcMMOPlayer; + //Init sets + alwaysVisible = new HashSet<>(); + disabledBars = new HashSet<>(); } public void updateExperienceBar(PrimarySkillType primarySkillType, Plugin plugin) { - if(!ExperienceConfig.getInstance().isExperienceBarsEnabled() || !ExperienceConfig.getInstance().isExperienceBarEnabled(primarySkillType)) + if(disabledBars.contains(primarySkillType) + || !ExperienceConfig.getInstance().isExperienceBarsEnabled() + || !ExperienceConfig.getInstance().isExperienceBarEnabled(primarySkillType)) return; //Init Bar @@ -49,25 +67,93 @@ public class ExperienceBarManager { if(experienceBarHideTaskHashMap.get(primarySkillType) != null) { experienceBarHideTaskHashMap.get(primarySkillType).cancel(); - scheduleHideTask(primarySkillType, plugin); - } else { - scheduleHideTask(primarySkillType, plugin); } + + scheduleHideTask(primarySkillType, plugin); } private void scheduleHideTask(PrimarySkillType primarySkillType, Plugin plugin) { + if(alwaysVisible.contains(primarySkillType)) + return; + ExperienceBarHideTask experienceBarHideTask = new ExperienceBarHideTask(this, mcMMOPlayer, primarySkillType); - experienceBarHideTask.runTaskLater(plugin, 20*2); + experienceBarHideTask.runTaskLater(plugin, 20* delaySeconds); experienceBarHideTaskHashMap.put(primarySkillType, experienceBarHideTask); } public void hideExperienceBar(PrimarySkillType primarySkillType) { - experienceBars.get(primarySkillType).hideExperienceBar(); + if(experienceBars.containsKey(primarySkillType)) + experienceBars.get(primarySkillType).hideExperienceBar(); } public void clearTask(PrimarySkillType primarySkillType) { experienceBarHideTaskHashMap.remove(primarySkillType); } + + public void disableAllBars() { + for(PrimarySkillType primarySkillType : PrimarySkillType.values()) { + xpBarSettingToggle(XPBarSettingTarget.HIDE, primarySkillType); + } + + NotificationManager.sendPlayerInformationChatOnlyPrefixed(mcMMOPlayer.getPlayer(), "Commands.XPBar.DisableAll"); + } + + public void xpBarSettingToggle(@NotNull XPBarSettingTarget settingTarget, @Nullable PrimarySkillType skillType) { + switch(settingTarget) { + case SHOW: + disabledBars.remove(skillType); + alwaysVisible.add(skillType); + + //Remove lingering tasks + if(experienceBarHideTaskHashMap.containsKey(skillType)) { + experienceBarHideTaskHashMap.get(skillType).cancel(); + } + + updateExperienceBar(skillType, mcMMO.p); + break; + case HIDE: + alwaysVisible.remove(skillType); + disabledBars.add(skillType); + + //Remove lingering tasks + if(experienceBarHideTaskHashMap.containsKey(skillType)) { + experienceBarHideTaskHashMap.get(skillType).cancel(); + } + + hideExperienceBar(skillType); + break; + case RESET: + resetBarSettings(); + break; + } + + informPlayer(settingTarget, skillType); + } + + private void resetBarSettings() { + //Hide all currently permanent bars + for(PrimarySkillType permanent : alwaysVisible) { + hideExperienceBar(permanent); + } + + alwaysVisible.clear(); + disabledBars.clear(); + + //Hide child skills by default + disabledBars.add(PrimarySkillType.SALVAGE); + disabledBars.add(PrimarySkillType.SMELTING); + } + + private void informPlayer(@NotNull ExperienceBarManager.@NotNull XPBarSettingTarget settingTarget, @Nullable PrimarySkillType primarySkillType) { + //Inform player of setting change + if(settingTarget != XPBarSettingTarget.RESET) { + NotificationManager.sendPlayerInformationChatOnlyPrefixed(mcMMOPlayer.getPlayer(), "Commands.XPBar.SettingChanged", mcMMO.p.getSkillTools().getLocalizedSkillName(primarySkillType), settingTarget.toString()); + } else { + NotificationManager.sendPlayerInformationChatOnlyPrefixed(mcMMOPlayer.getPlayer(), "Commands.XPBar.Reset"); + } + } + + public enum XPBarSettingTarget { SHOW, HIDE, RESET, DISABLE } } diff --git a/src/main/java/com/gmail/nossr50/util/experience/ExperienceBarWrapper.java b/src/main/java/com/gmail/nossr50/util/experience/ExperienceBarWrapper.java index 1d66ac823..5ae2032c6 100644 --- a/src/main/java/com/gmail/nossr50/util/experience/ExperienceBarWrapper.java +++ b/src/main/java/com/gmail/nossr50/util/experience/ExperienceBarWrapper.java @@ -4,8 +4,8 @@ import com.gmail.nossr50.config.experience.ExperienceConfig; import com.gmail.nossr50.datatypes.player.McMMOPlayer; import com.gmail.nossr50.datatypes.skills.PrimarySkillType; import com.gmail.nossr50.locale.LocaleLoader; -import com.gmail.nossr50.util.StringUtils; import com.gmail.nossr50.util.player.PlayerLevelUtils; +import com.gmail.nossr50.util.text.StringUtils; import org.bukkit.boss.BarColor; import org.bukkit.boss.BarStyle; import org.bukkit.boss.BossBar; @@ -14,7 +14,7 @@ import org.bukkit.entity.Player; import java.util.List; /** - * A visual representation of a players skill level progress for a PrimarySkillType + * A visual representation of a player's skill level progress for a PrimarySkillType */ public class ExperienceBarWrapper { diff --git a/src/main/java/com/gmail/nossr50/util/experience/FormulaManager.java b/src/main/java/com/gmail/nossr50/util/experience/FormulaManager.java index eda9dc52c..f7478e24c 100644 --- a/src/main/java/com/gmail/nossr50/util/experience/FormulaManager.java +++ b/src/main/java/com/gmail/nossr50/util/experience/FormulaManager.java @@ -1,6 +1,5 @@ package com.gmail.nossr50.util.experience; -import com.gmail.nossr50.config.Config; import com.gmail.nossr50.config.experience.ExperienceConfig; import com.gmail.nossr50.datatypes.experience.FormulaType; import com.gmail.nossr50.datatypes.skills.PrimarySkillType; @@ -12,7 +11,7 @@ import java.util.HashMap; import java.util.Map; public class FormulaManager { - private static File formulaFile = new File(mcMMO.getFlatFileDirectory() + "formula.yml"); + private static final File formulaFile = new File(mcMMO.getFlatFileDirectory() + "formula.yml"); // Experience needed to reach a level, cached values to improve conversion speed private Map experienceNeededRetroLinear; @@ -89,7 +88,7 @@ public class FormulaManager { public int[] calculateNewLevel(PrimarySkillType primarySkillType, int experience, FormulaType formulaType) { int newLevel = 0; int remainder = 0; - int maxLevel = Config.getInstance().getLevelCap(primarySkillType); + int maxLevel = mcMMO.p.getSkillTools().getLevelCap(primarySkillType); while (experience > 0 && newLevel < maxLevel) { int experienceToNextLevel = getXPtoNextLevel(newLevel, formulaType); @@ -116,9 +115,9 @@ public class FormulaManager { * @return amount of experience needed to reach next level */ public int getXPtoNextLevel(int level, FormulaType formulaType) { - /** - * Retro mode XP requirements are the default requirements - * Standard mode XP requirements are multiplied by a factor of 10 + /* + Retro mode XP requirements are the default requirements + Standard mode XP requirements are multiplied by a factor of 10 */ //TODO: When the heck is Unknown used? diff --git a/src/main/java/com/gmail/nossr50/util/nms/NMSConstants.java b/src/main/java/com/gmail/nossr50/util/nms/NMSConstants.java index ee94153cf..38d65eb4b 100644 --- a/src/main/java/com/gmail/nossr50/util/nms/NMSConstants.java +++ b/src/main/java/com/gmail/nossr50/util/nms/NMSConstants.java @@ -48,8 +48,10 @@ public class NMSConstants { return "v1_14_R1"; case NMS_1_15_2: return "v1_15_R1"; - case NMS_1_16: - break; + case NMS_1_16_1: + return "v1_16_R1"; + case NMS_1_16_4: + return "v1_16_R3"; case UNSUPPORTED: break; } diff --git a/src/main/java/com/gmail/nossr50/util/nms/NMSVersion.java b/src/main/java/com/gmail/nossr50/util/nms/NMSVersion.java index 165cb8a07..8c1e3c8b4 100644 --- a/src/main/java/com/gmail/nossr50/util/nms/NMSVersion.java +++ b/src/main/java/com/gmail/nossr50/util/nms/NMSVersion.java @@ -17,7 +17,12 @@ public enum NMSVersion { NMS_1_15_2("1.15.2"), //1.16 - NMS_1_16("1.16"), + NMS_1_16_1("1.16.1"), + NMS_1_16_2("1.16.2"), + NMS_1_16_3("1.16.3"), + NMS_1_16_4("1.16.4"), + NMS_1_16_5("1.16.5"), + NMS_1_17("1.17"), //Version not known to this build of mcMMO UNSUPPORTED("unsupported"); diff --git a/src/main/java/com/gmail/nossr50/util/platform/MinecraftGameVersion.java b/src/main/java/com/gmail/nossr50/util/platform/MinecraftGameVersion.java index 537c261ce..ead974825 100644 --- a/src/main/java/com/gmail/nossr50/util/platform/MinecraftGameVersion.java +++ b/src/main/java/com/gmail/nossr50/util/platform/MinecraftGameVersion.java @@ -27,4 +27,37 @@ public class MinecraftGameVersion extends MajorMinorPatchVersion { super(majorVerNumber, minorVerNumber); } + /** + * Returns whether or not the Minecraft version is at least equal to or higher than a target version + * @param majorVerNumber target major version number - for example 1.16.5 , the 1 is the major version + * @param minorVerNumber target minor version number - for example 1.16.5, the 16 is the minor version + * @param patchVerNumber target patch version number - for example 1.16.5, the 5 is the patch version number + * + * @return returns true if Minecraft is at least a certain version + */ + public boolean isAtLeast(int majorVerNumber, int minorVerNumber, int patchVerNumber) { + //First check if the major version is higher, if it is we have no need to check minor version or patch version + + if(getMajorVersion().asInt() > majorVerNumber) { + return true; //Major version is one higher and hierarchically more important than the other versions + } + + if(getMajorVersion().asInt() < majorVerNumber) { + return false; //Major version is below, so return false + } + + //Major version meets the requirement, check minor version + + if(getMinorVersion().asInt() > minorVerNumber) { + return true; //Minor version is one higher and hierarchically more important than patch version, so exit here + } + + if(getMinorVersion().asInt() < minorVerNumber) { + return false; //Minor version is at least one version behind, return false + } + + //Minor version meets the requirement, check patch version + return getPatchVersion().asInt() >= patchVerNumber; + } + } diff --git a/src/main/java/com/gmail/nossr50/util/platform/PlatformManager.java b/src/main/java/com/gmail/nossr50/util/platform/PlatformManager.java index 78d604e11..989eb3da6 100644 --- a/src/main/java/com/gmail/nossr50/util/platform/PlatformManager.java +++ b/src/main/java/com/gmail/nossr50/util/platform/PlatformManager.java @@ -6,9 +6,9 @@ import org.bukkit.Bukkit; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; -import java.util.ArrayList; import java.util.Locale; -import java.util.stream.Collectors; +import java.util.regex.Matcher; +import java.util.regex.Pattern; /** * @@ -47,18 +47,19 @@ public class PlatformManager { private @NotNull MinecraftGameVersion determineGameVersion(String platformVersionString) { int major = 0, minor = 0, patch = 0; - String[] splitVersion = platformVersionString.split("\\.", 3); - mcMMO.p.getLogger().info("Platform String: " + platformVersionString); - //TODO: this is very hacky and probably isn't reliable - //Grab all consecutive digits - major = getSubsequentDigits(splitVersion[0].toCharArray(), 0); - minor = getSubsequentDigits(splitVersion[1].toCharArray(), 0); - //Not all versions of Minecraft have a patch digit - //If the first character isn't a digit it's not a patch number and its some crap we don't care about - if(splitVersion.length > 2 && Character.isDigit(splitVersion[2].toCharArray()[0])) - patch = getSubsequentDigits(splitVersion[2].toCharArray(), 0); + // Gets two numbers separated by . and optional third number after next dot. Must end with - or _ + Matcher versionMatch = Pattern.compile("(\\d+)\\.(\\d+)(?:\\.(\\d+))?[-_].*").matcher(platformVersionString); + + if (versionMatch.find()) { + major = Integer.parseInt(versionMatch.group(1)); + minor = Integer.parseInt(versionMatch.group(2)); + + if (versionMatch.group(3) != null) { + patch = Integer.parseInt(versionMatch.group(3)); + } + } mcMMO.p.getLogger().info("Minecraft version determined to be - " + major + "." @@ -68,34 +69,6 @@ public class PlatformManager { return new MinecraftGameVersion(major, minor, patch); } - /** - * Get all consecutive digits in a char array from position - * @param charArray target char array - * @param position starting position - * @return all consecutive digits from position - */ - private int getSubsequentDigits(char[] charArray, int position) { - ArrayList digitArrayList = new ArrayList<>(); - - do { - if(Character.isDigit(charArray[position])) { - digitArrayList.add(charArray[position]); - position++; - } else { - break; - } - } while (position < charArray.length); - - //Convert List -> String - String digits = digitArrayList - .stream() - .map(String::valueOf) - .collect(Collectors.joining()); - - //Copy value - return Integer.parseInt(digits); - } - //TODO: Rewrite this properly once we actually support a not-bukkit platform private @NotNull ServerSoftwareType determinePlatformType() { if(Bukkit.getVersion().toLowerCase(Locale.ENGLISH).contains("paper")) diff --git a/src/main/java/com/gmail/nossr50/util/platform/version/SimpleNumericVersion.java b/src/main/java/com/gmail/nossr50/util/platform/version/SimpleNumericVersion.java index b76bbac05..8330e4279 100644 --- a/src/main/java/com/gmail/nossr50/util/platform/version/SimpleNumericVersion.java +++ b/src/main/java/com/gmail/nossr50/util/platform/version/SimpleNumericVersion.java @@ -3,7 +3,7 @@ package com.gmail.nossr50.util.platform.version; import org.jetbrains.annotations.NotNull; public class SimpleNumericVersion extends SimpleVersion implements NumericVersioned { - private int versionNumber; + private final int versionNumber; public SimpleNumericVersion(int versionNumber) { super(String.valueOf(versionNumber)); diff --git a/src/main/java/com/gmail/nossr50/util/player/NotificationManager.java b/src/main/java/com/gmail/nossr50/util/player/NotificationManager.java index 2bd02aa6a..5ae709683 100644 --- a/src/main/java/com/gmail/nossr50/util/player/NotificationManager.java +++ b/src/main/java/com/gmail/nossr50/util/player/NotificationManager.java @@ -1,7 +1,7 @@ package com.gmail.nossr50.util.player; -import com.gmail.nossr50.config.AdvancedConfig; -import com.gmail.nossr50.config.Config; +import com.gmail.nossr50.datatypes.LevelUpBroadcastPredicate; +import com.gmail.nossr50.datatypes.PowerLevelUpBroadcastPredicate; import com.gmail.nossr50.datatypes.interactions.NotificationType; import com.gmail.nossr50.datatypes.notifications.SensitiveCommandType; import com.gmail.nossr50.datatypes.player.McMMOPlayer; @@ -11,19 +11,32 @@ import com.gmail.nossr50.events.skills.McMMOPlayerNotificationEvent; import com.gmail.nossr50.locale.LocaleLoader; import com.gmail.nossr50.mcMMO; import com.gmail.nossr50.util.Permissions; -import com.gmail.nossr50.util.TextComponentFactory; import com.gmail.nossr50.util.sounds.SoundManager; import com.gmail.nossr50.util.sounds.SoundType; -import net.md_5.bungee.api.ChatMessageType; -import net.md_5.bungee.api.chat.TextComponent; +import com.gmail.nossr50.util.text.McMMOMessageType; +import com.gmail.nossr50.util.text.TextComponentFactory; +import net.kyori.adventure.audience.Audience; +import net.kyori.adventure.audience.MessageType; +import net.kyori.adventure.identity.Identity; +import net.kyori.adventure.text.Component; +import net.kyori.adventure.text.event.HoverEvent; +import net.kyori.adventure.text.format.TextColor; +import net.kyori.adventure.text.serializer.legacy.LegacyComponentSerializer; import org.bukkit.Bukkit; import org.bukkit.ChatColor; import org.bukkit.Server; import org.bukkit.SoundCategory; import org.bukkit.command.CommandSender; import org.bukkit.entity.Player; +import org.jetbrains.annotations.NotNull; + +import java.time.LocalDate; public class NotificationManager { + + public static final String HEX_BEIGE_COLOR = "#c2a66e"; + public static final String HEX_LIME_GREEN_COLOR = "#8ec26e"; + /** * Sends players notifications from mcMMO * Does so by sending out an event so other plugins can cancel it @@ -36,9 +49,9 @@ public class NotificationManager { if(UserManager.getPlayer(player) == null || !UserManager.getPlayer(player).useChatNotifications()) return; - ChatMessageType destination = AdvancedConfig.getInstance().doesNotificationUseActionBar(notificationType) ? ChatMessageType.ACTION_BAR : ChatMessageType.SYSTEM; + McMMOMessageType destination = mcMMO.p.getAdvancedConfig().doesNotificationUseActionBar(notificationType) ? McMMOMessageType.ACTION_BAR : McMMOMessageType.SYSTEM; - TextComponent message = TextComponentFactory.getNotificationTextComponentFromLocale(key); + Component message = TextComponentFactory.getNotificationTextComponentFromLocale(key); McMMOPlayerNotificationEvent customEvent = checkNotificationEvent(player, notificationType, destination, message); sendNotification(player, customEvent); @@ -91,9 +104,9 @@ public class NotificationManager { if(UserManager.getPlayer(player) == null || !UserManager.getPlayer(player).useChatNotifications()) return; - ChatMessageType destination = AdvancedConfig.getInstance().doesNotificationUseActionBar(notificationType) ? ChatMessageType.ACTION_BAR : ChatMessageType.SYSTEM; + McMMOMessageType destination = mcMMO.p.getAdvancedConfig().doesNotificationUseActionBar(notificationType) ? McMMOMessageType.ACTION_BAR : McMMOMessageType.SYSTEM; - TextComponent message = TextComponentFactory.getNotificationMultipleValues(key, values); + Component message = TextComponentFactory.getNotificationMultipleValues(key, values); McMMOPlayerNotificationEvent customEvent = checkNotificationEvent(player, notificationType, destination, message); sendNotification(player, customEvent); @@ -103,25 +116,27 @@ public class NotificationManager { if (customEvent.isCancelled()) return; + final Audience audience = mcMMO.getAudiences().player(player); + //If the message is being sent to the action bar we need to check if the copy if a copy is sent to the chat system - if(customEvent.getChatMessageType() == ChatMessageType.ACTION_BAR) + if(customEvent.getChatMessageType() == McMMOMessageType.ACTION_BAR) { - player.spigot().sendMessage(customEvent.getChatMessageType(), customEvent.getNotificationTextComponent()); + audience.sendActionBar(customEvent.getNotificationTextComponent()); if(customEvent.isMessageAlsoBeingSentToChat()) { //Send copy to chat system - player.spigot().sendMessage(ChatMessageType.SYSTEM, customEvent.getNotificationTextComponent()); + audience.sendMessage(Identity.nil(), customEvent.getNotificationTextComponent(), MessageType.SYSTEM); } } else { - player.spigot().sendMessage(customEvent.getChatMessageType(), customEvent.getNotificationTextComponent()); + audience.sendMessage(Identity.nil(), customEvent.getNotificationTextComponent(), MessageType.SYSTEM); } } - private static McMMOPlayerNotificationEvent checkNotificationEvent(Player player, NotificationType notificationType, ChatMessageType destination, TextComponent message) { + private static McMMOPlayerNotificationEvent checkNotificationEvent(Player player, NotificationType notificationType, McMMOMessageType destination, Component message) { //Init event McMMOPlayerNotificationEvent customEvent = new McMMOPlayerNotificationEvent(player, - notificationType, message, destination, AdvancedConfig.getInstance().doesNotificationSendCopyToChat(notificationType)); + notificationType, message, destination, mcMMO.p.getAdvancedConfig().doesNotificationSendCopyToChat(notificationType)); //Call event Bukkit.getServer().getPluginManager().callEvent(customEvent); @@ -139,9 +154,9 @@ public class NotificationManager { if(!mcMMOPlayer.useChatNotifications()) return; - ChatMessageType destination = AdvancedConfig.getInstance().doesNotificationUseActionBar(NotificationType.LEVEL_UP_MESSAGE) ? ChatMessageType.ACTION_BAR : ChatMessageType.SYSTEM; + McMMOMessageType destination = mcMMO.p.getAdvancedConfig().doesNotificationUseActionBar(NotificationType.LEVEL_UP_MESSAGE) ? McMMOMessageType.ACTION_BAR : McMMOMessageType.SYSTEM; - TextComponent levelUpTextComponent = TextComponentFactory.getNotificationLevelUpTextComponent(skillName, levelsGained, newLevel); + Component levelUpTextComponent = TextComponentFactory.getNotificationLevelUpTextComponent(skillName, levelsGained, newLevel); McMMOPlayerNotificationEvent customEvent = checkNotificationEvent(mcMMOPlayer.getPlayer(), NotificationType.LEVEL_UP_MESSAGE, destination, levelUpTextComponent); sendNotification(mcMMOPlayer.getPlayer(), customEvent); @@ -161,13 +176,13 @@ public class NotificationManager { return; //CHAT MESSAGE - mcMMOPlayer.getPlayer().spigot().sendMessage(TextComponentFactory.getSubSkillUnlockedNotificationComponents(mcMMOPlayer.getPlayer(), subSkillType)); + mcMMO.getAudiences().player(mcMMOPlayer.getPlayer()).sendMessage(Identity.nil(), TextComponentFactory.getSubSkillUnlockedNotificationComponents(mcMMOPlayer.getPlayer(), subSkillType)); //Unlock Sound Effect SoundManager.sendCategorizedSound(mcMMOPlayer.getPlayer(), mcMMOPlayer.getPlayer().getLocation(), SoundType.SKILL_UNLOCKED, SoundCategory.MASTER); //ACTION BAR MESSAGE - /*if(AdvancedConfig.getInstance().doesNotificationUseActionBar(NotificationType.SUBSKILL_UNLOCKED)) + /*if(mcMMO.p.getAdvancedConfig().doesNotificationUseActionBar(NotificationType.SUBSKILL_UNLOCKED)) mcMMOPlayer.getPlayer().spigot().sendMessage(ChatMessageType.ACTION_BAR, new TextComponent(LocaleLoader.getString("JSON.SkillUnlockMessage", subSkillType.getLocaleName(), String.valueOf(RankUtils.getRank(mcMMOPlayer.getPlayer(), @@ -181,7 +196,7 @@ public class NotificationManager { */ private static void sendAdminNotification(String msg) { //If its not enabled exit - if(!Config.getInstance().adminNotifications()) + if(!mcMMO.p.getGeneralConfig().adminNotifications()) return; for(Player player : Bukkit.getServer().getOnlinePlayers()) @@ -251,4 +266,83 @@ public class NotificationManager { return newArray; } + //TODO: Remove the code duplication, am lazy atm + //TODO: Fix broadcasts being skipped for situations where a player skips over the milestone like with the addlevels command + public static void processLevelUpBroadcasting(@NotNull McMMOPlayer mmoPlayer, @NotNull PrimarySkillType primarySkillType, int level) { + if(level <= 0) + return; + + //Check if broadcasting is enabled + if(mcMMO.p.getGeneralConfig().shouldLevelUpBroadcasts()) { + //Permission check + if(!Permissions.levelUpBroadcast(mmoPlayer.getPlayer())) { + return; + } + + int levelInterval = mcMMO.p.getGeneralConfig().getLevelUpBroadcastInterval(); + int remainder = level % levelInterval; + + if(remainder == 0) { + //Grab appropriate audience + Audience audience = mcMMO.getAudiences().filter(getLevelUpBroadcastPredicate(mmoPlayer.getPlayer())); + //TODO: Make prettier + HoverEvent levelMilestoneHover = Component.text(mmoPlayer.getPlayer().getName()) + .append(Component.newline()) + .append(Component.text(LocalDate.now().toString())) + .append(Component.newline()) + .append(Component.text(mcMMO.p.getSkillTools().getLocalizedSkillName(primarySkillType)+" reached level "+level)).color(TextColor.fromHexString(HEX_BEIGE_COLOR)) + .asHoverEvent(); + + String localeMessage = LocaleLoader.getString("Broadcasts.LevelUpMilestone", mmoPlayer.getPlayer().getDisplayName(), level, mcMMO.p.getSkillTools().getLocalizedSkillName(primarySkillType)); + Component message = LegacyComponentSerializer.legacySection().deserialize(localeMessage).hoverEvent(levelMilestoneHover); + + Bukkit.getScheduler().runTaskLater(mcMMO.p, () -> audience.sendMessage(Identity.nil(), message), 0); + } + } + } + + //TODO: Remove the code duplication, am lazy atm + //TODO: Fix broadcasts being skipped for situations where a player skips over the milestone like with the addlevels command + public static void processPowerLevelUpBroadcasting(@NotNull McMMOPlayer mmoPlayer, int powerLevel) { + if(powerLevel <= 0) + return; + + //Check if broadcasting is enabled + if(mcMMO.p.getGeneralConfig().shouldPowerLevelUpBroadcasts()) { + //Permission check + if(!Permissions.levelUpBroadcast(mmoPlayer.getPlayer())) { + return; + } + + int levelInterval = mcMMO.p.getGeneralConfig().getPowerLevelUpBroadcastInterval(); + int remainder = powerLevel % levelInterval; + + if(remainder == 0) { + //Grab appropriate audience + Audience audience = mcMMO.getAudiences().filter(getPowerLevelUpBroadcastPredicate(mmoPlayer.getPlayer())); + //TODO: Make prettier + HoverEvent levelMilestoneHover = Component.text(mmoPlayer.getPlayer().getName()) + .append(Component.newline()) + .append(Component.text(LocalDate.now().toString())) + .append(Component.newline()) + .append(Component.text("Power level has reached "+powerLevel)).color(TextColor.fromHexString(HEX_BEIGE_COLOR)) + .asHoverEvent(); + + String localeMessage = LocaleLoader.getString("Broadcasts.PowerLevelUpMilestone", mmoPlayer.getPlayer().getDisplayName(), powerLevel); + Component message = LegacyComponentSerializer.legacySection().deserialize(localeMessage).hoverEvent(levelMilestoneHover); + + Bukkit.getScheduler().runTaskLater(mcMMO.p, () -> audience.sendMessage(Identity.nil(), message), 0); + } + } + } + + //TODO: Could cache + public static @NotNull LevelUpBroadcastPredicate getLevelUpBroadcastPredicate(@NotNull CommandSender levelUpPlayer) { + return new LevelUpBroadcastPredicate<>(levelUpPlayer); + } + + public static @NotNull PowerLevelUpBroadcastPredicate getPowerLevelUpBroadcastPredicate(@NotNull CommandSender levelUpPlayer) { + return new PowerLevelUpBroadcastPredicate<>(levelUpPlayer); + } + } diff --git a/src/main/java/com/gmail/nossr50/util/player/UserManager.java b/src/main/java/com/gmail/nossr50/util/player/UserManager.java index 396770c58..732840720 100644 --- a/src/main/java/com/gmail/nossr50/util/player/UserManager.java +++ b/src/main/java/com/gmail/nossr50/util/player/UserManager.java @@ -2,6 +2,7 @@ package com.gmail.nossr50.util.player; import com.gmail.nossr50.datatypes.player.McMMOPlayer; import com.gmail.nossr50.mcMMO; +import com.gmail.nossr50.util.MetadataConstants; import com.google.common.collect.ImmutableList; import org.bukkit.OfflinePlayer; import org.bukkit.entity.Entity; @@ -24,7 +25,7 @@ public final class UserManager { * @param mcMMOPlayer the player profile to start tracking */ public static void track(McMMOPlayer mcMMOPlayer) { - mcMMOPlayer.getPlayer().setMetadata(mcMMO.playerDataKey, new FixedMetadataValue(mcMMO.p, mcMMOPlayer)); + mcMMOPlayer.getPlayer().setMetadata(MetadataConstants.METADATA_KEY_PLAYER_DATA, new FixedMetadataValue(mcMMO.p, mcMMOPlayer)); if(playerDataSet == null) playerDataSet = new HashSet<>(); @@ -33,7 +34,7 @@ public final class UserManager { } public static void cleanupPlayer(McMMOPlayer mcMMOPlayer) { - if(playerDataSet != null && playerDataSet.contains(mcMMOPlayer)) + if(playerDataSet != null) playerDataSet.remove(mcMMOPlayer); } @@ -45,9 +46,9 @@ public final class UserManager { public static void remove(Player player) { McMMOPlayer mcMMOPlayer = getPlayer(player); mcMMOPlayer.cleanup(); - player.removeMetadata(mcMMO.playerDataKey, mcMMO.p); + player.removeMetadata(MetadataConstants.METADATA_KEY_PLAYER_DATA, mcMMO.p); - if(playerDataSet != null && playerDataSet.contains(mcMMOPlayer)) { + if(playerDataSet != null) { playerDataSet.remove(mcMMOPlayer); //Clear sync save tracking } } @@ -91,7 +92,7 @@ public final class UserManager { } public static Collection getPlayers() { - Collection playerCollection = new ArrayList(); + Collection playerCollection = new ArrayList<>(); for (Player player : mcMMO.p.getServer().getOnlinePlayers()) { if (hasPlayerDataKey(player)) { @@ -131,8 +132,8 @@ public final class UserManager { */ public static McMMOPlayer getPlayer(Player player) { //Avoid Array Index out of bounds - if(player != null && player.hasMetadata(mcMMO.playerDataKey)) - return (McMMOPlayer) player.getMetadata(mcMMO.playerDataKey).get(0).value(); + if(player != null && player.hasMetadata(MetadataConstants.METADATA_KEY_PLAYER_DATA)) + return (McMMOPlayer) player.getMetadata(MetadataConstants.METADATA_KEY_PLAYER_DATA).get(0).value(); else return null; } @@ -152,6 +153,6 @@ public final class UserManager { } public static boolean hasPlayerDataKey(Entity entity) { - return entity != null && entity.hasMetadata(mcMMO.playerDataKey); + return entity != null && entity.hasMetadata(MetadataConstants.METADATA_KEY_PLAYER_DATA); } } diff --git a/src/main/java/com/gmail/nossr50/util/random/RandomChanceExecution.java b/src/main/java/com/gmail/nossr50/util/random/RandomChanceExecution.java index 8d0da9285..e5d51d740 100644 --- a/src/main/java/com/gmail/nossr50/util/random/RandomChanceExecution.java +++ b/src/main/java/com/gmail/nossr50/util/random/RandomChanceExecution.java @@ -3,6 +3,7 @@ package com.gmail.nossr50.util.random; public interface RandomChanceExecution { /** * Gets the XPos used in the formula for success + * * @return value of x for our success probability graph */ double getXPos(); @@ -10,6 +11,7 @@ public interface RandomChanceExecution { /** * The maximum odds for this RandomChanceExecution * For example, if this value is 10, then 10% odds would be the maximum and would be achieved only when xPos equaled the LinearCurvePeak + * * @return maximum probability odds from 0.00 (no chance of ever happened) to 100.0 (probability can be guaranteed) */ double getProbabilityCap(); diff --git a/src/main/java/com/gmail/nossr50/util/random/RandomChanceSkill.java b/src/main/java/com/gmail/nossr50/util/random/RandomChanceSkill.java index 5d47b44bd..92d91ec83 100644 --- a/src/main/java/com/gmail/nossr50/util/random/RandomChanceSkill.java +++ b/src/main/java/com/gmail/nossr50/util/random/RandomChanceSkill.java @@ -1,133 +1,133 @@ package com.gmail.nossr50.util.random; -import com.gmail.nossr50.config.AdvancedConfig; import com.gmail.nossr50.datatypes.player.McMMOPlayer; -import com.gmail.nossr50.datatypes.skills.PrimarySkillType; import com.gmail.nossr50.datatypes.skills.SubSkillType; import com.gmail.nossr50.util.Permissions; import com.gmail.nossr50.util.player.UserManager; import org.bukkit.entity.Player; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; public class RandomChanceSkill implements RandomChanceExecution { - - protected final PrimarySkillType primarySkillType; - protected final SubSkillType subSkillType; protected final double probabilityCap; protected final boolean isLucky; protected int skillLevel; - protected double resultModifier; + protected final double resultModifier; + protected final double maximumBonusLevelCap; - public RandomChanceSkill(Player player, SubSkillType subSkillType, double resultModifier) - { - this.primarySkillType = subSkillType.getParentSkill(); - this.subSkillType = subSkillType; + public RandomChanceSkill(@Nullable Player player, @NotNull SubSkillType subSkillType, double resultModifier) { this.probabilityCap = RandomChanceUtil.LINEAR_CURVE_VAR; final McMMOPlayer mcMMOPlayer = UserManager.getPlayer(player); if (player != null && mcMMOPlayer != null) { - this.skillLevel = mcMMOPlayer.getSkillLevel(primarySkillType); + this.skillLevel = mcMMOPlayer.getSkillLevel(subSkillType.getParentSkill()); } else { this.skillLevel = 0; } - if(player != null) - isLucky = Permissions.lucky(player, primarySkillType); + if (player != null) + isLucky = Permissions.lucky(player, subSkillType.getParentSkill()); else isLucky = false; this.resultModifier = resultModifier; + this.maximumBonusLevelCap = RandomChanceUtil.getMaxBonusLevelCap(subSkillType); } - public RandomChanceSkill(Player player, SubSkillType subSkillType) - { - this.primarySkillType = subSkillType.getParentSkill(); - this.subSkillType = subSkillType; + public RandomChanceSkill(@Nullable Player player, @NotNull SubSkillType subSkillType) { this.probabilityCap = RandomChanceUtil.LINEAR_CURVE_VAR; final McMMOPlayer mcMMOPlayer = UserManager.getPlayer(player); if (player != null && mcMMOPlayer != null) { - this.skillLevel = mcMMOPlayer.getSkillLevel(primarySkillType); + this.skillLevel = mcMMOPlayer.getSkillLevel(subSkillType.getParentSkill()); } else { this.skillLevel = 0; } - if(player != null) - isLucky = Permissions.lucky(player, primarySkillType); + if (player != null) + isLucky = Permissions.lucky(player, subSkillType.getParentSkill()); else isLucky = false; this.resultModifier = 1.0D; + this.maximumBonusLevelCap = RandomChanceUtil.getMaxBonusLevelCap(subSkillType); } - public RandomChanceSkill(Player player, SubSkillType subSkillType, boolean hasCap) - { - if(hasCap) - this.probabilityCap = AdvancedConfig.getInstance().getMaximumProbability(subSkillType); + public RandomChanceSkill(@Nullable Player player, @NotNull SubSkillType subSkillType, boolean hasCap) { + if (hasCap) + this.probabilityCap = RandomChanceUtil.getMaximumProbability(subSkillType); else this.probabilityCap = RandomChanceUtil.LINEAR_CURVE_VAR; - this.primarySkillType = subSkillType.getParentSkill(); - this.subSkillType = subSkillType; - final McMMOPlayer mcMMOPlayer = UserManager.getPlayer(player); if (player != null && mcMMOPlayer != null) { - this.skillLevel = mcMMOPlayer.getSkillLevel(primarySkillType); + this.skillLevel = mcMMOPlayer.getSkillLevel(subSkillType.getParentSkill()); } else { this.skillLevel = 0; } - if(player != null) - isLucky = Permissions.lucky(player, primarySkillType); + if (player != null) + isLucky = Permissions.lucky(player, subSkillType.getParentSkill()); else isLucky = false; this.resultModifier = 1.0D; + this.maximumBonusLevelCap = RandomChanceUtil.getMaxBonusLevelCap(subSkillType); } - public RandomChanceSkill(Player player, SubSkillType subSkillType, boolean hasCap, double resultModifier) - { - if(hasCap) - this.probabilityCap = AdvancedConfig.getInstance().getMaximumProbability(subSkillType); + public RandomChanceSkill(@Nullable Player player, @NotNull SubSkillType subSkillType, boolean hasCap, boolean luckyOverride) { + if (hasCap) + this.probabilityCap = RandomChanceUtil.getMaximumProbability(subSkillType); else this.probabilityCap = RandomChanceUtil.LINEAR_CURVE_VAR; - this.primarySkillType = subSkillType.getParentSkill(); - this.subSkillType = subSkillType; - final McMMOPlayer mcMMOPlayer = UserManager.getPlayer(player); if (player != null && mcMMOPlayer != null) { - this.skillLevel = mcMMOPlayer.getSkillLevel(primarySkillType); + this.skillLevel = mcMMOPlayer.getSkillLevel(subSkillType.getParentSkill()); } else { this.skillLevel = 0; } - if(player != null) - isLucky = Permissions.lucky(player, primarySkillType); + isLucky = luckyOverride; + + this.resultModifier = 1.0D; + this.maximumBonusLevelCap = RandomChanceUtil.getMaxBonusLevelCap(subSkillType); + } + + public RandomChanceSkill(@Nullable Player player, @NotNull SubSkillType subSkillType, boolean hasCap, double resultModifier) { + if (hasCap) + this.probabilityCap = RandomChanceUtil.getMaximumProbability(subSkillType); + else + this.probabilityCap = RandomChanceUtil.LINEAR_CURVE_VAR; + + final McMMOPlayer mcMMOPlayer = UserManager.getPlayer(player); + if (player != null && mcMMOPlayer != null) { + this.skillLevel = mcMMOPlayer.getSkillLevel(subSkillType.getParentSkill()); + } else { + this.skillLevel = 0; + } + + if (player != null) + isLucky = Permissions.lucky(player, subSkillType.getParentSkill()); else isLucky = false; this.resultModifier = resultModifier; - } - - /** - * The subskill corresponding to this RandomChanceSkill - * @return this subskill - */ - public SubSkillType getSubSkill() { - return subSkillType; + this.maximumBonusLevelCap = RandomChanceUtil.getMaxBonusLevelCap(subSkillType); } /** * Gets the skill level of the player who owns this RandomChanceSkill + * * @return the current skill level relating to this RandomChanceSkill */ - public int getSkillLevel() - { + public int getSkillLevel() { return skillLevel; } /** * Modify the skill level used for this skill's RNG calculations + * * @param newSkillLevel new skill level */ public void setSkillLevel(int newSkillLevel) { @@ -142,7 +142,7 @@ public class RandomChanceSkill implements RandomChanceExecution { * @return the maximum bonus from skill level for this skill */ public double getMaximumBonusLevelCap() { - return AdvancedConfig.getInstance().getMaxBonusLevel(subSkillType); + return maximumBonusLevelCap; } /** @@ -173,8 +173,4 @@ public class RandomChanceSkill implements RandomChanceExecution { public double getResultModifier() { return resultModifier; } - - public void setResultModifier(double resultModifier) { - this.resultModifier = resultModifier; - } } diff --git a/src/main/java/com/gmail/nossr50/util/random/RandomChanceSkillStatic.java b/src/main/java/com/gmail/nossr50/util/random/RandomChanceSkillStatic.java index 6223dcda8..c96b71d6b 100644 --- a/src/main/java/com/gmail/nossr50/util/random/RandomChanceSkillStatic.java +++ b/src/main/java/com/gmail/nossr50/util/random/RandomChanceSkillStatic.java @@ -2,19 +2,25 @@ package com.gmail.nossr50.util.random; import com.gmail.nossr50.datatypes.skills.SubSkillType; import org.bukkit.entity.Player; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; public class RandomChanceSkillStatic extends RandomChanceSkill { private final double xPos; - public RandomChanceSkillStatic(double xPos, Player player, SubSkillType subSkillType) - { + public RandomChanceSkillStatic(double xPos, @Nullable Player player, @NotNull SubSkillType subSkillType) { super(player, subSkillType); this.xPos = xPos; } - public RandomChanceSkillStatic(double xPos, Player player, SubSkillType subSkillType, double resultModifier) - { + public RandomChanceSkillStatic(double xPos, @Nullable Player player, @NotNull SubSkillType subSkillType, boolean luckyOverride) { + super(player, subSkillType, false, luckyOverride); + + this.xPos = xPos; + } + + public RandomChanceSkillStatic(double xPos, @Nullable Player player, @NotNull SubSkillType subSkillType, double resultModifier) { super(player, subSkillType, resultModifier); this.xPos = xPos; diff --git a/src/main/java/com/gmail/nossr50/util/random/RandomChanceStatic.java b/src/main/java/com/gmail/nossr50/util/random/RandomChanceStatic.java index 30f84cfbf..0b09a4a3c 100644 --- a/src/main/java/com/gmail/nossr50/util/random/RandomChanceStatic.java +++ b/src/main/java/com/gmail/nossr50/util/random/RandomChanceStatic.java @@ -5,10 +5,9 @@ public class RandomChanceStatic implements RandomChanceExecution { private final double probabilityCap; private final boolean isLucky; - public RandomChanceStatic(double xPos, boolean isLucky) - { + public RandomChanceStatic(double xPos, double probabilityCap, boolean isLucky) { this.xPos = xPos; - this.probabilityCap = xPos; + this.probabilityCap = probabilityCap; this.isLucky = isLucky; } diff --git a/src/main/java/com/gmail/nossr50/util/random/RandomChanceUtil.java b/src/main/java/com/gmail/nossr50/util/random/RandomChanceUtil.java index 29866144d..0191172c1 100644 --- a/src/main/java/com/gmail/nossr50/util/random/RandomChanceUtil.java +++ b/src/main/java/com/gmail/nossr50/util/random/RandomChanceUtil.java @@ -1,24 +1,25 @@ package com.gmail.nossr50.util.random; -import com.gmail.nossr50.config.AdvancedConfig; import com.gmail.nossr50.datatypes.skills.PrimarySkillType; import com.gmail.nossr50.datatypes.skills.SubSkillType; -import com.gmail.nossr50.datatypes.skills.subskills.AbstractSubSkill; import com.gmail.nossr50.events.skills.secondaryabilities.SubSkillEvent; import com.gmail.nossr50.events.skills.secondaryabilities.SubSkillRandomCheckEvent; +import com.gmail.nossr50.mcMMO; import com.gmail.nossr50.util.EventUtils; import com.gmail.nossr50.util.Permissions; import com.gmail.nossr50.util.skills.SkillActivationType; import org.bukkit.entity.Player; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; import java.text.DecimalFormat; import java.util.concurrent.ThreadLocalRandom; -public class RandomChanceUtil -{ - public static final DecimalFormat percent = new DecimalFormat("##0.00%"); +public class RandomChanceUtil { + public static final @NotNull DecimalFormat percent = new DecimalFormat("##0.00%"); //public static final DecimalFormat decimal = new DecimalFormat("##0.00"); public static final double LINEAR_CURVE_VAR = 100.0D; + public static final double LUCKY_MODIFIER = 1.333D; /** * This method is the final step in determining if a Sub-Skill / Secondary Skill in mcMMO successfully activates either from chance or otherwise @@ -26,14 +27,12 @@ public class RandomChanceUtil * non-RNG skills just fire the cancellable event and succeed if they go uncancelled * * @param skillActivationType this value represents what kind of activation procedures this sub-skill uses - * @param subSkillType The identifier for this specific sub-skill - * @param player The owner of this sub-skill + * @param subSkillType The identifier for this specific sub-skill + * @param player The owner of this sub-skill * @return returns true if all conditions are met and the event is not cancelled */ - public static boolean isActivationSuccessful(SkillActivationType skillActivationType, SubSkillType subSkillType, Player player) - { - switch(skillActivationType) - { + public static boolean isActivationSuccessful(@NotNull SkillActivationType skillActivationType, @NotNull SubSkillType subSkillType, @Nullable Player player) { + switch (skillActivationType) { case RANDOM_LINEAR_100_SCALE_WITH_CAP: return checkRandomChanceExecutionSuccess(player, subSkillType, true); case RANDOM_STATIC_CHANCE: @@ -46,40 +45,12 @@ public class RandomChanceUtil } } - /** - * This method is the final step in determining if a Sub-Skill / Secondary Skill in mcMMO successfully activates either from chance or otherwise - * Random skills check for success based on numbers and then fire a cancellable event, if that event is not cancelled they succeed - * non-RNG skills just fire the cancellable event and succeed if they go uncancelled - * - * @param skillActivationType this value represents what kind of activation procedures this sub-skill uses - * @param subSkillType The identifier for this specific sub-skill - * @param player The owner of this sub-skill - * @return returns true if all conditions are met and the event is not cancelled - */ - public static boolean isActivationSuccessful(SkillActivationType skillActivationType, SubSkillType subSkillType, Player player, double resultModifier) - { - switch(skillActivationType) - { + public static double getActivationChance(@NotNull SkillActivationType skillActivationType, @NotNull SubSkillType subSkillType, @Nullable Player player, boolean luckyOverride) { + switch (skillActivationType) { case RANDOM_LINEAR_100_SCALE_WITH_CAP: - return checkRandomChanceExecutionSuccess(player, subSkillType, true); + return getRandomChanceExecutionSuccess(player, subSkillType, true, luckyOverride); case RANDOM_STATIC_CHANCE: - return checkRandomStaticChanceExecutionSuccess(player, subSkillType, resultModifier); - case ALWAYS_FIRES: - SubSkillEvent event = EventUtils.callSubSkillEvent(player, subSkillType); - return !event.isCancelled(); - default: - return false; - } - } - - public static double getActivationChance(SkillActivationType skillActivationType, SubSkillType subSkillType, Player player) - { - switch(skillActivationType) - { - case RANDOM_LINEAR_100_SCALE_WITH_CAP: - return getRandomChanceExecutionSuccess(player, subSkillType, true); - case RANDOM_STATIC_CHANCE: - return getRandomStaticChanceExecutionSuccess(player, subSkillType); + return getRandomStaticChanceExecutionSuccess(player, subSkillType, luckyOverride); default: return 0.1337; } @@ -87,10 +58,10 @@ public class RandomChanceUtil /** * Checks whether or not the random chance succeeds + * * @return true if the random chance succeeds */ - public static boolean checkRandomChanceExecutionSuccess(Player player, PrimarySkillType primarySkillType, double chance) - { + public static boolean checkRandomChanceExecutionSuccess(@NotNull Player player, @NotNull PrimarySkillType primarySkillType, double chance) { //Check the odds chance *= 100; @@ -113,11 +84,11 @@ public class RandomChanceUtil /** * Used for stuff like Excavation, Fishing, etc... + * * @param randomChance * @return */ - public static boolean checkRandomChanceExecutionSuccess(RandomChanceSkillStatic randomChance, double resultModifier) - { + public static boolean checkRandomChanceExecutionSuccess(@NotNull RandomChanceSkillStatic randomChance, double resultModifier) { double chanceOfSuccess = calculateChanceOfSuccess(randomChance); //Check the odds @@ -126,16 +97,15 @@ public class RandomChanceUtil /** * Used for stuff like Excavation, Fishing, etc... + * * @param randomChance * @return */ - public static boolean checkRandomChanceExecutionSuccess(RandomChanceSkillStatic randomChance) - { + public static boolean checkRandomChanceExecutionSuccess(@NotNull RandomChanceSkillStatic randomChance) { return checkRandomChanceExecutionSuccess(randomChance, 1.0F); } - public static boolean checkRandomChanceExecutionSuccess(RandomChanceSkill randomChance) - { + public static boolean checkRandomChanceExecutionSuccess(@NotNull RandomChanceSkill randomChance) { double chanceOfSuccess = calculateChanceOfSuccess(randomChance); //Check the odds @@ -151,14 +121,19 @@ public class RandomChanceUtil /** * Gets the Static Chance for something to activate + * * @param randomChance * @return */ - public static double getRandomChanceExecutionChance(RandomChanceExecution randomChance) { + public static double getRandomChanceExecutionChance(@NotNull RandomChanceExecution randomChance) { return getChanceOfSuccess(randomChance.getXPos(), randomChance.getProbabilityCap(), LINEAR_CURVE_VAR); } - public static double getRandomChanceExecutionChance(RandomChanceStatic randomChance) { + public static double getRandomChanceExecutionChance(@NotNull RandomChanceExecution randomChance, boolean luckyOverride) { + return getChanceOfSuccess(randomChance.getXPos(), randomChance.getProbabilityCap(), LINEAR_CURVE_VAR); + } + + public static double getRandomChanceExecutionChance(@NotNull RandomChanceStatic randomChance) { double chanceOfSuccess = getChanceOfSuccess(randomChance.getXPos(), randomChance.getProbabilityCap(), LINEAR_CURVE_VAR); chanceOfSuccess = addLuck(randomChance.isLucky(), chanceOfSuccess); @@ -171,7 +146,7 @@ public class RandomChanceUtil return chanceOfSuccess; }*/ - private static double calculateChanceOfSuccess(RandomChanceSkill randomChance) { + public static double calculateChanceOfSuccess(@NotNull RandomChanceSkill randomChance) { double skillLevel = randomChance.getSkillLevel(); double maximumProbability = randomChance.getProbabilityCap(); double maximumBonusLevel = randomChance.getMaximumBonusLevelCap(); @@ -192,7 +167,7 @@ public class RandomChanceUtil return chanceOfSuccess; } - private static double calculateChanceOfSuccess(RandomChanceSkillStatic randomChance) { + public static double calculateChanceOfSuccess(@NotNull RandomChanceSkillStatic randomChance) { double chanceOfSuccess = getChanceOfSuccess(randomChance.getXPos(), 100, 100); //Add Luck @@ -207,29 +182,30 @@ public class RandomChanceUtil * * @return the chance of success from 0-100 (100 = guaranteed) */ - private static int getChanceOfSuccess(double skillLevel, double maxProbability, double maxLevel) - { + private static int getChanceOfSuccess(double skillLevel, double maxProbability, double maxLevel) { //return (int) (x / (y / LINEAR_CURVE_VAR)); - return (int) (maxProbability * (skillLevel/maxLevel)); + return (int) (maxProbability * (skillLevel / maxLevel)); // max probability * (weight/maxlevel) = chance of success } - private static int getChanceOfSuccess(double x, double y) - { + private static int getChanceOfSuccess(double x, double y) { return (int) (x / (y / LINEAR_CURVE_VAR)); // max probability * (weight/maxlevel) = chance of success } - public static double getRandomChanceExecutionSuccess(Player player, SubSkillType subSkillType, boolean hasCap) - { + public static double getRandomChanceExecutionSuccess(@Nullable Player player, @NotNull SubSkillType subSkillType, boolean hasCap) { RandomChanceSkill rcs = new RandomChanceSkill(player, subSkillType, hasCap); return calculateChanceOfSuccess(rcs); } - public static double getRandomStaticChanceExecutionSuccess(Player player, SubSkillType subSkillType) - { + public static double getRandomChanceExecutionSuccess(@Nullable Player player, @NotNull SubSkillType subSkillType, boolean hasCap, boolean luckyOverride) { + RandomChanceSkill rcs = new RandomChanceSkill(player, subSkillType, hasCap, luckyOverride); + return calculateChanceOfSuccess(rcs); + } + + public static double getRandomStaticChanceExecutionSuccess(@Nullable Player player, @NotNull SubSkillType subSkillType, boolean luckyOverride) { try { - return getRandomChanceExecutionChance(new RandomChanceSkillStatic(getStaticRandomChance(subSkillType), player, subSkillType)); + return getRandomChanceExecutionChance(new RandomChanceSkillStatic(getStaticRandomChance(subSkillType), player, subSkillType, luckyOverride)); } catch (InvalidStaticChance invalidStaticChance) { //Catch invalid static skills invalidStaticChance.printStackTrace(); @@ -238,29 +214,24 @@ public class RandomChanceUtil return 0.1337; //Puts on shades } - public static boolean checkRandomChanceExecutionSuccess(Player player, SubSkillType subSkillType, boolean hasCap) - { + public static boolean checkRandomChanceExecutionSuccess(@Nullable Player player, @NotNull SubSkillType subSkillType, boolean hasCap) { return checkRandomChanceExecutionSuccess(new RandomChanceSkill(player, subSkillType, hasCap)); } - public static boolean checkRandomChanceExecutionSuccess(Player player, SubSkillType subSkillType) - { + public static boolean checkRandomChanceExecutionSuccess(@Nullable Player player, @NotNull SubSkillType subSkillType) { return checkRandomChanceExecutionSuccess(new RandomChanceSkill(player, subSkillType)); } - public static boolean checkRandomChanceExecutionSuccess(Player player, SubSkillType subSkillType, boolean hasCap, double resultModifier) - { + public static boolean checkRandomChanceExecutionSuccess(@Nullable Player player, @NotNull SubSkillType subSkillType, boolean hasCap, double resultModifier) { return checkRandomChanceExecutionSuccess(new RandomChanceSkill(player, subSkillType, hasCap, resultModifier)); } - public static boolean checkRandomChanceExecutionSuccess(Player player, SubSkillType subSkillType, double resultModifier) - { + public static boolean checkRandomChanceExecutionSuccess(@Nullable Player player, @NotNull SubSkillType subSkillType, double resultModifier) { return checkRandomChanceExecutionSuccess(new RandomChanceSkill(player, subSkillType, resultModifier)); } - public static boolean checkRandomStaticChanceExecutionSuccess(Player player, SubSkillType subSkillType, double resultModifier) - { + public static boolean checkRandomStaticChanceExecutionSuccess(@Nullable Player player, @NotNull SubSkillType subSkillType) { try { return checkRandomChanceExecutionSuccess(new RandomChanceSkillStatic(getStaticRandomChance(subSkillType), player, subSkillType)); } catch (InvalidStaticChance invalidStaticChance) { @@ -271,66 +242,50 @@ public class RandomChanceUtil return false; } - public static boolean checkRandomStaticChanceExecutionSuccess(Player player, SubSkillType subSkillType) - { - return checkRandomStaticChanceExecutionSuccess(player, subSkillType, 1.0F); - } - /** * Grabs static activation rolls for Secondary Abilities + * * @param subSkillType The secondary ability to grab properties of - * @throws InvalidStaticChance if the skill has no defined static chance this exception will be thrown and you should know you're a naughty boy * @return The static activation roll involved in the RNG calculation + * @throws InvalidStaticChance if the skill has no defined static chance this exception will be thrown and you should know you're a naughty boy */ - public static double getStaticRandomChance(SubSkillType subSkillType) throws InvalidStaticChance - { - switch(subSkillType) - { + public static double getStaticRandomChance(@NotNull SubSkillType subSkillType) throws InvalidStaticChance { + switch (subSkillType) { case AXES_ARMOR_IMPACT: - return AdvancedConfig.getInstance().getImpactChance(); + return mcMMO.p.getAdvancedConfig().getImpactChance(); case AXES_GREATER_IMPACT: - return AdvancedConfig.getInstance().getGreaterImpactChance(); + return mcMMO.p.getAdvancedConfig().getGreaterImpactChance(); case TAMING_FAST_FOOD_SERVICE: - return AdvancedConfig.getInstance().getFastFoodChance(); + return mcMMO.p.getAdvancedConfig().getFastFoodChance(); default: throw new InvalidStaticChance(); } } - public static boolean sendSkillEvent(Player player, SubSkillType subSkillType, double activationChance) - { + public static boolean sendSkillEvent(Player player, SubSkillType subSkillType, double activationChance) { SubSkillRandomCheckEvent event = new SubSkillRandomCheckEvent(player, subSkillType, activationChance); return !event.isCancelled(); } - /*public static boolean treasureDropSuccessful(Player player, double dropChance, int activationChance) { - SubSkillRandomCheckEvent event = new SubSkillRandomCheckEvent(player, SubSkillType.EXCAVATION_ARCHAEOLOGY, dropChance / activationChance); - mcMMO.p.getServer().getPluginManager().callEvent(event); - return (event.getChance() * activationChance) > (Misc.getRandom().nextDouble() * activationChance) && !event.isCancelled(); - }*/ + public static String @NotNull [] calculateAbilityDisplayValues(@NotNull SkillActivationType skillActivationType, @NotNull Player player, @NotNull SubSkillType subSkillType) { + double successChance = getActivationChance(skillActivationType, subSkillType, player, false); + double successChanceLucky = getActivationChance(skillActivationType, subSkillType, player, true); - public static boolean isActivationSuccessful(SkillActivationType skillActivationType, AbstractSubSkill abstractSubSkill, Player player) - { - return isActivationSuccessful(skillActivationType, abstractSubSkill.getSubSkillType(), player); - } - - public static String[] calculateAbilityDisplayValues(SkillActivationType skillActivationType, Player player, SubSkillType subSkillType) { - double successChance = getActivationChance(skillActivationType, subSkillType, player); String[] displayValues = new String[2]; boolean isLucky = Permissions.lucky(player, subSkillType.getParentSkill()); displayValues[0] = percent.format(Math.min(successChance, 100.0D) / 100.0D); - displayValues[1] = isLucky ? percent.format(Math.min(successChance * 1.3333D, 100.0D) / 100.0D) : null; + displayValues[1] = isLucky ? percent.format(Math.min(successChanceLucky, 100.0D) / 100.0D) : null; return displayValues; } - public static String[] calculateAbilityDisplayValuesStatic(Player player, PrimarySkillType primarySkillType, double chance) { - RandomChanceStatic rcs = new RandomChanceStatic(chance, false); + public static String @NotNull [] calculateAbilityDisplayValuesStatic(@NotNull Player player, @NotNull PrimarySkillType primarySkillType, double chance) { + RandomChanceStatic rcs = new RandomChanceStatic(chance, LINEAR_CURVE_VAR, false); double successChance = getRandomChanceExecutionChance(rcs); - RandomChanceStatic rcs_lucky = new RandomChanceStatic(chance, true); + RandomChanceStatic rcs_lucky = new RandomChanceStatic(chance, LINEAR_CURVE_VAR, true); double successChance_lucky = getRandomChanceExecutionChance(rcs_lucky); String[] displayValues = new String[2]; @@ -343,34 +298,40 @@ public class RandomChanceUtil return displayValues; } - public static String[] calculateAbilityDisplayValuesCustom(SkillActivationType skillActivationType, Player player, SubSkillType subSkillType, double multiplier) { - double successChance = getActivationChance(skillActivationType, subSkillType, player); + public static String @NotNull [] calculateAbilityDisplayValuesCustom(@NotNull SkillActivationType skillActivationType, @NotNull Player player, @NotNull SubSkillType subSkillType, double multiplier) { + double successChance = getActivationChance(skillActivationType, subSkillType, player, false); + double successChanceLucky = getActivationChance(skillActivationType, subSkillType, player, true); + //TODO: Most likely incorrectly displays the value for graceful roll but gonna ignore for now... successChance *= multiplier; //Currently only used for graceful roll String[] displayValues = new String[2]; - //TODO: Account for lucky in this - boolean isLucky = Permissions.lucky(player, subSkillType.getParentSkill()); displayValues[0] = percent.format(Math.min(successChance, 100.0D) / 100.0D); - displayValues[1] = isLucky ? percent.format(Math.min(successChance * 1.3333D, 100.0D) / 100.0D) : null; + displayValues[1] = isLucky ? percent.format(Math.min(successChanceLucky, 100.0D) / 100.0D) : null; return displayValues; } - public static double addLuck(Player player, PrimarySkillType primarySkillType, double chance) - { - if(Permissions.lucky(player, primarySkillType)) - return chance * 1.333D; + public static double addLuck(@NotNull Player player, @NotNull PrimarySkillType primarySkillType, double chance) { + if (Permissions.lucky(player, primarySkillType)) + return chance * LUCKY_MODIFIER; else return chance; } - public static double addLuck(boolean isLucky, double chance) - { - if(isLucky) - return chance * 1.333D; + public static double addLuck(boolean isLucky, double chance) { + if (isLucky) + return chance * LUCKY_MODIFIER; else return chance; } + + public static double getMaximumProbability(@NotNull SubSkillType subSkillType) { + return mcMMO.p.getAdvancedConfig().getMaximumProbability(subSkillType); + } + + public static double getMaxBonusLevelCap(@NotNull SubSkillType subSkillType) { + return mcMMO.p.getAdvancedConfig().getMaxBonusLevel(subSkillType); + } } diff --git a/src/main/java/com/gmail/nossr50/util/scoreboards/ScoreboardManager.java b/src/main/java/com/gmail/nossr50/util/scoreboards/ScoreboardManager.java index 006199554..1851f5479 100644 --- a/src/main/java/com/gmail/nossr50/util/scoreboards/ScoreboardManager.java +++ b/src/main/java/com/gmail/nossr50/util/scoreboards/ScoreboardManager.java @@ -1,11 +1,12 @@ package com.gmail.nossr50.util.scoreboards; -import com.gmail.nossr50.config.Config; import com.gmail.nossr50.datatypes.database.PlayerStat; import com.gmail.nossr50.datatypes.player.McMMOPlayer; import com.gmail.nossr50.datatypes.player.PlayerProfile; import com.gmail.nossr50.datatypes.skills.PrimarySkillType; import com.gmail.nossr50.datatypes.skills.SuperAbilityType; +import com.gmail.nossr50.events.scoreboard.McMMOScoreboardMakeboardEvent; +import com.gmail.nossr50.events.scoreboard.ScoreboardEventReason; import com.gmail.nossr50.locale.LocaleLoader; import com.gmail.nossr50.mcMMO; import com.gmail.nossr50.util.Misc; @@ -18,6 +19,9 @@ import org.bukkit.ChatColor; import org.bukkit.entity.Player; import org.bukkit.scoreboard.DisplaySlot; import org.bukkit.scoreboard.Objective; +import org.bukkit.scoreboard.Scoreboard; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; import java.util.*; @@ -25,7 +29,7 @@ import java.util.*; * Manages the Scoreboards used to display a variety of mcMMO related information to the player */ public class ScoreboardManager { - static final Map PLAYER_SCOREBOARDS = new HashMap(); + static final Map PLAYER_SCOREBOARDS = new HashMap<>(); // do not localize; these are internal identifiers static final String SIDEBAR_OBJECTIVE = "mcmmo_sidebar"; @@ -42,13 +46,15 @@ public class ScoreboardManager { static final String LABEL_LEVEL = LocaleLoader.getString("Scoreboard.Misc.Level"); static final String LABEL_CURRENT_XP = LocaleLoader.getString("Scoreboard.Misc.CurrentXP"); static final String LABEL_REMAINING_XP = LocaleLoader.getString("Scoreboard.Misc.RemainingXP"); - static final String LABEL_ABILITY_COOLDOWN = LocaleLoader.getString("Scoreboard.Misc.Cooldown"); - static final String LABEL_OVERALL = LocaleLoader.getString("Scoreboard.Misc.Overall"); +// static final String LABEL_ABILITY_COOLDOWN = LocaleLoader.getString("Scoreboard.Misc.Cooldown"); +// static final String LABEL_OVERALL = LocaleLoader.getString("Scoreboard.Misc.Overall"); static final Map skillLabels; static final Map abilityLabelsColored; static final Map abilityLabelsSkill; + public static final String DISPLAY_NAME = "powerLevel"; + /* * Initializes the static properties of this class */ @@ -65,7 +71,7 @@ public class ScoreboardManager { * Stylizes the targetBoard in a Rainbow Pattern * This is off by default */ - if (Config.getInstance().getScoreboardRainbows()) { + if (mcMMO.p.getGeneralConfig().getScoreboardRainbows()) { // Everything but black, gray, gold List colors = Lists.newArrayList( ChatColor.WHITE, @@ -85,15 +91,15 @@ public class ScoreboardManager { Collections.shuffle(colors, Misc.getRandom()); int i = 0; - for (PrimarySkillType type : PrimarySkillType.values()) { + for (PrimarySkillType primarySkillType : PrimarySkillType.values()) { // Include child skills - skillLabelBuilder.put(type, getShortenedName(colors.get(i) + type.getName(), false)); + skillLabelBuilder.put(primarySkillType, getShortenedName(colors.get(i) + mcMMO.p.getSkillTools().getLocalizedSkillName(primarySkillType), false)); - if (type.getAbility() != null) { - abilityLabelBuilder.put(type.getAbility(), getShortenedName(colors.get(i) + type.getAbility().getName())); + if (mcMMO.p.getSkillTools().getSuperAbility(primarySkillType) != null) { + abilityLabelBuilder.put(mcMMO.p.getSkillTools().getSuperAbility(primarySkillType), getShortenedName(colors.get(i) + mcMMO.p.getSkillTools().getSuperAbility(primarySkillType).getLocalizedName())); - if (type == PrimarySkillType.MINING) { - abilityLabelBuilder.put(SuperAbilityType.BLAST_MINING, getShortenedName(colors.get(i) + SuperAbilityType.BLAST_MINING.getName())); + if (primarySkillType == PrimarySkillType.MINING) { + abilityLabelBuilder.put(SuperAbilityType.BLAST_MINING, getShortenedName(colors.get(i) + SuperAbilityType.BLAST_MINING.getLocalizedName())); } } @@ -107,22 +113,22 @@ public class ScoreboardManager { * Stylizes the targetBoard using our normal color scheme */ else { - for (PrimarySkillType type : PrimarySkillType.values()) { + for (PrimarySkillType primarySkillType : PrimarySkillType.values()) { // Include child skills - skillLabelBuilder.put(type, getShortenedName(ChatColor.GREEN + type.getName())); + skillLabelBuilder.put(primarySkillType, getShortenedName(ChatColor.GREEN + mcMMO.p.getSkillTools().getLocalizedSkillName(primarySkillType))); - if (type.getAbility() != null) { - abilityLabelBuilder.put(type.getAbility(), formatAbility(type.getAbility().getName())); + if (mcMMO.p.getSkillTools().getSuperAbility(primarySkillType) != null) { + abilityLabelBuilder.put(mcMMO.p.getSkillTools().getSuperAbility(primarySkillType), formatAbility(mcMMO.p.getSkillTools().getSuperAbility(primarySkillType).getLocalizedName())); - if (type == PrimarySkillType.MINING) { - abilityLabelBuilder.put(SuperAbilityType.BLAST_MINING, formatAbility(SuperAbilityType.BLAST_MINING.getName())); + if (primarySkillType == PrimarySkillType.MINING) { + abilityLabelBuilder.put(SuperAbilityType.BLAST_MINING, formatAbility(SuperAbilityType.BLAST_MINING.getLocalizedName())); } } } } for (SuperAbilityType type : SuperAbilityType.values()) { - abilityLabelSkillBuilder.put(type, formatAbility((type == SuperAbilityType.BLAST_MINING ? ChatColor.BLUE : ChatColor.AQUA), type.getName())); + abilityLabelSkillBuilder.put(type, formatAbility((type == SuperAbilityType.BLAST_MINING ? ChatColor.BLUE : ChatColor.AQUA), type.getLocalizedName())); } skillLabels = skillLabelBuilder.build(); @@ -130,7 +136,7 @@ public class ScoreboardManager { abilityLabelsSkill = abilityLabelSkillBuilder.build(); } - private static List dirtyPowerLevels = new ArrayList(); + private static final List dirtyPowerLevels = new ArrayList<>(); public enum SidebarType { NONE, @@ -138,7 +144,7 @@ public class ScoreboardManager { STATS_BOARD, COOLDOWNS_BOARD, RANK_BOARD, - TOP_BOARD; + TOP_BOARD } private static String formatAbility(String abilityName) { @@ -146,7 +152,7 @@ public class ScoreboardManager { } private static String formatAbility(ChatColor color, String abilityName) { - if (Config.getInstance().getShowAbilityNames()) { + if (mcMMO.p.getGeneralConfig().getShowAbilityNames()) { return getShortenedName(color + abilityName); } else { @@ -170,21 +176,28 @@ public class ScoreboardManager { // Called by PlayerJoinEvent listener public static void setupPlayer(Player player) { - PLAYER_SCOREBOARDS.put(player.getName(), ScoreboardWrapper.create(player)); + teardownPlayer(player); + + PLAYER_SCOREBOARDS.put(player.getName(), makeNewScoreboard(player)); dirtyPowerLevels.add(player.getName()); } // Called by PlayerQuitEvent listener and OnPlayerTeleport under certain circumstances public static void teardownPlayer(Player player) { + if(player == null) + return; + //Hacky world blacklist fix - if(player.isOnline() && player.isValid()) + if(player.isOnline() && player.isValid()) { if(Bukkit.getServer().getScoreboardManager() != null) player.setScoreboard(Bukkit.getServer().getScoreboardManager().getMainScoreboard()); + } - ScoreboardWrapper wrapper = PLAYER_SCOREBOARDS.remove(player.getName()); - - if (wrapper != null && wrapper.revertTask != null) { - wrapper.revertTask.cancel(); + if(getWrapper(player) != null) { + ScoreboardWrapper wrapper = PLAYER_SCOREBOARDS.remove(player.getName()); + if(wrapper.revertTask != null) { + wrapper.revertTask.cancel(); + } } } @@ -209,34 +222,42 @@ public class ScoreboardManager { // Called by internal level-up event listener public static void handleLevelUp(Player player, PrimarySkillType skill) { // Selfboards - ScoreboardWrapper selfboardWrapper = PLAYER_SCOREBOARDS.get(player.getName()); + ScoreboardWrapper wrapper = getWrapper(player); - if ((selfboardWrapper.isSkillScoreboard() && selfboardWrapper.targetSkill == skill) || (selfboardWrapper.isStatsScoreboard()) && selfboardWrapper.isBoardShown()) { - selfboardWrapper.doSidebarUpdateSoon(); + if(wrapper == null) { + setupPlayer(player); + wrapper = getWrapper(player); } - // Otherboards - String playerName = player.getName(); - - for (ScoreboardWrapper wrapper : PLAYER_SCOREBOARDS.values()) { - if (wrapper.isStatsScoreboard() && playerName.equals(wrapper.targetPlayer) && selfboardWrapper.isBoardShown()) { - selfboardWrapper.doSidebarUpdateSoon(); + if(wrapper != null) { + if ((wrapper.isSkillScoreboard() && wrapper.targetSkill == skill) || (wrapper.isStatsScoreboard()) && wrapper.isBoardShown()) { + wrapper.doSidebarUpdateSoon(); } - } - if (Config.getInstance().getPowerLevelTagsEnabled() && !dirtyPowerLevels.contains(playerName)) { - dirtyPowerLevels.add(playerName); - } + // Otherboards + String playerName = player.getName(); + + for (ScoreboardWrapper iWrapper : PLAYER_SCOREBOARDS.values()) { + if (iWrapper.isStatsScoreboard() && playerName.equals(iWrapper.targetPlayer) && wrapper.isBoardShown()) { + wrapper.doSidebarUpdateSoon(); + } + } + + if (mcMMO.p.getGeneralConfig().getPowerLevelTagsEnabled() && !dirtyPowerLevels.contains(playerName)) { + dirtyPowerLevels.add(playerName); + } + + if (mcMMO.p.getGeneralConfig().getSkillLevelUpBoard()) { + enablePlayerSkillLevelUpScoreboard(player, skill); + } - if (Config.getInstance().getSkillLevelUpBoard()) { - enablePlayerSkillLevelUpScoreboard(player, skill); } } // Called by internal xp event listener public static void handleXp(Player player, PrimarySkillType skill) { // Selfboards - ScoreboardWrapper wrapper = PLAYER_SCOREBOARDS.get(player.getName()); + ScoreboardWrapper wrapper = getWrapper(player); if (wrapper != null && wrapper.isSkillScoreboard() && wrapper.targetSkill == skill && wrapper.isBoardShown()) { wrapper.doSidebarUpdateSoon(); @@ -246,103 +267,211 @@ public class ScoreboardManager { // Called by internal ability event listeners public static void cooldownUpdate(Player player, PrimarySkillType skill) { // Selfboards - ScoreboardWrapper wrapper = PLAYER_SCOREBOARDS.get(player.getName()); + ScoreboardWrapper wrapper = getWrapper(player); - if (wrapper != null && (wrapper.isCooldownScoreboard() || wrapper.isSkillScoreboard() && wrapper.targetSkill == skill) && wrapper.isBoardShown()) { - wrapper.doSidebarUpdateSoon(); + if(wrapper == null) { + setupPlayer(player); + wrapper = getWrapper(player); + } + + if(wrapper != null) { + if ((wrapper.isCooldownScoreboard() || wrapper.isSkillScoreboard() && wrapper.targetSkill == skill) && wrapper.isBoardShown()) { + wrapper.doSidebarUpdateSoon(); + } } } // **** Setup methods **** // public static void enablePlayerSkillScoreboard(Player player, PrimarySkillType skill) { - ScoreboardWrapper wrapper = PLAYER_SCOREBOARDS.get(player.getName()); + McMMOPlayer mmoPlayer = UserManager.getPlayer(player); + mmoPlayer.setLastSkillShownScoreboard(skill); - wrapper.setOldScoreboard(); - wrapper.setTypeSkill(skill); + ScoreboardWrapper wrapper = getWrapper(player); - changeScoreboard(wrapper, Config.getInstance().getSkillScoreboardTime()); + if(wrapper == null) { + setupPlayer(player); + wrapper = getWrapper(player); + } + + if(wrapper != null) { + wrapper.setOldScoreboard(); + wrapper.setTypeSkill(skill); + + changeScoreboard(wrapper, mcMMO.p.getGeneralConfig().getSkillScoreboardTime()); + } + } + + public static void retryLastSkillBoard(Player player) { + McMMOPlayer mmoPlayer = UserManager.getPlayer(player); + PrimarySkillType primarySkillType = mmoPlayer.getLastSkillShownScoreboard(); + + ScoreboardWrapper wrapper = getWrapper(player); + + if(wrapper == null) { + setupPlayer(player); + wrapper = getWrapper(player); + } + + if(wrapper != null) { + wrapper.setOldScoreboard(); + wrapper.setTypeSkill(primarySkillType); + + changeScoreboard(wrapper, mcMMO.p.getGeneralConfig().getSkillScoreboardTime()); + } } public static void enablePlayerSkillLevelUpScoreboard(Player player, PrimarySkillType skill) { - ScoreboardWrapper wrapper = PLAYER_SCOREBOARDS.get(player.getName()); + ScoreboardWrapper wrapper = getWrapper(player); // Do NOT run if already shown - if (wrapper.isBoardShown()) { - return; + if (wrapper != null && wrapper.isBoardShown()) { + + if(wrapper.isBoardShown()) + return; + + wrapper.setOldScoreboard(); + wrapper.setTypeSkill(skill); + changeScoreboard(wrapper, mcMMO.p.getGeneralConfig().getSkillLevelUpTime()); } - - wrapper.setOldScoreboard(); - wrapper.setTypeSkill(skill); - - changeScoreboard(wrapper, Config.getInstance().getSkillLevelUpTime()); } public static void enablePlayerStatsScoreboard(Player player) { - ScoreboardWrapper wrapper = PLAYER_SCOREBOARDS.get(player.getName()); + ScoreboardWrapper wrapper = getWrapper(player); + + if(wrapper == null) + return; + wrapper.setOldScoreboard(); wrapper.setTypeSelfStats(); - changeScoreboard(wrapper, Config.getInstance().getStatsScoreboardTime()); + changeScoreboard(wrapper, mcMMO.p.getGeneralConfig().getStatsScoreboardTime()); } - public static void enablePlayerInspectScoreboard(Player player, PlayerProfile targetProfile) { - ScoreboardWrapper wrapper = PLAYER_SCOREBOARDS.get(player.getName()); + public static void enablePlayerInspectScoreboard(@NotNull Player player, @NotNull PlayerProfile targetProfile) { + ScoreboardWrapper wrapper = getWrapper(player); - wrapper.setOldScoreboard(); - wrapper.setTypeInspectStats(targetProfile); + if(wrapper == null) { + setupPlayer(player); + wrapper = getWrapper(player); + } - changeScoreboard(wrapper, Config.getInstance().getInspectScoreboardTime()); + if(wrapper != null) { + wrapper.setOldScoreboard(); + wrapper.setTypeInspectStats(targetProfile); + + changeScoreboard(wrapper, mcMMO.p.getGeneralConfig().getInspectScoreboardTime()); + } + } + + public static void enablePlayerInspectScoreboard(@NotNull Player player, @NotNull McMMOPlayer targetMcMMOPlayer) { + ScoreboardWrapper wrapper = getWrapper(player); + + if(wrapper == null) { + setupPlayer(player); + wrapper = getWrapper(player); + } + + if(wrapper != null) { + wrapper.setOldScoreboard(); + wrapper.setTypeInspectStats(targetMcMMOPlayer); + + changeScoreboard(wrapper, mcMMO.p.getGeneralConfig().getInspectScoreboardTime()); + } } public static void enablePlayerCooldownScoreboard(Player player) { - ScoreboardWrapper wrapper = PLAYER_SCOREBOARDS.get(player.getName()); + ScoreboardWrapper wrapper = getWrapper(player); - wrapper.setOldScoreboard(); - wrapper.setTypeCooldowns(); + if(wrapper == null) { + setupPlayer(player); + wrapper = getWrapper(player); + } - changeScoreboard(wrapper, Config.getInstance().getCooldownScoreboardTime()); + if(wrapper != null) { + wrapper.setOldScoreboard(); + wrapper.setTypeCooldowns(); + + changeScoreboard(wrapper, mcMMO.p.getGeneralConfig().getCooldownScoreboardTime()); + } } public static void showPlayerRankScoreboard(Player player, Map rank) { - ScoreboardWrapper wrapper = PLAYER_SCOREBOARDS.get(player.getName()); + ScoreboardWrapper wrapper = getWrapper(player); - wrapper.setOldScoreboard(); - wrapper.setTypeSelfRank(); - wrapper.acceptRankData(rank); + if(wrapper == null) { + setupPlayer(player); + wrapper = getWrapper(player); + } - changeScoreboard(wrapper, Config.getInstance().getRankScoreboardTime()); + if(wrapper != null) { + wrapper.setOldScoreboard(); + wrapper.setTypeSelfRank(); + wrapper.acceptRankData(rank); + + changeScoreboard(wrapper, mcMMO.p.getGeneralConfig().getRankScoreboardTime()); + } } public static void showPlayerRankScoreboardOthers(Player player, String targetName, Map rank) { - ScoreboardWrapper wrapper = PLAYER_SCOREBOARDS.get(player.getName()); + ScoreboardWrapper wrapper = getWrapper(player); - wrapper.setOldScoreboard(); - wrapper.setTypeInspectRank(targetName); - wrapper.acceptRankData(rank); + if(wrapper == null) { + setupPlayer(player); + wrapper = getWrapper(player); + } - changeScoreboard(wrapper, Config.getInstance().getRankScoreboardTime()); + if(wrapper != null) { + wrapper.setOldScoreboard(); + wrapper.setTypeInspectRank(targetName); + wrapper.acceptRankData(rank); + + changeScoreboard(wrapper, mcMMO.p.getGeneralConfig().getRankScoreboardTime()); + } } public static void showTopScoreboard(Player player, PrimarySkillType skill, int pageNumber, List stats) { - ScoreboardWrapper wrapper = PLAYER_SCOREBOARDS.get(player.getName()); - wrapper.setOldScoreboard(); - wrapper.setTypeTop(skill, pageNumber); - wrapper.acceptLeaderboardData(stats); + ScoreboardWrapper wrapper = getWrapper(player); - changeScoreboard(wrapper, Config.getInstance().getTopScoreboardTime()); + if(wrapper == null) { + setupPlayer(player); + wrapper = getWrapper(player); + } + + if(wrapper != null) { + wrapper.setOldScoreboard(); + wrapper.setTypeTop(skill, pageNumber); + wrapper.acceptLeaderboardData(stats); + + changeScoreboard(wrapper, mcMMO.p.getGeneralConfig().getTopScoreboardTime()); + } } public static void showTopPowerScoreboard(Player player, int pageNumber, List stats) { - ScoreboardWrapper wrapper = PLAYER_SCOREBOARDS.get(player.getName()); + ScoreboardWrapper wrapper = getWrapper(player); - wrapper.setOldScoreboard(); - wrapper.setTypeTopPower(pageNumber); - wrapper.acceptLeaderboardData(stats); + if(wrapper == null) { + setupPlayer(player); + wrapper = getWrapper(player); + } - changeScoreboard(wrapper, Config.getInstance().getTopScoreboardTime()); + if(wrapper != null) { + wrapper.setOldScoreboard(); + wrapper.setTypeTopPower(pageNumber); + wrapper.acceptLeaderboardData(stats); + + changeScoreboard(wrapper, mcMMO.p.getGeneralConfig().getTopScoreboardTime()); + } + } + + public static @Nullable ScoreboardWrapper getWrapper(Player player) { + if(PLAYER_SCOREBOARDS.get(player.getName()) == null) { + makeNewScoreboard(player); + } + + return PLAYER_SCOREBOARDS.get(player.getName()); } // **** Helper methods **** // @@ -386,9 +515,12 @@ public class ScoreboardManager { * * @return the main targetBoard objective, or null if disabled */ - public static Objective getPowerLevelObjective() { - if (!Config.getInstance().getPowerLevelTagsEnabled()) { - Objective objective = mcMMO.p.getServer().getScoreboardManager().getMainScoreboard().getObjective(POWER_OBJECTIVE); + public static @Nullable Objective getPowerLevelObjective() { + if (!mcMMO.p.getGeneralConfig().getPowerLevelTagsEnabled()) { + if(getScoreboardManager() == null) + return null; + + Objective objective = getScoreboardManager().getMainScoreboard().getObjective(POWER_OBJECTIVE); if (objective != null) { objective.unregister(); @@ -398,10 +530,14 @@ public class ScoreboardManager { return null; } - Objective powerObjective = mcMMO.p.getServer().getScoreboardManager().getMainScoreboard().getObjective(POWER_OBJECTIVE); + + if(getScoreboardManager() == null) + return null; + + Objective powerObjective = getScoreboardManager().getMainScoreboard().getObjective(POWER_OBJECTIVE); if (powerObjective == null) { - powerObjective = mcMMO.p.getServer().getScoreboardManager().getMainScoreboard().registerNewObjective(POWER_OBJECTIVE, "dummy"); + powerObjective = getScoreboardManager().getMainScoreboard().registerNewObjective(POWER_OBJECTIVE, "dummy", DISPLAY_NAME); powerObjective.setDisplayName(TAG_POWER_LEVEL); powerObjective.setDisplaySlot(DisplaySlot.BELOW_NAME); } @@ -409,7 +545,11 @@ public class ScoreboardManager { return powerObjective; } - private static void changeScoreboard(ScoreboardWrapper wrapper, int displayTime) { + public @Nullable static org.bukkit.scoreboard.ScoreboardManager getScoreboardManager() { + return mcMMO.p.getServer().getScoreboardManager(); + } + + public static void changeScoreboard(ScoreboardWrapper wrapper, int displayTime) { if (displayTime == -1) { wrapper.showBoardWithNoRevert(); } @@ -433,4 +573,20 @@ public class ScoreboardManager { public static void setRevertTimer(String playerName, int seconds) { PLAYER_SCOREBOARDS.get(playerName).showBoardAndScheduleRevert(seconds * Misc.TICK_CONVERSION_FACTOR); } + + public static boolean isPlayerBoardSetup(@NotNull String playerName) { + return PLAYER_SCOREBOARDS.get(playerName) != null; + } + + public static @Nullable ScoreboardWrapper makeNewScoreboard(Player player) { + if(getScoreboardManager() == null) + return null; + + //Call our custom event + Scoreboard scoreboard = getScoreboardManager().getNewScoreboard(); + McMMOScoreboardMakeboardEvent event = new McMMOScoreboardMakeboardEvent(scoreboard, player.getScoreboard(), player, ScoreboardEventReason.CREATING_NEW_SCOREBOARD); + player.getServer().getPluginManager().callEvent(event); + //Use the values from the event + return new ScoreboardWrapper(event.getTargetPlayer(), event.getTargetBoard()); + } } diff --git a/src/main/java/com/gmail/nossr50/util/scoreboards/ScoreboardWrapper.java b/src/main/java/com/gmail/nossr50/util/scoreboards/ScoreboardWrapper.java index 36c58c17a..be3e97cb4 100644 --- a/src/main/java/com/gmail/nossr50/util/scoreboards/ScoreboardWrapper.java +++ b/src/main/java/com/gmail/nossr50/util/scoreboards/ScoreboardWrapper.java @@ -1,19 +1,24 @@ package com.gmail.nossr50.util.scoreboards; -import com.gmail.nossr50.config.Config; import com.gmail.nossr50.datatypes.database.PlayerStat; import com.gmail.nossr50.datatypes.player.McMMOPlayer; import com.gmail.nossr50.datatypes.player.PlayerProfile; import com.gmail.nossr50.datatypes.skills.PrimarySkillType; import com.gmail.nossr50.datatypes.skills.SuperAbilityType; -import com.gmail.nossr50.events.scoreboard.*; +import com.gmail.nossr50.events.scoreboard.McMMOScoreboardObjectiveEvent; +import com.gmail.nossr50.events.scoreboard.McMMOScoreboardRevertEvent; +import com.gmail.nossr50.events.scoreboard.ScoreboardEventReason; +import com.gmail.nossr50.events.scoreboard.ScoreboardObjectiveEventReason; import com.gmail.nossr50.locale.LocaleLoader; import com.gmail.nossr50.mcMMO; import com.gmail.nossr50.skills.child.FamilyTree; import com.gmail.nossr50.util.Misc; +import com.gmail.nossr50.util.player.NotificationManager; import com.gmail.nossr50.util.player.UserManager; import com.gmail.nossr50.util.scoreboards.ScoreboardManager.SidebarType; +import com.gmail.nossr50.util.skills.SkillTools; import org.apache.commons.lang.Validate; +import org.bukkit.Bukkit; import org.bukkit.ChatColor; import org.bukkit.entity.Player; import org.bukkit.scheduler.BukkitRunnable; @@ -22,11 +27,14 @@ import org.bukkit.scoreboard.DisplaySlot; import org.bukkit.scoreboard.Objective; import org.bukkit.scoreboard.Score; import org.bukkit.scoreboard.Scoreboard; +import org.jetbrains.annotations.NotNull; import java.util.List; import java.util.Map; public class ScoreboardWrapper { + public static final String SIDE_OBJECTIVE = "mcMMO_sideObjective"; + public static final String POWER_OBJECTIVE = "mcMMO_powerObjective"; // Initialization variables public final String playerName; public final Player player; @@ -45,16 +53,29 @@ public class ScoreboardWrapper { public PrimarySkillType targetSkill = null; private PlayerProfile targetProfile = null; public int leaderboardPage = -1; + private boolean registered = false; - private ScoreboardWrapper(Player player, Scoreboard scoreboard) { + public ScoreboardWrapper(Player player, Scoreboard scoreboard) { this.player = player; this.playerName = player.getName(); this.scoreboard = scoreboard; - sidebarType = SidebarType.NONE; - sidebarObjective = this.scoreboard.registerNewObjective(ScoreboardManager.SIDEBAR_OBJECTIVE, "dummy"); - powerObjective = this.scoreboard.registerNewObjective(ScoreboardManager.POWER_OBJECTIVE, "dummy"); + initBoard(); + } - if (Config.getInstance().getPowerLevelTagsEnabled()) { + private void initBoard() { + sidebarType = SidebarType.NONE; + if(registered) { + //Make sure our references are pointed at the right things + sidebarObjective = scoreboard.getObjective(ScoreboardManager.SIDEBAR_OBJECTIVE); + powerObjective = scoreboard.getObjective(ScoreboardManager.POWER_OBJECTIVE); + } else { + //Register Objectives + sidebarObjective = this.scoreboard.registerNewObjective(ScoreboardManager.SIDEBAR_OBJECTIVE, "dummy", SIDE_OBJECTIVE); + powerObjective = this.scoreboard.registerNewObjective(ScoreboardManager.POWER_OBJECTIVE, "dummy", POWER_OBJECTIVE); + registered = true; + } + + if (mcMMO.p.getGeneralConfig().getPowerLevelTagsEnabled()) { powerObjective.setDisplayName(ScoreboardManager.TAG_POWER_LEVEL); powerObjective.setDisplaySlot(DisplaySlot.BELOW_NAME); @@ -64,14 +85,6 @@ public class ScoreboardWrapper { } } - public static ScoreboardWrapper create(Player player) { - //Call our custom event - McMMOScoreboardMakeboardEvent event = new McMMOScoreboardMakeboardEvent(mcMMO.p.getServer().getScoreboardManager().getNewScoreboard(), player.getScoreboard(), player, ScoreboardEventReason.CREATING_NEW_SCOREBOARD); - player.getServer().getPluginManager().callEvent(event); - //Use the values from the event - return new ScoreboardWrapper(event.getTargetPlayer(), event.getTargetBoard()); - } - public BukkitTask updateTask = null; private class ScoreboardQuickUpdate extends BukkitRunnable { @@ -128,7 +141,8 @@ public class ScoreboardWrapper { try { cooldownTask.cancel(); } - catch (Throwable ignored) { + catch (Exception e) { + e.printStackTrace(); } cooldownTask = null; @@ -158,16 +172,17 @@ public class ScoreboardWrapper { return; } - Scoreboard oldBoard = player.getScoreboard(); + Scoreboard previousBoard = player.getScoreboard(); - if (oldBoard == scoreboard) { // Already displaying it + if (previousBoard == scoreboard) { // Already displaying it if (this.oldBoard == null) { // (Shouldn't happen) Use failsafe value - we're already displaying our board, but we don't have the one we should revert to - this.oldBoard = mcMMO.p.getServer().getScoreboardManager().getMainScoreboard(); + if(mcMMO.p.getServer().getScoreboardManager() != null) + this.oldBoard = mcMMO.p.getServer().getScoreboardManager().getMainScoreboard(); } } else { - this.oldBoard = oldBoard; + this.oldBoard = previousBoard; } } @@ -210,7 +225,7 @@ public class ScoreboardWrapper { PlayerProfile profile = UserManager.getPlayer(player).getProfile(); - if (profile.getScoreboardTipsShown() >= Config.getInstance().getTipsAmount()) { + if (profile.getScoreboardTipsShown() >= mcMMO.p.getGeneralConfig().getTipsAmount()) { return; } @@ -235,8 +250,8 @@ public class ScoreboardWrapper { if (oldBoard != null) { if (player.getScoreboard() == scoreboard) { - /** - * Call the revert scoreboard custom event + /* + Call the revert scoreboard custom event */ McMMOScoreboardRevertEvent event = new McMMOScoreboardRevertEvent(oldBoard, player.getScoreboard(), player, ScoreboardEventReason.REVERTING_BOARD); player.getServer().getPluginManager().callEvent(event); @@ -324,6 +339,17 @@ public class ScoreboardWrapper { loadObjective(LocaleLoader.getString("Scoreboard.Header.PlayerInspect", targetPlayer)); } + public void setTypeInspectStats(@NotNull McMMOPlayer mcMMOPlayer) { + this.sidebarType = SidebarType.STATS_BOARD; + targetPlayer = mcMMOPlayer.getPlayer().getName(); + targetProfile = mcMMOPlayer.getProfile(); + + targetSkill = null; + leaderboardPage = -1; + + loadObjective(LocaleLoader.getString("Scoreboard.Header.PlayerInspect", targetPlayer)); + } + public void setTypeCooldowns() { this.sidebarType = SidebarType.COOLDOWNS_BOARD; @@ -388,13 +414,25 @@ public class ScoreboardWrapper { //Unregister objective McMMOScoreboardObjectiveEvent unregisterEvent = callObjectiveEvent(ScoreboardObjectiveEventReason.UNREGISTER_THIS_OBJECTIVE); if(!unregisterEvent.isCancelled()) { - sidebarObjective.unregister(); + try { + sidebarObjective.unregister(); + } catch (IllegalStateException e) { + McMMOPlayer mmoPlayer = UserManager.getPlayer(player); + + mcMMO.p.debug("Recovering scoreboard for player: " + player.getName()); + + if(mmoPlayer.isDebugMode()) + NotificationManager.sendPlayerInformationChatOnlyPrefixed(player, "Scoreboard.Recovery"); + + initBoard(); //Start over + Bukkit.getScheduler().runTaskLater(mcMMO.p, () -> ScoreboardManager.retryLastSkillBoard(player), 0); + } } //Register objective McMMOScoreboardObjectiveEvent registerEvent = callObjectiveEvent(ScoreboardObjectiveEventReason.REGISTER_NEW_OBJECTIVE); if(!registerEvent.isCancelled()) - sidebarObjective = registerEvent.getTargetBoard().registerNewObjective(ScoreboardManager.SIDEBAR_OBJECTIVE, "dummy"); + sidebarObjective = registerEvent.getTargetBoard().registerNewObjective(ScoreboardManager.SIDEBAR_OBJECTIVE, "dummy", SIDE_OBJECTIVE); if (displayName.length() > 32) { displayName = displayName.substring(0, 32); @@ -417,13 +455,16 @@ public class ScoreboardWrapper { * Load new values into the sidebar. */ private void updateSidebar() { - try { - updateTask.cancel(); - } - catch (Throwable ignored) { - } // catch NullPointerException and IllegalStateException and any Error; don't care + if(updateTask != null) { + try { + updateTask.cancel(); + } catch (Exception e) { + e.printStackTrace(); + } + + updateTask = null; + } - updateTask = null; if (sidebarType == SidebarType.NONE) { return; @@ -448,7 +489,7 @@ public class ScoreboardWrapper { case SKILL_BOARD: Validate.notNull(targetSkill); - if (!targetSkill.isChildSkill()) { + if (!SkillTools.isChildSkill(targetSkill)) { int currentXP = mcMMOPlayer.getSkillXpLevel(targetSkill); sidebarObjective.getScore(ScoreboardManager.LABEL_CURRENT_XP).setScore(currentXP); @@ -462,7 +503,7 @@ public class ScoreboardWrapper { sidebarObjective.getScore(ScoreboardManager.LABEL_LEVEL).setScore(mcMMOPlayer.getSkillLevel(targetSkill)); - if (targetSkill.getAbility() != null) { + if (mcMMO.p.getSkillTools().getSuperAbility(targetSkill) != null) { boolean stopUpdating; if (targetSkill == PrimarySkillType.MINING) { @@ -478,7 +519,7 @@ public class ScoreboardWrapper { stopUpdating = (secondsSB == 0 && secondsBM == 0); } else { - SuperAbilityType ability = targetSkill.getAbility(); + SuperAbilityType ability = mcMMO.p.getSkillTools().getSuperAbility(targetSkill); Score cooldown = sidebarObjective.getScore(ScoreboardManager.abilityLabelsSkill.get(ability)); int seconds = Math.max(mcMMOPlayer.calculateTimeRemaining(ability), 0); @@ -533,13 +574,13 @@ public class ScoreboardWrapper { // Calculate power level here int powerLevel = 0; - for (PrimarySkillType skill : PrimarySkillType.NON_CHILD_SKILLS) { // Don't include child skills, makes the list too long + for (PrimarySkillType skill : SkillTools.NON_CHILD_SKILLS) { // Don't include child skills, makes the list too long int level = newProfile.getSkillLevel(skill); powerLevel += level; // TODO: Verify that this is what we want - calculated in power level but not displayed - if (!skill.getPermissions(player)) { + if (!mcMMO.p.getSkillTools().doesPlayerHaveSkillPermission(player, skill)) { continue; } @@ -566,8 +607,8 @@ public class ScoreboardWrapper { Integer rank; Player player = mcMMO.p.getServer().getPlayerExact(playerName); - for (PrimarySkillType skill : PrimarySkillType.NON_CHILD_SKILLS) { - if (!skill.getPermissions(player)) { + for (PrimarySkillType skill : SkillTools.NON_CHILD_SKILLS) { + if (!mcMMO.p.getSkillTools().doesPlayerHaveSkillPermission(player, skill)) { continue; } diff --git a/src/main/java/com/gmail/nossr50/util/skills/CombatUtils.java b/src/main/java/com/gmail/nossr50/util/skills/CombatUtils.java index edfbbca93..a855f3a4c 100644 --- a/src/main/java/com/gmail/nossr50/util/skills/CombatUtils.java +++ b/src/main/java/com/gmail/nossr50/util/skills/CombatUtils.java @@ -1,6 +1,5 @@ package com.gmail.nossr50.util.skills; -import com.gmail.nossr50.config.AdvancedConfig; import com.gmail.nossr50.config.experience.ExperienceConfig; import com.gmail.nossr50.datatypes.experience.XPGainReason; import com.gmail.nossr50.datatypes.interactions.NotificationType; @@ -11,6 +10,8 @@ import com.gmail.nossr50.datatypes.skills.SubSkillType; import com.gmail.nossr50.events.fake.FakeEntityDamageByEntityEvent; import com.gmail.nossr50.events.fake.FakeEntityDamageEvent; import com.gmail.nossr50.mcMMO; +import com.gmail.nossr50.metadata.MobMetaFlagType; +import com.gmail.nossr50.metadata.MobMetadataService; import com.gmail.nossr50.party.PartyManager; import com.gmail.nossr50.runnables.skills.AwardCombatXpTask; import com.gmail.nossr50.skills.acrobatics.AcrobaticsManager; @@ -23,8 +24,11 @@ import com.gmail.nossr50.util.*; import com.gmail.nossr50.util.player.NotificationManager; import com.gmail.nossr50.util.player.UserManager; import com.google.common.collect.ImmutableMap; +import org.bukkit.Bukkit; import org.bukkit.GameMode; import org.bukkit.Material; +import org.bukkit.attribute.Attribute; +import org.bukkit.attribute.AttributeInstance; import org.bukkit.entity.*; import org.bukkit.event.entity.EntityDamageByEntityEvent; import org.bukkit.event.entity.EntityDamageEvent; @@ -32,7 +36,10 @@ import org.bukkit.event.entity.EntityDamageEvent.DamageCause; import org.bukkit.event.entity.EntityDamageEvent.DamageModifier; import org.bukkit.inventory.ItemStack; import org.bukkit.metadata.MetadataValue; +import org.bukkit.potion.PotionEffectType; import org.bukkit.projectiles.ProjectileSource; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; import java.util.EnumMap; import java.util.HashMap; @@ -40,9 +47,30 @@ import java.util.List; import java.util.Map; public final class CombatUtils { + private CombatUtils() {} - private static void processSwordCombat(LivingEntity target, Player player, EntityDamageByEntityEvent event) { + private static @NotNull MobMetadataService getMobMetadataService() { + return mcMMO.getMetadataService().getMobMetadataService(); + } + + //Likely.. because who knows what plugins are throwing around + public static boolean isDamageLikelyFromNormalCombat(@NotNull DamageCause damageCause) { + switch (damageCause) { + case ENTITY_ATTACK: + case ENTITY_SWEEP_ATTACK: + case PROJECTILE: + return true; + default: + return false; + } + } + + public static boolean hasWeakenedDamage(@NotNull LivingEntity livingEntity) { + return livingEntity.hasPotionEffect(PotionEffectType.WEAKNESS); + } + + private static void processSwordCombat(@NotNull LivingEntity target, @NotNull Player player, @NotNull EntityDamageByEntityEvent event) { if (event.getCause() == DamageCause.THORNS) { return; } @@ -64,11 +92,8 @@ public final class CombatUtils { mcMMOPlayer.checkAbilityActivation(PrimarySkillType.SWORDS); } - if(target.getHealth() - event.getFinalDamage() >= 1) - { - if (swordsManager.canUseRupture()) { - swordsManager.ruptureCheck(target); - } + if(target.getHealth() - event.getFinalDamage() > 0) { + swordsManager.processRupture(target); } //Add Stab Damage @@ -87,35 +112,24 @@ public final class CombatUtils { } applyScaledModifiers(initialDamage, finalDamage, event); - startGainXp(mcMMOPlayer, target, PrimarySkillType.SWORDS); + processCombatXP(mcMMOPlayer, target, PrimarySkillType.SWORDS); + + printFinalDamageDebug(player, event, mcMMOPlayer); } -// public static void strengthDebug(Player player) { -// BukkitPlatform bukkitPlatform = (BukkitPlatform) mcMMO.getPlatformManager().getPlatform(); -// Bukkit.broadcastMessage("Strength: "+bukkitPlatform.getPlayerAttackStrength(player)); -// -// Bukkit.getScheduler().scheduleSyncDelayedTask(mcMMO.p, () -> { -// Bukkit.broadcastMessage("1 Tick Delay: " + bukkitPlatform.getPlayerAttackStrength(player)); -// }, 1); -// -// Bukkit.getScheduler().scheduleSyncDelayedTask(mcMMO.p, () -> { -// Bukkit.broadcastMessage("5 Tick Delay: " + bukkitPlatform.getPlayerAttackStrength(player)); -// }, 5); -// -// Bukkit.getScheduler().scheduleSyncDelayedTask(mcMMO.p, () -> { -// Bukkit.broadcastMessage("80 Tick Delay: " + bukkitPlatform.getPlayerAttackStrength(player)); -// }, 20 * 4); -// -// Bukkit.broadcastMessage(""); -// -//// if(isPlayerFullStrength(player)) { -//// Bukkit.broadcastMessage("Full Strength!"); -//// } else { -//// Bukkit.broadcastMessage("Not full strength!"); -//// } -// } + private static void printFinalDamageDebug(@NotNull Player player, @NotNull EntityDamageByEntityEvent event, @NotNull McMMOPlayer mcMMOPlayer, @Nullable String @Nullable ... extraInfoLines) { + if(mcMMOPlayer.isDebugMode()) { + player.sendMessage("Final Damage value after mcMMO modifiers: "+ event.getFinalDamage()); + if(extraInfoLines != null) { + for(String str : extraInfoLines) { + if(str != null) + player.sendMessage(str); + } + } + } + } - private static void processAxeCombat(LivingEntity target, Player player, EntityDamageByEntityEvent event) { + private static void processAxeCombat(@NotNull LivingEntity target, @NotNull Player player, @NotNull EntityDamageByEntityEvent event) { if (event.getCause() == DamageCause.THORNS) { return; } @@ -162,10 +176,12 @@ public final class CombatUtils { } applyScaledModifiers(initialDamage, finalDamage, event); - startGainXp(mcMMOPlayer, target, PrimarySkillType.AXES); + processCombatXP(mcMMOPlayer, target, PrimarySkillType.AXES); + + printFinalDamageDebug(player, event, mcMMOPlayer); } - private static void processUnarmedCombat(LivingEntity target, Player player, EntityDamageByEntityEvent event) { + private static void processUnarmedCombat(@NotNull LivingEntity target, @NotNull Player player, @NotNull EntityDamageByEntityEvent event) { if (event.getCause() == DamageCause.THORNS) { return; } @@ -186,9 +202,8 @@ public final class CombatUtils { mcMMOPlayer.checkAbilityActivation(PrimarySkillType.UNARMED); } - //Only execute bonuses if the player is not spamming - if (unarmedManager.canUseIronArm()) { - finalDamage+=(unarmedManager.calculateIronArmDamage() * mcMMOPlayer.getAttackStrength()); + if (unarmedManager.canUseSteelArm()) { + finalDamage+=(unarmedManager.calculateSteelArmStyleDamage() * mcMMOPlayer.getAttackStrength()); } if (unarmedManager.canUseBerserk()) { @@ -205,10 +220,12 @@ public final class CombatUtils { } applyScaledModifiers(initialDamage, finalDamage, event); - startGainXp(mcMMOPlayer, target, PrimarySkillType.UNARMED); + processCombatXP(mcMMOPlayer, target, PrimarySkillType.UNARMED); + + printFinalDamageDebug(player, event, mcMMOPlayer); } - private static void processTamingCombat(LivingEntity target, Player master, Wolf wolf, EntityDamageByEntityEvent event) { + private static void processTamingCombat(@NotNull LivingEntity target, @Nullable Player master, @NotNull Wolf wolf, @NotNull EntityDamageByEntityEvent event) { double initialDamage = event.getDamage(); double finalDamage = initialDamage; @@ -237,18 +254,19 @@ public final class CombatUtils { } applyScaledModifiers(initialDamage, finalDamage, event); - startGainXp(mcMMOPlayer, target, PrimarySkillType.TAMING); + processCombatXP(mcMMOPlayer, target, PrimarySkillType.TAMING, 3); } } - private static void processArcheryCombat(LivingEntity target, Player player, EntityDamageByEntityEvent event, Projectile arrow) { + private static void processArcheryCombat(@NotNull LivingEntity target, @NotNull Player player, @NotNull EntityDamageByEntityEvent event, @NotNull Projectile arrow) { double initialDamage = event.getDamage(); McMMOPlayer mcMMOPlayer = UserManager.getPlayer(player); //Make sure the profiles been loaded if(mcMMOPlayer == null) { + cleanupArrowMetadata(arrow); return; } @@ -256,28 +274,16 @@ public final class CombatUtils { double finalDamage = event.getDamage(); - if (target instanceof Player && PrimarySkillType.UNARMED.getPVPEnabled()) { - UnarmedManager unarmedManager = UserManager.getPlayer((Player) target).getUnarmedManager(); - - if (unarmedManager.canDeflect()) { - event.setCancelled(unarmedManager.deflectCheck()); - - if (event.isCancelled()) { - return; - } - } - } - if (archeryManager.canSkillShot()) { //Not Additive finalDamage = archeryManager.skillShot(initialDamage); } if (archeryManager.canDaze(target)) { - finalDamage+=archeryManager.daze((Player) target); + finalDamage+=archeryManager.daze((Player) target); //the cast is checked by the if condition } - if (!arrow.hasMetadata(mcMMO.infiniteArrowKey) && archeryManager.canRetrieveArrows()) { + if (!arrow.hasMetadata(MetadataConstants.METADATA_KEY_INF_ARROW) && archeryManager.canRetrieveArrows()) { archeryManager.retrieveArrows(target, arrow); } @@ -289,11 +295,20 @@ public final class CombatUtils { double distanceMultiplier = archeryManager.distanceXpBonusMultiplier(target, arrow); double forceMultiplier = 1.0; //Hacky Fix - some plugins spawn arrows and assign them to players after the ProjectileLaunchEvent fires - if(arrow.hasMetadata(mcMMO.bowForceKey)) - forceMultiplier = arrow.getMetadata(mcMMO.bowForceKey).get(0).asDouble(); + if(arrow.hasMetadata(MetadataConstants.METADATA_KEY_BOW_FORCE)) + forceMultiplier = arrow.getMetadata(MetadataConstants.METADATA_KEY_BOW_FORCE).get(0).asDouble(); applyScaledModifiers(initialDamage, finalDamage, event); - startGainXp(mcMMOPlayer, target, PrimarySkillType.ARCHERY, forceMultiplier * distanceMultiplier); + + processCombatXP(mcMMOPlayer, target, PrimarySkillType.ARCHERY, forceMultiplier * distanceMultiplier); + + printFinalDamageDebug(player, event, mcMMOPlayer, + "Distance Multiplier: "+distanceMultiplier, + "Force Multiplier: "+forceMultiplier, + "Initial Damage: "+initialDamage, + "Final Damage: "+finalDamage); + //Clean data + cleanupArrowMetadata(arrow); } /** @@ -301,12 +316,15 @@ public final class CombatUtils { * * @param event The event to run the combat checks on. */ - public static void processCombatAttack(EntityDamageByEntityEvent event, Entity damageSourceEntity, LivingEntity target) { - EntityType entityType = damageSourceEntity.getType(); + public static void processCombatAttack(@NotNull EntityDamageByEntityEvent event, @NotNull Entity painSourceRoot, @NotNull LivingEntity target) { + Entity painSource = event.getDamager(); + EntityType entityType = painSource.getType(); if (target instanceof Player) { - if (Misc.isNPCEntityExcludingVillagers(target)) { - return; + if(ExperienceConfig.getInstance().isNPCInteractionPrevented()) { + if (Misc.isNPCEntityExcludingVillagers(target)) { + return; + } } Player player = (Player) target; @@ -318,35 +336,34 @@ public final class CombatUtils { AcrobaticsManager acrobaticsManager = mcMMOPlayer.getAcrobaticsManager(); if (acrobaticsManager.canDodge(target)) { - event.setDamage(acrobaticsManager.dodgeCheck(damageSourceEntity, event.getDamage())); + event.setDamage(acrobaticsManager.dodgeCheck(painSourceRoot, event.getDamage())); } if (ItemUtils.isSword(player.getInventory().getItemInMainHand())) { - if (!PrimarySkillType.SWORDS.shouldProcess(target)) { + if (!mcMMO.p.getSkillTools().canCombatSkillsTrigger(PrimarySkillType.SWORDS, target)) { return; } SwordsManager swordsManager = mcMMOPlayer.getSwordsManager(); - if (swordsManager.canUseCounterAttack(damageSourceEntity)) { - swordsManager.counterAttackChecks((LivingEntity) damageSourceEntity, event.getDamage()); + if (swordsManager.canUseCounterAttack(painSource)) { + swordsManager.counterAttackChecks((LivingEntity) painSource, event.getDamage()); } } } - if (damageSourceEntity instanceof Player && entityType == EntityType.PLAYER) { - Player player = (Player) damageSourceEntity; + if (painSourceRoot instanceof Player && entityType == EntityType.PLAYER) { + Player player = (Player) painSourceRoot; - if (UserManager.getPlayer(player) == null) { + if (!UserManager.hasPlayerDataKey(player)) { return; } - McMMOPlayer attackingPlayer = UserManager.getPlayer(player); ItemStack heldItem = player.getInventory().getItemInMainHand(); if (target instanceof Tameable) { if (heldItem.getType() == Material.BONE) { - TamingManager tamingManager = attackingPlayer.getTamingManager(); + TamingManager tamingManager = UserManager.getPlayer(player).getTamingManager(); if (tamingManager.canUseBeastLore()) { tamingManager.beastLore(target); @@ -361,73 +378,82 @@ public final class CombatUtils { } if (ItemUtils.isSword(heldItem)) { - if (!PrimarySkillType.SWORDS.shouldProcess(target)) { + if (!mcMMO.p.getSkillTools().canCombatSkillsTrigger(PrimarySkillType.SWORDS, target)) { return; } - if (PrimarySkillType.SWORDS.getPermissions(player)) { + if (mcMMO.p.getSkillTools().doesPlayerHaveSkillPermission(player, PrimarySkillType.SWORDS)) { processSwordCombat(target, player, event); + } } else if (ItemUtils.isAxe(heldItem)) { - if (!PrimarySkillType.AXES.shouldProcess(target)) { + if (!mcMMO.p.getSkillTools().canCombatSkillsTrigger(PrimarySkillType.AXES, target)) { return; } - if (PrimarySkillType.AXES.getPermissions(player)) { + if (mcMMO.p.getSkillTools().doesPlayerHaveSkillPermission(player, PrimarySkillType.AXES)) { processAxeCombat(target, player, event); } } else if (ItemUtils.isUnarmed(heldItem)) { - if (!PrimarySkillType.UNARMED.shouldProcess(target)) { + if (!mcMMO.p.getSkillTools().canCombatSkillsTrigger(PrimarySkillType.UNARMED, target)) { return; } - if (PrimarySkillType.UNARMED.getPermissions(player)) { + if (mcMMO.p.getSkillTools().doesPlayerHaveSkillPermission(player, PrimarySkillType.UNARMED)) { processUnarmedCombat(target, player, event); } } } else if (entityType == EntityType.WOLF) { - Wolf wolf = (Wolf) damageSourceEntity; + Wolf wolf = (Wolf) painSource; AnimalTamer tamer = wolf.getOwner(); - if (tamer != null && tamer instanceof Player && PrimarySkillType.TAMING.shouldProcess(target)) { + if (tamer instanceof Player && mcMMO.p.getSkillTools().canCombatSkillsTrigger(PrimarySkillType.TAMING, target)) { Player master = (Player) tamer; - if (!Misc.isNPCEntityExcludingVillagers(master) && PrimarySkillType.TAMING.getPermissions(master)) { + if (!Misc.isNPCEntityExcludingVillagers(master) && mcMMO.p.getSkillTools().doesPlayerHaveSkillPermission(master, PrimarySkillType.TAMING)) { processTamingCombat(target, master, wolf, event); } } } else if (entityType == EntityType.ARROW || entityType == EntityType.SPECTRAL_ARROW) { - Projectile arrow = (Projectile) damageSourceEntity; + Projectile arrow = (Projectile) painSource; ProjectileSource projectileSource = arrow.getShooter(); - if (projectileSource != null && projectileSource instanceof Player && PrimarySkillType.ARCHERY.shouldProcess(target)) { + if (projectileSource instanceof Player && mcMMO.p.getSkillTools().canCombatSkillsTrigger(PrimarySkillType.ARCHERY, target)) { Player player = (Player) projectileSource; - if (!Misc.isNPCEntityExcludingVillagers(player) && PrimarySkillType.ARCHERY.getPermissions(player)) { + if (!Misc.isNPCEntityExcludingVillagers(player) && mcMMO.p.getSkillTools().doesPlayerHaveSkillPermission(player, PrimarySkillType.ARCHERY)) { processArcheryCombat(target, player, event, arrow); + } else { + //Cleanup Arrow + cleanupArrowMetadata(arrow); } - if (target.getType() != EntityType.CREEPER && !Misc.isNPCEntityExcludingVillagers(player) && PrimarySkillType.TAMING.getPermissions(player)) { + if (target.getType() != EntityType.CREEPER && !Misc.isNPCEntityExcludingVillagers(player) && mcMMO.p.getSkillTools().doesPlayerHaveSkillPermission(player, PrimarySkillType.TAMING)) { McMMOPlayer mcMMOPlayer = UserManager.getPlayer(player); + + if(mcMMOPlayer == null) + return; + TamingManager tamingManager = mcMMOPlayer.getTamingManager(); tamingManager.attackTarget(target); } } } + } /** * This cleans up names from displaying in chat as hearts * @param entity target entity */ - public static void fixNames(LivingEntity entity) + public static void fixNames(@NotNull LivingEntity entity) { - List metadataValue = entity.getMetadata("mcMMO_oldName"); + List metadataValue = entity.getMetadata(MetadataConstants.METADATA_KEY_OLD_NAME_KEY); if(metadataValue.size() <= 0) return; @@ -435,6 +461,8 @@ public final class CombatUtils { OldName oldName = (OldName) metadataValue.get(0); entity.setCustomName(oldName.asString()); entity.setCustomNameVisible(false); + + entity.removeMetadata(MetadataConstants.METADATA_KEY_OLD_NAME_KEY, mcMMO.p); } /** @@ -444,7 +472,7 @@ public final class CombatUtils { * @param subSkillType the specific limit break skill for calculations * @return the RAW damage bonus from Limit Break which is applied before reductions */ - public static int getLimitBreakDamage(Player attacker, LivingEntity defender, SubSkillType subSkillType) { + public static int getLimitBreakDamage(@NotNull Player attacker, @NotNull LivingEntity defender, @NotNull SubSkillType subSkillType) { if(defender instanceof Player) { Player playerDefender = (Player) defender; return getLimitBreakDamageAgainstQuality(attacker, subSkillType, getArmorQualityLevel(playerDefender)); @@ -461,7 +489,7 @@ public final class CombatUtils { * @param armorQualityLevel Armor quality level * @return the RAW damage boost after its been mutated by armor quality */ - public static int getLimitBreakDamageAgainstQuality(Player attacker, SubSkillType subSkillType, int armorQualityLevel) { + public static int getLimitBreakDamageAgainstQuality(@NotNull Player attacker, @NotNull SubSkillType subSkillType, int armorQualityLevel) { int rawDamageBoost = RankUtils.getRank(attacker, subSkillType); if(armorQualityLevel <= 4) { @@ -480,7 +508,7 @@ public final class CombatUtils { * @param defender target defending player * @return the armor quality of the defending player */ - public static int getArmorQualityLevel(Player defender) { + public static int getArmorQualityLevel(@NotNull Player defender) { int armorQualityLevel = 0; for(ItemStack itemStack : defender.getInventory().getArmorContents()) { @@ -497,7 +525,7 @@ public final class CombatUtils { * @param itemStack target item stack * @return the armor quality of a specific Item Stack */ - private static int getArmorQuality(ItemStack itemStack) { + private static int getArmorQuality(@NotNull ItemStack itemStack) { return mcMMO.getMaterialMapStore().getTier(itemStack.getType().getKey().getKey()); } @@ -506,8 +534,8 @@ public final class CombatUtils { * @param player target entity * @return true if the player has access to the limit break */ - public static boolean canUseLimitBreak(Player player, LivingEntity target, SubSkillType subSkillType) { - if(target instanceof Player || AdvancedConfig.getInstance().canApplyLimitBreakPVE()) { + public static boolean canUseLimitBreak(@NotNull Player player, LivingEntity target, @NotNull SubSkillType subSkillType) { + if(target instanceof Player || mcMMO.p.getAdvancedConfig().canApplyLimitBreakPVE()) { return RankUtils.hasUnlockedSubskill(player, subSkillType) && Permissions.isSubSkillEnabled(player, subSkillType); } else { @@ -522,7 +550,7 @@ public final class CombatUtils { * @param damage Amount of damage to attempt to do */ @Deprecated - public static void dealDamage(LivingEntity target, double damage) { + public static void dealDamage(@NotNull LivingEntity target, double damage) { dealDamage(target, damage, DamageCause.CUSTOM, null); } @@ -534,25 +562,25 @@ public final class CombatUtils { * @param attacker Player to pass to event as damager */ @Deprecated - public static void dealDamage(LivingEntity target, double damage, LivingEntity attacker) { + public static void dealDamage(@NotNull LivingEntity target, double damage, @NotNull LivingEntity attacker) { dealDamage(target, damage, DamageCause.CUSTOM, attacker); } - /** - * Attempt to damage target for value dmg with reason ENTITY_ATTACK with damager attacker - * - * @param target LivingEntity which to attempt to damage - * @param damage Amount of damage to attempt to do - * @param attacker Player to pass to event as damager - */ - public static void dealDamage(LivingEntity target, double damage, Map modifiers, LivingEntity attacker) { - if (target.isDead()) { - return; - } - - // Aren't we applying the damage twice???? - target.damage(getFakeDamageFinalResult(attacker, target, damage, modifiers)); - } +// /** +// * Attempt to damage target for value dmg with reason ENTITY_ATTACK with damager attacker +// * +// * @param target LivingEntity which to attempt to damage +// * @param damage Amount of damage to attempt to do +// * @param attacker Player to pass to event as damager +// */ +// public static void dealDamage(LivingEntity target, double damage, Map modifiers, LivingEntity attacker) { +// if (target.isDead()) { +// return; +// } +// +// // Aren't we applying the damage twice???? +// target.damage(getFakeDamageFinalResult(attacker, target, damage, modifiers)); +// } /** * Attempt to damage target for value dmg with reason ENTITY_ATTACK with damager attacker @@ -562,13 +590,16 @@ public final class CombatUtils { * @param attacker Player to pass to event as damager */ @Deprecated - public static void dealDamage(LivingEntity target, double damage, DamageCause cause, Entity attacker) { + public static void dealDamage(@NotNull LivingEntity target, double damage, @NotNull DamageCause cause, @Nullable Entity attacker) { if (target.isDead()) { return; } - if(canDamage(attacker, target, cause, damage)) + if(canDamage(attacker, target, cause, damage)) { + applyIgnoreDamageMetadata(target); target.damage(damage); + removeIgnoreDamageMetadata(target); + } } private static boolean processingNoInvulnDamage; @@ -576,7 +607,7 @@ public final class CombatUtils { return processingNoInvulnDamage; } - public static void dealNoInvulnerabilityTickDamage(LivingEntity target, double damage, Entity attacker) { + public static void dealNoInvulnerabilityTickDamage(@NotNull LivingEntity target, double damage, @Nullable Entity attacker) { if (target.isDead()) { return; } @@ -587,22 +618,34 @@ public final class CombatUtils { // cause do have issues around plugin observability. This is not a perfect solution, but it appears to be the best one here // We also set no damage ticks to 0, to ensure that damage is applied for this case, and reset it back to the original value // Snapshot current state so we can pop up properly - boolean wasMetaSet = target.getMetadata(mcMMO.CUSTOM_DAMAGE_METAKEY).size() != 0; + boolean wasMetaSet = hasIgnoreDamageMetadata(target); boolean wasProcessing = processingNoInvulnDamage; // set markers processingNoInvulnDamage = true; - target.setMetadata(mcMMO.CUSTOM_DAMAGE_METAKEY, mcMMO.metadataValue); + applyIgnoreDamageMetadata(target); int noDamageTicks = target.getNoDamageTicks(); target.setNoDamageTicks(0); target.damage(damage, attacker); target.setNoDamageTicks(noDamageTicks); if (!wasMetaSet) - target.removeMetadata(mcMMO.CUSTOM_DAMAGE_METAKEY, mcMMO.p); + removeIgnoreDamageMetadata(target); if (!wasProcessing) processingNoInvulnDamage = false; } - public static void dealNoInvulnerabilityTickDamageRupture(LivingEntity target, double damage, Entity attacker, int toolTier) { + public static void removeIgnoreDamageMetadata(@NotNull LivingEntity target) { + target.removeMetadata(MetadataConstants.METADATA_KEY_CUSTOM_DAMAGE, mcMMO.p); + } + + public static void applyIgnoreDamageMetadata(@NotNull LivingEntity target) { + target.setMetadata(MetadataConstants.METADATA_KEY_CUSTOM_DAMAGE, MetadataConstants.MCMMO_METADATA_VALUE); + } + + public static boolean hasIgnoreDamageMetadata(@NotNull LivingEntity target) { + return target.getMetadata(MetadataConstants.METADATA_KEY_CUSTOM_DAMAGE).size() != 0; + } + + public static void dealNoInvulnerabilityTickDamageRupture(@NotNull LivingEntity target, double damage, Entity attacker, int toolTier) { if (target.isDead()) { return; } @@ -647,7 +690,7 @@ public final class CombatUtils { * @param damage The initial damage amount * @param type The type of skill being used */ - public static void applyAbilityAoE(Player attacker, LivingEntity target, double damage, Map modifiers, PrimarySkillType type) { + public static void applyAbilityAoE(@NotNull Player attacker, @NotNull LivingEntity target, double damage, Map modifiers, @NotNull PrimarySkillType type) { int numberOfTargets = getTier(attacker.getInventory().getItemInMainHand()); // The higher the weapon tier, the more targets you hit double damageAmount = Math.max(damage, 1); @@ -656,7 +699,7 @@ public final class CombatUtils { break; } - if (Misc.isNPCEntityExcludingVillagers(entity) || !(entity instanceof LivingEntity) || !shouldBeAffected(attacker, entity)) { + if ((ExperienceConfig.getInstance().isNPCInteractionPrevented() && Misc.isNPCEntityExcludingVillagers(entity)) || !(entity instanceof LivingEntity) || !shouldBeAffected(attacker, entity)) { continue; } @@ -669,7 +712,7 @@ public final class CombatUtils { NotificationManager.sendPlayerInformation((Player)entity, NotificationType.SUBSKILL_MESSAGE, "Swords.Combat.SS.Struck"); } - UserManager.getPlayer(attacker).getSwordsManager().ruptureCheck(target); + UserManager.getPlayer(attacker).getSwordsManager().processRupture(livingEntity); break; case AXES: @@ -688,8 +731,15 @@ public final class CombatUtils { } } - public static void startGainXp(McMMOPlayer mcMMOPlayer, LivingEntity target, PrimarySkillType primarySkillType) { - startGainXp(mcMMOPlayer, target, primarySkillType, 1.0); + /** + * Start the task that gives combat XP. + * + * @param mcMMOPlayer The attacking player + * @param target The defending entity + * @param primarySkillType The skill being used + */ + public static void processCombatXP(@NotNull McMMOPlayer mcMMOPlayer, LivingEntity target, PrimarySkillType primarySkillType) { + processCombatXP(mcMMOPlayer, target, primarySkillType, 1.0); } /** @@ -698,8 +748,9 @@ public final class CombatUtils { * @param mcMMOPlayer The attacking player * @param target The defending entity * @param primarySkillType The skill being used + * @param multiplier final XP result will be multiplied by this */ - private static void startGainXp(McMMOPlayer mcMMOPlayer, LivingEntity target, PrimarySkillType primarySkillType, double multiplier) { + public static void processCombatXP(@NotNull McMMOPlayer mcMMOPlayer, LivingEntity target, PrimarySkillType primarySkillType, double multiplier) { double baseXP = 0; XPGainReason xpGainReason; @@ -750,19 +801,22 @@ public final class CombatUtils { } } - if (target.hasMetadata(mcMMO.entityMetadataKey) - //Epic Spawners compatibility - || target.hasMetadata("ES")) { + if(getMobMetadataService().hasMobFlag(MobMetaFlagType.COTW_SUMMONED_MOB, target)) { + baseXP = 0; + } else if(getMobMetadataService().hasMobFlag(MobMetaFlagType.MOB_SPAWNER_MOB, target) || target.hasMetadata("ES")) { baseXP *= ExperienceConfig.getInstance().getSpawnedMobXpMultiplier(); - } - - if (target.hasMetadata(mcMMO.bredMetadataKey)) { + } else if(getMobMetadataService().hasMobFlag(MobMetaFlagType.NETHER_PORTAL_MOB, target)) { + baseXP *= ExperienceConfig.getInstance().getNetherPortalXpMultiplier(); + } else if(getMobMetadataService().hasMobFlag(MobMetaFlagType.EGG_MOB, target)) { + baseXP *= ExperienceConfig.getInstance().getEggXpMultiplier(); + } else if (getMobMetadataService().hasMobFlag(MobMetaFlagType.PLAYER_BRED_MOB, target)) { baseXP *= ExperienceConfig.getInstance().getBredMobXpMultiplier(); + } else if(getMobMetadataService().hasMobFlag(MobMetaFlagType.PLAYER_TAMED_MOB, target)) { + baseXP *= ExperienceConfig.getInstance().getTamedMobXpMultiplier(); } - xpGainReason = XPGainReason.PVE; - baseXP *= 10; + xpGainReason = XPGainReason.PVE; } baseXP *= multiplier; @@ -779,7 +833,7 @@ public final class CombatUtils { * @param entity The defending Entity * @return true if the Entity should be damaged, false otherwise. */ - private static boolean shouldBeAffected(Player player, Entity entity) { + private static boolean shouldBeAffected(@NotNull Player player, @NotNull Entity entity) { if (entity instanceof Player) { Player defender = (Player) entity; @@ -809,10 +863,12 @@ public final class CombatUtils { return getFakeDamageFinalResult(player, entity, 1.0) != 0; } else if (entity instanceof Tameable) { - if (isFriendlyPet(player, (Tameable) entity)) { + Tameable tameableEntity = (Tameable) entity; + + if (isFriendlyPet(player, tameableEntity)) { // isFriendlyPet ensures that the Tameable is: Tamed, owned by a player, and the owner is in the same party // So we can make some assumptions here, about our casting and our check - Player owner = (Player) ((Tameable) entity).getOwner(); + Player owner = (Player) tameableEntity.getOwner(); return Permissions.friendlyFire(player) && Permissions.friendlyFire(owner); } } @@ -827,7 +883,7 @@ public final class CombatUtils { * @param eventDamage The damage from the event the entity is involved in * @return true if the entity is invincible, false otherwise */ - public static boolean isInvincible(LivingEntity entity, double eventDamage) { + public static boolean isInvincible(@NotNull LivingEntity entity, double eventDamage) { /* * So apparently if you do more damage to a LivingEntity than its last damage int you bypass the invincibility. * So yeah, this is for that. @@ -842,7 +898,7 @@ public final class CombatUtils { * @param pet The entity to check. * @return true if the entity is friendly, false otherwise */ - public static boolean isFriendlyPet(Player attacker, Tameable pet) { + public static boolean isFriendlyPet(@NotNull Player attacker, @NotNull Tameable pet) { if (pet.isTamed()) { AnimalTamer tamer = pet.getOwner(); @@ -857,12 +913,12 @@ public final class CombatUtils { } @Deprecated - public static double getFakeDamageFinalResult(Entity attacker, Entity target, double damage) { - return getFakeDamageFinalResult(attacker, target, DamageCause.ENTITY_ATTACK, new EnumMap(ImmutableMap.of(DamageModifier.BASE, damage))); + public static double getFakeDamageFinalResult(@Nullable Entity attacker, @NotNull Entity target, double damage) { + return getFakeDamageFinalResult(attacker, target, DamageCause.ENTITY_ATTACK, new EnumMap<>(ImmutableMap.of(DamageModifier.BASE, damage))); } @Deprecated - public static double getFakeDamageFinalResult(Entity attacker, Entity target, DamageCause damageCause, double damage) { + public static double getFakeDamageFinalResult(@Nullable Entity attacker, @NotNull Entity target, @NotNull DamageCause damageCause, double damage) { EntityDamageEvent damageEvent = sendEntityDamageEvent(attacker, target, damageCause, damage); if (damageEvent.isCancelled()) { @@ -872,27 +928,27 @@ public final class CombatUtils { return damageEvent.getFinalDamage(); } - public static boolean canDamage(Entity attacker, Entity target, DamageCause damageCause, double damage) { + public static boolean canDamage(@NotNull Entity attacker, @NotNull Entity target, @NotNull DamageCause damageCause, double damage) { EntityDamageEvent damageEvent = sendEntityDamageEvent(attacker, target, damageCause, damage); return !damageEvent.isCancelled(); } - public static EntityDamageEvent sendEntityDamageEvent(Entity attacker, Entity target, DamageCause damageCause, double damage) { + public static @NotNull EntityDamageEvent sendEntityDamageEvent(@Nullable Entity attacker, @NotNull Entity target, @NotNull DamageCause damageCause, double damage) { EntityDamageEvent damageEvent = attacker == null ? new FakeEntityDamageEvent(target, damageCause, damage) : new FakeEntityDamageByEntityEvent(attacker, target, damageCause, damage); mcMMO.p.getServer().getPluginManager().callEvent(damageEvent); return damageEvent; } - public static double getFakeDamageFinalResult(Entity attacker, Entity target, Map modifiers) { + public static double getFakeDamageFinalResult(@Nullable Entity attacker, @NotNull Entity target, @NotNull Map modifiers) { return getFakeDamageFinalResult(attacker, target, DamageCause.ENTITY_ATTACK, modifiers); } - public static double getFakeDamageFinalResult(Entity attacker, Entity target, double damage, Map modifiers) { + public static double getFakeDamageFinalResult(@Nullable Entity attacker, @NotNull Entity target, double damage, @NotNull Map modifiers) { return getFakeDamageFinalResult(attacker, target, DamageCause.ENTITY_ATTACK, getScaledModifiers(damage, modifiers)); } - public static double getFakeDamageFinalResult(Entity attacker, Entity target, DamageCause cause, Map modifiers) { + public static double getFakeDamageFinalResult(@Nullable Entity attacker, @NotNull Entity target, @NotNull DamageCause cause, @NotNull Map modifiers) { EntityDamageEvent damageEvent = attacker == null ? new FakeEntityDamageEvent(target, cause, modifiers) : new FakeEntityDamageByEntityEvent(attacker, target, cause, modifiers); mcMMO.p.getServer().getPluginManager().callEvent(damageEvent); @@ -903,8 +959,8 @@ public final class CombatUtils { return damageEvent.getFinalDamage(); } - private static Map getModifiers(EntityDamageEvent event) { - Map modifiers = new HashMap(); + private static @NotNull Map getModifiers(@NotNull EntityDamageEvent event) { + Map modifiers = new HashMap<>(); for (DamageModifier modifier : DamageModifier.values()) { modifiers.put(modifier, event.getDamage(modifier)); } @@ -912,8 +968,8 @@ public final class CombatUtils { return modifiers; } - private static Map getScaledModifiers(double damage, Map modifiers) { - Map scaledModifiers = new HashMap(); + private static @NotNull Map getScaledModifiers(double damage, @NotNull Map modifiers) { + Map scaledModifiers = new HashMap<>(); for (DamageModifier modifier : modifiers.keySet()) { if (modifier == DamageModifier.BASE) { @@ -927,7 +983,7 @@ public final class CombatUtils { return scaledModifiers; } - public static EntityDamageByEntityEvent applyScaledModifiers(double initialDamage, double finalDamage, EntityDamageByEntityEvent event) { + public static @NotNull EntityDamageByEntityEvent applyScaledModifiers(double initialDamage, double finalDamage, @NotNull EntityDamageByEntityEvent event) { // No additional damage if (initialDamage == finalDamage) { return event; @@ -955,7 +1011,7 @@ public final class CombatUtils { * @param inHand The item to check the tier of * @return the tier of the item */ - private static int getTier(ItemStack inHand) { + private static int getTier(@NotNull ItemStack inHand) { int tier = 0; if (ItemUtils.isWoodTool(inHand)) { @@ -972,6 +1028,8 @@ public final class CombatUtils { } else if (ItemUtils.isDiamondTool(inHand)) { tier = 4; + } else if (ItemUtils.isNetheriteTool(inHand)) { + tier = 5; } else if (mcMMO.getModManager().isCustomTool(inHand)) { tier = mcMMO.getModManager().getTool(inHand).getTier(); @@ -980,7 +1038,7 @@ public final class CombatUtils { return tier; } - public static void handleHealthbars(Entity attacker, LivingEntity target, double damage, mcMMO plugin) { + public static void handleHealthbars(@NotNull Entity attacker, @NotNull LivingEntity target, double damage, @NotNull mcMMO plugin) { if (!(attacker instanceof Player)) { return; } @@ -991,10 +1049,47 @@ public final class CombatUtils { return; } - if (!player.hasMetadata(mcMMO.playerDataKey)) { + if (!player.hasMetadata(MetadataConstants.METADATA_KEY_PLAYER_DATA)) { return; } MobHealthbarUtils.handleMobHealthbars(target, damage, plugin); } + + public static void modifyMoveSpeed(@NotNull LivingEntity livingEntity, double multiplier) { + AttributeInstance attributeInstance = livingEntity.getAttribute(Attribute.GENERIC_MOVEMENT_SPEED); + + if(attributeInstance != null) { + double normalSpeed = attributeInstance.getBaseValue(); + attributeInstance.setBaseValue(normalSpeed * multiplier); + } + } + + /** + * Clean up metadata from a projectile + * + * @param entity projectile + */ + public static void cleanupArrowMetadata(@NotNull Projectile entity) { + if(entity.hasMetadata(MetadataConstants.METADATA_KEY_INF_ARROW)) { + entity.removeMetadata(MetadataConstants.METADATA_KEY_INF_ARROW, mcMMO.p); + } + + if(entity.hasMetadata(MetadataConstants.METADATA_KEY_BOW_FORCE)) { + entity.removeMetadata(MetadataConstants.METADATA_KEY_BOW_FORCE, mcMMO.p); + } + + if(entity.hasMetadata(MetadataConstants.METADATA_KEY_ARROW_DISTANCE)) { + entity.removeMetadata(MetadataConstants.METADATA_KEY_ARROW_DISTANCE, mcMMO.p); + } + } + + /** + * Clean up metadata from a projectile after a minute has passed + * + * @param entity the projectile + */ + public static void delayArrowMetaCleanup(@NotNull Projectile entity) { + Bukkit.getServer().getScheduler().runTaskLater(mcMMO.p, () -> { cleanupArrowMetadata(entity);}, 20*60); + } } diff --git a/src/main/java/com/gmail/nossr50/util/skills/ParticleEffectUtils.java b/src/main/java/com/gmail/nossr50/util/skills/ParticleEffectUtils.java index 9c9f19cf6..48265d03f 100644 --- a/src/main/java/com/gmail/nossr50/util/skills/ParticleEffectUtils.java +++ b/src/main/java/com/gmail/nossr50/util/skills/ParticleEffectUtils.java @@ -1,8 +1,9 @@ package com.gmail.nossr50.util.skills; -import com.gmail.nossr50.config.Config; +import com.gmail.nossr50.mcMMO; import com.gmail.nossr50.util.sounds.SoundManager; import com.gmail.nossr50.util.sounds.SoundType; +import org.apache.commons.lang.math.RandomUtils; import org.bukkit.Effect; import org.bukkit.Location; import org.bukkit.Material; @@ -11,10 +12,11 @@ import org.bukkit.block.Block; import org.bukkit.block.BlockFace; import org.bukkit.entity.LivingEntity; import org.bukkit.entity.Player; +import org.jetbrains.annotations.NotNull; public final class ParticleEffectUtils { - private ParticleEffectUtils() {}; + private ParticleEffectUtils() {} public static void playGreenThumbEffect(Location location) { World world = location.getWorld(); @@ -22,16 +24,53 @@ public final class ParticleEffectUtils { SoundManager.worldSendSoundMaxPitch(world, location, SoundType.POP); } - public static void playBleedEffect(LivingEntity livingEntity) { - if (!Config.getInstance().getBleedEffectEnabled()) { + public static void playBleedEffect(@NotNull LivingEntity livingEntity) { + if (!mcMMO.p.getGeneralConfig().getBleedEffectEnabled()) { return; } - livingEntity.getWorld().playEffect(livingEntity.getEyeLocation(), Effect.STEP_SOUND, Material.REDSTONE_WIRE); + livingEntity.getWorld().playEffect(getParticleLocation(livingEntity), Effect.STEP_SOUND, Material.REDSTONE_WIRE); + } + + private static @NotNull Location getParticleLocation(@NotNull LivingEntity livingEntity) { + Location origin = livingEntity.getEyeLocation().clone(); + World world = origin.getWorld(); + + double x = origin.getX(); + double y = origin.getY(); + double z = origin.getZ(); + + double offSetVal = 0.3D; + + switch(RandomUtils.nextInt(10)) { + + case 0: + return new Location(world, x - offSetVal, y, z); + case 1: + return new Location(world, x + offSetVal, y, z); + case 2: + return new Location(world, x, y + offSetVal, z); + case 3: + return new Location(world, x, y - offSetVal, z); + case 4: Location locE = new Location(world, x, y, z + offSetVal); + return new Location(world, x, y, z - offSetVal); + case 5: + return new Location(world, x + offSetVal, y, z + offSetVal); + case 6: + return new Location(world, x - offSetVal, y, z - offSetVal); + case 7: + return new Location(world, x - offSetVal, y - offSetVal, z - offSetVal); + case 8: + return new Location(world, x + offSetVal, y - offSetVal, z + offSetVal); + case 9: + return new Location(world, x - offSetVal, y + offSetVal, z - offSetVal); + default: + return new Location(world, x + offSetVal, y + offSetVal, z - offSetVal); + } } public static void playDodgeEffect(Player player) { - if (!Config.getInstance().getDodgeEffectEnabled()) { + if (!mcMMO.p.getGeneralConfig().getDodgeEffectEnabled()) { return; } @@ -39,7 +78,7 @@ public final class ParticleEffectUtils { } public static void playFluxEffect(Location location) { - if (!Config.getInstance().getFluxEffectEnabled()) { + if (!mcMMO.p.getGeneralConfig().getFluxEffectEnabled()) { return; } @@ -68,7 +107,7 @@ public final class ParticleEffectUtils { } public static void playGreaterImpactEffect(LivingEntity livingEntity) { - if (!Config.getInstance().getGreaterImpactEffectEnabled()) { + if (!mcMMO.p.getGeneralConfig().getGreaterImpactEffectEnabled()) { return; } @@ -78,26 +117,15 @@ public final class ParticleEffectUtils { } public static void playCallOfTheWildEffect(LivingEntity livingEntity) { - if (!Config.getInstance().getCallOfTheWildEffectEnabled()) { + if (!mcMMO.p.getGeneralConfig().getCallOfTheWildEffectEnabled()) { return; } livingEntity.getWorld().playEffect(livingEntity.getEyeLocation(), Effect.MOBSPAWNER_FLAMES, 1); } - public static void playAbilityEnabledEffect(Player player) { - if (!Config.getInstance().getAbilityActivationEffectEnabled()) { - return; - } - - /* if (hasHeadRoom(player)) { - fireworkParticleShower(player, Color.GREEN); - }*/ - } - public static void playAbilityDisabledEffect(Player player) { - if (!Config.getInstance().getAbilityDeactivationEffectEnabled()) { - return; + if (!mcMMO.p.getGeneralConfig().getAbilityDeactivationEffectEnabled()) { } /*if (hasHeadRoom(player)) { diff --git a/src/main/java/com/gmail/nossr50/util/skills/PerksUtils.java b/src/main/java/com/gmail/nossr50/util/skills/PerksUtils.java index eaa93d25f..1aa39105a 100644 --- a/src/main/java/com/gmail/nossr50/util/skills/PerksUtils.java +++ b/src/main/java/com/gmail/nossr50/util/skills/PerksUtils.java @@ -2,16 +2,18 @@ package com.gmail.nossr50.util.skills; import com.gmail.nossr50.config.experience.ExperienceConfig; import com.gmail.nossr50.datatypes.skills.PrimarySkillType; +import com.gmail.nossr50.events.skills.SkillActivationPerkEvent; import com.gmail.nossr50.util.Permissions; import com.gmail.nossr50.util.player.UserManager; -import net.md_5.bungee.api.ChatColor; +import org.bukkit.Bukkit; +import org.bukkit.ChatColor; import org.bukkit.entity.Player; public final class PerksUtils { private static final int LUCKY_SKILL_ACTIVATION_CHANCE = 75; private static final int NORMAL_SKILL_ACTIVATION_CHANCE = 100; - private PerksUtils() {}; + private PerksUtils() {} public static int handleCooldownPerks(Player player, int cooldown) { if (Permissions.halvedCooldowns(player)) { @@ -42,12 +44,13 @@ public final class PerksUtils { ticks += 4; } - return ticks; + final SkillActivationPerkEvent skillActivationPerkEvent = new SkillActivationPerkEvent(player, ticks, maxTicks); + Bukkit.getPluginManager().callEvent(skillActivationPerkEvent); + return skillActivationPerkEvent.getTicks(); } public static float handleXpPerks(Player player, float xp, PrimarySkillType skill) { double modifier = 1.0F; - double originalXP = xp; if (Permissions.customXpBoost(player, skill)) { if(UserManager.getPlayer(player) != null && UserManager.getPlayer(player).isDebugMode()) { @@ -79,7 +82,7 @@ public final class PerksUtils { if(UserManager.getPlayer(player) != null && UserManager.getPlayer(player).isDebugMode()) { player.sendMessage(ChatColor.GOLD + "[DEBUG] " + ChatColor.RESET + "XP Perk Multiplier - " + ChatColor.GOLD + modifier); - player.sendMessage(ChatColor.GOLD + "[DEBUG] " + ChatColor.RESET + "Original XP before perk boosts " + ChatColor.RED + originalXP); + player.sendMessage(ChatColor.GOLD + "[DEBUG] " + ChatColor.RESET + "Original XP before perk boosts " + ChatColor.RED + (double) xp); player.sendMessage(ChatColor.GOLD + "[DEBUG] " + ChatColor.RESET + "XP AFTER PERKS " + ChatColor.DARK_RED + modifiedXP); } diff --git a/src/main/java/com/gmail/nossr50/util/skills/RankUtils.java b/src/main/java/com/gmail/nossr50/util/skills/RankUtils.java index 2806dd91a..697e20e30 100644 --- a/src/main/java/com/gmail/nossr50/util/skills/RankUtils.java +++ b/src/main/java/com/gmail/nossr50/util/skills/RankUtils.java @@ -7,6 +7,7 @@ import com.gmail.nossr50.datatypes.skills.SubSkillType; import com.gmail.nossr50.datatypes.skills.SuperAbilityType; import com.gmail.nossr50.datatypes.skills.subskills.AbstractSubSkill; import com.gmail.nossr50.listeners.InteractionManager; +import com.gmail.nossr50.mcMMO; import com.gmail.nossr50.runnables.skills.SkillUnlockNotificationTask; import com.gmail.nossr50.util.Permissions; import com.gmail.nossr50.util.player.UserManager; @@ -28,7 +29,7 @@ public class RankUtils { */ public static void executeSkillUnlockNotifications(Plugin plugin, McMMOPlayer mcMMOPlayer, PrimarySkillType primarySkillType, int newLevel) { - for(SubSkillType subSkillType : primarySkillType.getSkillAbilities()) + for(SubSkillType subSkillType : mcMMO.p.getSkillTools().getSubSkills(primarySkillType)) { int playerRankInSkill = getRank(mcMMOPlayer.getPlayer(), subSkillType); @@ -154,6 +155,17 @@ public class RankUtils { return getRank(player, abstractSubSkill) >= rank; } + /** + * Gets the current rank of the subskill for the player + * @param mmoPlayer The player in question + * @param subSkillType Target subskill + * @return The rank the player currently has achieved in this skill. -1 for skills without ranks. + */ + public static int getRank(McMMOPlayer mmoPlayer, SubSkillType subSkillType) + { + return getRank(mmoPlayer.getPlayer(), subSkillType); + } + /** * Gets the current rank of the subskill for the player * @param player The player in question @@ -276,8 +288,7 @@ public class RankUtils { if (subSkillRanks == null) subSkillRanks = new HashMap<>(); - if (subSkillRanks.get(s) == null) - subSkillRanks.put(s, new HashMap<>()); + subSkillRanks.computeIfAbsent(s, k -> new HashMap<>()); } /* public static int getSubSkillUnlockRequirement(SubSkillType subSkillType) diff --git a/src/main/java/com/gmail/nossr50/util/skills/SkillTools.java b/src/main/java/com/gmail/nossr50/util/skills/SkillTools.java new file mode 100644 index 000000000..c8f88e65f --- /dev/null +++ b/src/main/java/com/gmail/nossr50/util/skills/SkillTools.java @@ -0,0 +1,453 @@ +package com.gmail.nossr50.util.skills; + +import com.gmail.nossr50.api.exceptions.InvalidSkillException; +import com.gmail.nossr50.config.experience.ExperienceConfig; +import com.gmail.nossr50.datatypes.skills.PrimarySkillType; +import com.gmail.nossr50.datatypes.skills.SubSkillType; +import com.gmail.nossr50.datatypes.skills.SuperAbilityType; +import com.gmail.nossr50.datatypes.skills.ToolType; +import com.gmail.nossr50.locale.LocaleLoader; +import com.gmail.nossr50.mcMMO; +import com.gmail.nossr50.util.Permissions; +import com.gmail.nossr50.util.text.StringUtils; +import com.google.common.collect.ImmutableList; +import com.google.common.collect.ImmutableMap; +import com.google.common.collect.ImmutableSet; +import org.bukkit.entity.Entity; +import org.bukkit.entity.Player; +import org.bukkit.entity.Tameable; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.VisibleForTesting; + +import java.util.*; + +public class SkillTools { + private final mcMMO pluginRef; + + //TODO: Figure out which ones we don't need, this was copy pasted from a diff branch + public final @NotNull ImmutableList LOCALIZED_SKILL_NAMES; + public final @NotNull ImmutableList FORMATTED_SUBSKILL_NAMES; + public final @NotNull ImmutableSet EXACT_SUBSKILL_NAMES; + public final @NotNull ImmutableList CHILD_SKILLS; + public final static @NotNull ImmutableList NON_CHILD_SKILLS; + public final @NotNull ImmutableList COMBAT_SKILLS; + public final @NotNull ImmutableList GATHERING_SKILLS; + public final @NotNull ImmutableList MISC_SKILLS; + + private final @NotNull ImmutableMap subSkillParentRelationshipMap; + private final @NotNull ImmutableMap superAbilityParentRelationshipMap; + private final @NotNull ImmutableMap> primarySkillChildrenMap; + + // The map below is for the super abilities which require readying a tool, its everything except blast mining + private final ImmutableMap mainActivatedAbilityChildMap; + private final ImmutableMap primarySkillToolMap; + + static { + ArrayList tempNonChildSkills = new ArrayList<>(); + for(PrimarySkillType primarySkillType : PrimarySkillType.values()) { + if (primarySkillType != PrimarySkillType.SALVAGE && primarySkillType != PrimarySkillType.SMELTING) + tempNonChildSkills.add(primarySkillType); + } + + NON_CHILD_SKILLS = ImmutableList.copyOf(tempNonChildSkills); + } + + public SkillTools(@NotNull mcMMO pluginRef) { + this.pluginRef = pluginRef; + + /* + * Setup subskill -> parent relationship map + */ + EnumMap tempSubParentMap = new EnumMap(SubSkillType.class); + + //Super hacky and disgusting + for(PrimarySkillType primarySkillType1 : PrimarySkillType.values()) { + for(SubSkillType subSkillType : SubSkillType.values()) { + String[] splitSubSkillName = subSkillType.toString().split("_"); + + if(primarySkillType1.toString().equalsIgnoreCase(splitSubSkillName[0])) { + //Parent Skill Found + tempSubParentMap.put(subSkillType, primarySkillType1); + } + } + } + + subSkillParentRelationshipMap = ImmutableMap.copyOf(tempSubParentMap); + + /* + * Setup primary -> (collection) subskill map + */ + + EnumMap> tempPrimaryChildMap = new EnumMap>(PrimarySkillType.class); + + //Init the empty Hash Sets + for(PrimarySkillType primarySkillType1 : PrimarySkillType.values()) { + tempPrimaryChildMap.put(primarySkillType1, new HashSet<>()); + } + + //Fill in the hash sets + for(SubSkillType subSkillType : SubSkillType.values()) { + PrimarySkillType parentSkill = subSkillParentRelationshipMap.get(subSkillType); + + //Add this subskill as a child + tempPrimaryChildMap.get(parentSkill).add(subSkillType); + } + + primarySkillChildrenMap = ImmutableMap.copyOf(tempPrimaryChildMap); + + /* + * Setup primary -> tooltype map + */ + EnumMap tempToolMap = new EnumMap(PrimarySkillType.class); + + tempToolMap.put(PrimarySkillType.AXES, ToolType.AXE); + tempToolMap.put(PrimarySkillType.WOODCUTTING, ToolType.AXE); + tempToolMap.put(PrimarySkillType.UNARMED, ToolType.FISTS); + tempToolMap.put(PrimarySkillType.SWORDS, ToolType.SWORD); + tempToolMap.put(PrimarySkillType.EXCAVATION, ToolType.SHOVEL); + tempToolMap.put(PrimarySkillType.HERBALISM, ToolType.HOE); + tempToolMap.put(PrimarySkillType.MINING, ToolType.PICKAXE); + + primarySkillToolMap = ImmutableMap.copyOf(tempToolMap); + + /* + * Setup ability -> primary map + * Setup primary -> ability map + */ + + EnumMap tempAbilityParentRelationshipMap = new EnumMap(SuperAbilityType.class); + EnumMap tempMainActivatedAbilityChildMap = new EnumMap(PrimarySkillType.class); + + for(SuperAbilityType superAbilityType : SuperAbilityType.values()) { + try { + PrimarySkillType parent = getSuperAbilityParent(superAbilityType); + tempAbilityParentRelationshipMap.put(superAbilityType, parent); + + if(superAbilityType != SuperAbilityType.BLAST_MINING) { + //This map is used only for abilities that have a tool readying phase, so blast mining is ignored + tempMainActivatedAbilityChildMap.put(parent, superAbilityType); + } + } catch (InvalidSkillException e) { + e.printStackTrace(); + } + } + + superAbilityParentRelationshipMap = ImmutableMap.copyOf(tempAbilityParentRelationshipMap); + mainActivatedAbilityChildMap = ImmutableMap.copyOf(tempMainActivatedAbilityChildMap); + + /* + * Build child skill and nonchild skill lists + */ + + List childSkills = new ArrayList<>(); +// List nonChildSkills = new ArrayList<>(); + + for (PrimarySkillType primarySkillType : PrimarySkillType.values()) { + if (isChildSkill(primarySkillType)) + childSkills.add(primarySkillType); +// } { +// nonChildSkills.add(primarySkillType); +// } + } + + CHILD_SKILLS = ImmutableList.copyOf(childSkills); +// NON_CHILD_SKILLS = ImmutableList.copyOf(nonChildSkills); + + /* + * Build categorized skill lists + */ + + COMBAT_SKILLS = ImmutableList.of(PrimarySkillType.ARCHERY, PrimarySkillType.AXES, PrimarySkillType.SWORDS, PrimarySkillType.TAMING, PrimarySkillType.UNARMED); + GATHERING_SKILLS = ImmutableList.of(PrimarySkillType.EXCAVATION, PrimarySkillType.FISHING, PrimarySkillType.HERBALISM, PrimarySkillType.MINING, PrimarySkillType.WOODCUTTING); + MISC_SKILLS = ImmutableList.of(PrimarySkillType.ACROBATICS, PrimarySkillType.ALCHEMY, PrimarySkillType.REPAIR, PrimarySkillType.SALVAGE, PrimarySkillType.SMELTING); + + /* + * Build formatted/localized/etc string lists + */ + + LOCALIZED_SKILL_NAMES = ImmutableList.copyOf(buildLocalizedPrimarySkillNames()); + FORMATTED_SUBSKILL_NAMES = ImmutableList.copyOf(buildFormattedSubSkillNameList()); + EXACT_SUBSKILL_NAMES = ImmutableSet.copyOf(buildExactSubSkillNameList()); + } + + private @NotNull PrimarySkillType getSuperAbilityParent(SuperAbilityType superAbilityType) throws InvalidSkillException { + switch(superAbilityType) { + case BERSERK: + return PrimarySkillType.UNARMED; + case GREEN_TERRA: + return PrimarySkillType.HERBALISM; + case TREE_FELLER: + return PrimarySkillType.WOODCUTTING; + case SUPER_BREAKER: + case BLAST_MINING: + return PrimarySkillType.MINING; + case SKULL_SPLITTER: + return PrimarySkillType.AXES; + case SERRATED_STRIKES: + return PrimarySkillType.SWORDS; + case GIGA_DRILL_BREAKER: + return PrimarySkillType.EXCAVATION; + default: + throw new InvalidSkillException("No parent defined for super ability! "+superAbilityType.toString()); + } + } + + /** + * Makes a list of the "nice" version of sub skill names + * Used in tab completion mostly + * @return a list of formatted sub skill names + */ + private @NotNull ArrayList buildFormattedSubSkillNameList() { + ArrayList subSkillNameList = new ArrayList<>(); + + for(SubSkillType subSkillType : SubSkillType.values()) { + subSkillNameList.add(subSkillType.getNiceNameNoSpaces(subSkillType)); + } + + return subSkillNameList; + } + + private @NotNull HashSet buildExactSubSkillNameList() { + HashSet subSkillNameExactSet = new HashSet<>(); + + for(SubSkillType subSkillType : SubSkillType.values()) { + subSkillNameExactSet.add(subSkillType.toString()); + } + + return subSkillNameExactSet; + } + + /** + * Builds a list of localized {@link PrimarySkillType} names + * @return list of localized {@link PrimarySkillType} names + */ + @VisibleForTesting + private @NotNull ArrayList buildLocalizedPrimarySkillNames() { + ArrayList localizedSkillNameList = new ArrayList<>(); + + for(PrimarySkillType primarySkillType : PrimarySkillType.values()) { + localizedSkillNameList.add(getLocalizedSkillName(primarySkillType)); + } + + Collections.sort(localizedSkillNameList); + + return localizedSkillNameList; + } + + /** + * Matches a string of a skill to a skill + * This is NOT case sensitive + * First it checks the locale file and tries to match by the localized name of the skill + * Then if nothing is found it checks against the hard coded "name" of the skill, which is just its name in English + * + * @param skillName target skill name + * @return the matching PrimarySkillType if one is found, otherwise null + */ + public PrimarySkillType matchSkill(String skillName) { + if (!pluginRef.getGeneralConfig().getLocale().equalsIgnoreCase("en_US")) { + for (PrimarySkillType type : PrimarySkillType.values()) { + if (skillName.equalsIgnoreCase(LocaleLoader.getString(StringUtils.getCapitalized(type.name()) + ".SkillName"))) { + return type; + } + } + } + + for (PrimarySkillType type : PrimarySkillType.values()) { + if (type.name().equalsIgnoreCase(skillName)) { + return type; + } + } + + if (!skillName.equalsIgnoreCase("all")) { + pluginRef.getLogger().warning("Invalid mcMMO skill (" + skillName + ")"); //TODO: Localize + } + + return null; + } + + /** + * Gets the PrimarySkillStype to which a SubSkillType belongs + * Return null if it does not belong to one.. which should be impossible in most circumstances + * @param subSkillType target subskill + * @return the PrimarySkillType of this SubSkill, null if it doesn't exist + */ + public PrimarySkillType getPrimarySkillBySubSkill(SubSkillType subSkillType) { + return subSkillParentRelationshipMap.get(subSkillType); + } + + /** + * Gets the PrimarySkillStype to which a SuperAbilityType belongs + * Return null if it does not belong to one.. which should be impossible in most circumstances + * @param superAbilityType target super ability + * @return the PrimarySkillType of this SuperAbilityType, null if it doesn't exist + */ + public PrimarySkillType getPrimarySkillBySuperAbility(SuperAbilityType superAbilityType) { + return superAbilityParentRelationshipMap.get(superAbilityType); + } + + public SuperAbilityType getSuperAbility(PrimarySkillType primarySkillType) { + if(mainActivatedAbilityChildMap.get(primarySkillType) == null) + return null; + + return mainActivatedAbilityChildMap.get(primarySkillType); + } + + public boolean isSuperAbilityUnlocked(PrimarySkillType primarySkillType, Player player) { + SuperAbilityType superAbilityType = mcMMO.p.getSkillTools().getSuperAbility(primarySkillType); + SubSkillType subSkillType = superAbilityType.getSubSkillTypeDefinition(); + return RankUtils.hasUnlockedSubskill(player, subSkillType); + } + + public boolean getPVPEnabled(PrimarySkillType primarySkillType) { + return pluginRef.getGeneralConfig().getPVPEnabled(primarySkillType); + } + + public boolean getPVEEnabled(PrimarySkillType primarySkillType) { + return pluginRef.getGeneralConfig().getPVEEnabled(primarySkillType); + } + + public boolean getHardcoreStatLossEnabled(PrimarySkillType primarySkillType) { + return pluginRef.getGeneralConfig().getHardcoreStatLossEnabled(primarySkillType); + } + + public boolean getHardcoreVampirismEnabled(PrimarySkillType primarySkillType) { + return pluginRef.getGeneralConfig().getHardcoreVampirismEnabled(primarySkillType); + } + + public ToolType getPrimarySkillToolType(PrimarySkillType primarySkillType) { + return primarySkillToolMap.get(primarySkillType); + } + + public Set getSubSkills(PrimarySkillType primarySkillType) { + //TODO: Cache this! + return primarySkillChildrenMap.get(primarySkillType); + } + + public double getXpModifier(PrimarySkillType primarySkillType) { + return ExperienceConfig.getInstance().getFormulaSkillModifier(primarySkillType); + } + + // TODO: This is a little "hacky", we probably need to add something to distinguish child skills in the enum, or to use another enum for them + public static boolean isChildSkill(PrimarySkillType primarySkillType) { + switch (primarySkillType) { + case SALVAGE: + case SMELTING: + return true; + + default: + return false; + } + } + + /** + * Get the localized name for a {@link PrimarySkillType} + * @param primarySkillType target {@link PrimarySkillType} + * @return the localized name for a {@link PrimarySkillType} + */ + public String getLocalizedSkillName(PrimarySkillType primarySkillType) { + //TODO: Replace with current impl + return StringUtils.getCapitalized(LocaleLoader.getString(StringUtils.getCapitalized(primarySkillType.toString()) + ".SkillName")); + } + + public boolean doesPlayerHaveSkillPermission(Player player, PrimarySkillType primarySkillType) { + return Permissions.skillEnabled(player, primarySkillType); + } + + public boolean canCombatSkillsTrigger(PrimarySkillType primarySkillType, Entity target) { + return (target instanceof Player || (target instanceof Tameable && ((Tameable) target).isTamed())) ? getPVPEnabled(primarySkillType) : getPVEEnabled(primarySkillType); + } + + public String getCapitalizedPrimarySkillName(PrimarySkillType primarySkillType) { + return StringUtils.getCapitalized(primarySkillType.toString()); + } + + public int getSuperAbilityCooldown(SuperAbilityType superAbilityType) { + return pluginRef.getGeneralConfig().getCooldown(superAbilityType); + } + + public int getSuperAbilityMaxLength(SuperAbilityType superAbilityType) { + return pluginRef.getGeneralConfig().getMaxLength(superAbilityType); + } + + public String getSuperAbilityOnLocaleKey(SuperAbilityType superAbilityType) { + return "SuperAbility." + StringUtils.getPrettyCamelCaseName(superAbilityType) + ".On"; + } + + public String getSuperAbilityOffLocaleKey(SuperAbilityType superAbilityType) { + return "SuperAbility." + StringUtils.getPrettyCamelCaseName(superAbilityType) + ".Off"; + } + + public String getSuperAbilityOtherPlayerActivationLocaleKey(SuperAbilityType superAbilityType) { + return "SuperAbility." + StringUtils.getPrettyCamelCaseName(superAbilityType) + ".Other.On"; + } + + public String getSuperAbilityOtherPlayerDeactivationLocaleKey(SuperAbilityType superAbilityType) { + return "SuperAbility." + StringUtils.getPrettyCamelCaseName(superAbilityType) + "Other.Off"; + } + + public String getSuperAbilityRefreshedLocaleKey(SuperAbilityType superAbilityType) { + return "SuperAbility." + StringUtils.getPrettyCamelCaseName(superAbilityType) + ".Refresh"; + } + + public int getLevelCap(@NotNull PrimarySkillType primarySkillType) { + return mcMMO.p.getGeneralConfig().getLevelCap(primarySkillType); + } + + /** + * Get the permissions for this ability. + * + * @param player Player to check permissions for + * @param superAbilityType target super ability + * @return true if the player has permissions, false otherwise + */ + public boolean superAbilityPermissionCheck(SuperAbilityType superAbilityType, Player player) { + switch (superAbilityType) { + case BERSERK: + return Permissions.berserk(player); + + case BLAST_MINING: + return Permissions.remoteDetonation(player); + + case GIGA_DRILL_BREAKER: + return Permissions.gigaDrillBreaker(player); + + case GREEN_TERRA: + return Permissions.greenTerra(player); + + case SERRATED_STRIKES: + return Permissions.serratedStrikes(player); + + case SKULL_SPLITTER: + return Permissions.skullSplitter(player); + + case SUPER_BREAKER: + return Permissions.superBreaker(player); + + case TREE_FELLER: + return Permissions.treeFeller(player); + + default: + return false; + } + } + + public @NotNull List getChildSkills() { + return CHILD_SKILLS; + } + + public @NotNull ImmutableList getNonChildSkills() { + return NON_CHILD_SKILLS; + } + + public @NotNull ImmutableList getCombatSkills() { + return COMBAT_SKILLS; + } + + public @NotNull ImmutableList getGatheringSkills() { + return GATHERING_SKILLS; + } + + public @NotNull ImmutableList getMiscSkills() { + return MISC_SKILLS; + } +} diff --git a/src/main/java/com/gmail/nossr50/util/skills/SkillUtils.java b/src/main/java/com/gmail/nossr50/util/skills/SkillUtils.java index a539c8bae..6a15963ef 100644 --- a/src/main/java/com/gmail/nossr50/util/skills/SkillUtils.java +++ b/src/main/java/com/gmail/nossr50/util/skills/SkillUtils.java @@ -1,7 +1,5 @@ package com.gmail.nossr50.util.skills; -import com.gmail.nossr50.config.AdvancedConfig; -import com.gmail.nossr50.config.Config; import com.gmail.nossr50.config.HiddenConfig; import com.gmail.nossr50.datatypes.experience.XPGainReason; import com.gmail.nossr50.datatypes.experience.XPGainSource; @@ -12,11 +10,12 @@ import com.gmail.nossr50.datatypes.skills.SubSkillType; import com.gmail.nossr50.datatypes.skills.SuperAbilityType; import com.gmail.nossr50.locale.LocaleLoader; import com.gmail.nossr50.mcMMO; +import com.gmail.nossr50.metadata.ItemMetadataService; import com.gmail.nossr50.util.ItemUtils; import com.gmail.nossr50.util.Misc; -import com.gmail.nossr50.util.StringUtils; import com.gmail.nossr50.util.player.NotificationManager; import com.gmail.nossr50.util.player.UserManager; +import com.gmail.nossr50.util.text.StringUtils; import org.bukkit.Bukkit; import org.bukkit.Location; import org.bukkit.Material; @@ -29,12 +28,17 @@ import org.bukkit.inventory.ShapelessRecipe; import org.bukkit.inventory.meta.ItemMeta; import org.bukkit.potion.PotionEffect; import org.bukkit.potion.PotionEffectType; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; -import java.util.ArrayList; import java.util.Iterator; -import java.util.List; -public class SkillUtils { +public final class SkillUtils { + /** + * This is a static utility class, therefore we don't want any instances of + * this class. Making the constructor private prevents accidents like that. + */ + private SkillUtils() {} public static void applyXpGain(McMMOPlayer mcMMOPlayer, PrimarySkillType skill, float xp, XPGainReason xpGainReason) { mcMMOPlayer.beginXpGain(skill, xp, xpGainReason, XPGainSource.SELF); @@ -49,9 +53,9 @@ public class SkillUtils { */ public static String[] calculateLengthDisplayValues(Player player, float skillValue, PrimarySkillType skill) { - int maxLength = skill.getAbility().getMaxLength(); - int abilityLengthVar = AdvancedConfig.getInstance().getAbilityLength(); - int abilityLengthCap = AdvancedConfig.getInstance().getAbilityLengthCap(); + int maxLength = mcMMO.p.getSkillTools().getSuperAbilityMaxLength(mcMMO.p.getSkillTools().getSuperAbility(skill)); + int abilityLengthVar = mcMMO.p.getAdvancedConfig().getAbilityLength(); + int abilityLengthCap = mcMMO.p.getAdvancedConfig().getAbilityLengthCap(); int length; @@ -119,7 +123,7 @@ public class SkillUtils { * @return true if this is a valid skill, false otherwise */ public static boolean isSkill(String skillName) { - return Config.getInstance().getLocale().equalsIgnoreCase("en_US") ? PrimarySkillType.getSkill(skillName) != null : isLocalizedSkill(skillName); + return mcMMO.p.getGeneralConfig().getLocale().equalsIgnoreCase("en_US") ? mcMMO.p.getSkillTools().matchSkill(skillName) != null : isLocalizedSkill(skillName); } public static void sendSkillMessage(Player player, NotificationType notificationType, String key) { @@ -136,25 +140,24 @@ public class SkillUtils { if (HiddenConfig.getInstance().useEnchantmentBuffs()) { ItemStack heldItem = player.getInventory().getItemInMainHand(); - if (heldItem == null || heldItem.getType() == Material.AIR) { + if(heldItem == null) + return; + + if (!ItemUtils.canBeSuperAbilityDigBoosted(heldItem)) { return; } - int efficiencyLevel = heldItem.getEnchantmentLevel(Enchantment.DIG_SPEED); - ItemMeta itemMeta = heldItem.getItemMeta(); - List itemLore = new ArrayList(); + int originalDigSpeed = heldItem.getEnchantmentLevel(Enchantment.DIG_SPEED); - if (itemMeta.hasLore()) { - itemLore = itemMeta.getLore(); - } + //Add dig speed - itemLore.add("mcMMO Ability Tool"); - itemMeta.addEnchant(Enchantment.DIG_SPEED, efficiencyLevel + AdvancedConfig.getInstance().getEnchantBuff(), true); + //Lore no longer gets added, no point to it afaik + //ItemUtils.addAbilityLore(heldItem); //lore can be a secondary failsafe for 1.13 and below + ItemUtils.addDigSpeedToItem(heldItem, heldItem.getEnchantmentLevel(Enchantment.DIG_SPEED)); - itemMeta.setLore(itemLore); - heldItem.setItemMeta(itemMeta); - } - else { + //1.13.2+ will have persistent metadata for this item + mcMMO.getMetadataService().getItemMetadataService().setSuperAbilityBoostedItem(heldItem, originalDigSpeed); + } else { int duration = 0; int amplifier = 0; @@ -176,18 +179,18 @@ public class SkillUtils { PrimarySkillType skill = mcMMOPlayer.getAbilityMode(SuperAbilityType.SUPER_BREAKER) ? PrimarySkillType.MINING : PrimarySkillType.EXCAVATION; - int abilityLengthVar = AdvancedConfig.getInstance().getAbilityLength(); - int abilityLengthCap = AdvancedConfig.getInstance().getAbilityLengthCap(); + int abilityLengthVar = mcMMO.p.getAdvancedConfig().getAbilityLength(); + int abilityLengthCap = mcMMO.p.getAdvancedConfig().getAbilityLengthCap(); int ticks; if(abilityLengthCap > 0) { ticks = PerksUtils.handleActivationPerks(player, Math.min(abilityLengthCap, 2 + (mcMMOPlayer.getSkillLevel(skill) / abilityLengthVar)), - skill.getAbility().getMaxLength()) * Misc.TICK_CONVERSION_FACTOR; + mcMMO.p.getSkillTools().getSuperAbilityMaxLength(mcMMO.p.getSkillTools().getSuperAbility(skill))) * Misc.TICK_CONVERSION_FACTOR; } else { ticks = PerksUtils.handleActivationPerks(player, 2 + ((mcMMOPlayer.getSkillLevel(skill)) / abilityLengthVar), - skill.getAbility().getMaxLength()) * Misc.TICK_CONVERSION_FACTOR; + mcMMO.p.getSkillTools().getSuperAbilityMaxLength(mcMMO.p.getSkillTools().getSuperAbility(skill))) * Misc.TICK_CONVERSION_FACTOR; } PotionEffect abilityBuff = new PotionEffect(PotionEffectType.FAST_DIGGING, duration + ticks, amplifier + 10); @@ -195,39 +198,37 @@ public class SkillUtils { } } - public static void handleAbilitySpeedDecrease(Player player) { - if (!HiddenConfig.getInstance().useEnchantmentBuffs()) { - return; - } - - for (ItemStack item : player.getInventory().getContents()) { - removeAbilityBuff(item); + public static void removeAbilityBoostsFromInventory(@NotNull Player player) { + for (ItemStack itemStack : player.getInventory().getContents()) { + removeAbilityBuff(itemStack); } } - public static void removeAbilityBuff(ItemStack item) { - if (item == null || item.getType() == Material.AIR || (!ItemUtils.isPickaxe(item) && !ItemUtils.isShovel(item)) || !item.containsEnchantment(Enchantment.DIG_SPEED)) { + public static void removeAbilityBuff(@Nullable ItemStack itemStack) { + if(itemStack == null) return; + + if(!ItemUtils.canBeSuperAbilityDigBoosted(itemStack)) + return; + + + //1.13.2+ will have persistent metadata for this itemStack + ItemMetadataService itemMetadataService = mcMMO.getMetadataService().getItemMetadataService(); + + if(itemMetadataService.isLegacyAbilityTool(itemStack)) { + ItemMeta itemMeta = itemStack.getItemMeta(); + + if(itemMeta != null) { + // This is safe to call without prior checks. + itemMeta.removeEnchant(Enchantment.DIG_SPEED); + + itemStack.setItemMeta(itemMeta); + ItemUtils.removeAbilityLore(itemStack); + } } - ItemMeta itemMeta = item.getItemMeta(); - - if (itemMeta.hasLore()) { - List itemLore = itemMeta.getLore(); - - if (itemLore.remove("mcMMO Ability Tool")) { - int efficiencyLevel = item.getEnchantmentLevel(Enchantment.DIG_SPEED); - - if (efficiencyLevel <= AdvancedConfig.getInstance().getEnchantBuff()) { - itemMeta.removeEnchant(Enchantment.DIG_SPEED); - } - else { - itemMeta.addEnchant(Enchantment.DIG_SPEED, efficiencyLevel - AdvancedConfig.getInstance().getEnchantBuff(), true); - } - - itemMeta.setLore(itemLore); - item.setItemMeta(itemMeta); - } + if(itemMetadataService.isSuperAbilityBoosted(itemStack)) { + itemMetadataService.removeBonusDigSpeedOnSuperAbilityTool(itemStack); } } @@ -236,14 +237,14 @@ public class SkillUtils { } /** - * Modify the durability of an ItemStack. + * Modify the durability of an ItemStack, using Tools specific formula for unbreaking enchant damage reduction * * @param itemStack The ItemStack which durability should be modified * @param durabilityModifier the amount to modify the durability by * @param maxDamageModifier the amount to adjust the max damage by */ public static void handleDurabilityChange(ItemStack itemStack, double durabilityModifier, double maxDamageModifier) { - if(itemStack.getItemMeta() != null && itemStack.getItemMeta().isUnbreakable()) { + if(itemStack.hasItemMeta() && itemStack.getItemMeta().isUnbreakable()) { return; } @@ -263,8 +264,29 @@ public class SkillUtils { return false; } + + + /** + * Modify the durability of an ItemStack, using Armor specific formula for unbreaking enchant damage reduction + * + * @param itemStack The ItemStack which durability should be modified + * @param durabilityModifier the amount to modify the durability by + * @param maxDamageModifier the amount to adjust the max damage by + */ + public static void handleArmorDurabilityChange(ItemStack itemStack, double durabilityModifier, double maxDamageModifier) { + if(itemStack.hasItemMeta() && itemStack.getItemMeta().isUnbreakable()) { + return; + } - protected static Material getRepairAndSalvageItem(ItemStack inHand) { + Material type = itemStack.getType(); + short maxDurability = mcMMO.getRepairableManager().isRepairable(type) ? mcMMO.getRepairableManager().getRepairable(type).getMaximumDurability() : type.getMaxDurability(); + durabilityModifier = (int) Math.min(durabilityModifier * (0.6 + 0.4/ (itemStack.getEnchantmentLevel(Enchantment.DURABILITY) + 1)), maxDurability * maxDamageModifier); + + itemStack.setDurability((short) Math.min(itemStack.getDurability() + durabilityModifier, maxDurability)); + } + + @Nullable + public static Material getRepairAndSalvageItem(@NotNull ItemStack inHand) { if (ItemUtils.isDiamondTool(inHand) || ItemUtils.isDiamondArmor(inHand)) { return Material.DIAMOND; } diff --git a/src/main/java/com/gmail/nossr50/util/skills/SmeltingTracker.java b/src/main/java/com/gmail/nossr50/util/skills/SmeltingTracker.java new file mode 100644 index 000000000..83e993a10 --- /dev/null +++ b/src/main/java/com/gmail/nossr50/util/skills/SmeltingTracker.java @@ -0,0 +1,102 @@ +package com.gmail.nossr50.util.skills; + +import com.gmail.nossr50.datatypes.player.McMMOPlayer; +import com.gmail.nossr50.datatypes.skills.PrimarySkillType; +import com.gmail.nossr50.mcMMO; +import com.gmail.nossr50.util.player.UserManager; +import org.bukkit.Bukkit; +import org.bukkit.ChatColor; +import org.bukkit.OfflinePlayer; +import org.bukkit.block.Furnace; +import org.bukkit.entity.Player; +import org.bukkit.inventory.FurnaceInventory; +import org.bukkit.inventory.Inventory; +import org.jetbrains.annotations.Nullable; + +import java.util.UUID; + +public class SmeltingTracker { + +// private final HashMap furnaceOwners; + + private void changeFurnaceOwnership(Furnace furnace, Player player) { + + McMMOPlayer mcMMOPlayer = UserManager.getPlayer(player); + + /* + Debug output + */ + printOwnershipGainDebug(furnace, mcMMOPlayer); + + printOwnershipLossDebug(furnace); + + setFurnaceOwner(furnace, player); + } + + private void setFurnaceOwner(Furnace furnace, Player player) { + mcMMO.getMetadataService().getBlockMetadataService().setFurnaceOwner(furnace, player.getUniqueId()); + } + + private void printOwnershipGainDebug(Furnace furnace, McMMOPlayer mcMMOPlayer) { + if(mcMMOPlayer != null) { + if(mcMMOPlayer.isDebugMode()) { + mcMMOPlayer.getPlayer().sendMessage("Furnace ownership " + + ChatColor.GREEN +"gained " + ChatColor.RESET + + "at location: " + furnace.getLocation().toString()); + } + + } + } + + private void printOwnershipLossDebug(Furnace furnace) { + OfflinePlayer furnaceOwner = getFurnaceOwner(furnace); + + if(furnaceOwner != null && furnaceOwner.isOnline()) { + McMMOPlayer furnaceOwnerProfile = UserManager.getPlayer(furnaceOwner.getPlayer()); + + if(furnaceOwnerProfile != null) { + if(furnaceOwnerProfile.isDebugMode()) { + furnaceOwnerProfile.getPlayer().sendMessage("Furnace ownership " + + ChatColor.RED + "lost " + ChatColor.RESET + + "at location: " + furnace.getLocation().toString()); + } + } + } + } + + public @Nullable OfflinePlayer getFurnaceOwner(Furnace furnace) { + UUID uuid = mcMMO.getMetadataService().getBlockMetadataService().getFurnaceOwner(furnace); + + if(uuid != null) { + return Bukkit.getOfflinePlayer(uuid); + } else { + return null; + } + } + + @Nullable + public Furnace getFurnaceFromInventory(Inventory inventory) { + if (!(inventory instanceof FurnaceInventory)) { + return null; + } + + return (Furnace) inventory.getHolder(); + } + + public boolean isFurnaceOwned(Furnace furnace) { + return getFurnaceOwner(furnace) != null; + } + + public void processFurnaceOwnership(Furnace furnace, Player player) { + if(!mcMMO.p.getSkillTools().doesPlayerHaveSkillPermission(player, PrimarySkillType.SMELTING)) + return; + + //Don't swap ownership if its the same player + if(getFurnaceOwner(furnace) != null) { + if(getFurnaceOwner(furnace).getUniqueId().equals(player.getUniqueId())) + return; + } + + changeFurnaceOwnership(furnace, player); + } +} diff --git a/src/main/java/com/gmail/nossr50/util/sounds/SoundManager.java b/src/main/java/com/gmail/nossr50/util/sounds/SoundManager.java index a3d7bc736..e3b21da03 100644 --- a/src/main/java/com/gmail/nossr50/util/sounds/SoundManager.java +++ b/src/main/java/com/gmail/nossr50/util/sounds/SoundManager.java @@ -66,43 +66,22 @@ public class SoundManager { private static Sound getSound(SoundType soundType) { - switch(soundType) - { - case ANVIL: - return Sound.BLOCK_ANVIL_PLACE; - case ITEM_BREAK: - return Sound.ENTITY_ITEM_BREAK; - case POP: - return Sound.ENTITY_ITEM_PICKUP; - case CHIMAERA_WING: - return Sound.ENTITY_BAT_TAKEOFF; - case LEVEL_UP: - return Sound.ENTITY_PLAYER_LEVELUP; - case FIZZ: - return Sound.BLOCK_FIRE_EXTINGUISH; - case TOOL_READY: - return Sound.ITEM_ARMOR_EQUIP_GOLD; - case ROLL_ACTIVATED: - return Sound.ENTITY_LLAMA_SWAG; - case SKILL_UNLOCKED: - return Sound.UI_TOAST_CHALLENGE_COMPLETE; - case ABILITY_ACTIVATED_BERSERK: - return Sound.BLOCK_CONDUIT_AMBIENT; - case ABILITY_ACTIVATED_GENERIC: - return Sound.ITEM_TRIDENT_RIPTIDE_3; - case DEFLECT_ARROWS: - return Sound.ENTITY_ENDER_EYE_DEATH; - case TIRED: - return Sound.BLOCK_CONDUIT_AMBIENT; - case BLEED: - return Sound.ENTITY_ENDER_EYE_DEATH; - case GLASS: - return Sound.BLOCK_GLASS_BREAK; - case ITEM_CONSUMED: - return Sound.ITEM_BOTTLE_EMPTY; - default: - return null; - } + return switch (soundType) { + case ANVIL -> Sound.BLOCK_ANVIL_PLACE; + case ITEM_BREAK -> Sound.ENTITY_ITEM_BREAK; + case POP -> Sound.ENTITY_ITEM_PICKUP; + case CHIMAERA_WING -> Sound.ENTITY_BAT_TAKEOFF; + case LEVEL_UP -> Sound.ENTITY_PLAYER_LEVELUP; + case FIZZ -> Sound.BLOCK_FIRE_EXTINGUISH; + case TOOL_READY -> Sound.ITEM_ARMOR_EQUIP_GOLD; + case ROLL_ACTIVATED -> Sound.ENTITY_LLAMA_SWAG; + case SKILL_UNLOCKED -> Sound.UI_TOAST_CHALLENGE_COMPLETE; + case ABILITY_ACTIVATED_BERSERK, TIRED -> Sound.BLOCK_CONDUIT_AMBIENT; + case ABILITY_ACTIVATED_GENERIC -> Sound.ITEM_TRIDENT_RIPTIDE_3; + case DEFLECT_ARROWS, BLEED -> Sound.ENTITY_ENDER_EYE_DEATH; + case GLASS -> Sound.BLOCK_GLASS_BREAK; + case ITEM_CONSUMED -> Sound.ITEM_BOTTLE_EMPTY; + }; } public static float getFizzPitch() { diff --git a/src/main/java/com/gmail/nossr50/util/text/McMMOMessageType.java b/src/main/java/com/gmail/nossr50/util/text/McMMOMessageType.java new file mode 100644 index 000000000..f4fb0d7bb --- /dev/null +++ b/src/main/java/com/gmail/nossr50/util/text/McMMOMessageType.java @@ -0,0 +1,23 @@ +package com.gmail.nossr50.util.text; + +import net.kyori.adventure.audience.Audience; +import net.kyori.adventure.audience.MessageType; +import net.kyori.adventure.identity.Identity; +import net.kyori.adventure.text.Component; + +import java.util.function.BiConsumer; + +public enum McMMOMessageType { + ACTION_BAR(Audience::sendActionBar), + SYSTEM((audience, message) -> audience.sendMessage(Identity.nil(), message, MessageType.SYSTEM)); + + private final BiConsumer sender; + + McMMOMessageType(final BiConsumer sender) { + this.sender = sender; + } + + public void send(final Audience audience, final Component message) { + this.sender.accept(audience, message); + } +} diff --git a/src/main/java/com/gmail/nossr50/util/StringUtils.java b/src/main/java/com/gmail/nossr50/util/text/StringUtils.java similarity index 67% rename from src/main/java/com/gmail/nossr50/util/StringUtils.java rename to src/main/java/com/gmail/nossr50/util/text/StringUtils.java index 1b90467bb..34aac4fc8 100644 --- a/src/main/java/com/gmail/nossr50/util/StringUtils.java +++ b/src/main/java/com/gmail/nossr50/util/text/StringUtils.java @@ -1,4 +1,4 @@ -package com.gmail.nossr50.util; +package com.gmail.nossr50.util.text; import com.gmail.nossr50.datatypes.party.PartyFeature; import com.gmail.nossr50.datatypes.skills.SuperAbilityType; @@ -6,11 +6,16 @@ import org.bukkit.Material; import org.bukkit.block.data.Ageable; import org.bukkit.block.data.BlockData; import org.bukkit.entity.EntityType; +import org.jetbrains.annotations.NotNull; +import java.text.DecimalFormat; import java.util.Locale; public class StringUtils { + protected static DecimalFormat percent = new DecimalFormat("##0.00%"); + protected static DecimalFormat shortDecimal = new DecimalFormat("##0.0"); + /** * Gets a capitalized version of the target string. * @@ -22,6 +27,59 @@ public class StringUtils { return target.substring(0, 1).toUpperCase() + target.substring(1).toLowerCase(Locale.ENGLISH); } + public static String ticksToSeconds(double ticks) { + return shortDecimal.format(ticks / 20); + } + + public static String convertToCamelCaseString(String baseString, String splitBy) { + String[] substrings = baseString.split(splitBy); + 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 getPrettyCamelCaseName(Object o) { + return StringUtils.convertToCamelCaseString(o.toString(), "_"); + } + + public static String getPrettySuperAbilityName(SuperAbilityType superAbilityType) { + return StringUtils.getPrettySuperAbilityString(superAbilityType); + } + + public static String getPrettySuperAbilityString(SuperAbilityType ability) { + return createPrettyString(ability.toString()); + } + + /** + * Creates a string from an array skipping the first n elements + * @param args the array to iterate over when forming the string + * @param index the amount of elements to skip over + * @return the "trimmed" string + */ + public static String buildStringAfterNthElement(@NotNull String @NotNull []args, int index) { + StringBuilder trimMessage = new StringBuilder(); + + for (int i = index; i < args.length; i++) { + if(i + 1 >= args.length) + trimMessage.append(args[i]); + else + trimMessage.append(args[i]).append(" "); + } + + return trimMessage.toString(); + } + public static String getPrettyItemString(Material material) { return createPrettyString(material.toString()); } diff --git a/src/main/java/com/gmail/nossr50/util/text/TextComponentFactory.java b/src/main/java/com/gmail/nossr50/util/text/TextComponentFactory.java new file mode 100644 index 000000000..5506b6685 --- /dev/null +++ b/src/main/java/com/gmail/nossr50/util/text/TextComponentFactory.java @@ -0,0 +1,528 @@ +package com.gmail.nossr50.util.text; + +import com.gmail.nossr50.config.RankConfig; +import com.gmail.nossr50.datatypes.json.McMMOUrl; +import com.gmail.nossr50.datatypes.json.McMMOWebLinks; +import com.gmail.nossr50.datatypes.skills.PrimarySkillType; +import com.gmail.nossr50.datatypes.skills.SubSkillType; +import com.gmail.nossr50.datatypes.skills.subskills.AbstractSubSkill; +import com.gmail.nossr50.listeners.InteractionManager; +import com.gmail.nossr50.locale.LocaleLoader; +import com.gmail.nossr50.mcMMO; +import com.gmail.nossr50.util.Permissions; +import com.gmail.nossr50.util.skills.RankUtils; +import net.kyori.adventure.audience.Audience; +import net.kyori.adventure.audience.MessageType; +import net.kyori.adventure.identity.Identity; +import net.kyori.adventure.text.Component; +import net.kyori.adventure.text.TextComponent; +import net.kyori.adventure.text.event.ClickEvent; +import net.kyori.adventure.text.event.HoverEvent; +import net.kyori.adventure.text.format.NamedTextColor; +import net.kyori.adventure.text.format.TextColor; +import net.kyori.adventure.text.format.TextDecoration; +import org.bukkit.entity.Player; +import org.jetbrains.annotations.NotNull; + +import java.util.ArrayList; +import java.util.List; +import java.util.Locale; + +/** + * This class handles many of the JSON components that mcMMO makes and uses + */ +public class TextComponentFactory { + + /** + * Makes a text component using strings from a locale and supports passing an undefined number of variables to the LocaleLoader + * @param localeKey target locale string address + * @param values vars to be passed to the locale loader + * @return + */ + public static TextComponent getNotificationMultipleValues(String localeKey, String... values) + { + String preColoredString = LocaleLoader.getString(localeKey, (Object[]) values); + return Component.text(preColoredString); + } + + public static Component getNotificationTextComponentFromLocale(String localeKey) + { + return getNotificationTextComponent(LocaleLoader.getString(localeKey)); + } + + public static Component getNotificationLevelUpTextComponent(PrimarySkillType skill, int levelsGained, int currentLevel) + { + return Component.text(LocaleLoader.getString("Overhaul.Levelup", LocaleLoader.getString("Overhaul.Name."+ StringUtils.getCapitalized(skill.toString())), levelsGained, currentLevel)); + } + + private static TextComponent getNotificationTextComponent(String text) + { + //textComponent.setColor(getNotificationColor(notificationType)); + return Component.text(text); + } + + public static void sendPlayerSubSkillWikiLink(Player player, String subskillformatted) + { + if(!mcMMO.p.getGeneralConfig().getUrlLinksEnabled()) + return; + + TextComponent.Builder wikiLinkComponent = Component.text().content(LocaleLoader.getString("Overhaul.mcMMO.MmoInfo.Wiki")); + wikiLinkComponent.decoration(TextDecoration.UNDERLINED, true); + + String wikiUrl = "https://mcmmo.org/wiki/"+subskillformatted; + + wikiLinkComponent.clickEvent(ClickEvent.openUrl(wikiUrl)); + + TextComponent.Builder componentBuilder = Component.text().content(subskillformatted).append(Component.newline()).append(Component.text(wikiUrl)).color(NamedTextColor.GRAY).decoration(TextDecoration.ITALIC, true); + + wikiLinkComponent.hoverEvent(HoverEvent.showText(componentBuilder.build())); + + mcMMO.getAudiences().player(player).sendMessage(Identity.nil(), wikiLinkComponent, MessageType.SYSTEM); + } + + public static void sendPlayerUrlHeader(Player player) { + TextComponent prefix = Component.text(LocaleLoader.getString("Overhaul.mcMMO.Url.Wrap.Prefix") + " "); + /*prefix.setColor(ChatColor.DARK_AQUA);*/ + TextComponent suffix = Component.text(" "+LocaleLoader.getString("Overhaul.mcMMO.Url.Wrap.Suffix")); + /*suffix.setColor(ChatColor.DARK_AQUA);*/ + + TextComponent emptySpace = Component.space(); + + mcMMO.getAudiences().player(player).sendMessage(Identity.nil(),TextComponent.ofChildren( + prefix, + getWebLinkTextComponent(McMMOWebLinks.WEBSITE), + emptySpace, + getWebLinkTextComponent(McMMOWebLinks.DISCORD), + emptySpace, + getWebLinkTextComponent(McMMOWebLinks.PATREON), + emptySpace, + getWebLinkTextComponent(McMMOWebLinks.WIKI), + emptySpace, + getWebLinkTextComponent(McMMOWebLinks.SPIGOT), + emptySpace, + getWebLinkTextComponent(McMMOWebLinks.HELP_TRANSLATE), + suffix + ), MessageType.SYSTEM); + } + + /** + * Sends a player a bunch of text components that represent a list of sub-skills + * Styling and formatting is applied before sending the messages + * + * @param player target player + * @param subSkillComponents the text components representing the sub-skills by name + */ + public static void sendPlayerSubSkillList(@NotNull Player player, @NotNull List subSkillComponents) { + final Audience audience = mcMMO.getAudiences().player(player); + + //@ Signs, done for style + Component space = Component.space(); + TextComponent atSignComponent = Component.text(LocaleLoader.getString("JSON.Hover.AtSymbolSkills")); + + //Only send 3 sub-skills per line + Component[][] splitSubSkills = TextUtils.splitComponentsIntoGroups(subSkillComponents, 3); + ArrayList individualLinesToSend = new ArrayList<>(); + + //Create each line + for (Component[] componentArray : splitSubSkills) { + individualLinesToSend.add(TextUtils.fromArray(componentArray, atSignComponent, space)); + } + + //Send each group + for(Component curLine : individualLinesToSend) { + audience.sendMessage(Identity.nil(), curLine); + } + } + + private static Component getWebLinkTextComponent(McMMOWebLinks webLinks) + { + TextComponent.Builder webTextComponent; + + switch(webLinks) + { + case WEBSITE: + webTextComponent = Component.text().content(LocaleLoader.getString("JSON.Hover.AtSymbolURL")); + TextUtils.addChildWebComponent(webTextComponent, "Web"); + webTextComponent.clickEvent(getUrlClickEvent(McMMOUrl.urlWebsite)); + break; + case SPIGOT: + webTextComponent = Component.text().content(LocaleLoader.getString("JSON.Hover.AtSymbolURL")); + TextUtils.addChildWebComponent(webTextComponent, "Spigot"); + webTextComponent.clickEvent(getUrlClickEvent(McMMOUrl.urlSpigot)); + break; + case DISCORD: + webTextComponent = Component.text().content(LocaleLoader.getString("JSON.Hover.AtSymbolURL")); + TextUtils.addChildWebComponent(webTextComponent, "Discord"); + webTextComponent.clickEvent(getUrlClickEvent(McMMOUrl.urlDiscord)); + break; + case PATREON: + webTextComponent = Component.text().content(LocaleLoader.getString("JSON.Hover.AtSymbolURL")); + TextUtils.addChildWebComponent(webTextComponent, "Patreon"); + webTextComponent.clickEvent(getUrlClickEvent(McMMOUrl.urlPatreon)); + break; + case WIKI: + webTextComponent = Component.text().content(LocaleLoader.getString("JSON.Hover.AtSymbolURL")); + TextUtils.addChildWebComponent(webTextComponent, "Wiki"); + webTextComponent.clickEvent(getUrlClickEvent(McMMOUrl.urlWiki)); + break; + case HELP_TRANSLATE: + webTextComponent = Component.text().content(LocaleLoader.getString("JSON.Hover.AtSymbolURL")); + TextUtils.addChildWebComponent(webTextComponent, "Lang"); + webTextComponent.clickEvent(getUrlClickEvent(McMMOUrl.urlTranslate)); + break; + default: + webTextComponent = Component.text().content("NOT DEFINED"); + } + + TextUtils.addNewHoverComponentToTextComponent(webTextComponent, getUrlHoverEvent(webLinks)); + webTextComponent.insertion(webLinks.getUrl()); + + return webTextComponent.build(); + } + + private static Component getUrlHoverEvent(McMMOWebLinks webLinks) + { + TextComponent.Builder componentBuilder = Component.text().content(webLinks.getNiceTitle()); + + switch(webLinks) + { + case WEBSITE: + addUrlHeaderHover(webLinks, componentBuilder); + componentBuilder.append(Component.newline()).append(Component.newline()); + componentBuilder.append(Component.text(webLinks.getLocaleDescription(), NamedTextColor.GREEN)); + componentBuilder.append(Component.text("\nDev Blogs, and information related to mcMMO can be found here", NamedTextColor.GRAY)); + break; + case SPIGOT: + addUrlHeaderHover(webLinks, componentBuilder); + componentBuilder.append(Component.newline()).append(Component.newline()); + componentBuilder.append(Component.text(webLinks.getLocaleDescription(), NamedTextColor.GREEN)); + componentBuilder.append(Component.text("\nI post regularly in the discussion thread here!", NamedTextColor.GRAY)); + break; + case PATREON: + addUrlHeaderHover(webLinks, componentBuilder); + componentBuilder.append(Component.newline()).append(Component.newline()); + componentBuilder.append(Component.text(webLinks.getLocaleDescription(), NamedTextColor.GREEN)); + componentBuilder.append(Component.newline()); + componentBuilder.append(Component.text("Show support by buying me a coffee :)", NamedTextColor.GRAY)); + break; + case WIKI: + addUrlHeaderHover(webLinks, componentBuilder); + componentBuilder.append(Component.newline()).append(Component.newline()); + componentBuilder.append(Component.text(webLinks.getLocaleDescription(), NamedTextColor.GREEN)); + componentBuilder.append(Component.newline()); + componentBuilder.append(Component.text("I'm looking for more wiki staff, contact me on our discord!", NamedTextColor.DARK_GRAY)); + break; + case DISCORD: + addUrlHeaderHover(webLinks, componentBuilder); + componentBuilder.append(Component.newline()).append(Component.newline()); + componentBuilder.append(Component.text(webLinks.getLocaleDescription(), NamedTextColor.GREEN)); + break; + case HELP_TRANSLATE: + addUrlHeaderHover(webLinks, componentBuilder); + componentBuilder.append(Component.newline()).append(Component.newline()); + componentBuilder.append(Component.text(webLinks.getLocaleDescription(), NamedTextColor.GREEN)); + componentBuilder.append(Component.newline()); + componentBuilder.append(Component.text("You can use this website to help translate mcMMO into your language!" + + "\nIf you want to know more contact me in discord.", NamedTextColor.DARK_GRAY)); + } + + return componentBuilder.build(); + } + + private static void addUrlHeaderHover(McMMOWebLinks webLinks, TextComponent.Builder componentBuilder) { + componentBuilder.append(Component.newline()); + componentBuilder.append(Component.text(webLinks.getUrl(), NamedTextColor.GRAY, TextDecoration.ITALIC)); + } + + private static ClickEvent getUrlClickEvent(String url) + { + return ClickEvent.openUrl(url); + } + + private static Component getSubSkillTextComponent(Player player, SubSkillType subSkillType) + { + //Get skill name + String skillName = subSkillType.getLocaleName(); + + boolean skillUnlocked = RankUtils.hasUnlockedSubskill(player, subSkillType); + + TextComponent.Builder textComponent = initNewSkillTextComponent(player, skillName, subSkillType, skillUnlocked); + + //Hover Event + TextUtils.addNewHoverComponentToTextComponent(textComponent, getSubSkillHoverComponent(player, subSkillType)); + + //Insertion + textComponent.insertion(skillName); + + return textComponent.build(); + } + + private static TextComponent getSubSkillTextComponent(Player player, AbstractSubSkill abstractSubSkill) + { + //String key = abstractSubSkill.getConfigKeyName(); + String skillName = abstractSubSkill.getNiceName(); + + //Setup Text Component + SubSkillType subSkillType = abstractSubSkill.getSubSkillType(); + + boolean skillUnlocked = RankUtils.hasUnlockedSubskill(player, subSkillType); + + TextComponent.Builder textComponent = initNewSkillTextComponent(player, skillName, subSkillType, skillUnlocked); + + //Hover Event + TextUtils.addNewHoverComponentToTextComponent(textComponent, getSubSkillHoverComponent(player, abstractSubSkill)); + + //Insertion + textComponent.insertion(skillName); + + return textComponent.build(); + } + + private static TextComponent.Builder initNewSkillTextComponent(Player player, String skillName, SubSkillType subSkillType, boolean skillUnlocked) { + TextComponent.Builder textComponent; + if (skillUnlocked) { + if (RankUtils.getHighestRank(subSkillType) == RankUtils.getRank(player, subSkillType) && subSkillType.getNumRanks() > 1) + textComponent = Component.text().content(LocaleLoader.getString("JSON.Hover.MaxRankSkillName", skillName)); + else + textComponent = Component.text().content(LocaleLoader.getString("JSON.Hover.SkillName", skillName)); + + textComponent.clickEvent(ClickEvent.runCommand("/mmoinfo " + subSkillType.getNiceNameNoSpaces(subSkillType))); + + } else { + textComponent = Component.text().content(LocaleLoader.getString("JSON.Hover.Mystery", + String.valueOf(RankUtils.getUnlockLevel(subSkillType)))); + + textComponent.clickEvent(ClickEvent.runCommand("/mmoinfo ???")); + } + return textComponent; + } + + private static Component getSubSkillHoverComponent(Player player, AbstractSubSkill abstractSubSkill) + { + return getSubSkillHoverEventJSON(abstractSubSkill, player); + } + + private static Component getSubSkillHoverComponent(Player player, SubSkillType subSkillType) + { + return getSubSkillHoverEventJSON(subSkillType, player); + } + + /** + * Used for the skill in the new skill system (Deriving from AbstractSubSkill) + * @param abstractSubSkill this subskill + * @param player the player who owns this subskill + * @return the hover basecomponent object for this subskill + */ + private static Component getSubSkillHoverEventJSON(AbstractSubSkill abstractSubSkill, Player player) + { + String skillName = abstractSubSkill.getNiceName(); + + /* + * Hover Event BaseComponent color table + */ + TextColor ccSubSkillHeader = NamedTextColor.GOLD; + TextColor ccRank = NamedTextColor.BLUE; + TextColor ccCurRank = NamedTextColor.GREEN; + TextColor ccPossessive = NamedTextColor.WHITE; + //ChatColor ccDescriptionHeader = ChatColor.DARK_PURPLE; + //ChatColor ccDescription = ChatColor.WHITE; + TextColor ccLocked = NamedTextColor.DARK_GRAY; + TextColor ccLevelRequirement = NamedTextColor.BLUE; + TextColor ccLevelRequired = NamedTextColor.RED; + + SubSkillType subSkillType = abstractSubSkill.getSubSkillType(); + + //SubSkillType Name + TextComponent.Builder componentBuilder = setupSkillComponentNameStyle(player, skillName, subSkillType, RankUtils.hasUnlockedSubskill(player, abstractSubSkill)); + + if(!RankUtils.hasUnlockedSubskill(player, abstractSubSkill)) + { + //Skill is not unlocked yet + addLocked(abstractSubSkill, ccLocked, ccLevelRequirement, ccLevelRequired, componentBuilder); + } else { + addSubSkillTypeToHoverEventJSON(abstractSubSkill, componentBuilder); + + //RANK + int curRank = RankUtils.getRank(player, abstractSubSkill); + int nextRank = 0; + + if(curRank < abstractSubSkill.getNumRanks() && abstractSubSkill.getNumRanks() > 0) + { + nextRank = RankUtils.getRankUnlockLevel(abstractSubSkill, curRank+1); + } + + addRanked(ccRank, ccCurRank, ccPossessive, ccCurRank, componentBuilder, abstractSubSkill.getNumRanks(), RankUtils.getRank(player, abstractSubSkill), nextRank); + + componentBuilder.append(Component.text(LocaleLoader.getString("JSON.DescriptionHeader"))); + componentBuilder.append(Component.newline()).append(Component.text(abstractSubSkill.getDescription())).append(Component.newline()); + + //Empty line + componentBuilder.append(Component.newline()).decoration(TextDecoration.BOLD, false); + componentBuilder.append(Component.newline()); + + //Finally, add details to the tooltip + abstractSubSkill.addStats(componentBuilder, player); + } + + return componentBuilder.build(); + } + + private static TextComponent.Builder setupSkillComponentNameStyle(Player player, String skillName, SubSkillType subSkillType, boolean skillUnlocked) { + TextComponent.Builder componentBuilder; + if (skillUnlocked) { + if (RankUtils.getHighestRank(subSkillType) == RankUtils.getRank(player, subSkillType) && subSkillType.getNumRanks() > 1) + componentBuilder = getNewComponentBuilder(LocaleLoader.getString("JSON.Hover.MaxRankSkillName", skillName)); + else + componentBuilder = getNewComponentBuilder(LocaleLoader.getString("JSON.Hover.SkillName", skillName)); + } else + componentBuilder = getNewComponentBuilder(LocaleLoader.getString("JSON.Hover.Mystery", + String.valueOf(RankUtils.getUnlockLevel(subSkillType)))); + return componentBuilder; + } + + private static TextComponent.Builder getNewComponentBuilder(String skillName) { + TextComponent.Builder componentBuilder = Component.text().content(skillName); + componentBuilder.append(Component.newline()); + return componentBuilder; + } + + private static void addRanked(TextColor ccRank, TextColor ccCurRank, TextColor ccPossessive, TextColor ccNumRanks, TextComponent.Builder componentBuilder, int numRanks, int rank, int nextRank) { + if (numRanks > 0) { + //Rank: x + componentBuilder.append(Component.text(LocaleLoader.getString("JSON.Hover.Rank", String.valueOf(rank)))).append(Component.newline()); + + //Next Rank: x + if(nextRank > rank) + componentBuilder.append(Component.text(LocaleLoader.getString("JSON.Hover.NextRank", String.valueOf(nextRank)))).append(Component.newline()); + + /*componentBuilder.append(" " + LocaleLoader.getString("JSON.RankPossesive") + " ").color(ccPossessive); + componentBuilder.append(String.valueOf(numRanks)).color(ccNumRanks);*/ + } + } + + private static void addLocked(SubSkillType subSkillType, TextColor ccLocked, TextColor ccLevelRequirement, TextColor ccLevelRequired, TextComponent.Builder componentBuilder) { + addLocked(ccLocked, ccLevelRequirement, componentBuilder); + componentBuilder.append(Component.text(String.valueOf(RankConfig.getInstance().getSubSkillUnlockLevel(subSkillType, 1)), ccLevelRequired)); + //componentBuilder.append(Component.newline()); + } + + private static void addLocked(AbstractSubSkill abstractSubSkill, TextColor ccLocked, TextColor ccLevelRequirement, TextColor ccLevelRequired, TextComponent.Builder componentBuilder) { + addLocked(ccLocked, ccLevelRequirement, componentBuilder); + componentBuilder.append(Component.text(String.valueOf(RankConfig.getInstance().getSubSkillUnlockLevel(abstractSubSkill, 1)), ccLevelRequired)); + //componentBuilder.append(Component.newline()); + } + + private static void addLocked(TextColor ccLocked, TextColor ccLevelRequirement, TextComponent.Builder componentBuilder) { + componentBuilder.append(Component.text(LocaleLoader.getString("JSON.Locked"), ccLocked, TextDecoration.BOLD)); + componentBuilder.append(Component.newline()).append(Component.newline()); + componentBuilder.append(Component.text(LocaleLoader.getString("JSON.LevelRequirement") + ": ", ccLevelRequirement)); + } + + @Deprecated + private static Component getSubSkillHoverEventJSON(SubSkillType subSkillType, Player player) + { + String skillName = subSkillType.getLocaleName(); + + /* + * Hover Event BaseComponent color table + */ + TextColor ccSubSkillHeader = NamedTextColor.GOLD; + TextColor ccRank = NamedTextColor.BLUE; + TextColor ccCurRank = NamedTextColor.GREEN; + TextColor ccPossessive = NamedTextColor.WHITE; + TextColor ccDescriptionHeader = NamedTextColor.DARK_PURPLE; + TextColor ccDescription = NamedTextColor.DARK_GRAY; + TextColor ccLocked = NamedTextColor.DARK_GRAY; + TextColor ccLevelRequirement = NamedTextColor.BLUE; + TextColor ccLevelRequired = NamedTextColor.RED; + + //SubSkillType Name + TextComponent.Builder componentBuilder = setupSkillComponentNameStyle(player, skillName, subSkillType, RankUtils.hasUnlockedSubskill(player, subSkillType)); + + if(!RankUtils.hasUnlockedSubskill(player, subSkillType)) + { + //Skill is not unlocked yet + addLocked(subSkillType, ccLocked, ccLevelRequirement, ccLevelRequired, componentBuilder); + } else { + //addSubSkillTypeToHoverEventJSON(subSkillType, componentBuilder); + + //RANK + if(subSkillType.getNumRanks() > 0) + { + int curRank = RankUtils.getRank(player, subSkillType); + int nextRank = 0; + + if(curRank < subSkillType.getNumRanks()) + { + nextRank = RankUtils.getRankUnlockLevel(subSkillType, curRank+1); + } + + addRanked(ccRank, ccCurRank, ccPossessive, ccCurRank, componentBuilder, subSkillType.getNumRanks(), RankUtils.getRank(player, subSkillType), nextRank); + + } + + componentBuilder.append(Component.newline()); + componentBuilder.append(Component.text(LocaleLoader.getString("JSON.DescriptionHeader"))); + componentBuilder.color(ccDescriptionHeader); + componentBuilder.append(Component.newline()); + componentBuilder.append(Component.text(subSkillType.getLocaleDescription())); + componentBuilder.color(ccDescription); + } + + return componentBuilder.build(); + } + + private static void addSubSkillTypeToHoverEventJSON(AbstractSubSkill abstractSubSkill, TextComponent.Builder componentBuilder) + { + if(abstractSubSkill.isSuperAbility()) + { + componentBuilder.append(Component.text(LocaleLoader.getString("JSON.Type.SuperAbility"), NamedTextColor.LIGHT_PURPLE, TextDecoration.BOLD)); + } else if(abstractSubSkill.isActiveUse()) + { + componentBuilder.append(Component.text(LocaleLoader.getString("JSON.Type.Active"), NamedTextColor.DARK_RED, TextDecoration.BOLD)); + } else { + componentBuilder.append(Component.text(LocaleLoader.getString("JSON.Type.Passive"), NamedTextColor.GREEN, TextDecoration.BOLD)); + } + + componentBuilder.append(Component.newline()); + } + + public static void getSubSkillTextComponents(Player player, List textComponents, PrimarySkillType parentSkill) { + for(SubSkillType subSkillType : SubSkillType.values()) + { + if(subSkillType.getParentSkill() == parentSkill) + { + //TODO: Hacky rewrite later + //Only some versions of MC have this skill + if(subSkillType == SubSkillType.FISHING_MASTER_ANGLER && mcMMO.getCompatibilityManager().getMasterAnglerCompatibilityLayer() == null) + continue; + + if(Permissions.isSubSkillEnabled(player, subSkillType)) + { + if(!InteractionManager.hasSubSkill(subSkillType)) + textComponents.add(TextComponentFactory.getSubSkillTextComponent(player, subSkillType)); + } + } + } + + /* NEW SKILL SYSTEM */ + for(AbstractSubSkill abstractSubSkill : InteractionManager.getSubSkillList()) + { + if(abstractSubSkill.getPrimarySkill() == parentSkill) + { + if(Permissions.isSubSkillEnabled(player, abstractSubSkill)) + textComponents.add(TextComponentFactory.getSubSkillTextComponent(player, abstractSubSkill)); + } + } + } + + public static TextComponent getSubSkillUnlockedNotificationComponents(Player player, SubSkillType subSkillType) + { + TextComponent.Builder unlockMessage = Component.text().content(LocaleLoader.getString("JSON.SkillUnlockMessage", subSkillType.getLocaleName(), RankUtils.getRank(player, subSkillType))); + unlockMessage.hoverEvent(HoverEvent.showText(getSubSkillHoverComponent(player, subSkillType))); + unlockMessage.clickEvent(ClickEvent.runCommand("/"+subSkillType.getParentSkill().toString().toLowerCase(Locale.ENGLISH))); + return unlockMessage.build(); + } +} + + diff --git a/src/main/java/com/gmail/nossr50/util/text/TextUtils.java b/src/main/java/com/gmail/nossr50/util/text/TextUtils.java new file mode 100644 index 000000000..1d3c001d5 --- /dev/null +++ b/src/main/java/com/gmail/nossr50/util/text/TextUtils.java @@ -0,0 +1,149 @@ +package com.gmail.nossr50.util.text; + +import com.gmail.nossr50.mcMMO; +import net.kyori.adventure.text.Component; +import net.kyori.adventure.text.ComponentBuilder; +import net.kyori.adventure.text.TextComponent; +import net.kyori.adventure.text.event.HoverEvent; +import net.kyori.adventure.text.format.NamedTextColor; +import net.kyori.adventure.text.format.Style; +import net.kyori.adventure.text.format.TextDecoration; +import net.kyori.adventure.text.serializer.legacy.LegacyComponentSerializer; +import net.md_5.bungee.api.chat.BaseComponent; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +import java.util.List; + +public class TextUtils { + private static @Nullable LegacyComponentSerializer customLegacySerializer; + + private TextUtils() { + // We don't want any instances of this class. + } + + /** + * Makes a single component from an array of components, can optionally add prefixes and suffixes to come before and after each component + * @param componentsArray target array + * @return a component with optional styling built from an array + */ + static @NotNull Component fromArray(@NotNull Component[] componentsArray, @Nullable Component prefixComponent, @Nullable Component suffixComponent) { + TextComponent.Builder componentBuilder = Component.text(); + + for(Component component : componentsArray) { + if(component == null) //Individual elements can be null + continue; + + if(prefixComponent != null) + componentBuilder.append(prefixComponent); + + componentBuilder.append(component); + + if(suffixComponent != null) + componentBuilder.append(suffixComponent); + + } + + return componentBuilder.build(); + } + + /** + * Takes a list of components and splits them into arrays each with a maximum element limit + * Individual elements in [][X] may be null + * + * @param components target component list + * @param groupsSize maximum size per array + * @return a 2D array with components split into groups + */ + static @NotNull Component[][] splitComponentsIntoGroups(@NotNull List components, int groupsSize) { + int groupCount = (int) Math.ceil((double) components.size() / (double) groupsSize); + + Component[][] splitGroups = new Component[groupCount][groupsSize]; + + int groupsFinished = 0; + + while (groupsFinished < groupCount) { + //Fill group with members + for(int i = 0; i < groupsSize; i++) { + int indexOfPotentialMember = i + (groupsFinished * 3); //Groups don't always fill all members neatly + + //Some groups won't have entirely non-null elements + if(indexOfPotentialMember > components.size()-1) { + break; + } + + Component potentialMember = components.get(indexOfPotentialMember); + + //Make sure the potential member exists because of rounding + if(potentialMember != null) { + splitGroups[groupsFinished][i] = potentialMember; + } + } + + //Another group is finished + groupsFinished++; + } + + return splitGroups; + } + + static void addChildWebComponent(@NotNull ComponentBuilder webTextComponent, @NotNull String childName) { + TextComponent childComponent = Component.text(childName).color(NamedTextColor.BLUE); + webTextComponent.append(childComponent); + } + + static void addNewHoverComponentToTextComponent(@NotNull TextComponent.Builder textComponent, @NotNull Component baseComponent) { + textComponent.hoverEvent(HoverEvent.showText(baseComponent)); + } + + public static BaseComponent[] convertToBungeeComponent(@NotNull String displayName) { + return net.md_5.bungee.api.chat.TextComponent.fromLegacyText(displayName); + } + + public static @NotNull TextComponent ofBungeeComponents(@NotNull BaseComponent[] bungeeName) { + return TextComponent.ofChildren(mcMMO.getCompatibilityManager().getBungeeSerializerCompatibilityLayer().deserialize(bungeeName)); + } + + public static @NotNull TextComponent ofBungeeRawStrings(@NotNull String bungeeRawString) { + return ofBungeeComponents(convertToBungeeComponent(bungeeRawString)); + } + + public static @NotNull TextComponent ofLegacyTextRaw(@NotNull String rawString) { + return LegacyComponentSerializer.legacySection().deserialize(rawString); + } + + public static @NotNull TextComponent colorizeText(@NotNull String rawtext) { + if(customLegacySerializer == null) { + customLegacySerializer = getSerializer(); + } + + return customLegacySerializer.deserialize(rawtext); + } + + @NotNull + private static LegacyComponentSerializer getSerializer() { + return LegacyComponentSerializer.builder() + .hexColors() + .useUnusualXRepeatedCharacterHexFormat() + .character('&') + .hexCharacter('#') + .extractUrls(Style.style() + .decorate(getURLStyle()) + .color(NamedTextColor.DARK_AQUA) + .build()) + .build(); + } + + public static @NotNull TextDecoration[] getURLStyle() { + return new TextDecoration[]{TextDecoration.UNDERLINED}; + } + + public static @NotNull String sanitizeForSerializer(@NotNull String string) { + if(customLegacySerializer == null) { + customLegacySerializer = getSerializer(); + } + + TextComponent componentForm = ofLegacyTextRaw(string); + return customLegacySerializer.serialize(componentForm); + } +} diff --git a/src/main/java/com/gmail/nossr50/util/upgrade/UpgradeManager.java b/src/main/java/com/gmail/nossr50/util/upgrade/UpgradeManager.java index 082376c0e..99e8f0f86 100644 --- a/src/main/java/com/gmail/nossr50/util/upgrade/UpgradeManager.java +++ b/src/main/java/com/gmail/nossr50/util/upgrade/UpgradeManager.java @@ -1,23 +1,30 @@ package com.gmail.nossr50.util.upgrade; -import com.gmail.nossr50.config.ConfigLoader; +import com.gmail.nossr50.config.BukkitConfig; import com.gmail.nossr50.datatypes.database.UpgradeType; +import com.gmail.nossr50.mcMMO; import java.util.Arrays; import java.util.EnumSet; import java.util.Set; -public class UpgradeManager extends ConfigLoader { +public class UpgradeManager extends BukkitConfig { private final Set setNeededUpgrades; public UpgradeManager() { - super("upgrades.yml"); + super("upgrades_overhaul.yml"); //overhaul is added so we don't have any issues with classic setNeededUpgrades = EnumSet.allOf(UpgradeType.class); loadKeys(); } + @Override + protected void validateConfigKeys() { + //TODO: Rewrite legacy validation code + // Look into what needs to change for this + } + /** * Check if the given {@link UpgradeType} is necessary. * @@ -40,7 +47,7 @@ public class UpgradeManager extends ConfigLoader { return; } - plugin.debug("Saving upgrade status for type " + type.toString() + "..."); + mcMMO.p.debug("Saving upgrade status for type " + type.toString() + "..."); config.set("Upgrades_Finished." + type.toString(), true); @@ -60,6 +67,6 @@ public class UpgradeManager extends ConfigLoader { } } - plugin.debug("Needed upgrades: " + Arrays.toString(setNeededUpgrades.toArray(new UpgradeType[setNeededUpgrades.size()]))); + mcMMO.p.debug("Needed upgrades: " + Arrays.toString(setNeededUpgrades.toArray(new UpgradeType[setNeededUpgrades.size()]))); } } diff --git a/src/main/java/com/gmail/nossr50/util/uuid/UUIDFetcher.java b/src/main/java/com/gmail/nossr50/util/uuid/UUIDFetcher.java deleted file mode 100644 index 995a11513..000000000 --- a/src/main/java/com/gmail/nossr50/util/uuid/UUIDFetcher.java +++ /dev/null @@ -1,109 +0,0 @@ -package com.gmail.nossr50.util.uuid; - -import com.google.common.collect.ImmutableList; -import com.google.gson.Gson; -import com.google.gson.JsonArray; -import com.google.gson.JsonObject; -import com.google.gson.JsonPrimitive; - -import java.io.InputStreamReader; -import java.io.OutputStream; -import java.net.HttpURLConnection; -import java.net.URL; -import java.nio.ByteBuffer; -import java.util.*; -import java.util.concurrent.Callable; - -public class UUIDFetcher implements Callable> { - private static final int PROFILES_PER_REQUEST = 10; - private static final long RATE_LIMIT = 100L; - private static final String PROFILE_URL = "https://api.mojang.com/profiles/minecraft"; - private final List names; - private final boolean rateLimiting; - - public UUIDFetcher(List names, boolean rateLimiting) { - this.names = ImmutableList.copyOf(names); - this.rateLimiting = rateLimiting; - } - - public UUIDFetcher(List names) { - this(names, true); - } - - public Map call() throws Exception { - Map uuidMap = new HashMap(); - int requests = (int) Math.ceil(names.size() / PROFILES_PER_REQUEST); - for (int i = 0; i < requests; i++) { - HttpURLConnection connection = createConnection(); - - List nameSubList = names.subList(i * PROFILES_PER_REQUEST, Math.min((i + 1) * PROFILES_PER_REQUEST, names.size())); - JsonArray array = new JsonArray(); - - for(String name : nameSubList) - { - JsonPrimitive element = new JsonPrimitive(name); - array.add(element); - } - - Gson gson = new Gson(); - String body = array.toString(); - - writeBody(connection, body); - JsonObject[] jsonStreamArray = gson.fromJson(new InputStreamReader(connection.getInputStream()), JsonObject[].class); - - for (JsonObject jsonProfile : jsonStreamArray) { - String id = jsonProfile.get("id").getAsString(); - String name = jsonProfile.get("name").getAsString(); - UUID uuid = UUIDFetcher.getUUID(id); - uuidMap.put(name, uuid); - } - if (rateLimiting && i != requests - 1) { - Thread.sleep(RATE_LIMIT); - } - } - return uuidMap; - } - - private static void writeBody(HttpURLConnection connection, String body) throws Exception { - OutputStream stream = connection.getOutputStream(); - stream.write(body.getBytes()); - stream.flush(); - stream.close(); - } - - private static HttpURLConnection createConnection() throws Exception { - URL url = new URL(PROFILE_URL); - HttpURLConnection connection = (HttpURLConnection) url.openConnection(); - connection.setRequestMethod("POST"); - connection.setRequestProperty("Content-Type", "application/json"); - connection.setUseCaches(false); - connection.setDoInput(true); - connection.setDoOutput(true); - return connection; - } - - private static UUID getUUID(String id) { - return UUID.fromString(id.substring(0, 8) + "-" + id.substring(8, 12) + "-" + id.substring(12, 16) + "-" + id.substring(16, 20) + "-" + id.substring(20, 32)); - } - - public static byte[] toBytes(UUID uuid) { - ByteBuffer byteBuffer = ByteBuffer.wrap(new byte[16]); - byteBuffer.putLong(uuid.getMostSignificantBits()); - byteBuffer.putLong(uuid.getLeastSignificantBits()); - return byteBuffer.array(); - } - - public static UUID fromBytes(byte[] array) { - if (array.length != 16) { - throw new IllegalArgumentException("Illegal byte array length: " + array.length); - } - ByteBuffer byteBuffer = ByteBuffer.wrap(array); - long mostSignificant = byteBuffer.getLong(); - long leastSignificant = byteBuffer.getLong(); - return new UUID(mostSignificant, leastSignificant); - } - - public static UUID getUUIDOf(String name) throws Exception { - return new UUIDFetcher(Arrays.asList(name)).call().get(name); - } -} diff --git a/src/main/java/com/gmail/nossr50/worldguard/WorldGuardManager.java b/src/main/java/com/gmail/nossr50/worldguard/WorldGuardManager.java index cf4d83d15..3e4ea3386 100644 --- a/src/main/java/com/gmail/nossr50/worldguard/WorldGuardManager.java +++ b/src/main/java/com/gmail/nossr50/worldguard/WorldGuardManager.java @@ -1,5 +1,6 @@ package com.gmail.nossr50.worldguard; +import com.gmail.nossr50.mcMMO; import com.sk89q.worldedit.bukkit.BukkitAdapter; import com.sk89q.worldedit.bukkit.BukkitPlayer; import com.sk89q.worldguard.WorldGuard; @@ -75,7 +76,7 @@ public class WorldGuardManager { Plugin plugin = getServer().getPluginManager().getPlugin("WorldGuard"); // WorldGuard may not be loaded - if (plugin == null || !(plugin instanceof WorldGuardPlugin)) { + if (!(plugin instanceof WorldGuardPlugin)) { return null; // Maybe you want throw an exception instead } @@ -93,10 +94,10 @@ public class WorldGuardManager { registry.register(WorldGuardFlags.MCMMO_ENABLE_WG_FLAG); registry.register(WorldGuardFlags.MCMMO_XP_WG_FLAG); registry.register(WorldGuardFlags.MCMMO_HARDCORE_WG_FLAG); - System.out.println("mcMMO has registered WG flags successfully!"); + mcMMO.p.getLogger().info("Registered WG flags successfully!"); } catch (FlagConflictException e) { e.printStackTrace(); - System.out.println("mcMMO has failed to register WG flags!"); + mcMMO.p.getLogger().warning("Failed to register WG flags!"); // some other plugin registered a flag by the same name already. // you may want to re-register with a different name, but this // could cause issues with saved flags in region files. it's better diff --git a/src/main/java/net/shatteredlands/shatt/backup/ZipLibrary.java b/src/main/java/net/shatteredlands/shatt/backup/ZipLibrary.java index c990d336e..f6f0d829c 100644 --- a/src/main/java/net/shatteredlands/shatt/backup/ZipLibrary.java +++ b/src/main/java/net/shatteredlands/shatt/backup/ZipLibrary.java @@ -1,6 +1,5 @@ package net.shatteredlands.shatt.backup; -import com.gmail.nossr50.config.Config; import com.gmail.nossr50.mcMMO; import java.io.File; @@ -16,18 +15,18 @@ import java.util.zip.ZipEntry; import java.util.zip.ZipOutputStream; public class ZipLibrary { - private static String BACKUP_DIRECTORY = mcMMO.getMainDirectory() + "backup" + File.separator; - private static File BACKUP_DIR = new File(BACKUP_DIRECTORY); - private static File FLAT_FILE_DIRECTORY = new File(mcMMO.getFlatFileDirectory()); - private static File MOD_FILE_DIRECTORY = new File(mcMMO.getModDirectory()); - private static File CONFIG_FILE = new File(mcMMO.getMainDirectory() + "config.yml"); - private static File EXPERIENCE_FILE = new File(mcMMO.getMainDirectory() + "experience.yml"); - private static File TREASURE_FILE = new File(mcMMO.getMainDirectory() + "treasures.yml"); - private static File ADVANCED_FILE = new File(mcMMO.getMainDirectory() + "advanced.yml"); - private static File REPAIR_FILE = new File(mcMMO.getMainDirectory() + "repair.vanilla.yml"); + private static final String BACKUP_DIRECTORY = mcMMO.getMainDirectory() + "backup" + File.separator; + private static final File BACKUP_DIR = new File(BACKUP_DIRECTORY); + private static final File FLAT_FILE_DIRECTORY = new File(mcMMO.getFlatFileDirectory()); + private static final File MOD_FILE_DIRECTORY = new File(mcMMO.getModDirectory()); + private static final File CONFIG_FILE = new File(mcMMO.getMainDirectory() + "config.yml"); + private static final File EXPERIENCE_FILE = new File(mcMMO.getMainDirectory() + "experience.yml"); + private static final File TREASURE_FILE = new File(mcMMO.getMainDirectory() + "treasures.yml"); + private static final File ADVANCED_FILE = new File(mcMMO.getMainDirectory() + "advanced.yml"); + private static final File REPAIR_FILE = new File(mcMMO.getMainDirectory() + "repair.vanilla.yml"); public static void mcMMOBackup() throws IOException { - if (Config.getInstance().getUseMySQL()) { + if (mcMMO.p.getGeneralConfig().getUseMySQL()) { mcMMO.p.debug("This server is running in SQL Mode."); mcMMO.p.debug("Only config files will be backed up."); } @@ -47,7 +46,7 @@ public class ZipLibrary { File fileZip = new File(BACKUP_DIRECTORY + File.separator + dateFormat.format(date) + ".zip"); // Create the Source List, and add directories/etc to the file. - List sources = new ArrayList(); + List sources = new ArrayList<>(); sources.add(FLAT_FILE_DIRECTORY); sources.add(CONFIG_FILE); diff --git a/src/main/resources/advanced.yml b/src/main/resources/advanced.yml index 6648a3dc7..66b79f79a 100644 --- a/src/main/resources/advanced.yml +++ b/src/main/resources/advanced.yml @@ -24,6 +24,9 @@ Feedback: Events: XP: SendTitles: true + # Send notifications to the chat or actionbar of other nearby players when a user activates an ability + AbilityActivation: + SendNotificationToOtherPlayers: true #The actionbar is the message location right above the health bar ## If you disable the action bar messages, mcMMO will send the message to the chat system instead ActionBarNotifications: @@ -75,6 +78,9 @@ Feedback: PartyMessage: Enabled: true SendCopyOfMessageToChat: true + AbilityRefreshed: + Enabled: true + SendCopyOfMessageToChat: false Skills: General: LimitBreak: @@ -203,14 +209,7 @@ Skills: Fishing: ShakeChance: - Rank_1: 15.0 - Rank_2: 15.0 - Rank_3: 25.0 - Rank_4: 35.0 - Rank_5: 45.0 - Rank_6: 55.0 - Rank_7: 65.0 - Rank_8: 75.0 + Rank_1: 30 # VanillaXPMultiplier: Vanilla XP gained from fishing is multiplied by these values. VanillaXPMultiplier: @@ -228,10 +227,16 @@ Skills: RankChange: 20 MasterAngler: - # BoatMultiplier: Catch rate is multiplied by this modifier - # BiomeModifier: Catch rate is multiplied by this modifier - BoatModifier: 2.0 - BiomeModifier: 2.0 + Boat_Tick_Reduction: + Min_Wait: 10 + Max_Wait: 30 + Tick_Reduction_Per_Rank: + Min_Wait: 10 + Max_Wait: 30 + Tick_Reduction_Caps: + # Don't modify these two unless you fully understand what you are doing + Min_Wait: 40 + Max_Wait: 100 # # Settings for Herbalism ### @@ -272,6 +277,8 @@ Skills: # Settings for Mining ### Mining: + SuperBreaker: + AllowTripleDrops: true DoubleDrops: SilkTouch: true # ChanceMax: Maximum chance of receiving double drops when on or higher @@ -443,24 +450,42 @@ Skills: ### Swords: Rupture: - # ChanceMax: Maximum chance of triggering bleeding - # MaxBonusLevel: On this level, the chance to cause Bleeding will be - ChanceMax: 33.0 - MaxBonusLevel: - Standard: 100 - RetroMode: 1000 - - # DamagePlayer: Bleeding damage dealt to players - # DamageMobs: Bleeding damage dealt to mobs - DamagePlayer: 2.0 - DamageMobs: 3.0 - - # These settings determine how long the Bleeding effect lasts - MaxTicks: 8 - BaseTicks: 2 - + Rupture_Mechanics: + # This is % chance, 15 would mean 15% percent of the time + Chance_To_Apply_On_Hit: + Rank_1: 15 + Rank_2: 33 + Rank_3: 40 + Rank_4: 66 + Duration_In_Seconds: + Against_Players: 5 + Against_Mobs: 5 + # Tick interval damage is applied twice a second during rupture, it is "pure" and does not get lowered from armor or absorption etc + Tick_Interval_Damage: + Against_Players: + Rank_1: 0.1 + Rank_2: 0.15 + Rank_3: 0.2 + Rank_4: 0.3 + Against_Mobs: + Rank_1: 0.5 + Rank_2: 0.75 + Rank_3: 0.9 + Rank_4: 1 + # If Rupture runs for 5 seconds without being reapplied, it explodes + # this damage is **NOT** pure and is reduced dramatically vs armor/absorption/etc + Explosion_Damage: + Against_Players: + Rank_1: 10 + Rank_2: 20 + Rank_3: 30 + Rank_4: 40 + Against_Mobs: + Rank_1: 10 + Rank_2: 20 + Rank_3: 30 + Rank_4: 40 CounterAttack: - # ChanceMax: Maximum chance of triggering a counter attack # MaxBonusLevel: On this level, the chance to Counter will be ChanceMax: 30.0 @@ -540,36 +565,40 @@ Skills: Standard: 100 RetroMode: 1000 - IronArmStyle: + SteelArmStyle: # BonusMin: Minimum bonus damage for unarmed # BonusMax: Maximum bonus damage for unarmed # IncreaseLevel: Bonus damage increases every increase level - IncreaseLevel: 10 + Damage_Override: false + Override: + Rank_1: 1 + Rank_2: 1.5 + Rank_3: 2.0 + Rank_4: 2.5 + Rank_5: 3.0 + Rank_6: 3.5 + Rank_7: 4.0 + Rank_8: 4.5 + Rank_9: 5.0 + Rank_10: 5.5 + Rank_11: 6.0 + Rank_12: 6.5 + Rank_13: 7.0 + Rank_14: 7.5 + Rank_15: 8.0 + Rank_16: 8.5 + Rank_17: 9.0 + Rank_18: 10.5 + Rank_19: 12.0 + Rank_20: 13.5 # # Settings for Woodcutting ### Woodcutting: TreeFeller: - # If set to true then tree feller will not use the new system and will use its old behaviour - Classic: false - # This is the time in seconds to build a new charge of Tree Feller - ChargeRate: 600 - Rank_Levels: - Rank_1: - TreeSizeMax: 100 - Charges: 1 - Rank_2: - TreeSizeMax: 200 - Charges: 1 - Rank_3: - TreeSizeMax: 200 - Charges: 2 - Rank_4: - TreeSizeMax: 200 - Charges: 3 - Rank_5: - TreeSizeMax: 500 - Charges: 3 + Knock_On_Wood: + Add_XP_Orbs_To_Drops: true + # Double Drops HarvestLumber: # ChanceMax & MaxBonusLevel are only used for Classic, I'll make that more clear in the future. diff --git a/src/main/resources/chat.yml b/src/main/resources/chat.yml new file mode 100644 index 000000000..6fa5ecf88 --- /dev/null +++ b/src/main/resources/chat.yml @@ -0,0 +1,23 @@ +# Settings for the chat channels in mcMMO +Chat: + # Turn this off if you don't want mcMMO to process any chat (such as party chat or admin chat) + Enable: true + Channels: + Party: + # Enable or disable party chat + Enable: true + # Whether or not to use the current display name of a player + Use_Display_Names: true + Spies: + # Whether or not players with the chat spy permission join the server with chat spying toggled on + Automatically_Enable_Spying: false + Admin: + # Enable or disable admin chat + Enable: true + # Whether or not to use the current display name of a player + Use_Display_Names: true +# CUSTOMIZATION INFORMATION +# If you want to customize the look and feel of chat channels, that is handled through localization which is configurable +# You can find information on how to handle that in the link below +# https://mcmmo.org/wiki/Locale +# When editing the locale for chat, do a search in the master text file (your local locale override file is empty at first, read the wiki article above) for "chat" and that should lead you right to the locale entries related to chat \ No newline at end of file diff --git a/src/main/resources/config.yml b/src/main/resources/config.yml index 9f1a35414..84798fd72 100644 --- a/src/main/resources/config.yml +++ b/src/main/resources/config.yml @@ -8,13 +8,47 @@ # Settings for mcMMO in general ### General: + # When players reach certain level milestones messages will be broadcast + Level_Up_Chat_Broadcasts: + # Whether or not level up broadcasts are enabled + Enabled: true + # Whether or not you want power level milestones to be broadcast + Broadcast_Powerlevels: + Enabled: true + # How often to broadcast, you can change this to 1 to always broadcast a level up event, a setting of 100 will limit it to every 100 levels (for example level 100, level 200, etc) + Milestone_Interval: 100 + Broadcast_Targets: + # Send the message to the console as well + Send_To_Console: true + # Whether or not to only send chat messages to party members + Only_Party_Members: false + # Whether or not players who recieve a level up broadcast have to be on the same world as the one who leveled up + Only_Same_World: false + # Distance restrictions + Distance_Restrictions: + Restrict_Distance: false + # When using Restrict_Distance the blow setting configures the range of the broadcast + Restricted_Radius: 100 + # How often to broadcast, you can change this to 1 to always broadcast a level up event, a setting of 100 will limit it to every 100 levels (for example level 100, level 200, etc) + Milestone_Interval: 100 + Broadcast_Targets: + # Send the message to the console as well + Send_To_Console: true + # Whether or not to only send chat messages to party members + Only_Party_Members: false + # Whether or not players who recieve a level up broadcast have to be on the same world as the one who leveled up + Only_Same_World: false + # Distance restrictions + Distance_Restrictions: + Restrict_Distance: false + # When using Restrict_Distance the blow setting configures the range of the broadcast + Restricted_Radius: 100 # Turning this on will scale mcMMO around 1-1000 with default scaling factor # Everything in your config related to skill level requirements, skill level bonuses, etc will be multiplied by 10 when this mode is on # This change is purely cosmetic, it retains the old feel of mcMMO where you could level up thousands of times RetroMode: Enabled: true Locale: en_US - AprilFoolsEvent: true MOTD_Enabled: true EventBroadcasts: true EventInfoOnPlayerJoin: true @@ -115,7 +149,6 @@ Scoreboard: Mob_Healthbar: # Enabled: Whether or not the feature is enabled at all # Display_Type: Per player Default display for mob health bars - HEARTS, BAR, or DISABLED - # Display_Time: Amount of time (in seconds) to display. To display permanently, set to -1 Enabled: true Display_Type: HEARTS Display_Time: 3 @@ -168,6 +201,7 @@ MySQL: SSL: true Port: 3306 Address: localhost + allowPublicKeyRetrieval: true # # Settings for Hardcore mode @@ -303,7 +337,7 @@ Abilities: Super_Breaker: 0 Tree_Feller: 0 Limits: - Tree_Feller_Threshold: 500 + Tree_Feller_Threshold: 1000 Tools: # Use more tool durability while using abilities. Set Durability_Loss to 0 to disable the extra durability damage. Durability_Loss: 1 @@ -336,10 +370,8 @@ Skills: Enabled_For_PVP: true Enabled_For_PVE: true Level_Cap: 0 - Ability_Activation_Level_Gate: 10 Excavation: Level_Cap: 0 - Ability_Activation_Level_Gate: 10 Fishing: Level_Cap: 0 Drops_Enabled: true @@ -353,13 +385,13 @@ Skills: Mining: Level_Cap: 0 Detonator_Name: FLINT_AND_STEEL - Ability_Activation_Level_Gate: 10 Repair: Level_Cap: 0 Anvil_Messages: true Anvil_Placed_Sounds: true Anvil_Use_Sounds: true Anvil_Material: IRON_BLOCK + Use_Enchanted_Materials: false # Ask for a confirmation when a player tries to repair an enchanted item Confirm_Required: true Salvage: @@ -376,7 +408,6 @@ Skills: Enabled_For_PVP: true Enabled_For_PVE: true Level_Cap: 0 - Ability_Activation_Level_Gate: 10 Taming: Enabled_For_PVP: true Enabled_For_PVE: true @@ -409,7 +440,6 @@ Skills: Enabled_For_PVP: true Enabled_For_PVE: true Level_Cap: 0 - Ability_Activation_Level_Gate: 10 Block_Cracker: SmoothBrick_To_CrackedBrick: true # When using Unarmed, picked up items will automatically get moved to a free slot instead of going in the slot @@ -420,13 +450,34 @@ Skills: Woodcutting: Tree_Feller_Sounds: true Level_Cap: 0 - Ability_Activation_Level_Gate: 10 +# Disable or Enable the Green Thumb auto replant feature for specific crops, use the name of the block not the crop itemstack +Green_Thumb_Replanting_Crops: + Carrots: true + Wheat: true + Nether_Wart: true + Potatoes: true + Beetroots: true + Cocoa: true # # Settings for Double Drops ### Bonus_Drops: Herbalism: + Glow_Berries: true + Cave_Vines: true + Cave_Vines_Plant: true + Moss_Block: true + Sweet_Berry_Bush: true + Weeping_Vines: true + Twisting_Vines: true + Shroomlight: true + Crimson_Stem: true + Warped_Stem: true + Crimson_Roots: true + Warped_Roots: true + Nether_Wart_Block: true + Warped_Wart_Block: true Bamboo_Sapling: true Crimson_Fungus: true Warped_Fungus: true @@ -467,6 +518,39 @@ Bonus_Drops: Peony: true Lily_Of_The_Valley: true Mining: + Tuff: true + Deepslate_Redstone_Ore: true + Deepslate_Copper_Ore: true + Deepslate_Coal_Ore: true + Deepslate_Diamond_Ore: true + Deepslate_Emerald_Ore: true + Deepslate_Iron_Ore: true + Deepslate_Gold_Ore: true + Deepslate_Lapis_Ore: true + Lapis_Lazuli_Ore: true + Copper_Ore: true + Calcite: true + Smooth_Basalt: true + Block_Of_Amethyst: true + Budding_Amethyst: true + Small_Amethyst_Bud: true + Medium_Amethyst_Bud: true + Large_Amethyst_Bud: true + Amethyst_Cluster: true + Amethyst_Shard: true + Deepslate: true + Cobbled_Deepslate: true + Gilded_Blackstone: true + Crying_Obsidian: true + Nether_Bricks: true + Red_Nether_Bricks: true + Cracked_Nether_Bricks: true + Chiseled_Nether_Bricks: true + Chain: true + Blackstone: true + Basalt: true + Polished_Basalt: true + Nether_Gold_Ore: true Warped_Nylium: true Crimson_Nylium: true Ancient_Debris: true @@ -496,10 +580,18 @@ Bonus_Drops: Nether_Quartz: true Redstone_Ore: true Redstone: true + Redstone_Dust: true Sandstone: true Stone: true Cobblestone: true + Raw_Copper: true + Raw_Iron: true + Raw_Gold: true Woodcutting: + Crimson_Hyphae: true + Warped_Hyphae: true + Stripped_Crimson_Hyphae: true + Stripped_Warped_Hyphae: true Shroomlight: true Crimson_Stem: true Warped_Stem: true @@ -517,7 +609,19 @@ Bonus_Drops: Jungle_Log: true Spruce_Wood: true Spruce_Log: true - + Smelting: + Iron_Ingot: true + Gold_Ingot: true + Emerald: true + Diamond: true + Lapis_Lazuli: true + Coal: true + Nether_Quartz: true + Quartz: true + Redstone: true + Deepslate: true + Copper_Ingot: true + Netherite_Scrap: true # # Settings for commands ### @@ -546,13 +650,6 @@ Commands: # If true, require players to have a mcmmo.commands.ptp.world.[WorldName] permission # to teleport to, from, or within any given world. World_Based_Permissions: false - partychat: - Chat_Prefix_Format: '[[GREEN]]([[WHITE]]{0}[[GREEN]])' - Use_Display_Names: true - Chat_Prefix_Format_Ally: '[[GREEN]](A)[[RESET]]' - adminchat: - Chat_Prefix_Format: '[[AQUA]][[[WHITE]]{0}[[AQUA]]]' - Use_Display_Names: true # # Settings for particles diff --git a/src/main/resources/coreskills.yml b/src/main/resources/coreskills.yml index ba54e50f2..75e99afb8 100644 --- a/src/main/resources/coreskills.yml +++ b/src/main/resources/coreskills.yml @@ -3,7 +3,7 @@ #Acrobatics Acrobatics: - # turn this to false to disable all subskills for this skill - Enabled: true - Roll: - Enabled: true \ No newline at end of file + # turn this to false to disable all subskills for this skill + Enabled: true + Roll: + Enabled: true \ No newline at end of file diff --git a/src/main/resources/experience.yml b/src/main/resources/experience.yml index 1172932b7..18b4d446e 100644 --- a/src/main/resources/experience.yml +++ b/src/main/resources/experience.yml @@ -35,6 +35,13 @@ ExploitFix: TreeFellerReducedXP: true PistonCheating: true SnowGolemExcavation: true + # This include NPCs from stuff like Citizens, this is not a setting for Vanilla Minecraft Villagers (Which can be considered NPCs) + # mcMMO normally doesn't process attacks against an Entity if it is an NPC from another plugin + # Of course, mcMMO doesn't know for sure whether or not something is an NPC, it checks a few known things, see our source code to see how + PreventPluginNPCInteraction: true +Fishing_ExploitFix_Options: + MoveRange: 3 + OverFishLimit: 10 Experience_Bars: # Turn this to false if you wanna disable XP bars Enable: true @@ -139,8 +146,12 @@ Experience_Formula: PVP: 1.0 # Experience gained from mobs not naturally spawned will get multiplied by this value. 0 by default. + Eggs: + Multiplier: 0 Mobspawners: Multiplier: 0 + Nether_Portal: + Multiplier: 0 Breeding: Multiplier: 1.0 @@ -237,6 +248,7 @@ Experience_Values: Excavation: Clay: 40 Dirt: 40 + Rooted_Dirt: 60 Coarse_Dirt: 40 Podzol: 40 Grass_Block: 40 @@ -249,6 +261,10 @@ Experience_Values: Soul_Sand: 40 Soul_Soil: 40 Woodcutting: + Crimson_Hyphae: 50 + Stripped_Crimson_Hyphae: 50 + Warped_Hyphae: 50 + Stripped_Warped_Hyphae: 50 Nether_Wart_Block: 1 Warped_Wart_Block: 1 Shroomlight: 100 @@ -282,6 +298,12 @@ Experience_Values: Brown_Mushroom_Block: 70 Mushroom_Stem: 80 Herbalism: + Small_Dripleaf: 140 + Big_Dripleaf: 140 + Cave_Vines: 90 + Cave_Vines_Plant: 90 + Glow_Lichen: 200 + Moss_Block: 150 Crimson_Roots: 6 Warped_Roots: 6 Nether_Wart_Block: 3 @@ -289,6 +311,7 @@ Experience_Values: Nether_Sprouts: 10 Crimson_Fungus: 50 Warped_Fungus: 50 + Shroomlight: 250 Bee_Nest: 200 Sweet_Berry_Bush: 50 Seagrass: 10 @@ -367,6 +390,23 @@ Experience_Values: Lily_Of_The_Valley: 150 Wither_Rose: 500 Mining: + Tuff: 10 + Copper_Ore: 1400 + Deepslate_Copper_Ore: 1900 + Deepslate: 30 + Cobbled_Deepslate: 15 + Calcite: 400 + Smooth_Basalt: 300 + Amethyst_Block: 500 + Budding_Amethyst: 400 + Small_Amethyst_Bud: 10 + Medium_Amethyst_Bud: 20 + Large_Amethyst_Bud: 30 + Amethyst_Cluster: 60 + Bone_Block: 500 + Crying_Obsidian: 3000 + Chain: 100 + Blackstone: 55 Warped_Nylium: 5 Crimson_Nylium: 5 Ancient_Debris: 7777 @@ -378,17 +418,28 @@ Experience_Values: Fire_Coral_Block: 90 Horn_Coral_Block: 125 Coal_Ore: 400 + Deepslate_Coal_Ore: 700 Diamond_Ore: 2400 + Deepslate_Diamond_Ore: 3600 Emerald_Ore: 1000 + Deepslate_Emerald_Ore: 1700 End_Bricks: 50 + Chiseled_Nether_Bricks: 50 + Cracked_Nether_Bricks: 50 Nether_Bricks: 50 + Red_Nether_Bricks: 50 End_Stone: 15 Glowstone: 15 Gold_Ore: 1300 + Deepslate_Gold_Ore: 1900 Nether_Gold_Ore: 1300 + Gilded_Blackstone: 200 Terracotta: 30 Iron_Ore: 900 + Deepslate_Iron_Ore: 1300 Lapis_Ore: 800 + Lapis_Lazuli_Ore: 800 + Deepslate_Lapis_Ore: 1400 Mossy_Cobblestone: 30 Netherrack: 15 Obsidian: 150 @@ -396,6 +447,7 @@ Experience_Values: Blue_Ice: 15 Nether_Quartz_Ore: 300 Redstone_Ore: 600 + Deepslate_Redstone_Ore: 900 Sandstone: 30 Black_Terracotta: 50 Blue_Terracotta: 50 @@ -437,19 +489,35 @@ Experience_Values: Iron: 2.5 Gold: 0.3 Diamond: 5.0 + Netherite: 6.0 Leather: 1.6 String: 1.8 Other: 1.5 Smelting: + Raw_Copper: 75 + Deepslate_Redstone_Ore: 30 + Deepslate_Copper_Ore: 100 + Deepslate_Coal_Ore: 20 + Deepslate_Diamond_Ore: 140 + Deepslate_Emerald_Ore: 110 + Deepslate_Iron_Ore: 40 + Deepslate_Gold_Ore: 50 + Deepslate_Lapis_Lazuli_Ore: 60 + Copper_Ore: 75 Ancient_Debris: 200 Coal_Ore: 10 Diamond_Ore: 75 Emerald_Ore: 100 Gold_Ore: 35 + Raw_Gold: 35 Iron_Ore: 25 + Raw_Iron: 25 + Lapis_Lazuli_Ore: 40 Lapis_Ore: 40 Nether_Quartz_Ore: 25 Redstone_Ore: 15 + Nether_Gold_Ore: 35 + Cobbled_Deepslate: 5 Taming: Animal_Taming: Llama: 1200 @@ -465,6 +533,8 @@ Experience_Values: Fox: 1000 Panda: 1000 Bee: 100 + Goat: 250 + Axolotl: 600 Combat: Multiplier: Animals: 1.0 @@ -528,7 +598,12 @@ Experience_Values: Wandering_trader: 1.0 Bee: 1.5 Piglin: 2.0 + Piglin_Brute: 4.5 Hoglin: 4.0 Zombie_Pigman: 3.0 Zombified_Piglin: 3.0 - + Strider: 1.2 + Zoglin: 2.5 + Goat: 1.5 + Axolotl: 1.75 + Glow_Squid: 1.5 diff --git a/src/main/resources/fishing_treasures.yml b/src/main/resources/fishing_treasures.yml new file mode 100644 index 000000000..3b9f796dc --- /dev/null +++ b/src/main/resources/fishing_treasures.yml @@ -0,0 +1,808 @@ +# +# Settings for Fishing Treasures / Shake Treasures +# Last updated on 12/28/2020 +### +Fishing: + LEATHER_BOOTS: + Amount: 1 + XP: 200 + Rarity: COMMON + LEATHER_HELMET: + Amount: 1 + XP: 200 + Rarity: COMMON + LEATHER_LEGGINGS: + Amount: 1 + XP: 200 + Rarity: COMMON + LEATHER_CHESTPLATE: + Amount: 1 + XP: 200 + Rarity: COMMON + WOODEN_SWORD: + Amount: 1 + XP: 200 + Rarity: COMMON + WOODEN_SHOVEL: + Amount: 1 + XP: 200 + Rarity: COMMON + WOODEN_PICKAXE: + Amount: 1 + XP: 200 + Rarity: COMMON + WOODEN_AXE: + Amount: 1 + XP: 200 + Rarity: COMMON + WOODEN_HOE: + Amount: 1 + XP: 200 + Rarity: COMMON + LAPIS_LAZULI: + Amount: 20 + XP: 200 + Rarity: COMMON + STONE_SWORD: + Amount: 1 + XP: 200 + Rarity: UNCOMMON + STONE_SHOVEL: + Amount: 1 + XP: 200 + Rarity: UNCOMMON + STONE_PICKAXE: + Amount: 1 + XP: 200 + Rarity: UNCOMMON + STONE_AXE: + Amount: 1 + XP: 200 + Rarity: UNCOMMON + STONE_HOE: + Amount: 1 + XP: 200 + Rarity: UNCOMMON + GOLDEN_SWORD: + Amount: 1 + XP: 200 + Rarity: UNCOMMON + GOLDEN_SHOVEL: + Amount: 1 + XP: 200 + Rarity: UNCOMMON + GOLDEN_PICKAXE: + Amount: 1 + XP: 200 + Rarity: UNCOMMON + GOLDEN_AXE: + Amount: 1 + XP: 200 + Rarity: UNCOMMON + GOLDEN_HOE: + Amount: 1 + XP: 200 + Rarity: UNCOMMON + GOLDEN_BOOTS: + Amount: 1 + XP: 200 + Rarity: UNCOMMON + GOLDEN_HELMET: + Amount: 1 + XP: 200 + Rarity: UNCOMMON + GOLDEN_LEGGINGS: + Amount: 1 + XP: 200 + Rarity: UNCOMMON + GOLDEN_CHESTPLATE: + Amount: 1 + XP: 200 + Rarity: UNCOMMON + IRON_INGOT: + Amount: 5 + XP: 200 + Rarity: UNCOMMON + GOLD_INGOT: + Amount: 5 + XP: 200 + Rarity: UNCOMMON + IRON_SWORD: + Amount: 1 + XP: 200 + Rarity: RARE + IRON_SHOVEL: + Amount: 1 + XP: 200 + Rarity: RARE + IRON_PICKAXE: + Amount: 1 + XP: 200 + Rarity: RARE + IRON_AXE: + Amount: 1 + XP: 200 + Rarity: RARE + IRON_HOE: + Amount: 1 + XP: 200 + Rarity: RARE + BOW: + Amount: 1 + XP: 200 + Rarity: RARE + ENDER_PEARL: + Amount: 1 + XP: 200 + Rarity: RARE + BLAZE_ROD: + Amount: 1 + XP: 200 + Rarity: RARE + NAME_TAG: + Amount: 1 + XP: 200 + Rarity: RARE + IRON_BOOTS: + Amount: 1 + XP: 200 + Rarity: EPIC + IRON_HELMET: + Amount: 1 + XP: 200 + Rarity: EPIC + IRON_LEGGINGS: + Amount: 1 + XP: 200 + Rarity: EPIC + IRON_CHESTPLATE: + Amount: 1 + XP: 200 + Rarity: EPIC + GHAST_TEAR: + Amount: 1 + XP: 200 + Rarity: EPIC + DIAMOND: + Amount: 5 + XP: 200 + Rarity: EPIC + NAUTILUS_SHELL: + Amount: 1 + XP: 200 + Rarity: LEGENDARY + DIAMOND_SWORD: + Amount: 1 + XP: 200 + Rarity: LEGENDARY + DIAMOND_SHOVEL: + Amount: 1 + XP: 200 + Rarity: LEGENDARY + DIAMOND_PICKAXE: + Amount: 1 + XP: 200 + Rarity: LEGENDARY + DIAMOND_AXE: + Amount: 1 + XP: 200 + Rarity: LEGENDARY + DIAMOND_HOE: + Amount: 1 + XP: 200 + Rarity: LEGENDARY + DIAMOND_BOOTS: + Amount: 1 + XP: 200 + Rarity: LEGENDARY + DIAMOND_HELMET: + Amount: 1 + XP: 200 + Rarity: LEGENDARY + DIAMOND_LEGGINGS: + Amount: 1 + XP: 200 + Rarity: LEGENDARY + DIAMOND_CHESTPLATE: + Amount: 1 + XP: 200 + Rarity: LEGENDARY + NETHERITE_SWORD: + Amount: 1 + XP: 200 + Rarity: MYTHIC + NETHERITE_SHOVEL: + Amount: 1 + XP: 200 + Rarity: MYTHIC + NETHERITE_PICKAXE: + Amount: 1 + XP: 200 + Rarity: MYTHIC + NETHERITE_AXE: + Amount: 1 + XP: 200 + Rarity: MYTHIC + NETHERITE_HOE: + Amount: 1 + XP: 200 + Rarity: MYTHIC + NETHERITE_BOOTS: + Amount: 1 + XP: 200 + Rarity: MYTHIC + NETHERITE_HELMET: + Amount: 1 + XP: 200 + Rarity: MYTHIC + NETHERITE_LEGGINGS: + Amount: 1 + XP: 200 + Rarity: MYTHIC + NETHERITE_CHESTPLATE: + Amount: 1 + XP: 200 + Rarity: MYTHIC + ENCHANTED_BOOK: + Amount: 1 + XP: 400 + Rarity: LEGENDARY +# Uncomment the below 3 lines to use the Whitelist, Alternatively rename it Enchantments_Blacklist to use the blacklist +# NOTE: Enchantments_Whitelist and Enchantments_Blacklist only do anything for Enchanted_Books at the moment, you can't use it with any other treasure definition +# Enchantments_Whitelist: +# - Fortune +# - Protection + NETHERITE_SCRAP: + Amount: 1 + XP: 400 + Rarity: LEGENDARY +# +# Fishing drop rates +### +Item_Drop_Rates: + Tier_1: + COMMON: 7.50 + UNCOMMON: 1.25 + RARE: 0.25 + EPIC: 0.10 + LEGENDARY: 0.01 + MYTHIC: 0.01 + Tier_2: + COMMON: 6.50 + UNCOMMON: 1.75 + RARE: 0.75 + EPIC: 0.50 + LEGENDARY: 0.05 + MYTHIC: 0.01 + Tier_3: + COMMON: 3.50 + UNCOMMON: 2.75 + RARE: 1.25 + EPIC: 1.00 + LEGENDARY: 0.10 + MYTHIC: 0.01 + Tier_4: + COMMON: 2.00 + UNCOMMON: 3.50 + RARE: 2.25 + EPIC: 1.50 + LEGENDARY: 1.00 + MYTHIC: 0.01 + Tier_5: + COMMON: 1.50 + UNCOMMON: 3.75 + RARE: 2.50 + EPIC: 2.00 + LEGENDARY: 1.00 + MYTHIC: 0.01 + Tier_6: + COMMON: 1.00 + UNCOMMON: 3.25 + RARE: 3.75 + EPIC: 2.50 + LEGENDARY: 1.50 + MYTHIC: 0.05 + Tier_7: + COMMON: 0.25 + UNCOMMON: 2.75 + RARE: 4.00 + EPIC: 5.00 + LEGENDARY: 2.50 + MYTHIC: 0.10 + Tier_8: + COMMON: 0.10 + UNCOMMON: 1.50 + RARE: 6.00 + EPIC: 7.50 + LEGENDARY: 5.00 + MYTHIC: 0.25 +# +# Fishing enchantment drop rates +### +Enchantments_Rarity: + COMMON: + EFFICIENCY: 1 + UNBREAKING: 1 + FORTUNE: 1 + PROTECTION: 1 + FIRE_PROTECTION: 1 + FEATHER_FALLING: 1 + BLAST_PROTECTION: 1 + PROJECTILE_PROTECTION: 1 + RESPIRATION: 1 + THORNS: 1 + SHARPNESS: 1 + SMITE: 1 + BANE_OF_ARTHROPODS: 1 + POWER: 1 + UNCOMMON: + EFFICIENCY: 2 + PROTECTION: 2 + FIRE_PROTECTION: 2 + FEATHER_FALLING: 2 + BLAST_PROTECTION: 2 + PROJECTILE_PROTECTION: 2 + SHARPNESS: 2 + SMITE: 2 + BANE_OF_ARTHROPODS: 2 + KNOCKBACK: 1 + LOOTING: 1 + POWER: 2 + PUNCH: 1 + RARE: + EFFICIENCY: 3 + UNBREAKING: 2 + PROTECTION: 3 + FIRE_PROTECTION: 3 + FEATHER_FALLING: 3 + BLAST_PROTECTION: 3 + PROJECTILE_PROTECTION: 3 + RESPIRATION: 2 + SHARPNESS: 3 + SMITE: 3 + BANE_OF_ARTHROPODS: 3 + FIRE_ASPECT: 1 + LOOTING: 2 + POWER: 3 + EPIC: + EFFICIENCY: 4 + FORTUNE: 2 + AQUA_AFFINITY: 1 + THORNS: 2 + SHARPNESS: 4 + SMITE: 4 + BANE_OF_ARTHROPODS: 4 + POWER: 4 + FLAME: 1 + LEGENDARY: + EFFICIENCY: 5 + UNBREAKING: 3 + FORTUNE: 3 + PROTECTION: 4 + FIRE_PROTECTION: 4 + FEATHER_FALLING: 4 + BLAST_PROTECTION: 4 + PROJECTILE_PROTECTION: 4 + RESPIRATION: 3 + AQUA_AFFINITY: 1 + THORNS: 3 + SHARPNESS: 5 + SMITE: 5 + BANE_OF_ARTHROPODS: 5 + KNOCKBACK: 2 + FIRE_ASPECT: 2 + LOOTING: 3 + SILK_TOUCH: 1 + POWER: 5 + PUNCH: 2 + INFINITY: 1 + MYTHIC: + EFFICIENCY: 5 + UNBREAKING: 3 + FORTUNE: 3 + PROTECTION: 4 + FIRE_PROTECTION: 4 + FEATHER_FALLING: 4 + BLAST_PROTECTION: 4 + PROJECTILE_PROTECTION: 4 + RESPIRATION: 3 + AQUA_AFFINITY: 1 + THORNS: 3 + SHARPNESS: 5 + SMITE: 5 + BANE_OF_ARTHROPODS: 5 + KNOCKBACK: 2 + FIRE_ASPECT: 2 + LOOTING: 3 + SILK_TOUCH: 1 + POWER: 5 + PUNCH: 2 + INFINITY: 1 +Enchantment_Drop_Rates: + Tier_1: + COMMON: 5.00 + UNCOMMON: 1.00 + RARE: 0.10 + EPIC: 0.01 + LEGENDARY: 0.01 + MYTHIC: 0.01 + Tier_2: + COMMON: 7.50 + UNCOMMON: 1.00 + RARE: 0.10 + EPIC: 0.01 + LEGENDARY: 0.01 + MYTHIC: 0.01 + Tier_3: + COMMON: 7.50 + UNCOMMON: 2.50 + RARE: 0.25 + EPIC: 0.10 + LEGENDARY: 0.01 + MYTHIC: 0.01 + Tier_4: + COMMON: 10.0 + UNCOMMON: 2.75 + RARE: 0.50 + EPIC: 0.10 + LEGENDARY: 0.05 + MYTHIC: 0.05 + Tier_5: + COMMON: 10.0 + UNCOMMON: 4.00 + RARE: 0.75 + EPIC: 0.25 + LEGENDARY: 0.10 + MYTHIC: 0.10 + Tier_6: + COMMON: 9.50 + UNCOMMON: 5.50 + RARE: 1.75 + EPIC: 0.50 + LEGENDARY: 0.25 + MYTHIC: 0.25 + Tier_7: + COMMON: 8.50 + UNCOMMON: 7.50 + RARE: 2.75 + EPIC: 0.75 + LEGENDARY: 0.50 + MYTHIC: 0.50 + Tier_8: + COMMON: 7.50 + UNCOMMON: 10.0 + RARE: 5.25 + EPIC: 1.50 + LEGENDARY: 0.75 + MYTHIC: 0.75 +# +# Settings for Shake +# If you are in retro mode, Drop_Level is multiplied by 10. +### +Shake: + BLAZE: + BLAZE_ROD: + Amount: 1 + XP: 0 + Drop_Chance: 100.0 + Drop_Level: 0 + CAVE_SPIDER: + SPIDER_EYE: + Amount: 1 + XP: 0 + Drop_Chance: 49.0 + Drop_Level: 0 + STRING: + Amount: 1 + XP: 0 + Drop_Chance: 49.0 + Drop_Level: 0 + COBWEB: + Amount: 1 + XP: 0 + Drop_Chance: 1.0 + Drop_Level: 0 + POTION|0|POISON: + PotionData: + PotionType: POISON + Amount: 1 + XP: 0 + Drop_Chance: 1.0 + Drop_Level: 0 + CHICKEN: + FEATHER: + Amount: 1 + XP: 0 + Drop_Chance: 33.3 + Drop_Level: 0 + CHICKEN: + Amount: 1 + XP: 0 + Drop_Chance: 33.3 + Drop_Level: 0 + EGG: + Amount: 1 + XP: 0 + Drop_Chance: 33.3 + Drop_Level: 0 + COW: + MILK_BUCKET: + Amount: 1 + XP: 0 + Drop_Chance: 2.0 + Drop_Level: 0 + LEATHER: + Amount: 1 + XP: 0 + Drop_Chance: 49.0 + Drop_Level: 0 + BEEF: + Amount: 1 + XP: 0 + Drop_Chance: 49.0 + Drop_Level: 0 + CREEPER: + CREEPER_HEAD: + Amount: 1 + XP: 0 + Drop_Chance: 1.0 + Drop_Level: 0 + GUNPOWDER: + Amount: 1 + XP: 0 + Drop_Chance: 99.0 + Drop_Level: 0 + ENDERMAN: + ENDER_PEARL: + Amount: 1 + XP: 0 + Drop_Chance: 100.0 + Drop_Level: 0 + GHAST: + GUNPOWDER: + Amount: 1 + XP: 0 + Drop_Chance: 50.0 + Drop_Level: 0 + GHAST_TEAR: + Amount: 1 + XP: 0 + Drop_Chance: 50.0 + Drop_Level: 0 + HORSE: + LEATHER: + Amount: 1 + XP: 0 + Drop_Chance: 99.0 + Drop_Level: 0 + SADDLE: + Amount: 1 + XP: 0 + Drop_Chance: 1.0 + Drop_Level: 0 + IRON_GOLEM: + PUMPKIN: + Amount: 1 + XP: 0 + Drop_Chance: 3.0 + Drop_Level: 0 + IRON_INGOT: + Amount: 1 + XP: 0 + Drop_Chance: 12.0 + Drop_Level: 0 + POPPY: + Amount: 1 + XP: 0 + Drop_Chance: 85.0 + Drop_Level: 0 + MAGMA_CUBE: + MAGMA_CREAM: + Amount: 1 + XP: 0 + Drop_Chance: 100.0 + Drop_Level: 0 + MUSHROOM_COW: + MILK_BUCKET: + Amount: 1 + XP: 0 + Drop_Chance: 5.0 + Drop_Level: 0 + MUSHROOM_STEW: + Amount: 1 + XP: 0 + Drop_Chance: 5.0 + Drop_Level: 0 + LEATHER: + Amount: 1 + XP: 0 + Drop_Chance: 30.0 + Drop_Level: 0 + BEEF: + Amount: 1 + XP: 0 + Drop_Chance: 30.0 + Drop_Level: 0 + RED_MUSHROOM: + Amount: 2 + XP: 0 + Drop_Chance: 30.0 + Drop_Level: 0 + PIG: + PORKCHOP: + Amount: 1 + XP: 0 + Drop_Chance: 100.0 + Drop_Level: 0 + PIG_ZOMBIE: + ROTTEN_FLESH: + Amount: 1 + XP: 0 + Drop_Chance: 50.0 + Drop_Level: 0 + GOLD_NUGGET: + Amount: 1 + XP: 0 + Drop_Chance: 50.0 + Drop_Level: 0 + PLAYER: + SKELETON_SKULL: + Amount: 1 + XP: 0 + Drop_Chance: 0.0 + Drop_Level: 0 + INVENTORY: + Whole_Stacks: false + Drop_Chance: 0.0 + Drop_Level: 0 + SHEEP: + WHITE_WOOL: + Amount: 3 + XP: 0 + Drop_Chance: 100.0 + Drop_Level: 0 + SHULKER: + SHULKER_SHELL: + Amount: 1 + XP: 0 + Drop_Chance: 25.0 + Drop_Level: 0 + PURPUR_BLOCK: + Amount: 1 + XP: 0 + Drop_Chance: 75.0 + Drop_Level: 0 + SKELETON: + SKELETON_SKULL: + Amount: 1 + XP: 0 + Drop_Chance: 2.0 + Drop_Level: 0 + BONE: + Amount: 1 + XP: 0 + Drop_Chance: 49.0 + Drop_Level: 0 + ARROW: + Amount: 2 + XP: 0 + Drop_Chance: 49.0 + Drop_Level: 0 + SLIME: + SLIME_BALL: + Amount: 1 + XP: 0 + Drop_Chance: 100.0 + Drop_Level: 0 + SPIDER: + SPIDER_EYE: + Amount: 1 + XP: 0 + Drop_Chance: 50.0 + Drop_Level: 0 + STRING: + Amount: 1 + XP: 0 + Drop_Chance: 50.0 + Drop_Level: 0 + SNOWMAN: + PUMPKIN: + Amount: 1 + XP: 0 + Drop_Chance: 3.0 + Drop_Level: 0 + SNOWBALL: + Amount: 2 + XP: 0 + Drop_Chance: 97.0 + Drop_Level: 0 + SQUID: + INK_SAC: + Amount: 1 + XP: 0 + Drop_Chance: 100.0 + Drop_Level: 0 + WITCH: + SPLASH_POTION|0|INSTANT_HEAL: + PotionData: + PotionType: INSTANT_HEAL + Amount: 1 + XP: 0 + Drop_Chance: 1.0 + Drop_Level: 0 + SPLASH_POTION|0|FIRE_RESISTANCE: + PotionData: + PotionType: FIRE_RESISTANCE + Amount: 1 + XP: 0 + Drop_Chance: 1.0 + Drop_Level: 0 + SPLASH_POTION|0|SPEED: + PotionData: + PotionType: SPEED + Amount: 1 + XP: 0 + Drop_Chance: 1.0 + Drop_Level: 0 + GLASS_BOTTLE: + Amount: 1 + XP: 0 + Drop_Chance: 7.0 + Drop_Level: 0 + GLOWSTONE_DUST: + Amount: 1 + XP: 0 + Drop_Chance: 15.0 + Drop_Level: 0 + GUNPOWDER: + Amount: 1 + XP: 0 + Drop_Chance: 15.0 + Drop_Level: 0 + REDSTONE: + Amount: 1 + XP: 0 + Drop_Chance: 15.0 + Drop_Level: 0 + SPIDER_EYE: + Amount: 1 + XP: 0 + Drop_Chance: 15.0 + Drop_Level: 0 + STICK: + Amount: 1 + XP: 0 + Drop_Chance: 15.0 + Drop_Level: 0 + SUGAR: + Amount: 1 + XP: 0 + Drop_Chance: 15.0 + Drop_Level: 0 + WITHER_SKELETON: + WITHER_SKELETON_SKULL: + Amount: 1 + XP: 0 + Drop_Chance: 2.0 + Drop_Level: 0 + BONE: + Amount: 1 + XP: 0 + Drop_Chance: 49.0 + Drop_Level: 0 + COAL: + Amount: 2 + XP: 0 + Drop_Chance: 49.0 + Drop_Level: 0 + ZOMBIE: + ZOMBIE_HEAD: + Amount: 1 + XP: 0 + Drop_Chance: 2.0 + Drop_Level: 0 + ROTTEN_FLESH: + Amount: 1 + XP: 0 + Drop_Chance: 98.0 + Drop_Level: 0 \ No newline at end of file diff --git a/src/main/resources/hidden.yml b/src/main/resources/hidden.yml index c79be996c..a6f89e025 100644 --- a/src/main/resources/hidden.yml +++ b/src/main/resources/hidden.yml @@ -8,12 +8,4 @@ Options: # Square root of the number of chunks to convert per tick. ConversionRate: 1 # true to use enchantment buffs for Super Breaker & Giga Drill Breaker, false to use potion buffs - EnchantmentBuffs: true - - # Amount of users to convert every interval - UUIDConvertAmount: 100 - # Amount of users to be converted at a time before waiting MojangLimitPeriod milliseconds to begin again - # This setting is for large servers to avoid being temp banned from mojang api - MojangRateLimit: 300 - # Amount of time to wait after hitting the MojangRateLimit in UUID conversion - MojangLimitPeriod: 6000 + EnchantmentBuffs: true \ No newline at end of file diff --git a/src/main/resources/locale/locale_cs_CZ.properties b/src/main/resources/locale/locale_cs_CZ.properties index bba15218e..4080f60bc 100644 --- a/src/main/resources/locale/locale_cs_CZ.properties +++ b/src/main/resources/locale/locale_cs_CZ.properties @@ -1,27 +1,27 @@ -Acrobatics.Ability.Proc=[[GREEN]]**Elegantni pristani** -Acrobatics.Combat.Proc=[[GREEN]]**Uskocil jsi** -Acrobatics.DodgeChance=\u0160ance na \u00faskok: [[YELLOW]]{0} +Acrobatics.Ability.Proc=&a**Elegantni pristani** +Acrobatics.Combat.Proc=&a**Uskocil jsi** +Acrobatics.DodgeChance=Šance na úskok: &e{0} Acrobatics.SubSkill.Roll.Name=Valeni -Acrobatics.SubSkill.Roll.Description=Redukuje nebo ru\u0161\u00ed zran\u011bn\u00ed zp\u016fsoben\u00e9 p\u00e1dem -Acrobatics.SubSkill.GracefulRoll.Name=\u0160\u0165astn\u00fd kotoul -Acrobatics.SubSkill.GracefulRoll.Description=Dvojt\u00e1 effectivita ne\u017e norm\u00e1ln\u00ed -Acrobatics.SubSkill.Dodge.Name=\u00dahyb -Acrobatics.SubSkill.Dodge.Description=Sn\u00ed\u017een\u00e9 zran\u011bn\u00ed o polovinu +Acrobatics.SubSkill.Roll.Description=Redukuje nebo ruší zranění způsobené pádem +Acrobatics.SubSkill.GracefulRoll.Name=Šťastný kotoul +Acrobatics.SubSkill.GracefulRoll.Description=Dvojtá effectivita než normální +Acrobatics.SubSkill.Dodge.Name=Úhyb +Acrobatics.SubSkill.Dodge.Description=Snížené zranění o polovinu Acrobatics.Listener=Akrobacie: -Acrobatics.SubSkill.Roll.Chance=\u0160ance na kotoul: [[YELLOW]]{0} -Acrobatics.SubSkill.Roll.GraceChance=\u0160ance na \u0160\u0165astn\u00fd kotoul: [[YELLOW]]{0} +Acrobatics.SubSkill.Roll.Chance=Šance na kotoul: &e{0} +Acrobatics.SubSkill.Roll.GraceChance=Šance na Šťastný kotoul: &e{0} Acrobatics.Roll.Text=**Valis se** Acrobatics.SkillName=AKROBACIE Acrobatics.Skillup=Dovednost akrobacie byla navysena o {0}. Celkem ({1}) -Archery.Combat.DazeChance=\u0160ance na om\u00e1men\u00ed: [[YELLOW]]{0} -Archery.Combat.RetrieveChance=\u0160ance z\u00edsk\u00e1n\u00ed \u0161\u00edp\u016f zp\u011bt: [[YELLOW]]{0} -Archery.Combat.SkillshotBonus=Bonusov\u00e9 zran\u011bn\u00ed p\u0159esn\u00e9 trefy: [[YELLOW]]{0} -Archery.SubSkill.SkillShot.Name=P\u0159esn\u00e1 trefa -Archery.SubSkill.SkillShot.Description=Zv\u00fd\u0161en\u00e9 po\u0161kozen\u00ed lukem -Archery.SubSkill.Daze.Name=Om\u00e1men\u00ed (Hr\u00e1\u010di) -Archery.SubSkill.Daze.Description=Dezorientuje protivn\u00edky a zp\u016fsob\u00ed {0} po\u0161kozen\u00ed. -Archery.SubSkill.ArrowRetrieval.Name=Sb\u011br \u0161\u00edp\u016f -Archery.SubSkill.ArrowRetrieval.Description=\u0160ance na navr\u00e1cen\u00ed \u0161\u00edp\u016f z mrtvol. +Archery.Combat.DazeChance=Šance na omámení: &e{0} +Archery.Combat.RetrieveChance=Šance získání šípů zpět: &e{0} +Archery.Combat.SkillshotBonus=Bonusové zranění přesné trefy: &e{0} +Archery.SubSkill.SkillShot.Name=Přesná trefa +Archery.SubSkill.SkillShot.Description=Zvýšené poškození lukem +Archery.SubSkill.Daze.Name=Omámení (Hráči) +Archery.SubSkill.Daze.Description=Dezorientuje protivníky a způsobí {0} poškození. +Archery.SubSkill.ArrowRetrieval.Name=Sběr šípů +Archery.SubSkill.ArrowRetrieval.Description=Šance na navrácení šípů z mrtvol. Archery.Listener=Lukostrelba Archery.SkillName=LUKOSTRELBA Archery.Skillup=Dovednost lukostrelba byla navysena o {0}. Celkem ({1}) @@ -31,147 +31,146 @@ Axes.Ability.Bonus.2=Ucinek Axes.Ability.Bonus.3=Zpusobi bonusove zraneni o velkosi {0} do brneni Axes.Ability.Bonus.4=Vyssi ucinek Axes.Ability.Bonus.5=Zpusobi bonusove zraneni o velkosi {0} vsem neozbrojenym nepratelum -Axes.Ability.Lower=[[GRAY]]**ODLOZIL JSI SVOU SEKERU** -Axes.Ability.Ready=[[GREEN]]**P\u0158IPRAVUJE\u0160 SI SVOJ\u00cd SEKERU!** -Axes.Combat.CritStruck=[[DARK_RED]]Byl jsi KRITICKY zasazen! -Axes.Combat.CritChance=Sance na kriticky uder: [[YELLOW]]{0}% -Axes.Combat.CriticalHit=KRITICK\u00dd Z\u00c1SAH! -Axes.Combat.GI.Proc=[[GREEN]]**\u00daDER VELKOU SILOU** +Axes.Ability.Lower=&7**ODLOZIL JSI SVOU SEKERU** +Axes.Ability.Ready=&a**PŘIPRAVUJEŠ SI SVOJÍ SEKERU!** +Axes.Combat.CritStruck=&4Byl jsi KRITICKY zasazen! +Axes.Combat.CritChance=Sance na kriticky uder: &e{0}% +Axes.Combat.CriticalHit=KRITICKÝ ZÁSAH! +Axes.Combat.GI.Proc=&a**ÚDER VELKOU SILOU** Axes.Combat.GI.Struck=**ZASAZENI S VYSSIM UCINKEM** -Axes.Combat.SS.Length=Delka trvani Drtice lebek: [[YELLOW]]{0}s -Axes.SubSkill.SkullSplitter.Name=[[GREEN]]**Drtic lebek byl AKTIVOVAN** -Axes.SubSkill.SkullSplitter.Description=Ud\u011bl AoE zran\u011bn\u00ed +Axes.Combat.SS.Length=Delka trvani Drtice lebek: &e{0}s +Axes.SubSkill.SkullSplitter.Name=&a**Drtic lebek byl AKTIVOVAN** +Axes.SubSkill.SkullSplitter.Description=Uděl AoE zranění Axes.SubSkill.CriticalStrikes.Name=Kriticky zasah Axes.SubSkill.CriticalStrikes.Description=Dvojite zraneni Axes.SubSkill.AxeMastery.Name=Mistr sekyr Axes.SubSkill.AxeMastery.Description=Pridava bonusove zraneni -Axes.SubSkill.ArmorImpact.Name=\u00da\u010dinek -Axes.SubSkill.ArmorImpact.Description=Zas\u00e1hnout s dostate\u010dnou silou pro rozdrcen\u00ed brn\u011bn\u00ed +Axes.SubSkill.ArmorImpact.Name=Účinek +Axes.SubSkill.ArmorImpact.Description=Zasáhnout s dostatečnou silou pro rozdrcení brnění Axes.SubSkill.GreaterImpact.Name=Vyssi ucinek Axes.SubSkill.GreaterImpact.Description=Zpusobi bonusove zraneni neozbrojenym nepratelum. Axes.Listener=Sekery: Axes.SkillName=SEKERY Axes.Skills.SS.Off=**Drtic lebek byl deaktivovan** -Axes.Skills.SS.On=[[GREEN]]**Drtic lebek byl AKTIVOVAN** -Axes.Skills.SS.Refresh=[[GREEN]]Schopnost [[YELLOW]]Drtic lebek [[GREEN]]byla obnovena! -Axes.Skills.SS.Other.Off=Drti\u010d lebek[[GREEN]] byl deaktivovan na [[YELLOW]]{0} -Axes.Skills.SS.Other.On=[[GREEN]]{0}[[DARK_GREEN]] pouzil [[RED]]Drtice lebek! +Axes.Skills.SS.On=&a**Drtic lebek byl AKTIVOVAN** +Axes.Skills.SS.Refresh=&aSchopnost &eDrtic lebek &abyla obnovena! +Axes.Skills.SS.Other.Off=Drtič lebek&a byl deaktivovan na &e{0} +Axes.Skills.SS.Other.On=&a{0}&2 pouzil &cDrtice lebek! Axes.Skillup=Dovednost v sekerach byla navysena o {0}. Celkem ({1}) -Excavation.Ability.Lower=[[GRAY]]**Sklonil jsi svoji lopatu** -Excavation.Ability.Ready=[[GREEN]]**PRIPRAVIL JSI SVOU LOPATU** +Excavation.Ability.Lower=&7**Sklonil jsi svoji lopatu** +Excavation.Ability.Ready=&a**PRIPRAVIL JSI SVOU LOPATU** Excavation.SubSkill.GigaDrillBreaker.Name=Giga Vrtacka (SCHOPNOST) Excavation.SubSkill.GigaDrillBreaker.Description=3x Drop Rate, 3x EXP, +Speed -Excavation.SubSkill.TreasureHunter.Name=Hleda\u010d poklad\u016f +Excavation.SubSkill.TreasureHunter.Name=Hledač pokladů Excavation.SubSkill.TreasureHunter.Description=Schopnost kopat poklady -Excavation.Effect.Length=Delka trvani Giga Drill Breaker: [[YELLOW]]{0}s +Excavation.Effect.Length=Delka trvani Giga Drill Breaker: &e{0}s Excavation.Listener=Kopani: Excavation.SkillName=KOPANI -Excavation.Skills.GigaDrillBreaker.Off=**Giga vrta\u010dka selhala** -Excavation.Skills.GigaDrillBreaker.On=[[GREEN]]**GIGA DRILL BREAKER BYL AKTIVOVAN** -Excavation.Skills.GigaDrillBreaker.Refresh=[[GREEN]]Tvoje schopnost [[YELLOW]]Giga Vrta\u010dka [[GREEN]]byla obnovena! -Excavation.Skills.GigaDrillBreaker.Other.Off=Ni\u010ditel hl\u00edny[[GREEN]] je vy\u010derp\u00e1n do [[YELLOW]]{0} -Excavation.Skills.GigaDrillBreaker.Other.On=[[GREEN]]{0}[[DARK_GREEN]] pou\u017eil [[RED]]Giga Vrta\u010dku! +Excavation.Skills.GigaDrillBreaker.Off=**Giga vrtačka selhala** +Excavation.Skills.GigaDrillBreaker.On=&a**GIGA DRILL BREAKER BYL AKTIVOVAN** +Excavation.Skills.GigaDrillBreaker.Refresh=&aTvoje schopnost &eGiga Vrtačka &abyla obnovena! +Excavation.Skills.GigaDrillBreaker.Other.Off=Ničitel hlíny&a je vyčerpán do &e{0} +Excavation.Skills.GigaDrillBreaker.Other.On=&a{0}&2 použil &cGiga Vrtačku! Excavation.Skillup=Dovednost v kopani byla navysena o {0}. Celkem ({1}) -Fishing.Ability.Chance=\u0160ance na zah\u00e1knut\u00ed: [[YELLOW]]{0} -Fishing.Ability.Info=Magick\u00fd lovec: [[GRAY]] **Zvy\u0161uje se s dovednost\u00ed Lovec poklad\u016f** -Fishing.Ability.Locked.0=Uzam\u010deno do {0}+ schopnosti (Prot\u0159ep\u00e1n\u00ed) -Fishing.Ability.Locked.1=UZAM\u010cENO DOKU\u010e {0}+ DOVEDNOST (RYBA\u0158EN\u00cd V LEDU) -Fishing.Ability.Rank=Lovec Poklad\u016f Level: [[YELLOW]]{0}/5 -Fishing.Ability.TH.MagicRate=\u0160ance na magick\u00e9ho lovce: [[YELLOW]]{0} -Fishing.Ability.Shake=\u0160ance na ot\u0159es: [[YELLOW]]{0} -Fishing.Ability.IceFishing=Ledov\u00e9 ryba\u0159en\u00ed: B\u011b\u017ete ryba\u0159it do ledu -Fishing.Ability.FD=Ryb\u00e1\u0159\u016fv apetit: [[YELLOW]]Rank {0} +Fishing.Ability.Chance=Šance na zaháknutí: &e{0} +Fishing.Ability.Info=Magický lovec: &7 **Zvyšuje se s dovedností Lovec pokladů** +Fishing.Ability.Locked.0=Uzamčeno do {0}+ schopnosti (Protřepání) +Fishing.Ability.Locked.1=UZAMČENO DOKUĎ {0}+ DOVEDNOST (RYBAŘENÍ V LEDU) +Fishing.Ability.Rank=Lovec Pokladů Level: &e{0}/5 +Fishing.Ability.TH.MagicRate=Šance na magického lovce: &e{0} +Fishing.Ability.Shake=Šance na otřes: &e{0} +Fishing.Ability.IceFishing=Ledové rybaření: Běžte rybařit do ledu +Fishing.Ability.FD=Rybářův apetit: &eRank {0} Fishing.SubSkill.TreasureHunter.Name=Lovec pokladu (pasivni) Fishing.SubSkill.TreasureHunter.Description=Fish up misc. objects Fishing.SubSkill.MagicHunter.Name=Magicky Lovec -Fishing.SubSkill.MagicHunter.Description=Na\u0161el si o\u010darovanou v\u011bc +Fishing.SubSkill.MagicHunter.Description=Našel si očarovanou věc Fishing.SubSkill.Shake.Name=Shake (vs. Entities) -Fishing.SubSkill.Shake.Description=Vyklepni p\u0159edm\u011bty z p\u0159\u00ed\u0161er s prutem -Fishing.SubSkill.FishermansDiet.Name=Ryb\u00e1\u0159\u016fv apetit -Fishing.SubSkill.FishermansDiet.Description=Zlep\u0161uje dopl\u0148ov\u00e1n\u00ed hladu z naryba\u0159en\u00fdch j\u00eddel -Fishing.SubSkill.MasterAngler.Name=Mistr Ryb\u00e1\u0159 -Fishing.SubSkill.MasterAngler.Description=Zvy\u0161uje \u0161anci zah\u00e1knut\u00ed ryby p\u0159i ryba\u0159en\u00ed -Fishing.SubSkill.IceFishing.Name=Ryba\u0159en\u00ed v ledu -Fishing.SubSkill.IceFishing.Description=Umo\u017e\u0148uje v\u00e1m ryba\u0159it v ledov\u00fdch prost\u0159ed\u00edch -Fishing.Chance.Raining=[[BLUE]] De\u0161\u0165ov\u00fd bonus +Fishing.SubSkill.Shake.Description=Vyklepni předměty z příšer s prutem +Fishing.SubSkill.FishermansDiet.Name=Rybářův apetit +Fishing.SubSkill.FishermansDiet.Description=Zlepšuje doplňování hladu z narybařených jídel +Fishing.SubSkill.MasterAngler.Name=Mistr Rybář +Fishing.SubSkill.IceFishing.Name=Rybaření v ledu +Fishing.SubSkill.IceFishing.Description=Umožňuje vám rybařit v ledových prostředích +Fishing.Chance.Raining=&9 Dešťový bonus Fishing.Listener=Rybareni: -Fishing.Ability.TH.MagicFound=[[GRAY]]C\u00edt\u00edte dotek magie s t\u00edmto \u00falovkem... +Fishing.Ability.TH.MagicFound=&7Cítíte dotek magie s tímto úlovkem... Fishing.SkillName=RYBARENI Fishing.Skillup=Dovednost v rybareni byla navysena o {0}. Celkem ({1}) -Herbalism.Ability.DoubleDropChance=\u0160ance na dvojn\u00e1sobn\u00fd zisk: [[YELLOW]]{0} -Herbalism.Ability.FD=Farm\u00e1\u0159ova dieta: [[YELLOW]]Rank {0} -Herbalism.Ability.GTe.Length=D\u00e9lka trv\u00e1n\u00ed Zelen\u00e9 planety: [[YELLOW]]{0}s -Herbalism.Ability.GTe.NeedMore=Bude\u0161 pot\u0159ebovat v\u00edc sem\u00ednek pro Green Tera. -Herbalism.Ability.GTh.Chance=\u0160ance na dovednost Zahradn\u00edk: [[YELLOW]]{0} -Herbalism.Ability.GTh.Fail=**ZAHRADN\u00cdK SELHAL** -Herbalism.Ability.GTh.Stage= Zahradn\u00edk Stage: [[\u017dlut\u00e9]] Plodiny rostou ve st\u00e1diu {0} -Herbalism.Ability.GTh=[[GREEN]]**ZAHRADNIK** -Herbalism.Ability.HylianLuck=Hylian Luck zm\u011bn\u011bn: [[YELLOW]]{0} -Herbalism.Ability.Lower=[[GRAY]]**SKLONIL JSI SVOJI MOTYKU** -Herbalism.Ability.Ready=[[GREEN]]**PRIPRAVIL JSI SVOU MOTYKU** -Herbalism.Ability.ShroomThumb.Chance=\u0160ance na dovednost Houba\u0159: [[YELLOW]]{0} -Herbalism.Ability.ShroomThumb.Fail=**HOUBA\u0158 SELHAL** +Herbalism.Ability.DoubleDropChance=Šance na dvojnásobný zisk: &e{0} +Herbalism.Ability.FD=Farmářova dieta: &eRank {0} +Herbalism.Ability.GTe.Length=Délka trvání Zelené planety: &e{0}s +Herbalism.Ability.GTe.NeedMore=Budeš potřebovat víc semínek pro Green Tera. +Herbalism.Ability.GTh.Chance=Šance na dovednost Zahradník: &e{0} +Herbalism.Ability.GTh.Fail=**ZAHRADNÍK SELHAL** +Herbalism.Ability.GTh.Stage= Zahradník Stage: [[Žluté]] Plodiny rostou ve stádiu {0} +Herbalism.Ability.GTh=&a**ZAHRADNIK** +Herbalism.Ability.HylianLuck=Hylian Luck změněn: &e{0} +Herbalism.Ability.Lower=&7**SKLONIL JSI SVOJI MOTYKU** +Herbalism.Ability.Ready=&a**PRIPRAVIL JSI SVOU MOTYKU** +Herbalism.Ability.ShroomThumb.Chance=Šance na dovednost Houbař: &e{0} +Herbalism.Ability.ShroomThumb.Fail=**HOUBAŘ SELHAL** Herbalism.SubSkill.GreenTerra.Name=Green Terra (SCHOPNOST) -Herbalism.SubSkill.GreenTerra.Description=\u0160\u00ed\u0159en\u00ed planety, 3x v\u00edce drop\u016f +Herbalism.SubSkill.GreenTerra.Description=Šíření planety, 3x více dropů Herbalism.SubSkill.GreenThumb.Name=Zahradnik (Wheat) Herbalism.SubSkill.GreenThumb.Description=Automaticky sazi plodiny pri sklizeni -Herbalism.SubSkill.GreenThumb.Description.2=Zar\u016fst cihly mechem, nebo nebo nechat vyr\u016fst tr\u00e1vu -Herbalism.SubSkill.FarmersDiet.Name=Farm\u00e1\u0159\u016fv apetit +Herbalism.SubSkill.GreenThumb.Description.2=Zarůst cihly mechem, nebo nebo nechat vyrůst trávu +Herbalism.SubSkill.FarmersDiet.Name=Farmářův apetit Herbalism.SubSkill.FarmersDiet.Description=Zvysuje obnovu hladu ze sklizenych jidel Herbalism.SubSkill.DoubleDrops.Name=Dvojnasobny zisk (vsechny byliny) Herbalism.SubSkill.DoubleDrops.Description=Zdvojnasobi normalni zisk -Herbalism.SubSkill.HylianLuck.Name=Hyliansk\u00e9 \u0161t\u011bst\u00ed -Herbalism.SubSkill.HylianLuck.Description=D\u00e1v\u00e1 malou \u0161anci naj\u00edt vz\u00e1cn\u00e9 p\u0159edm\u011bty -Herbalism.SubSkill.ShroomThumb.Name=Houba\u0159 -Herbalism.SubSkill.ShroomThumb.Description=Roz\u0161i\u0159te podhoub\u00ed do tr\u00e1vy a hl\u00edny -Herbalism.HylianLuck=[[GREEN]]The luck of Hyrule t\u011b doprov\u00e1z\u00ed! +Herbalism.SubSkill.HylianLuck.Name=Hylianské štěstí +Herbalism.SubSkill.HylianLuck.Description=Dává malou šanci najít vzácné předměty +Herbalism.SubSkill.ShroomThumb.Name=Houbař +Herbalism.SubSkill.ShroomThumb.Description=Rozšiřte podhoubí do trávy a hlíny +Herbalism.HylianLuck=&aThe luck of Hyrule tě doprovází! Herbalism.Listener=Bylinarstvi: Herbalism.SkillName=Bylinkarstvi -Herbalism.Skills.GTe.On=[[GREEN]]**ZELEN\u00c1 TERRA AKTIVOV\u00c1NA** -Herbalism.Skills.GTe.Refresh=[[GREEN]]Schopnost [[YELLOW]]Green Terra [[GREEN]]je obnovena! -Herbalism.Skills.GTe.Other.Off=Green Terra[[GREEN]] byla deaktivovana [[YELLOW]]{0} -Herbalism.Skills.GTe.Other.On=[[GREEN]]{0}[[DARK_GREEN]] pou\u017eil [[RED]Green Terra! -Herbalism.Skillup=[[DARK_RED]]Dovednost v bylinarstvi byla navysena o {0}. Celkem ({1}). -Mining.Ability.Length=Trvani Super Breaker: [[YELLOW]]{0}s -Mining.Ability.Locked.0=Zam\u010deno doku\u010f {0}+ DOVEDNOST (T\u011a\u017dEN\u00cd V\u00ddBUCHEM) -Mining.Ability.Locked.1=Zamknuto doku\u010f {0}+ DOVEDNOST (V\u011aT\u0160\u00cd BOMBY) -Mining.Ability.Locked.2=ZAM\u010cENO DOKU\u010e{0}+ DOVEDNOST (DEMOLI\u010cN\u00cd ODBORNOST) -Mining.Ability.Lower=[[GRAY]]**SLOZIL SI SVUJ KRUMPAC** -Mining.Ability.Ready=[[GREEN]]**KRUMPAC PRIPRAVEN** +Herbalism.Skills.GTe.On=&a**ZELENÁ TERRA AKTIVOVÁNA** +Herbalism.Skills.GTe.Refresh=&aSchopnost &eGreen Terra &aje obnovena! +Herbalism.Skills.GTe.Other.Off=Green Terra&a byla deaktivovana &e{0} +Herbalism.Skills.GTe.Other.On=&a{0}&2 použil &cGreen Terra! +Herbalism.Skillup=&4Dovednost v bylinarstvi byla navysena o {0}. Celkem ({1}). +Mining.Ability.Length=Trvani Super Breaker: &e{0}s +Mining.Ability.Locked.0=Zamčeno dokuď {0}+ DOVEDNOST (TĚŽENÍ VÝBUCHEM) +Mining.Ability.Locked.1=Zamknuto dokuď {0}+ DOVEDNOST (VĚTŠÍ BOMBY) +Mining.Ability.Locked.2=ZAMČENO DOKUĎ{0}+ DOVEDNOST (DEMOLIČNÍ ODBORNOST) +Mining.Ability.Lower=&7**SLOZIL SI SVUJ KRUMPAC** +Mining.Ability.Ready=&a**KRUMPAC PRIPRAVEN** Mining.SubSkill.SuperBreaker.Name=Super Breaker (SCHOPNOST) Mining.SubSkill.SuperBreaker.Description=Rychlost+, sance na trojnasobny zisk -Mining.SubSkill.DoubleDrops.Name=Dvojn\u00e1sobn\u00fd zisk +Mining.SubSkill.DoubleDrops.Name=Dvojnásobný zisk Mining.SubSkill.DoubleDrops.Description=Zdvojnasobi normalni zisk Mining.SubSkill.BlastMining.Name=Tezeni vybuchem Mining.SubSkill.BlastMining.Description=Bonusy za tezeni s TNT -Mining.SubSkill.BiggerBombs.Name=V\u011bt\u0161\u00ed bomby +Mining.SubSkill.BiggerBombs.Name=Větší bomby Mining.SubSkill.BiggerBombs.Description=Navysuje vzdalenost exploze TNT -Mining.SubSkill.DemolitionsExpertise.Name=Odborn\u00e1 demolice +Mining.SubSkill.DemolitionsExpertise.Name=Odborná demolice Mining.SubSkill.DemolitionsExpertise.Description=Snizuje zraneni zpusobene vybuchem TNT -Mining.Effect.Decrease=Sn\u00ed\u017een\u00ed \u0161kod Demoli\u010dn\u00edho experta: [[YELLOW]]{0} -Mining.Effect.DropChance=\u0161ance na dvojn\u00e1sobn\u00fd zisk: [[YELLOW]]{0} +Mining.Effect.Decrease=Snížení škod Demoličního experta: &e{0} +Mining.Effect.DropChance=šance na dvojnásobný zisk: &e{0} Mining.Listener=Dolovani: Mining.SkillName=DOLOVANI -Mining.Skills.SuperBreaker.Off=**Super Ni\u010den\u00ed vyprchalo** -Mining.Skills.SuperBreaker.On=[[GREEN]]**SUPER BREAKER BYL AKTIVOVAN** -Mining.Skills.SuperBreaker.Other.Off=Super Breaker[[GREEN]] byl deaktivovan [[YELLOW]]{0} -Mining.Skills.SuperBreaker.Other.On=[[GREEN]]{0}[[DARK_GREEN]] has used [[RED]]Mega Ni\u010den\u00ed -Mining.Skills.SuperBreaker.Refresh=[[GREEN]]Schopnost [[YELLOW]]Super Breaker [[GREEN]]obnovena! +Mining.Skills.SuperBreaker.Off=**Super Ničení vyprchalo** +Mining.Skills.SuperBreaker.On=&a**SUPER BREAKER BYL AKTIVOVAN** +Mining.Skills.SuperBreaker.Other.Off=Super Breaker&a byl deaktivovan &e{0} +Mining.Skills.SuperBreaker.Other.On=&a{0}&2 has used &cMega Ničení +Mining.Skills.SuperBreaker.Refresh=&aSchopnost &eSuper Breaker &aobnovena! Mining.Skillup=Dovednost v dolovani byla navysena o {0}. Celkem ({1}) -Mining.Blast.Boom=[[GRAY]]**VYBUCH** -Mining.Blast.Effect=+{0} v\u00fdnos rudy, {1}x ko\u0159ist -Mining.Blast.Radius.Increase=Navyseni radiusu vybuchu: [[YELLOW]]+{0} -Mining.Blast.Rank=V\u00fdbu\u0161n\u00e9 t\u011b\u017een\u00ed [[YELLOW]] Rank {0}/8 [[GRAY]]({1}) -Mining.Blast.Other.On=[[GREEN]]{0}[[DARK_GREEN]] pou\u017eil [[RED]]V\u00fdbu\u0161n\u00e9 T\u011b\u017een\u00ed! -Mining.Blast.Refresh=[[GREEN]]Dovednost [[YELLOW]]Dolovani vybuchem [[GREEN]]je nyni obnovena! +Mining.Blast.Boom=&7**VYBUCH** +Mining.Blast.Effect=+{0} výnos rudy, {1}x kořist +Mining.Blast.Radius.Increase=Navyseni radiusu vybuchu: &e+{0} +Mining.Blast.Rank=Výbušné těžení &e Rank {0}/8 &7({1}) +Mining.Blast.Other.On=&a{0}&2 použil &cVýbušné Těžení! +Mining.Blast.Refresh=&aDovednost &eDolovani vybuchem &aje nyni obnovena! Repair.SubSkill.Repair.Name=Opravovani -Repair.SubSkill.Repair.Description=Oprava zbroje a n\u00e1stroj\u016f +Repair.SubSkill.Repair.Description=Oprava zbroje a nástrojů Repair.SubSkill.GoldRepair.Name=Oprava zlata ({0}+ SKILL) -Repair.SubSkill.GoldRepair.Description=Oprava zlat\u00fdch n\u00e1stroj\u016f a brn\u011bn\u00ed -Repair.SubSkill.IronRepair.Name=Oprava \u017eeleza ({0}+ SKILL) -Repair.SubSkill.IronRepair.Description=Oprava \u017eelezn\u00fdch nastroju a brneni +Repair.SubSkill.GoldRepair.Description=Oprava zlatých nástrojů a brnění +Repair.SubSkill.IronRepair.Name=Oprava železa ({0}+ SKILL) +Repair.SubSkill.IronRepair.Description=Oprava železných nastroju a brneni Repair.SubSkill.StoneRepair.Name=Oprava kamene ({0}+ SKILL) -Repair.SubSkill.StoneRepair.Description=Oprava kamenn\u00fdch n\u00e1stroj\u016f +Repair.SubSkill.StoneRepair.Description=Oprava kamenných nástrojů Repair.SubSkill.RepairMastery.Name=Mistrovstvi v opravovani Repair.SubSkill.RepairMastery.Description=Zvysena efektivita opravy Repair.SubSkill.SuperRepair.Name=Superopravovani @@ -180,345 +179,345 @@ Repair.SubSkill.DiamondRepair.Name=Oprava diamantovych predmetu ({0}+ SKILL) Repair.SubSkill.DiamondRepair.Description=Oprava diamantovych nastroju a brneni Repair.SubSkill.ArcaneForging.Name=Tajemne kovani Repair.SubSkill.ArcaneForging.Description=Oprava enchantovanych predmetu -Repair.SubSkill.Salvage.Name=Sb\u00edrat({0}+ Dovednost) -Repair.SubSkill.Salvage.Description=Sb\u00edrat N\u00e1stroje a Zbroj -Repair.Error=[[DARK_RED]]V mcMMO do\u0161lo k chyb\u011b p\u0159i oprav\u011b tohoto itemu! -Repair.Listener.Anvil=[[DARK_RED]]Polo\u017eil si kovadlinu, na kovadlin\u011b m\u016f\u017ee\u0161 opravovat n\u00e1stroje a zbroj. -Repair.Listener.Anvil2=[[DARK_RED]]Polozil jsi Salvage kovadlinu, pouzij ji na zachranu armoru. +Repair.SubSkill.Salvage.Name=Sbírat({0}+ Dovednost) +Repair.SubSkill.Salvage.Description=Sbírat Nástroje a Zbroj +Repair.Error=&4V mcMMO došlo k chybě při opravě tohoto itemu! +Repair.Listener.Anvil=&4Položil si kovadlinu, na kovadlině můžeš opravovat nástroje a zbroj. +Repair.Listener.Anvil2=&4Polozil jsi Salvage kovadlinu, pouzij ji na zachranu armoru. Repair.Listener=Opravovani: Repair.SkillName=OPRAVOVANI -Repair.Skills.AdeptSalvage=[[TMAV\u011a_\u010cERVEN\u00c1]] Nejsi dostate\u010dn\u011b dovedn\u00fd na Sb\u00edr\u00e1n\u00ed v\u011bc\u00ed. -Repair.Skills.AdeptDiamond=[[DARK_RED]]Nemas dostatek dovednosti pro opravu Diamantovych predmetu. -Repair.Skills.AdeptGold=[[DARK_RED]]Nemas dostatek dovednosti pro opravu Zlatych predmetu. -Repair.Skills.AdeptIron=[[DARK_RED]]Nejsi dostatecne zkuseny na opravu s Ironem. -Repair.Skills.AdeptStone=[[DARK_RED]]Nemas dostatek dovednosti pro opravu Kamennych predmetu. -Repair.Skills.Adept=Mus\u00ed\u0161 m\u00edt level [[YELLOW]]{0}[[RED]] k oprav\u011b [[YELLOW]]{1} -Repair.Skills.FeltEasy=[[GRAY]]To bylo snadn\u00e9. -Repair.Skills.FullDurability=[[GRAY]]Tento p\u0159edm\u011bt nen\u00ed po\u0161kozen\u00fd. -Repair.Skills.SalvageSuccess=[[GRAY]] P\u0159edm\u011bt zachr\u00e1n\u011bn! -Repair.Skills.NotFullDurability=[[TMAV\u011a_\u010cERVEN\u00c1]]Nem\u016f\u017eete sb\u00edrat poni\u010den\u00e9 v\u011bci. -Repair.Skills.Mastery=Mistrovstvi v opravovani: [[YELLOW]]Extra {0} \u017eivotnosti obnovena -Repair.Skills.StackedItems=[[DARK_RED]]Nem\u016f\u017ee\u0161 opravovat nestackovan\u00e9 p\u0159edm\u011bty. -Repair.Skills.Super.Chance=\u0160ance na superopravov\u00e1n\u00ed: [[YELLOW]]{0} +Repair.Skills.AdeptSalvage=[[TMAVĚ_ČERVENÁ]] Nejsi dostatečně dovedný na Sbírání věcí. +Repair.Skills.AdeptDiamond=&4Nemas dostatek dovednosti pro opravu Diamantovych predmetu. +Repair.Skills.AdeptGold=&4Nemas dostatek dovednosti pro opravu Zlatych predmetu. +Repair.Skills.AdeptIron=&4Nejsi dostatecne zkuseny na opravu s Ironem. +Repair.Skills.AdeptStone=&4Nemas dostatek dovednosti pro opravu Kamennych predmetu. +Repair.Skills.Adept=Musíš mít level &e{0}&c k opravě &e{1} +Repair.Skills.FeltEasy=&7To bylo snadné. +Repair.Skills.FullDurability=&7Tento předmět není poškozený. +Repair.Skills.SalvageSuccess=&7 Předmět zachráněn! +Repair.Skills.NotFullDurability=[[TMAVĚ_ČERVENÁ]]Nemůžete sbírat poničené věci. +Repair.Skills.Mastery=Mistrovstvi v opravovani: &eExtra {0} životnosti obnovena +Repair.Skills.StackedItems=&4Nemůžeš opravovat nestackované předměty. +Repair.Skills.Super.Chance=Šance na superopravování: &e{0} Repair.Skillup=Dovednost v opravovani byla navysena o {0}. Celkem ({1}) Repair.Pretty.Name=Oprava -Salvage.Pretty.Name=Zachr\u00e1nit -Repair.Arcane.Chance.Downgrade=[[GRAY]]Sance na degradovani magicke sily predmetu: [[YELLOW]]{0}% -Repair.Arcane.Chance.Success=[[GRAY]]Pravd\u011bpodobnost \u00fasp\u011bchu AF: [[YELLOW]]{0}% -Repair.Arcane.Downgrade=Magick\u00e1 s\u00edla tohoto p\u0159edm\u011btu zesl\u00e1bla. +Salvage.Pretty.Name=Zachránit +Repair.Arcane.Chance.Downgrade=&7Sance na degradovani magicke sily predmetu: &e{0}% +Repair.Arcane.Chance.Success=&7Pravděpodobnost úspěchu AF: &e{0}% +Repair.Arcane.Downgrade=Magická síla tohoto předmětu zeslábla. Repair.Arcane.Fail=Predmet ztratil navzdy svou magickou silu. Repair.Arcane.Lost=Nemel jsi dostatocnou dovednost pro zachovani ocarovani predmetu. -Repair.Arcane.Perfect=[[GREEN]]Udr\u017eel jsi nezn\u00e1mou enegii v tomto p\u0159edm\u011btu. -Repair.Arcane.Rank=Tajemne kov\u00e1n\u00ed: [[YELLOW]]Level {0}/4 -Swords.Ability.Lower=[[GRAY]]**ODLOZIL JSI SVUJ MEC** -Swords.Ability.Ready=[[GREEN]]**PRIPRAVIL JSI SVUJ MEC** -Swords.Combat.Bleed.Chance=\u0160ance na krv\u00e1cen\u00ed: [[YELLOW]]{0} -Swords.Combat.Bleed.Length=D\u00e9lka krv\u00e1cen\u00ed: [[YELLOW]]{0} tik\u016f -Swords.Combat.Bleed.Note=[[GRAY]]NOTE: [[YELLOW]]1 trva 2 sekundy -Swords.Combat.Bleeding.Started=[[DARK_RED]] Krv\u00e1c\u00ed\u0161! -Swords.Combat.Bleeding.Stopped=[[GRAY]]Krvaceni bylo [[GREEN]]zastaveno[[GRAY]]! -Swords.Combat.Bleeding=[[GREEN]]**NEPRITEL KRVACI** -Swords.Combat.Counter.Chance=\u0160ance na proti\u00fatok: [[YELLOW]]{0} -Swords.Combat.Counter.Hit=[[DARK_RED]]Zasa\u017een proti\u00fatokem! -Swords.Combat.Countered=[[GREEN]]**PROTIUTOK** -Swords.Combat.SS.Struck=[[DARK_RED]]Zasazen Hrozivym utokem! +Repair.Arcane.Perfect=&aUdržel jsi neznámou enegii v tomto předmětu. +Repair.Arcane.Rank=Tajemne kování: &eLevel {0}/4 +Swords.Ability.Lower=&7**ODLOZIL JSI SVUJ MEC** +Swords.Ability.Ready=&a**PRIPRAVIL JSI SVUJ MEC** +Swords.Combat.Bleed.Chance=Šance na krvácení: &e{0} +Swords.Combat.Bleed.Length=Délka krvácení: &e{0} tiků +Swords.Combat.Bleed.Note=&7NOTE: &e1 trva 2 sekundy +Swords.Combat.Bleeding.Started=&4 Krvácíš! +Swords.Combat.Bleeding.Stopped=&7Krvaceni bylo &azastaveno&7! +Swords.Combat.Bleeding=&a**NEPRITEL KRVACI** +Swords.Combat.Counter.Chance=Šance na protiútok: &e{0} +Swords.Combat.Counter.Hit=&4Zasažen protiútokem! +Swords.Combat.Countered=&a**PROTIUTOK** +Swords.Combat.SS.Struck=&4Zasazen Hrozivym utokem! Swords.SubSkill.CounterAttack.Name=Protiutok Swords.SubSkill.CounterAttack.Description=Sance k reflektovani obdrzeneho poskozeni pri braneni {0} Swords.SubSkill.SerratedStrikes.Name=Hrozivy utok (SCHOPNOST) -Swords.SubSkill.SerratedStrikes.Description={0} Po\u0161kozen\u00ed \u00fatok do okol\u00ed, Krv\u00e1cen\u00ed+ \u00fatok do okol\u00ed +Swords.SubSkill.SerratedStrikes.Description={0} Poškození útok do okolí, Krvácení+ útok do okolí Swords.Effect.4=Hrozivy utok krvaceni+ -Swords.Effect.5={0} Tikav\u00e9 Krv\u00e1cen\u00ed -Swords.SubSkill.Bleed.Name=Krv\u00e1cen\u00ed -Swords.SubSkill.Bleed.Description=Aplikuj krv\u00e1cejic\u00ed DoTku +Swords.Effect.5={0} Tikavé Krvácení +Swords.SubSkill.Bleed.Name=Krvácení +Swords.SubSkill.Bleed.Description=Aplikuj krvácejicí DoTku Swords.Listener=Mece: Swords.SkillName=MECE -Swords.Skills.SS.Off=**Hroziv\u00fd \u00fatok byl deaktivov\u00e1n** -Swords.Skills.SS.On=[[GREEN]]**HROZIVY UTOK BYL AKTIVOVAN** -Swords.Skills.SS.Refresh=[[GREEN]]Tvoje schopnost [[YELLOW]]Serrated Strikes [[GREEN]]je obnovena! -Swords.Skills.SS.Other.Off=Hrozivy utok[[GREEN]] byl deaktivovan [[YELLOW]]{0} -Swords.Skills.SS.Other.On=[[GREEN]]{0}[[DARK_GREEN]] pouzil [[RED]]Hrozivy utok! +Swords.Skills.SS.Off=**Hrozivý útok byl deaktivován** +Swords.Skills.SS.On=&a**HROZIVY UTOK BYL AKTIVOVAN** +Swords.Skills.SS.Refresh=&aTvoje schopnost &eSerrated Strikes &aje obnovena! +Swords.Skills.SS.Other.Off=Hrozivy utok&a byl deaktivovan &e{0} +Swords.Skills.SS.Other.On=&a{0}&2 pouzil &cHrozivy utok! Swords.Skillup=Dovednost mece byla navysena o {0}. Celkem ({1}) -Swords.SS.Length=D\u00e9lka Hroziv\u00e9ho \u00datoku: [[YELLOW]]{0}s +Swords.SS.Length=Délka Hrozivého Útoku: &e{0}s Taming.Ability.Bonus.0=Ekologicky informovane -Taming.Ability.Bonus.1=Vlci, vyhn\u011bte se nebezpe\u010d\u00ed +Taming.Ability.Bonus.1=Vlci, vyhněte se nebezpečí Taming.Ability.Bonus.2=Husta srst -Taming.Ability.Bonus.3=1/{0} Po\u0161kozen\u00ed, Odolnost proti ohni +Taming.Ability.Bonus.3=1/{0} Poškození, Odolnost proti ohni Taming.Ability.Bonus.4=Otresuvzdorny -Taming.Ability.Bonus.5=V\u00fdbu\u0161niny d\u011blaj\u00ed 1/{0} norm\u00e1ln\u00edho po\u0161kozen\u00ed +Taming.Ability.Bonus.5=Výbušniny dělají 1/{0} normálního poškození Taming.Ability.Bonus.6=Nabrousene drapy -Taming.Ability.Bonus.7=+{0} Po\u0161kozen\u00ed -Taming.Ability.Bonus.8=Rychl\u00e9 Ob\u010derstven\u00ed -Taming.Ability.Bonus.9={0} \u0161ance na vyl\u00e9\u010den\u00ed p\u0159i \u00fatoku -Taming.Ability.Bonus.10=Svat\u00fd Chrt -Taming.Ability.Bonus.11=Obnovuje zdrav\u00ed p\u0159i zran\u011bn\u00ed magi\u00ed nebo lektvarem -Taming.Ability.Locked.0=ZAM\u010cENO DOKU\u010e{0}+ DOVEDNOST (UV\u011aDOM\u011aL\u00dd O SV\u00c9M OKOL\u00cd) -Taming.Ability.Locked.1=ZAM\u010cENO DOKU\u010e {0}+ DOVEDNOST (HUST\u00c1 SRST) -Taming.Ability.Locked.2=ZAM\u010cENO DOKU\u010e {0}+DOVEDNOST (OT\u0158ESUVZDORN\u00dd) -Taming.Ability.Locked.3=ZAM\u010cENO DOKUD {0}+ DOVEDNOST (NABROU\u0160EN\u00c9 DR\u00c1PY) -Taming.Ability.Locked.4=ZAM\u010cENO DOKU\u010e{0}+ DOVEDNOST (RYCHL\u00c9 OB\u010cERSTVEN\u00cd) -Taming.Ability.Locked.5=UZAM\u010cENO DOKU\u010e {0}+ DOVEDNOST (Svat\u00fd Chrt) -Taming.Combat.Chance.Gore=\u0160ance na nabodnut\u00ed: [[YELLOW]]{0} -Taming.SubSkill.BeastLore.Name=Tradice \u0161elem -Taming.SubSkill.BeastLore.Description=Na\u0159\u00edznut\u00ed kost\u00ed kontroluje vlky & oceloty +Taming.Ability.Bonus.7=+{0} Poškození +Taming.Ability.Bonus.8=Rychlé Občerstvení +Taming.Ability.Bonus.9={0} šance na vyléčení při útoku +Taming.Ability.Bonus.10=Svatý Chrt +Taming.Ability.Bonus.11=Obnovuje zdraví při zranění magií nebo lektvarem +Taming.Ability.Locked.0=ZAMČENO DOKUĎ{0}+ DOVEDNOST (UVĚDOMĚLÝ O SVÉM OKOLÍ) +Taming.Ability.Locked.1=ZAMČENO DOKUĎ {0}+ DOVEDNOST (HUSTÁ SRST) +Taming.Ability.Locked.2=ZAMČENO DOKUĎ {0}+DOVEDNOST (OTŘESUVZDORNÝ) +Taming.Ability.Locked.3=ZAMČENO DOKUD {0}+ DOVEDNOST (NABROUŠENÉ DRÁPY) +Taming.Ability.Locked.4=ZAMČENO DOKUĎ{0}+ DOVEDNOST (RYCHLÉ OBČERSTVENÍ) +Taming.Ability.Locked.5=UZAMČENO DOKUĎ {0}+ DOVEDNOST (Svatý Chrt) +Taming.Combat.Chance.Gore=Šance na nabodnutí: &e{0} +Taming.SubSkill.BeastLore.Name=Tradice šelem +Taming.SubSkill.BeastLore.Description=Naříznutí kostí kontroluje vlky & oceloty Taming.SubSkill.ShockProof.Name=Otresuvzdorny -Taming.SubSkill.ShockProof.Description=Po\u0161kozen\u00ed Exploz\u00ed Sn\u00ed\u017eeno -Taming.SubSkill.CallOfTheWild.Name=Vol\u00e1n\u00ed divociny +Taming.SubSkill.ShockProof.Description=Poškození Explozí Sníženo +Taming.SubSkill.CallOfTheWild.Name=Volání divociny Taming.SubSkill.CallOfTheWild.Description=Privolej zvirata na svou stranu -Taming.SubSkill.CallOfTheWild.Description.2=[[GRAY]]COTW (Ocelot): Skrc se a levym-klikem s {0} rybami v ruce -Taming.Effect.15=[[GRAY]]COTW (Ocelot): Skrc se a levym-klikem s {0} kostmi v ruce -Taming.SubSkill.FastFoodService.Name=Rychl\u00e9 Ob\u010derstven\u00ed -Taming.SubSkill.FastFoodService.Description=\u0160ance na vyl\u00e9\u010den\u00ed vlka p\u0159i \u00fatoku -Taming.SubSkill.HolyHound.Name=Svat\u00fd Chrt -Taming.SubSkill.HolyHound.Description=Uzdraven Magi\u00ed & Lektvarem -Taming.SubSkill.Gore.Name=Krveprolit\u00ed -Taming.SubSkill.Gore.Description=Kritick\u00fd \u00fader, kter\u00fd aplikuje krv\u00e1cen\u00ed +Taming.SubSkill.CallOfTheWild.Description.2=&7COTW (Ocelot): Skrc se a levym-klikem s {0} rybami v ruce +Taming.Effect.15=&7COTW (Ocelot): Skrc se a levym-klikem s {0} kostmi v ruce +Taming.SubSkill.FastFoodService.Name=Rychlé Občerstvení +Taming.SubSkill.FastFoodService.Description=Šance na vyléčení vlka při útoku +Taming.SubSkill.HolyHound.Name=Svatý Chrt +Taming.SubSkill.HolyHound.Description=Uzdraven Magií & Lektvarem +Taming.SubSkill.Gore.Name=Krveprolití +Taming.SubSkill.Gore.Description=Kritický úder, který aplikuje krvácení Taming.SubSkill.SharpenedClaws.Name=Nabrousene drapy -Taming.SubSkill.SharpenedClaws.Description=Bonus k zran\u011bn\u00ed +Taming.SubSkill.SharpenedClaws.Description=Bonus k zranění Taming.SubSkill.EnvironmentallyAware.Name=Ekologicky informovane -Taming.SubSkill.EnvironmentallyAware.Description=Kaktusov\u00e1/L\u00e1vov\u00e1 f\u00f3bie, Imunita proti zran\u011bn\u00ed p\u00e1dem +Taming.SubSkill.EnvironmentallyAware.Description=Kaktusová/Lávová fóbie, Imunita proti zranění pádem Taming.SubSkill.ThickFur.Name=Husta srst -Taming.SubSkill.ThickFur.Description=Sn\u00ed\u017een\u00e9 zran\u011bn\u00ed,Odolnost proti ohni -Taming.Listener.Wolf=[[DARK_GRAY]]Vlk vlk pribehl zpatky k tobe... +Taming.SubSkill.ThickFur.Description=Snížené zranění,Odolnost proti ohni +Taming.Listener.Wolf=&8Vlk vlk pribehl zpatky k tobe... Taming.Listener=Ochocovani: Taming.SkillName=OCHOCOVANI Taming.Skillup=Dovednost v ochocovani byla navysena o {0}. Celkem ({1}) -Taming.Summon.Complete=[[GREEN]]Vyvol\u00e1n\u00ed hotovo -Taming.Summon.Fail.Ocelot=M\u00e1\u0161 pobl\u00ed\u0161 p\u0159\u00edli\u0161 moc, abys povolal dal\u0161\u00edho. -Taming.Summon.Fail.Wolf=M\u00e1\u0161 p\u0159\u00edli\u0161 mnoho vlk\u016f v okol\u00ed k tomu, aby jsi p\u0159ivolal dal\u0161\u00ed. +Taming.Summon.Complete=&aVyvolání hotovo +Taming.Summon.Fail.Ocelot=Máš poblíš příliš moc, abys povolal dalšího. +Taming.Summon.Fail.Wolf=Máš příliš mnoho vlků v okolí k tomu, aby jsi přivolal další. Taming.Summon.Name.Format={0}s {1} -Unarmed.Ability.Berserk.Length=Delka trvani Besneni: [[YELLOW]]{0}s -Unarmed.Ability.Bonus.0=Styl \u017eelezn\u00e9 pa\u017ee -Unarmed.Ability.Bonus.1=+{0} Zv\u00fd\u0161en\u00ed zran\u011bn\u00ed -Unarmed.Ability.Chance.ArrowDeflect=\u0160ance na vych\u00edlen\u00ed \u0161\u00edpu: [[YELLOW]]{0} -Unarmed.Ability.Chance.Disarm=\u0160ance na odzbrojen\u00ed: [[YELLOW]]{0} -Unarmed.Ability.Chance.IronGrip=\u0160ance na \u017delezn\u00fd stisk: [[YELLOW]]{0} -Unarmed.Ability.IronGrip.Attacker= Tv\u016fj soupe\u0159 m\u00e1 \u017eelezn\u00e9 sev\u0159en\u00ed! -Unarmed.Ability.IronGrip.Defender=[[GREEN]]Tv\u016fj \u017eelezny stisk zabr\u00e1nil tomu abys byl odzbrojen! -Unarmed.Ability.Lower=[[GRAY]]**SKL\u00c1N\u00cd\u0160 SV\u00c9 P\u011aSTI** -Unarmed.Ability.Ready=[[GREEN]]**PRIPRAVIL JSI SVOJE PESTI** -Unarmed.SubSkill.Berserk.Name=B\u011bsn\u011bn\u00ed (SCHOPNOST) +Unarmed.Ability.Berserk.Length=Delka trvani Besneni: &e{0}s +Unarmed.Ability.Bonus.0=Styl železné paže +Unarmed.Ability.Bonus.1=+{0} Zvýšení zranění +Unarmed.Ability.Chance.ArrowDeflect=Šance na vychílení šípu: &e{0} +Unarmed.Ability.Chance.Disarm=Šance na odzbrojení: &e{0} +Unarmed.Ability.Chance.IronGrip=Šance na Železný stisk: &e{0} +Unarmed.Ability.IronGrip.Attacker= Tvůj soupeř má železné sevření! +Unarmed.Ability.IronGrip.Defender=&aTvůj železny stisk zabránil tomu abys byl odzbrojen! +Unarmed.Ability.Lower=&7**SKLÁNÍŠ SVÉ PĚSTI** +Unarmed.Ability.Ready=&a**PRIPRAVIL JSI SVOJE PESTI** +Unarmed.SubSkill.Berserk.Name=Běsnění (SCHOPNOST) Unarmed.SubSkill.Berserk.Description=+50% DMG, Nici slabsi materiali -Unarmed.SubSkill.Disarm.Name=Odzbrojit (Hr\u00e1ce) -Unarmed.SubSkill.Disarm.Description=Vyraz\u00ed nep\u0159\u00e1tel\u016fm p\u0159edm\u011bt kter\u00fd dr\u017e\u00ed v ruce -Unarmed.SubSkill.IronArmStyle.Name=Styl \u017eelezn\u00e9 pa\u017ee -Unarmed.SubSkill.IronArmStyle.Description=Na \u010das ti zatvrd\u00ed ruku -Unarmed.SubSkill.ArrowDeflect.Name=Vych\u00fdlen\u00ed \u0161\u00edpu +Unarmed.SubSkill.Disarm.Name=Odzbrojit (Hráce) +Unarmed.SubSkill.Disarm.Description=Vyrazí nepřátelům předmět který drží v ruce +Unarmed.SubSkill.IronArmStyle.Name=Styl železné paže +Unarmed.SubSkill.IronArmStyle.Description=Na čas ti zatvrdí ruku +Unarmed.SubSkill.ArrowDeflect.Name=Vychýlení šípu Unarmed.SubSkill.ArrowDeflect.Description=Odrazeni sipu -Unarmed.SubSkill.IronGrip.Name=\u017delezn\u00fd stisk -Unarmed.SubSkill.IronGrip.Description=Zabra\u0148uje va\u0161emu odzbrojen\u00ed +Unarmed.SubSkill.IronGrip.Name=Železný stisk +Unarmed.SubSkill.IronGrip.Description=Zabraňuje vašemu odzbrojení Unarmed.Listener=Neozbrojeny: Unarmed.SkillName=NEOZBROJENY Unarmed.Skills.Berserk.Off=**Besneni bylo deaktivovano** -Unarmed.Skills.Berserk.On=[[GREEN]]**BESNENI AKTIVOVANO** -Unarmed.Skills.Berserk.Other.Off=Besneni[[GREEN]] bylo deaktivovano [[YELLOW]]{0} -Unarmed.Skills.Berserk.Other.On=[[GREEN]]{0}[[DARK_GREEN]] pouzil [[RED]]Besneni! -Unarmed.Skills.Berserk.Refresh=[[GREEN]]Tvoje [[YELLOW]]schopnost B\u011bsn\u011bn\u00ed [[GREEN]]byla obnovena! -Unarmed.Skillup=Dovednost v boji rukou byla navy\u0161ena o {0}. Celkem ({1}) +Unarmed.Skills.Berserk.On=&a**BESNENI AKTIVOVANO** +Unarmed.Skills.Berserk.Other.Off=Besneni&a bylo deaktivovano &e{0} +Unarmed.Skills.Berserk.Other.On=&a{0}&2 pouzil &cBesneni! +Unarmed.Skills.Berserk.Refresh=&aTvoje &eschopnost Běsnění &abyla obnovena! +Unarmed.Skillup=Dovednost v boji rukou byla navyšena o {0}. Celkem ({1}) Woodcutting.Ability.0=Vyfoukavac Woodcutting.Ability.1=Odfoukne listi -Woodcutting.Ability.Chance.DDrop=\u0160ance na dvojn\u00e1sobn\u00fd zisk: [[YELLOW]]{0} -Woodcutting.Ability.Length=D\u00e9lka Tree felleru: [[YELLOW]]{0}s -Woodcutting.Ability.Locked.0=ZAM\u010cENO DOKUD {0}+ DOVEDNOST (FOUKA\u010c LIST\u00cd) -Woodcutting.SubSkill.TreeFeller.Name=Ni\u010ditel strom\u016f (ABILITA) -Woodcutting.SubSkill.TreeFeller.Description=Odp\u00e1l\u00ed strom +Woodcutting.Ability.Chance.DDrop=Šance na dvojnásobný zisk: &e{0} +Woodcutting.Ability.Length=Délka Tree felleru: &e{0}s +Woodcutting.Ability.Locked.0=ZAMČENO DOKUD {0}+ DOVEDNOST (FOUKAČ LISTÍ) +Woodcutting.SubSkill.TreeFeller.Name=Ničitel stromů (ABILITA) +Woodcutting.SubSkill.TreeFeller.Description=Odpálí strom Woodcutting.SubSkill.LeafBlower.Name=Vyfoukavac Woodcutting.SubSkill.LeafBlower.Description=Odfoukne listi Woodcutting.SubSkill.HarvestLumber.Name=Dvojnasobne zisky Woodcutting.SubSkill.HarvestLumber.Description=Zdvojnasobi normalni zisk -Woodcutting.Listener=D\u0159evorubectv\u00ed: +Woodcutting.Listener=Dřevorubectví: Woodcutting.SkillName=DREVORUBECTVI -Woodcutting.Skills.TreeFeller.Off=Valec stromu[[GREEN]] byl deaktivovan [[YELLOW]]{0} t -Woodcutting.Skills.TreeFeller.On=[[GREEN]]**V\u00c1LE\u010c STROM\u016e AKTIVOV\u00c1NO** -Woodcutting.Skills.TreeFeller.Refresh=[[GREEN]]Schopnost [[YELLOW]]Valec stromu [[GREEN]]byla obnovena! -Woodcutting.Skills.TreeFeller.Other.Off=Valec stromu[[GREEN]] byl deaktivovan [[YELLOW]]{0} -Woodcutting.Skills.TreeFeller.Other.On=[[GREEN]]{0}[[DARK_GREEN]] pouzil [[RED]]Valece stromu! +Woodcutting.Skills.TreeFeller.Off=Valec stromu&a byl deaktivovan &e{0} t +Woodcutting.Skills.TreeFeller.On=&a**VÁLEČ STROMŮ AKTIVOVÁNO** +Woodcutting.Skills.TreeFeller.Refresh=&aSchopnost &eValec stromu &abyla obnovena! +Woodcutting.Skills.TreeFeller.Other.Off=Valec stromu&a byl deaktivovan &e{0} +Woodcutting.Skills.TreeFeller.Other.On=&a{0}&2 pouzil &cValece stromu! Woodcutting.Skills.TreeFeller.Splinter=TVOJE SEKERA SE ROZLETELA NA TISICE KOUSKU! -Woodcutting.Skills.TreeFeller.Threshold=Tento strom je p\u0159\u00edli\u0161 velk\u00fd! +Woodcutting.Skills.TreeFeller.Threshold=Tento strom je příliš velký! Woodcutting.Skillup=Dovednost v dolovani byla navysena o {0}. Celkem ({1}) -Ability.Generic.Refresh=[[GREEN]**SCHOPNOSTI OBNOVENY!** -Ability.Generic.Template.Lock=[[GRAY]]{0} -Ability.Generic.Template=[[GOLD]]{0}: [[DARK_AQUA]]{1} -Combat.ArrowDeflect=[[WHITE]]**SIP VYCHYLEN** -Combat.BeastLore=[[GREEN]]**TRADICE SELEM** -Combat.BeastLoreHealth=[[DARK_AQUA]]Zivoty ([[GREEN]]{0}[[DARK_AQUA]]/{1}) -Combat.BeastLoreOwner=[[DARK_AQUA]]Vlastn\u00edk ([[RED]]{0}[[DARK_AQUA]]) -Combat.Gore=[[GREEN]]**PRUNIK** +Ability.Generic.Refresh=&a**SCHOPNOSTI OBNOVENY!** +Ability.Generic.Template.Lock=&7{0} +Ability.Generic.Template=&6{0}: &3{1} +Combat.ArrowDeflect=&f**SIP VYCHYLEN** +Combat.BeastLore=&a**TRADICE SELEM** +Combat.BeastLoreHealth=&3Zivoty (&a{0}&3/{1}) +Combat.BeastLoreOwner=&3Vlastník (&c{0}&3) +Combat.Gore=&a**PRUNIK** Combat.StruckByGore=**BYL JSI PROBODNUT** -Combat.TargetDazed=C\u00edl byl [[DARK_RED]]Omr\u00e1\u010den -Combat.TouchedFuzzy=[[DARK_RED]]Nejasne dotcen. Mas zavrat. -mcMMO.Description=[[DARK_AQUA]]O [[YELLOW]]mcMMO[[DARK_AQUA]] Projekt:,[[GOLD]]mcMMO je [[RED]]open source[[GOLD]] RPG m\u00f3d vytvo\u0159en\u00fd v \u00fanoru 2011,[[GOLD]]autorem [[BLUE]]nossr50[[GOLD]]. C\u00edl projektu je poskytnout kvalitu RPG.,[[DARK_AQUA]]Tipy:,[[GOLD]] - [[GREEN]]Pou\u017eij [[RED]]/mcmmo help[[GREEN]] pro zobrazen\u00ed dostupn\u00fdch p\u0159\u00edkaz\u016f,[[GOLD]] - [[GREEN]]Type [[RED]]/SKILLNAME[[GREEN]] pro zobrazen\u00ed detailn\u00edch informac\u00ed o skillu,[[DARK_AQUA]]V\u00fdvoj\u00e1\u0159i:,[[GOLD]] - [[GREEN]]nossr50 [[BLUE]](Majitel),[[GOLD]] - [[GREEN]]GJ [[BLUE]](Vedouc\u00ed projektu),[[GOLD]] - [[GREEN]]NuclearW [[BLUE]](V\u00fdvoj\u00e1\u0159),[[GOLD]] - [[GREEN]]bm01 [[BLUE]](V\u00fdvoj\u00e1\u0159),[[GOLD]] - [[GREEN]]TfT_02 [[BLUE]](V\u00fdvoj\u00e1\u0159),[[GOLD]] - [[GREEN]]Glitchfinder [[BLUE]](V\u00fdvoj\u00e1\u0159),[[GOLD]] - [[GREEN]]t00thpick1 [[BLUE]](V\u00fdvoj\u00e1\u0159),[[DARK_AQUA]]U\u017eite\u010dn\u00e9 odkazy:,[[GOLD]] - [[GREEN]]https://github.com/mcMMO-Dev/mcMMO/issues[[GOLD]] Nahla\u0161ov\u00e1n\u00ed Chyb,[[GOLD]] - [[GREEN]]#mcmmo @ irc.esper.net[[GOLD]] IRC Chat, -Commands.addlevels.AwardAll.1=[[GREEN]]Bylo v\u00e1m ud\u011bleno {0} \u00farovn\u00ed ve v\u0161ech dovednostech! -Commands.addlevels.AwardAll.2=V\u0161echny schopnosti byly zm\u011bn\u011bny na {0}. -Commands.addlevels.AwardSkill.1=[[GREEN]]Tvoje dovednost {1} je nyn\u00ed {0}! +Combat.TargetDazed=Cíl byl &4Omráčen +Combat.TouchedFuzzy=&4Nejasne dotcen. Mas zavrat. +mcMMO.Description=&3O &emcMMO&3 Projekt:,&6mcMMO je &copen source&6 RPG mód vytvořený v únoru 2011,&6autorem &9nossr50&6. Cíl projektu je poskytnout kvalitu RPG.,&3Tipy:,&6 - &aPoužij &c/mcmmo help&a pro zobrazení dostupných příkazů,&6 - &aType &c/SKILLNAME&a pro zobrazení detailních informací o skillu,&3Vývojáři:,&6 - &anossr50 &9(Majitel),&6 - &aGJ &9(Vedoucí projektu),&6 - &aNuclearW &9(Vývojář),&6 - &abm01 &9(Vývojář),&6 - &aTfT_02 &9(Vývojář),&6 - &aGlitchfinder &9(Vývojář),&6 - &at00thpick1 &9(Vývojář),&3Užitečné odkazy:,&6 - &ahttps://github.com/mcMMO-Dev/mcMMO/issues&6 Nahlašování Chyb,&6 - &a#mcmmo @ irc.esper.net&6 IRC Chat, +Commands.addlevels.AwardAll.1=&aBylo vám uděleno {0} úrovní ve všech dovednostech! +Commands.addlevels.AwardAll.2=Všechny schopnosti byly změněny na {0}. +Commands.addlevels.AwardSkill.1=&aTvoje dovednost {1} je nyní {0}! Commands.addlevels.AwardSkill.2={0} bylo upraveno pro {1}. -Commands.addxp.AwardAll=[[GREEN]]Bylo v\u00e1m ud\u011bleno {0} zku\u0161enost\u00ed ve v\u0161ech skillech! -Commands.addxp.AwardSkill=[[GREEN]]Z\u00edskal si {0} zku\u0161enost\u00ed v {1}! -Commands.Ability.Off=Pou\u017eit\u00ed schopnosti bylo [[RED]] vypnuto -Commands.Ability.On=Pou\u017eit\u00ed schopnosti bylo [[GREEN]]zapnuto -Commands.AdminChat.Off=Admin chat [[RED]]Vypnuty -Commands.AdminChat.On=Admin Chat[[GREEN]]Zapnut\u00fd +Commands.addxp.AwardAll=&aBylo vám uděleno {0} zkušeností ve všech skillech! +Commands.addxp.AwardSkill=&aZískal si {0} zkušeností v {1}! +Commands.Ability.Off=Použití schopnosti bylo &c vypnuto +Commands.Ability.On=Použití schopnosti bylo &azapnuto +Commands.AdminChat.Off=Admin chat &cVypnuty +Commands.AdminChat.On=Admin Chat&aZapnutý Commands.AdminToggle=- Prepnout admin chat -Commands.Chat.Console=*\u0158\u00edd\u00edc\u00ed panel* +Commands.Chat.Console=*Řídící panel* Commands.Disabled=Tento prikaz je vypnuty. Commands.DoesNotExist=Hrac se v databaze nenachazi! Commands.GodMode.Disabled=mcMMO Godmod vypnuty Commands.GodMode.Enabled=mcMMO Godmod aktivovan -Commands.GodMode.Forbidden=[mcMMO] M\u00f3d B\u016fh nen\u00ed povolen v tomto sv\u011bt\u011b (pod\u00edvej se do Povolen\u00ed) -Commands.Inspect= [[RED]]- Shl\u00e9dni detailn\u00ed informace o hr\u00e1\u010di -Commands.Party.Invite.Accepted=[[GREEN]]Pozvanka prijata. Pridal jsi se k party {0} -Commands.Invite.Success=[[GREEN]]Pozv\u00e1nka \u00faspesne odesl\u00e1na. -Commands.Leaderboards= [[RED]]- Tabulka nejlep\u0161\u00edch -Commands.mcc.Header=---[][[YELLOW]]mcMMO P\u0159\u00edkazy[[RED]][]--- +Commands.GodMode.Forbidden=[mcMMO] Mód Bůh není povolen v tomto světě (podívej se do Povolení) +Commands.Inspect= &c- Shlédni detailní informace o hráči +Commands.Party.Invite.Accepted=&aPozvanka prijata. Pridal jsi se k party {0} +Commands.Invite.Success=&aPozvánka úspesne odeslána. +Commands.Leaderboards= &c- Tabulka nejlepších +Commands.mcc.Header=---[]&emcMMO Příkazy&c[]--- Commands.mcgod=- Prepnout GodMod -Commands.mchud.Invalid=Nespr\u00e1vn\u00fd typ HUD. -Commands.mcpurge.Success=[[GREEN]]Datab\u00e1ze byla \u00fasp\u011b\u0161n\u011b vy\u010dist\u011bna! -Commands.mcrank.Heading=[[GOLD]]-=OSOBN\u00cd HODNOCEN\u00cd=- -Commands.mcrank.Overall=Celkov\u00e1[[GREEN]] - [[GOLD]]Hodnost [[WHITE]]#[[GREEN]]{0} -Commands.mcrank.Player=C\u00cdL: [[WHITE]]{0} -Commands.mcrank.Skill={0}[[GREEN]] - [[GOLD]]Hodnost [[WHITE]]#[[GREEN]]{1} -Commands.mcrank.Unranked=[[WHITE]]Bez hodnosti +Commands.mchud.Invalid=Nesprávný typ HUD. +Commands.mcpurge.Success=&aDatabáze byla úspěšně vyčistěna! +Commands.mcrank.Heading=&6-=OSOBNÍ HODNOCENÍ=- +Commands.mcrank.Overall=Celková&a - &6Hodnost &f#&a{0} +Commands.mcrank.Player=CÍL: &f{0} +Commands.mcrank.Skill={0}&a - &6Hodnost &f#&a{1} +Commands.mcrank.Unranked=&fBez hodnosti Commands.mcrefresh.Success={0}\'\' schopnosti obnoveny. -Commands.mcremove.Success=[[GREEN]]{0} byl \u00fasp\u011b\u0161n\u011b vymaz\u00e1n z datab\u00e1ze! -Commands.mctop.Tip=[[GOLD]]Tip: Pro osobn\u00ed statistiky pou\u017eij [[RED]]/mcrank[[GOLD]]! -Commands.mmoedit=[player] [[RED]] - Modify target -Commands.mmoedit.AllSkills.1=[[GREEN]]Tv\u00e1 \u00farove\u0148 ve v\u0161ech skillech byla nastavena na {0}! -Commands.mmoedit.Modified.1=[[GREEN]]Tv\u016fj skill v {0} byl pozm\u011bn\u011bn na {1}! +Commands.mcremove.Success=&a{0} byl úspěšně vymazán z databáze! +Commands.mctop.Tip=&6Tip: Pro osobní statistiky použij &c/mcrank&6! +Commands.mmoedit=[player] &c - Modify target +Commands.mmoedit.AllSkills.1=&aTvá úroveň ve všech skillech byla nastavena na {0}! +Commands.mmoedit.Modified.1=&aTvůj skill v {0} byl pozměněn na {1}! Commands.mmoedit.Modified.2={0} bylo upraveno pro {1}. -Commands.mmoshowdb=Aktu\u00e1ln\u00ed pou\u017e\u00edvan\u00e1 datab\u00e1ze je [[GREEN]]{0} +Commands.mmoshowdb=Aktuální používaná databáze je &a{0} Commands.ModDescription=- Precti si strucny popis pluginu Commands.NoConsole=Tento prikaz nepodporuje pouziti z konzole. -Commands.Notifications.Off=Oznamov\u00e1n\u00ed schopnost\u00ed [[RED]]vypnuto -Commands.Notifications.On=Oznamov\u00e1n\u00ed schopnost\u00ed [[GREEN]]zapnuto -Commands.Offline=Tento p\u0159\u00edkaz nefunguje pro offline hr\u00e1\u010de. -Commands.Other=[[GREEN]]--OSTATNI PRIKAZY-- -Commands.Party.Header=-----[][[GREEN]]PARTA[[RED]][]----- -Commands.Party.Status=[[DARK_GRAY]]JM\u00c9NO: [[WHITE]]{0} {1} -Commands.Party.ShareMode=[[DARK_GRAY]]M\u00d3D SD\u00cdLEN\u00cd: -Commands.Party.ItemShare=[[GRAY]]P\u0158EDM\u011aT [[DARK_AQUA]]({0}) -Commands.Party.ExpShare=[[GRAY]]EXP [[DARK_AQUA]]({0}) -Commands.Party.ItemShareCategories=[[DARK_GRAY]]Sd\u00edl\u00edm p\u0159edm\u011bty: [[GRAY]][[ITALIC]]{0} -Commands.Party.MembersNear=[[DARK_GRAY]]BL\u00cdZKO TEBE[[DARK_AQUA]]{0}[[DARK_GRAY]]/[[DARK_AQUA]]{1} +Commands.Notifications.Off=Oznamování schopností &cvypnuto +Commands.Notifications.On=Oznamování schopností &azapnuto +Commands.Offline=Tento příkaz nefunguje pro offline hráče. +Commands.Other=&a--OSTATNI PRIKAZY-- +Commands.Party.Header=-----[]&aPARTA&c[]----- +Commands.Party.Status=&8JMÉNO: &f{0} {1} +Commands.Party.ShareMode=&8MÓD SDÍLENÍ: +Commands.Party.ItemShare=&7PŘEDMĚT &3({0}) +Commands.Party.ExpShare=&7EXP &3({0}) +Commands.Party.ItemShareCategories=&8Sdílím předměty: &7&o{0} +Commands.Party.MembersNear=&8BLÍZKO TEBE&3{0}&8/&3{1} Commands.Party.Accept=- Potvrdit pozvanku do party -Commands.Party.Chat.Off=Chat jenom pro partu [[RED]]Vypnuty -Commands.Party.Chat.On=Party chat [[RED]]Off -Commands.Party.Commands=[[GREEN]]--P\u0158\u00cdKAZY PARTY-- -Commands.Party.Invite.0=VAROVANI: [[GREEN]]Obdrzel jsi pozvanku do party {0} od {1} -Commands.Party.Invite.1=Napi\u0161te [[GREEN]]/party accept[[YELLOW]] abyste p\u0159ijali pozv\u00e1nku -Commands.Party.Invite=- Poslat pozv\u00e1nku do party -Commands.Party.Join=[[GRAY]]P\u0159idal/a jste se do party: {0} -Commands.Party.Create=[[GRAY]]Vytvo\u0159ena parta: {0} -Commands.Party.Rename=[[GRAY]]Jm\u00e9no party zm\u011bn\u011bno na: [[WHITE]]{0} -Commands.Party.SetSharing=[[GRAY]]Parta {0} sd\u00edl\u00ed nastaven\u00ed na: [[DARK_AQUA]]{1} -Commands.Party.ToggleShareCategory=[[GRAY]]Sd\u00edlen\u00ed v\u011bc\u00ed v part\u011b pro [[GOLD]]{0} [[GRAY]]bylo [[DARK_AQUA]]{1} -Commands.Party.AlreadyExists=[[DARK_RED]]Parta {0} u\u017e existuje! +Commands.Party.Chat.Off=Chat jenom pro partu &cVypnuty +Commands.Party.Chat.On=Party chat &cOff +Commands.Party.Commands=&a--PŘÍKAZY PARTY-- +Commands.Party.Invite.0=VAROVANI: &aObdrzel jsi pozvanku do party {0} od {1} +Commands.Party.Invite.1=Napište &a/party accept&e abyste přijali pozvánku +Commands.Party.Invite=- Poslat pozvánku do party +Commands.Party.Join=&7Přidal/a jste se do party: {0} +Commands.Party.Create=&7Vytvořena parta: {0} +Commands.Party.Rename=&7Jméno party změněno na: &f{0} +Commands.Party.SetSharing=&7Parta {0} sdílí nastavení na: &3{1} +Commands.Party.ToggleShareCategory=&7Sdílení věcí v partě pro &6{0} &7bylo &3{1} +Commands.Party.AlreadyExists=&4Parta {0} už existuje! Commands.Party.Kick=Byl jsi vyhozen z party {0}! Commands.Party.Leave=Opustil jsi party -Commands.Party.Members.Header=-----[][[GREEN]]\u010cLENOV\u00c9[[RED]][]----- -Commands.Party.None=[RED]]Nejsi v zadne party. +Commands.Party.Members.Header=-----[]&aČLENOVÉ&c[]----- +Commands.Party.None=&cNejsi v zadne party. Commands.Party.Quit=- Opustil jsi svoji aktualni partu -Commands.Party.Teleport= [[RED]]- Teleport ke clenovi party +Commands.Party.Teleport= &c- Teleport ke clenovi party Commands.Party.Toggle=- Zapnout party chat -Commands.Party.1=- Vytvo\u0159en\u00ed nov\u00e9 party -Commands.Party.2=- P\u0159ipoj\u00ed se k hr\u00e1\u010dov\u011b part\u011b -Commands.ptp.Enabled=Teleportace paret [[GREEN]]zapnut\u00e1 -Commands.ptp.Disabled=Teleportace paret [[RED]]vypnut\u00e1 -Commands.ptp.NoRequests=V tuto chv\u00edli nem\u00e1te \u017e\u00e1dne po\u017eadavky o teleport -Commands.ptp.NoWorldPermissions=[mcMMO] Nem\u00e1\u0161 opr\u00e1vn\u011bn\u00ed pro teleportaci do sv\u011bta {0}. -Commands.ptp.Request1={0} [[GREEN]]po\u017e\u00e1dal ,aby se k v\u00e1m mohl teleportovat. -Commands.ptp.Request2=[[GREEN]]K teleportu napi\u0161te [[YELLOW]]/ptp accept. [[GREEN]]Po\u017eadavek vypr\u0161\u00ed za [[RED]]{0} [[GREEN]]sekund. -Commands.ptp.AcceptAny.Enabled=Potvrzen\u00ed teleportu party [[GREEN]]zapnut -Commands.ptp.AcceptAny.Disabled=Potvrzen\u00ed teleportu party [[RED]]vypnuto -Commands.ptp.RequestExpired=Po\u017eadavek o teleport party vypr\u0161el! -Commands.PowerLevel.Leaderboard=--mcMMO[[BLUE]] Rebricek [[YELLOW]]Celkovych levelu-- -Commands.PowerLevel.Capped=[[DARK_RED]]CELKOV\u00c1 \u00daROVE\u0147: [[GREEN]]{0} [[DARK_RED]]MAXIM\u00c1LN\u00cd \u00daROVE\u0147: [[YELLOW]]{1} -Commands.PowerLevel=[[DARK_RED]]CELKOVY LEVEL: [[GREEN]]{0} -Commands.Reset.All=[[GREEN]] Vsechny vase dovednosti byly uspesne resetov\u00e1ny. -Commands.Reset.Single=[[GREEN]]Tvoje dovednost {0} byla uspesne restartovana. -Commands.Reset=Resetov\u00e1n\u00ed zku\u0161enost\u00ed na level 0 +Commands.Party.1=- Vytvoření nové party +Commands.Party.2=- Připojí se k hráčově partě +Commands.ptp.Enabled=Teleportace paret &azapnutá +Commands.ptp.Disabled=Teleportace paret &cvypnutá +Commands.ptp.NoRequests=V tuto chvíli nemáte žádne požadavky o teleport +Commands.ptp.NoWorldPermissions=[mcMMO] Nemáš oprávnění pro teleportaci do světa {0}. +Commands.ptp.Request1={0} &apožádal ,aby se k vám mohl teleportovat. +Commands.ptp.Request2=&aK teleportu napište &e/ptp accept. &aPožadavek vyprší za &c{0} &asekund. +Commands.ptp.AcceptAny.Enabled=Potvrzení teleportu party &azapnut +Commands.ptp.AcceptAny.Disabled=Potvrzení teleportu party &cvypnuto +Commands.ptp.RequestExpired=Požadavek o teleport party vypršel! +Commands.PowerLevel.Leaderboard=--mcMMO&9 Rebricek &eCelkovych levelu-- +Commands.PowerLevel.Capped=&4CELKOVÁ ÚROVEŇ: &a{0} &4MAXIMÁLNÍ ÚROVEŇ: &e{1} +Commands.PowerLevel=&4CELKOVY LEVEL: &a{0} +Commands.Reset.All=&a Vsechny vase dovednosti byly uspesne resetovány. +Commands.Reset.Single=&aTvoje dovednost {0} byla uspesne restartovana. +Commands.Reset=Resetování zkušeností na level 0 Commands.Skill.Invalid=Neplatny nazev dovednosti! -Commands.Skill.Leaderboard=--mcMMO [[BLUE]]{0}[[YELLOW]] Tabulka nejlepsich-- -Commands.SkillInfo=- Shl\u00e9dnout detailn\u00ed informace o dovednosti +Commands.Skill.Leaderboard=--mcMMO &9{0}&e Tabulka nejlepsich-- +Commands.SkillInfo=- Shlédnout detailní informace o dovednosti Commands.Stats.Self=Tvoje statistiky -Commands.Stats=- Shl\u00e9dnout svoje mcMMO statistiky -Commands.ToggleAbility=- Aktivace schopnosti prav\u00fdm tla\u010d\u00edtkem. -Commands.Usage.0=Spr\u00e1vn\u00e9 pou\u017eit\u00ed je /{0} -Commands.Usage.1=Spr\u00e1vn\u00e9 pou\u017eit\u00ed je /{0} {1} -Commands.Usage.2=Spr\u00e1vn\u00e9 pou\u017eit\u00ed je /{0} {1} {2} -Commands.Usage.3=Spr\u00e1vn\u00e9 pou\u017eit\u00ed je /{0} {1} {2} {3} -Commands.Usage.Level=\u00darove\u0148 +Commands.Stats=- Shlédnout svoje mcMMO statistiky +Commands.ToggleAbility=- Aktivace schopnosti pravým tlačítkem. +Commands.Usage.0=Správné použití je /{0} +Commands.Usage.1=Správné použití je /{0} {1} +Commands.Usage.2=Správné použití je /{0} {1} {2} +Commands.Usage.3=Správné použití je /{0} {1} {2} {3} +Commands.Usage.Level=Úroveň Commands.Usage.Message=zprava Commands.Usage.Page=stranka -Commands.Usage.PartyName=jm\u00e9no +Commands.Usage.PartyName=jméno Commands.Usage.Password=heslo Commands.Usage.Player=hrac Commands.Usage.Rate=hodnota Commands.Usage.Skill=Dovednost -Commands.Usage.XP=Zku\u0161enostn\u00ed body +Commands.Usage.XP=Zkušenostní body mcMMO.NoInvites=Momentalne nemas zadne pozvanky -mcMMO.NoPermission=[[DARK_RED]]Nedostatecna prava -mcMMO.NoSkillNote=[[DARK_GRAY]]Pokud nemas pristup k schopnosti, nebude zobrazena. -Party.Forbidden=[mcMMO] Party nejsou povoleny (pod\u00edvej se do Povolen\u00ed) -Party.Help.0=Spr\u00e1vn\u00e9 pou\u017eit\u00ed je [[DARK_AQUA]]{0} [password]. -Party.Help.1=Pro vytvo\u0159en\u00ed party, pou\u017eij [[DARK_AQUA]]{0} [password]. -Party.Help.2=Pora\u010f se s [[DARK_AQUA]]{0} [[RED]]pro v\u00edce informac\u00ed -Party.Help.3=Pou\u017eij [[DARK_AQUA]]{0} [password] [[RED]]pro vstup nebo [[DARK_AQUA]]{1} [[RED]]pro opu\u0161t\u011bn\u00ed -Party.Help.4=Pro uzam\u010den\u00ed nebo odem\u010den\u00ed tv\u00e9 party, pou\u017eij [[DARK_AQUA]]{0} -Party.Help.5=Pro ochr\u00e1n\u011bn\u00ed va\u0161\u00ed party heslem, pou\u017eij [[DARK_AQUA]]{0} -Party.Help.6=Pro vykopnut\u00ed hr\u00e1\u010de z tv\u00e9 party, pou\u017eij [[DARK_AQUA]]{0} -Party.Help.7=Pro p\u0159esunut\u00ed v\u016fdcovstv\u00ed tv\u00e9 party, pou\u017eij [[DARK_AQUA]]{0} -Party.Help.8=Pro zru\u0161en\u00ed va\u0161\u00ed party pou\u017eij [[DARK_AQUA]]{0} -Party.Help.9=Pou\u017eijte[[DARK_AQUA]]{0} [[RED]]abyste sd\u00edlel v\u011bci se \u010dleny party. -Party.Help.10=Pou\u017eij [[DARK_AQUA]]{0} [[RED]]k zapnut\u00ed sd\u00edlen\u00ed zku\u0161enostn\u00edch bod\u016f se \u010dleny party -Party.InformedOnJoin={0} [[GREEN]]se p\u0159idal do va\u0161\u00ed party -Party.InformedOnQuit={0} [[GREEN]]opustil va\u0161\u00ed partu -Party.InformedOnNameChange=[[GOLD]]{0} [[GREEN]]nastavil jm\u00e9no party na [[WHITE]]{1} -Party.InvalidName=[[DARK_RED]]Toto nen\u00ed mo\u017en\u00e9 jm\u00e9no pro partu. -Party.Invite.Self=Nem\u016f\u017ee\u0161 pozvat s\u00e1m sebe! -Party.IsLocked=Tahla parta je ji\u017e uzamknuta! +mcMMO.NoPermission=&4Nedostatecna prava +mcMMO.NoSkillNote=&8Pokud nemas pristup k schopnosti, nebude zobrazena. +Party.Forbidden=[mcMMO] Party nejsou povoleny (podívej se do Povolení) +Party.Help.0=Správné použití je &3{0} [password]. +Party.Help.1=Pro vytvoření party, použij &3{0} [password]. +Party.Help.2=Poraď se s &3{0} &cpro více informací +Party.Help.3=Použij &3{0} [password] &cpro vstup nebo &3{1} &cpro opuštění +Party.Help.4=Pro uzamčení nebo odemčení tvé party, použij &3{0} +Party.Help.5=Pro ochránění vaší party heslem, použij &3{0} +Party.Help.6=Pro vykopnutí hráče z tvé party, použij &3{0} +Party.Help.7=Pro přesunutí vůdcovství tvé party, použij &3{0} +Party.Help.8=Pro zrušení vaší party použij &3{0} +Party.Help.9=Použijte&3{0} &cabyste sdílel věci se členy party. +Party.Help.10=Použij &3{0} &ck zapnutí sdílení zkušenostních bodů se členy party +Party.InformedOnJoin={0} &ase přidal do vaší party +Party.InformedOnQuit={0} &aopustil vaší partu +Party.InformedOnNameChange=&6{0} &anastavil jméno party na &f{1} +Party.InvalidName=&4Toto není možné jméno pro partu. +Party.Invite.Self=Nemůžeš pozvat sám sebe! +Party.IsLocked=Tahla parta je již uzamknuta! Party.IsntLocked=Tato parta je zamknuta! -Party.Locked=Parta je zamnuta, pouze velitel party t\u011b m\u016f\u017ee p\u0159izvat. -Party.NotInYourParty=[[DARK_RED]]{0} nen\u00ed ve tv\u00e9 part\u011b. -Party.NotOwner=[[DARK_RED]]Nejste v\u016fdcem party. -Party.Owner.New=[[GREEN]]{0} se stal v\u016fdce party. -Party.Owner.NotLeader=[[DARK_RED]]U\u017e nejsi v\u016fdce party. -Party.Owner.Player=[[GREEN]]Nyn\u00ed jsi v\u016fdce party. -Party.Password.None=Tato parta je zaheslov\u00e1na. Pros\u00edm napi\u0161te heslo pro vstup. -Party.Password.Incorrect=Heslo k part\u011b je \u0161patn\u011b! -Party.Password.Set=[[GREEN]]Heslo do party nastaveno na {0} -Party.Password.Removed=[[GREEN]]Heslo party bylo vy\u010di\u0161t\u011bno. +Party.Locked=Parta je zamnuta, pouze velitel party tě může přizvat. +Party.NotInYourParty=&4{0} není ve tvé partě. +Party.NotOwner=&4Nejste vůdcem party. +Party.Owner.New=&a{0} se stal vůdce party. +Party.Owner.NotLeader=&4Už nejsi vůdce party. +Party.Owner.Player=&aNyní jsi vůdce party. +Party.Password.None=Tato parta je zaheslována. Prosím napište heslo pro vstup. +Party.Password.Incorrect=Heslo k partě je špatně! +Party.Password.Set=&aHeslo do party nastaveno na {0} +Party.Password.Removed=&aHeslo party bylo vyčištěno. Party.Player.Invalid=Tohle neni platny hrac. -Party.NotOnline=[[DARK_RED]]{0} nen\u00ed online! -Party.Player.InSameParty={0} u\u017e je na va\u0161\u00ed party! -Party.PlayerNotInParty=[[DARK_RED]]{0} nen\u00ed na party -Party.Specify=Mus\u00ed\u0161 specifikovat partu. +Party.NotOnline=&4{0} není online! +Party.Player.InSameParty={0} už je na vaší party! +Party.PlayerNotInParty=&4{0} není na party +Party.Specify=Musíš specifikovat partu. Party.Teleport.Dead=Nemuzes se teleportovat k mrtvemu hraci. -Party.Teleport.Hurt=Byl jsi zran\u011bn v posledn\u00edch {0} sekund\u00e1ch a nem\u016f\u017ee\u0161 se teleportovat. -Party.Teleport.Player=[[GREEN]]Byl jsi teleportovan k {0}. -Party.Teleport.Self=Nem\u016f\u017ee\u0161 se teleportovat s\u00e1m na sebe! -Party.Teleport.Target=[[GREEN]]{0} se k tobe teleportoval. -Party.Teleport.Disabled={0} neumo\u017e\u0148uje teleportace paret -Party.Rename.Same=Toto u\u017e je jm\u00e9no va\u0161\u00ed party! -Party.Join.Self=Nem\u016f\u017ee\u0161 nabrat sebe! -Party.Unlocked=[[GRAY]]Party je odemknuta -Party.Disband=[[GRAY]]Parta se rozpadla -Party.Status.Locked=[[DARK_RED]](POUZE POZV\u00c1NKY) -Party.Status.Unlocked=[[DARK_GREEN]](OTEV\u0158\u00cdT) +Party.Teleport.Hurt=Byl jsi zraněn v posledních {0} sekundách a nemůžeš se teleportovat. +Party.Teleport.Player=&aByl jsi teleportovan k {0}. +Party.Teleport.Self=Nemůžeš se teleportovat sám na sebe! +Party.Teleport.Target=&a{0} se k tobe teleportoval. +Party.Teleport.Disabled={0} neumožňuje teleportace paret +Party.Rename.Same=Toto už je jméno vaší party! +Party.Join.Self=Nemůžeš nabrat sebe! +Party.Unlocked=&7Party je odemknuta +Party.Disband=&7Parta se rozpadla +Party.Status.Locked=&4(POUZE POZVÁNKY) +Party.Status.Unlocked=&2(OTEVŘÍT) Party.ShareType.Xp=EXP -Party.ShareType.Item=P\u0158EDM\u011aT -Party.ShareMode.None=\u017d\u00c1DN\u00dd -Party.ShareMode.Equal=STEJN\u00dd -Party.ShareMode.Random=N\u00c1HODN\u00dd -Party.XpShare.Disabled=Sd\u00edlen\u00ed party zku\u0161enost\u00ed je vypnuto. -Party.ItemShare.Disabled=Sd\u00edlen\u00ed item\u016f v part\u011b je zak\u00e1zan\u00e9. -Party.ItemShare.Category.Loot=Ko\u0159ist -Party.ItemShare.Category.Mining=T\u011b\u017een\u00ed -Party.ItemShare.Category.Herbalism=Bylink\u00e1\u0159stv\u00ed -Party.ItemShare.Category.Woodcutting=D\u0159evorubectv\u00ed -Party.ItemShare.Category.Misc=R\u016fzn\u00e9 +Party.ShareType.Item=PŘEDMĚT +Party.ShareMode.None=ŽÁDNÝ +Party.ShareMode.Equal=STEJNÝ +Party.ShareMode.Random=NÁHODNÝ +Party.XpShare.Disabled=Sdílení party zkušeností je vypnuto. +Party.ItemShare.Disabled=Sdílení itemů v partě je zakázané. +Party.ItemShare.Category.Loot=Kořist +Party.ItemShare.Category.Mining=Těžení +Party.ItemShare.Category.Herbalism=Bylinkářství +Party.ItemShare.Category.Woodcutting=Dřevorubectví +Party.ItemShare.Category.Misc=Různé Commands.XPGain.Acrobatics=Padani -Commands.XPGain.Archery=Zabijen\u00ed monster. +Commands.XPGain.Archery=Zabijení monster. Commands.XPGain.Axes=Utoceni na monstra -Commands.XPGain.Child=Z\u00edsk\u00e1v\u00e1 \u00farovn\u011b z rodi\u010dovsk\u00fdch dovednost\u00ed +Commands.XPGain.Child=Získává úrovně z rodičovských dovedností Commands.XPGain.Excavation=Kopani a nalezani pokladu Commands.XPGain.Fishing=Rybareni (Bez zjistit!) Commands.XPGain.Herbalism=Sklizeni rostlin @@ -527,121 +526,124 @@ Commands.XPGain.Repair=Opravovani Commands.XPGain.Swords=Zabijenim monster. Commands.XPGain.Taming=Ochoceni zvirat nebo boj s vlky Commands.XPGain.Unarmed=Zabijenim monster. -Commands.XPGain.Woodcutting=K\u00e1cen\u00ed strom\u016f -Commands.XPGain=[[DARK_GRAY]]Zisk dovednosti: [[WHITE]]{0} -Commands.xplock.locked=[[GOLD]]Tvuj XP bar byl uzamcen na {0}! -Commands.xplock.unlocked=[[GOLD]]Tvuj XP bar je nyni [[GREEN]]ODEMCEN[[GOLD]]! -Commands.xprate.modified=Sazba zku\u0161enostn\u00edch bod\u016f byla zm\u011bn\u011bna na {0} -Commands.xprate.over=mcMMO Event na XP N\u00e1sobek ZKON\u010cIL! +Commands.XPGain.Woodcutting=Kácení stromů +Commands.XPGain=&8Zisk dovednosti: &f{0} +Commands.xplock.locked=&6Tvuj XP bar byl uzamcen na {0}! +Commands.xplock.unlocked=&6Tvuj XP bar je nyni &aODEMCEN&6! +Commands.xprate.modified=Sazba zkušenostních bodů byla změněna na {0} +Commands.xprate.over=mcMMO Event na XP Násobek ZKONČIL! Commands.xprate.proper.0=Spravne pouziti prikazu pro zmenu sazby dovednosti je /xprate -Commands.xprate.proper.1=Spravne pou\u017eit\u00ed k obnov\u011b urovn\u011b XP na v\u00fdchoz\u00ed hodnotu je /xprate reset +Commands.xprate.proper.1=Spravne použití k obnově urovně XP na výchozí hodnotu je /xprate reset Commands.xprate.proper.2=Uvedte prosim true nebo false pro rozliseni zda-li se jedna o udalost na zisk dovednosti nebo ne -Commands.xprate.started.0=[[GOLD]]XP EVENT PRO mcMMO ZA\u010cAL! -Commands.xprate.started.1=[[GOLD]]mcMMO XP N\u00c1SOBEK JE NYN\u00cd {0}x! -XPRate.Event=[[GOLD]]mcMMO je nyni v modu zmeneneho pomeru ziskavani dovednosti! Nasobek pomeru dovednosti je {0}x! +Commands.xprate.started.0=&6XP EVENT PRO mcMMO ZAČAL! +Commands.xprate.started.1=&6mcMMO XP NÁSOBEK JE NYNÍ {0}x! +XPRate.Event=&6mcMMO je nyni v modu zmeneneho pomeru ziskavani dovednosti! Nasobek pomeru dovednosti je {0}x! Effects.Effects=EFEKTY -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.Available=[[GRAY]]N\u00e1vod k {0} - napi\u0161te /{1} ? [page] -Guides.Header=[[GOLD]]-=[[GREEN]]{0} N\u00e1vod[[GOLD]]=- -Guides.Page.Invalid=Nespr\u00e1vn\u00e9 \u010d\u00edslo str\u00e1nky! -Guides.Page.OutOfRange=Tato str\u00e1nka neexistuje, je tu pouze {0} str\u00e1nek. -Guides.Usage= Pou\u017eit\u00ed je /{0} ? [page] -Guides.Smelting.Section.0=Ji\u017e brzy... -Inspect.Offline=Nem\u00e1\u0161 pr\u00e1va kontrolovat hr\u00e1\u010de co nejsou online! -Inspect.OfflineStats=mcMMO Statistiky pro offline hrace [[YELLOW]]{0} -Inspect.Stats=[[GREEN]]mcMMO Statistiky pro [[YELLOW]]{0} -Inspect.TooFar=Jsi moc daleko pro prozkoum\u00e1n\u00ed tohoto hr\u00e1\u010de. -Item.ChimaeraWing.Fail=**K\u0158\u00cdDLO CHIM\u00c9RY SELHALO!** +Effects.Child=&8LVL: &a{0} +Effects.Level=&8LVL: &a{0} &3XP&e(&6{1}&e/&6{2}&e) +Effects.Parent=&6{0} - +Effects.Template=&3{0}: &a{1} +Guides.Available=&7Návod k {0} - napište /{1} ? [page] +Guides.Header=&6-=&a{0} Návod&6=- +Guides.Page.Invalid=Nesprávné číslo stránky! +Guides.Page.OutOfRange=Tato stránka neexistuje, je tu pouze {0} stránek. +Guides.Usage= Použití je /{0} ? [page] +Guides.Smelting.Section.0=Již brzy... +Inspect.Offline=Nemáš práva kontrolovat hráče co nejsou online! +Inspect.OfflineStats=mcMMO Statistiky pro offline hrace &e{0} +Inspect.Stats=&amcMMO Statistiky pro &e{0} +Inspect.TooFar=Jsi moc daleko pro prozkoumání tohoto hráče. +Item.ChimaeraWing.Fail=**KŘÍDLO CHIMÉRY SELHALO!** Item.ChimaeraWing.Pass=**KRIDLO CHIMERY** -Item.ChimaeraWing.Name=K\u0159\u00eddlo chim\u00e9ry -Item.ChimaeraWing.Lore=[[GRAY]]Teleportuje v\u00e1s k va\u0161\u00ed posteli. -Item.Generic.Wait=Mus\u00ed\u0161 po\u010dkat ne\u017e to zas bude\u0161 moci pou\u017e\u00edt! [[YELLOW]]({0}s) -Item.Injured.Wait=Predchvili jsi byl zranen a musis pockat az budes moci pouzit tuto schopnost. [[YELLOW]]({0}s) -Teleport.Commencing=[[GRAY]]Zah\u00e1jen\u00ed teleportu za[[GOLD]]({0}) [[GRAY]]sekund, pros\u00edm st\u016fj klidn\u011b... -Teleport.Cancelled=[[DARK_RED]]Teleportace zru\u0161ena -Skills.Child=[[GOLD]](D\u011btsk\u00e1 dovednost) -Skills.Disarmed=[[DARK_RED]]Byl jsi odzbrojen! -Skills.Header=-----[][[GREEN]]{0}[[RED]][]----- -Skills.NeedMore=[[DARK_RED]]Potrebujes vic -Skills.Parents=RODI\u010cE -Skills.Stats={0}[[GREEN]]{1}[[DARK_AQUA]] XP([[GRAY]]{2}[[DARK_AQUA]]/[[GRAY]]{3}[[DARK_AQUA]]) +Item.ChimaeraWing.Name=Křídlo chiméry +Item.ChimaeraWing.Lore=&7Teleportuje vás k vaší posteli. +Item.Generic.Wait=Musíš počkat než to zas budeš moci použít! &e({0}s) +Item.Injured.Wait=Predchvili jsi byl zranen a musis pockat az budes moci pouzit tuto schopnost. &e({0}s) +Teleport.Commencing=&7Zahájení teleportu za&6({0}) &7sekund, prosím stůj klidně... +Teleport.Cancelled=&4Teleportace zrušena +Skills.Child=&6(Dětská dovednost) +Skills.Disarmed=&4Byl jsi odzbrojen! +Skills.Header=-----[]&a{0}&c[]----- +Skills.NeedMore=&4Potrebujes vic +Skills.Parents=RODIČE +Skills.Stats={0}&a{1}&3 XP(&7{2}&3/&7{3}&3) Skills.TooTired=Si moc unaveny na pouziti teto schopnosti znovu. -Skills.Cancelled={0} zru\u0161eno! -Skills.ConfirmOrCancel=[[GREEN]Stiskn\u011bte znovu prav\u00e9 tla\u010d\u00edtko pro potvrzen\u00ed [[GOLD]]{0}[[GREEN]]. Lev\u00e9 tla\u010d\u00edtko ke zru\u0161en\u00ed. -Stats.Header.Combat=[[GOLD]]-=BOJOVE DOVEDNOSTI=- -Stats.Header.Gathering=[[GOLD]]-=SHROMAZDOVACI DOVEDNOSTI=- +Skills.Cancelled={0} zrušeno! +Skills.ConfirmOrCancel=&aStiskněte znovu pravé tlačítko pro potvrzení &6{0}&a. Levé tlačítko ke zrušení. +Stats.Header.Combat=&6-=BOJOVE DOVEDNOSTI=- +Stats.Header.Gathering=&6-=SHROMAZDOVACI DOVEDNOSTI=- Stats.Header.Misc=Ostatni schopnosti -Stats.Own.Stats=[[GREEN]][mcMMO] Statistiky -Perks.XP.Name=Zku\u0161enost +Stats.Own.Stats=&a[mcMMO] Statistiky +Perks.XP.Name=Zkušenost Perks.XP.Desc=Obdrzene {0}x Zkusenosti -Perks.Lucky.Name=\u0160test\u00ed -Perks.Lucky.Desc=D\u00e1v\u00e1 {0} dovednostem a schopnostem o 33,3% lep\u0161\u00ed \u0161anci na aktivaci. -Perks.Lucky.Desc.Login=D\u00e1v\u00e1 ur\u010dit\u00fdm dovednostem a schopnostem o 33,3% lep\u0161\u00ed \u0161anci na aktivaci. -Perks.Lucky.Bonus=[[GOLD]] ({0} s perkem \u0160\u0165astlivec) +Perks.Lucky.Name=Štestí +Perks.Lucky.Desc=Dává {0} dovednostem a schopnostem o 33,3% lepší šanci na aktivaci. +Perks.Lucky.Desc.Login=Dává určitým dovednostem a schopnostem o 33,3% lepší šanci na aktivaci. +Perks.Lucky.Bonus=&6 ({0} s perkem Šťastlivec) Perks.Cooldowns.Name=Rychle zotaveni -Perks.Cooldowns.Desc=Zmen\u0161\u00ed dobu znovunabit\u00ed schopnosti o {0}. +Perks.Cooldowns.Desc=Zmenší dobu znovunabití schopnosti o {0}. Perks.ActivationTime.Name=Vytrvalost -Perks.ActivationTime.Desc=Prodlu\u017euje pou\u017eit\u00ed schopnosti na {0} sekund. -Perks.ActivationTime.Bonus=[[GOLD]] ({0} s perkem V\u00fddr\u017enost) -MOTD.Donate=[[DARK_AQUA]]Informace o p\u0159\u00edsp\u011bvc\u00edch: -MOTD.Hardcore.DeathStatLoss.Stats=[[GOLD]][mcMMO] [[DARK_AQUA]]Dovednost\u00ed penalizace kv\u016fli smrti : [[DARK_RED]]{0}% -MOTD.Hardcore.Vampirism.Stats=[GOLD]][mcMMO] [[DARK_AQUA]]Up\u00edrsk\u00e9 Cizen\u00ed Stat\u016f: [[DARK_RED]]{0}% +Perks.ActivationTime.Desc=Prodlužuje použití schopnosti na {0} sekund. +Perks.ActivationTime.Bonus=&6 ({0} s perkem Výdržnost) +MOTD.Donate=&3Informace o příspěvcích: +MOTD.Hardcore.DeathStatLoss.Stats=&6[mcMMO] &3Dovedností penalizace kvůli smrti : &4{0}% +MOTD.Hardcore.Vampirism.Stats=&6[mcMMO] &3Upírské Cizení Statů: &4{0}% MOTD.PerksPrefix=[mcMMO Perky] -MOTD.Version=[[GOLD]][mcMMO] - verze [[DARK_AQUA]]{0} -MOTD.Website=[[GOLD]][mcMMO] [[GREEN]]{0}[[YELLOW]] - Web mcMMO -Smelting.Ability.FluxMining=\u0160ANCE NA T\u011a\u017dBU VRT\u00c1KEM: [[YELLOW]]{0} -Smelting.Ability.FuelEfficiency=N\u00e1sobi\u010d v\u00fdkonnosti paliva: [[YELLOW]]{0}x -Smelting.Ability.Locked.0=ZAM\u010cENO DOKU\u010e {0}+ DOVEDNOST (Z\u00c1KLADN\u00cd ZKU\u0160ENOSTN\u00cd ZES\u00cdLEN\u00cd) -Smelting.Ability.Locked.1=UZAM\u010cENO DOKU\u010e {0}+ DOVEDNOST (T\u011b\u017eba vrt\u00e1kem) -Smelting.Ability.SecondSmelt=\u0160ance na z\u00edsk\u00e1n\u00ed druh\u00e9 ztaveniny: [[YELLOW]]{0} -Smelting.Ability.VanillaXPBoost=N\u00c1SOBI\u010c ZKU\u0160ENOST\u00cd: [[YELLOW]]{0}x -Smelting.SubSkill.FuelEfficiency.Name=V\u00fdkonnost paliva -Smelting.SubSkill.FuelEfficiency.Description=Zvy\u0161uje dobu ho\u0159en\u00ed paliva v pec\u00edch p\u0159i taven\u00ed -Smelting.SubSkill.SecondSmelt.Name=Druh\u00e1 ztavenina -Smelting.SubSkill.SecondSmelt.Description=Zvy\u0161uje zdroje z\u00edskan\u00e9 z taven\u00ed -Smelting.Effect.4=Zku\u0161enostn\u00ed zes\u00edlen\u00ed z p\u016fvodn\u00edho minecraftu -Smelting.Effect.5=Zvy\u0161uje po\u010det zku\u0161enost\u00ed z\u00edskan\u00fdch p\u0159i taven\u00ed -Smelting.SubSkill.FluxMining.Name=T\u011b\u017eba Vrt\u00e1kem -Smelting.SubSkill.FluxMining.Description=\u0160ance aby byla ruda instant\u011b ztavena p\u0159i t\u011b\u017eb\u011b -Smelting.FluxMining.Success=[[GREEN]]Ta ruda se sama ztavila! -Smelting.Listener=Taven\u00ed: -Smelting.SkillName=TAVEN\u00cd -Commands.Description.addlevels=P\u0159id\u00e1v\u00e1 u\u017eivatelsk\u00e9 mcMMO \u00farovn\u011b -Commands.Description.adminchat=Zap\u00edn\u00e1/vyp\u00edn\u00e1 mcMMO administr\u00e1torsk\u00fd chat nebo odes\u00edl\u00e1 administr\u00e1torsk\u00e9 chatov\u00e9 zpr\u00e1vy -Commands.Description.addxp=P\u0159id\u00e1 u\u017eivateli mcMMO XP -Commands.Description.hardcore=Upravuje mcMMO hardcore procentu\u00e1lnost nebo zap\u00edn\u00e1/vyp\u00edn\u00e1 hardcore m\u00f3d -Commands.Description.inspect=Zobraz\u00ed detailn\u00ed mcMMO info jin\u00e9ho hr\u00e1\u010de -Commands.Description.mcability=Zap\u00edn\u00e1/vyp\u00edna p\u0159ipraven\u00ed mcMMO schopnost\u00ed kliknut\u00edm prav\u00e9ho tla\u010d\u00edtka my\u0161i -Commands.Description.mcgod=Zap\u00edn\u00e1/vyp\u00edn\u00e1 mcMMO nesmrteln\u00fd m\u00f3d -Commands.Description.mchud=Zm\u011bn\u00ed tv\u016fj mcMMO HUD styl -Commands.Description.mcmmo=Zobraz\u00ed stru\u010dn\u00fd popis mcMMO -Commands.Description.mcnotify=P\u0159ep\u00edn\u00e1 zobrazov\u00e1n\u00ed upozor\u0148ov\u00e1n\u00ed mcMMO schopnost\u00ed v chatu na zapnuto/vypnuto -Commands.Description.mcpurge=Pro\u010dist\u00ed u\u017eivatele bez mcMMO \u00farovn\u00ed a u\u017eivatele kter\u00e9 se nep\u0159ipojili za posledn\u00edch {0} m\u011bs\u00edc\u016f z mcMMO datab\u00e1ze. -Commands.Description.mcrank=Zobraz\u00ed hr\u00e1\u010dsk\u00e9 mcMMO \u017eeb\u0159\u00ed\u010dky -Commands.Description.mcrefresh=Obnovuje v\u0161echny mcMMO cooldowny -Commands.Description.mcremove=Odstranit u\u017eivatele z datab\u00e1ze mcMMO -Commands.Description.mcstats=Zobraz\u00ed tv\u00e9 mcMMO \u00farovn\u011b a XP -Commands.Description.mctop=Zobraz\u00ed mcMMO \u017eeb\u0159\u00ed\u010dky -Commands.Description.mmoedit=Upravuje u\u017eivatelsk\u00e9 mcMMO \u00farovn\u011b -Commands.Description.mmoupdate=P\u0159esouv\u00e1n\u00ed mcMMO datab\u00e1ze ze star\u00e9 do datab\u00e1ze nov\u00e9 -Commands.Description.mmoshowdb=Zobraz\u00ed n\u00e1zev aktu\u00e1ln\u00ed datab\u00e1ze (p\u0159\u00ed\u0161t\u011b pou\u017e\u00edjte /mmoupdate) -Commands.Description.party=Nastavuje r\u016fzn\u00e9 mcMMO nastaven\u00ed party -Commands.Description.partychat=Zap\u00edn\u00e1/vyp\u00edn\u00e1 mcMMO chat party nebo odes\u00edl\u00e1 chatov\u00e9 zpr\u00e1vy +MOTD.Version=&6[mcMMO] - verze &3{0} +MOTD.Website=&6[mcMMO] &a{0}&e - Web mcMMO +Smelting.Ability.FluxMining=ŠANCE NA TĚŽBU VRTÁKEM: &e{0} +Smelting.Ability.FuelEfficiency=Násobič výkonnosti paliva: &e{0}x +Smelting.Ability.Locked.0=ZAMČENO DOKUĎ {0}+ DOVEDNOST (ZÁKLADNÍ ZKUŠENOSTNÍ ZESÍLENÍ) +Smelting.Ability.Locked.1=UZAMČENO DOKUĎ {0}+ DOVEDNOST (Těžba vrtákem) +Smelting.Ability.SecondSmelt=Šance na získání druhé ztaveniny: &e{0} +Smelting.Ability.VanillaXPBoost=NÁSOBIČ ZKUŠENOSTÍ: &e{0}x +Smelting.SubSkill.FuelEfficiency.Name=Výkonnost paliva +Smelting.SubSkill.FuelEfficiency.Description=Zvyšuje dobu hoření paliva v pecích při tavení +Smelting.SubSkill.SecondSmelt.Name=Druhá ztavenina +Smelting.SubSkill.SecondSmelt.Description=Zvyšuje zdroje získané z tavení +Smelting.Effect.4=Zkušenostní zesílení z původního minecraftu +Smelting.Effect.5=Zvyšuje počet zkušeností získaných při tavení +Smelting.SubSkill.FluxMining.Name=Těžba Vrtákem +Smelting.SubSkill.FluxMining.Description=Šance aby byla ruda instantě ztavena při těžbě +Smelting.FluxMining.Success=&aTa ruda se sama ztavila! +Smelting.Listener=Tavení: +Smelting.SkillName=TAVENÍ +Commands.Description.addlevels=Přidává uživatelské mcMMO úrovně +Commands.Description.adminchat=Zapíná/vypíná mcMMO administrátorský chat nebo odesílá administrátorské chatové zprávy +Commands.Description.addxp=Přidá uživateli mcMMO XP +Commands.Description.hardcore=Upravuje mcMMO hardcore procentuálnost nebo zapíná/vypíná hardcore mód +Commands.Description.inspect=Zobrazí detailní mcMMO info jiného hráče +Commands.Description.mcability=Zapíná/vypína připravení mcMMO schopností kliknutím pravého tlačítka myši +Commands.Description.mcgod=Zapíná/vypíná mcMMO nesmrtelný mód +Commands.Description.mchud=Změní tvůj mcMMO HUD styl +Commands.Description.mcmmo=Zobrazí stručný popis mcMMO +Commands.Description.mcnotify=Přepíná zobrazování upozorňování mcMMO schopností v chatu na zapnuto/vypnuto +Commands.Description.mcpurge=Pročistí uživatele bez mcMMO úrovní a uživatele které se nepřipojili za posledních {0} měsíců z mcMMO databáze. +Commands.Description.mcrank=Zobrazí hráčské mcMMO žebříčky +Commands.Description.mcrefresh=Obnovuje všechny mcMMO cooldowny +Commands.Description.mcremove=Odstranit uživatele z databáze mcMMO +Commands.Description.mcstats=Zobrazí tvé mcMMO úrovně a XP +Commands.Description.mctop=Zobrazí mcMMO žebříčky +Commands.Description.mmoedit=Upravuje uživatelské mcMMO úrovně +Commands.Description.mmoupdate=Přesouvání mcMMO databáze ze staré do databáze nové +Commands.Description.mmoshowdb=Zobrazí název aktuální databáze (příště použíjte /mmoupdate) +Commands.Description.party=Nastavuje různé mcMMO nastavení party +Commands.Description.partychat=Zapíná/vypíná mcMMO chat party nebo odesílá chatové zprávy Commands.Description.ptp=Teleport k mcMMO clenovi party -Commands.Description.Skill=Zobraz\u00ed detailn\u00ed mcMMO informace o skillu {0} -Commands.Description.skillreset=Resetuje u\u017eivatelsk\u00e9 mcMMO \u00farovn\u011b -Commands.Description.vampirism=Upravuje mcMMO procenta up\u00edrstv\u00ed nebo zap\u00edn\u00e1/vyp\u00edna up\u00edrsk\u00fd m\u00f3d -Commands.Description.xplock=Nastav\u00ed tv\u016fj mcMMO XP bar na konkr\u00e9tn\u00ed mcMMO skill -Commands.Description.xprate=Upravuje mcMMO XP n\u00e1sobek nebo spou\u0161t\u00ed mcMMO XP ud\u00e1lost -UpdateChecker.Outdated=Pou\u017e\u00edv\u00e1\u0161 zastaralou verzi mcMMO! -UpdateChecker.NewAvailable=Nov\u00e1 verze dostupn\u00e1 na BukkitDevu. +Commands.Description.Skill=Zobrazí detailní mcMMO informace o skillu {0} +Commands.Description.skillreset=Resetuje uživatelské mcMMO úrovně +Commands.Description.vampirism=Upravuje mcMMO procenta upírství nebo zapíná/vypína upírský mód +Commands.Description.xplock=Nastaví tvůj mcMMO XP bar na konkrétní mcMMO skill +Commands.Description.xprate=Upravuje mcMMO XP násobek nebo spouští mcMMO XP událost +UpdateChecker.Outdated=Používáš zastaralou verzi mcMMO! +UpdateChecker.NewAvailable=Nová verze dostupná na BukkitDevu. Scoreboard.Header.PlayerStats=mcMMO Staty Scoreboard.Header.PlayerRank=mcMMO Ranky Scoreboard.Header.PlayerInspect=mcMMO Staty: Scoreboard.Misc.Level=Level -Scoreboard.Misc.CurrentXP=Aktualn\u00ed XP -Scoreboard.Misc.RemainingXP=Zb\u00fdvaj\u00edc\u00ed XP -Scoreboard.Misc.Overall=Celkov\u011b +Scoreboard.Misc.CurrentXP=Aktualní XP +Scoreboard.Misc.RemainingXP=Zbývající XP +Scoreboard.Misc.Overall=Celkově +Commands.XPBar.Usage=Proper usage is /mmoxpbar +Commands.Description.mmoxpbar=Player settings for mcMMO XP bars +Commands.Description.mmocompat=Information about mcMMO and whether or not its in compatibility mode or fully functional. diff --git a/src/main/resources/locale/locale_cy.properties b/src/main/resources/locale/locale_cy.properties index dd6fc8bd6..254a078d3 100644 --- a/src/main/resources/locale/locale_cy.properties +++ b/src/main/resources/locale/locale_cy.properties @@ -1,6 +1,6 @@ -Acrobatics.Ability.Proc=[[GREEN]]**Graceful Landing** -Acrobatics.Combat.Proc=[[GREEN]] **osgoi\'r** -Acrobatics.DodgeChance=Dodge Chance: [[YELLOW]]{0} +Acrobatics.Ability.Proc=&a**Graceful Landing** +Acrobatics.Combat.Proc=&a **osgoi\'r** +Acrobatics.DodgeChance=Dodge Chance: &e{0} Acrobatics.SubSkill.Roll.Name=Roll Acrobatics.SubSkill.Roll.Description=Reduces or Negates fall damage Acrobatics.SubSkill.GracefulRoll.Name=Graceful Roll @@ -8,14 +8,14 @@ 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.SubSkill.Roll.Chance=Roll Chance: &e{0} +Acrobatics.SubSkill.Roll.GraceChance=Graceful Roll Chance: &e{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.Combat.DazeChance=Chance to Daze: &e{0} +Archery.Combat.RetrieveChance=Chance to Retrieve Arrows: &e{0} +Archery.Combat.SkillshotBonus=Skill Shot Bonus Damage: &e{0} Archery.SubSkill.SkillShot.Name=Skill Shot Archery.SubSkill.SkillShot.Description=Increases damage done with bows Archery.SubSkill.Daze.Name=Daze (Players) @@ -30,14 +30,14 @@ 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.Ability.Lower=&7**YOU LOWER YOUR AXE** +Axes.Ability.Ready=&a**YOU READY YOUR AXE** +Axes.Combat.CritStruck=&4You were CRITICALLY hit! +Axes.Combat.CritChance=Chance to critically strike: &e{0} Axes.Combat.CriticalHit=CRITICAL HIT! -Axes.Combat.GI.Proc=[[GREEN]]**STRUCK WITH GREAT FORCE** +Axes.Combat.GI.Proc=&a**STRUCK WITH GREAT FORCE** Axes.Combat.GI.Struck= ** ** BRIFO GAN EFFAITH FWYAF -Axes.Combat.SS.Length=Skull Splitter Length: [[YELLOW]]{0}s +Axes.Combat.SS.Length=Skull Splitter Length: &e{0}s Axes.SubSkill.SkullSplitter.Name=Skull Splitter Axes.SubSkill.SkullSplitter.Description=Deal AoE Damage Axes.SubSkill.CriticalStrikes.Name=Critical Strikes @@ -52,31 +52,31 @@ 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.Skills.SS.Refresh=&a Eich &e Penglog Llorweddol &a gallu ei hadnewyddu! +Axes.Skills.SS.Other.Off=Skull Splitter&a has worn off for &e{0} +Axes.Skills.SS.Other.On=&a {0} &2 wedi defnyddio &c 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.Ability.Lower=&7**YOU LOWER YOUR SHOVEL** +Excavation.Ability.Ready=&a**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.Effect.Length=Giga Drill Breaker Length: &e{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.Skills.GigaDrillBreaker.On=&a**GIGA DRILL BREAKER ACTIVATED** +Excavation.Skills.GigaDrillBreaker.Refresh=&aYour &eGiga Drill Breaker &aability is refreshed! +Excavation.Skills.GigaDrillBreaker.Other.Off=Giga Drill Breaker&a has worn off for &e{0} +Excavation.Skills.GigaDrillBreaker.Other.On=&a{0}&2 has used &cGiga Drill Breaker! Excavation.Skillup=Excavation skill increased by {0}. Total ({1}) -Fishing.Ability.Info=Magic Hunter: [[GRAY]] **Improves With Treasure Hunter Rank** +Fishing.Ability.Info=Magic Hunter: &7 **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.Ability.Rank=Treasure Hunter Rank: &e{0}/5 +Fishing.Ability.TH.MagicRate=Magic Hunter Chance: &e{0} +Fishing.Ability.Shake=Shake Chance: &e{0} +Fishing.Ability.FD=Fisherman\'\'s Diet: &eRank {0} Fishing.SubSkill.TreasureHunter.Name=Treasure Hunter (Passive) Fishing.SubSkill.TreasureHunter.Description=Fish up misc. objects Fishing.SubSkill.MagicHunter.Name=Magic Hunter @@ -85,20 +85,20 @@ 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.Chance.Raining=&9 Rain Bonus Fishing.Listener=Fishing: -Fishing.Ability.TH.MagicFound=[[GRAY]]You feel a touch of magic with this catch... +Fishing.Ability.TH.MagicFound=&7You 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.DoubleDropChance=Double Drop Chance: &e{0} +Herbalism.Ability.GTe.Length=Green Terra Length: &e{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.Chance=Green Thumb Chance: &e{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.Ability.GTh.Stage=Green Thumb Stage: &e Crops grow in stage {0} +Herbalism.Ability.GTh=&a**GREEN THUMB** +Herbalism.Ability.Lower=&7**YOU LOWER YOUR HOE** +Herbalism.Ability.Ready=&a**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) @@ -110,17 +110,17 @@ 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.Skills.GTe.On=&a**GREEN TERRA ACTIVATED** +Herbalism.Skills.GTe.Refresh=&a Eich &e Green Terra &a gallu ei hadnewyddu! +Herbalism.Skills.GTe.Other.Off= Green terra &a wedi gwisgo i ffwrdd ar gyfer &e {0} +Herbalism.Skills.GTe.Other.On=&a{0}&2 has used &cGreen Terra! Herbalism.Skillup=Herbalism skill increased by {0}. Total ({1}) -Mining.Ability.Length= Hyd Torri\'r Super: [[YELLOW]] {0} s +Mining.Ability.Length= Hyd Torri\'r Super: &e {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.Ability.Lower=&7You lower your Pickaxe. +Mining.Ability.Ready=&a ** 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 @@ -131,21 +131,21 @@ 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.Effect.Decrease=Demolitions Expert Damage Decrease: &e{0} +Mining.Effect.DropChance=Double Drop Chance: &e{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.Skills.SuperBreaker.On=&a**SUPER BREAKER ACTIVATED** +Mining.Skills.SuperBreaker.Other.Off=Super Breaker&a has worn off for &e{0} +Mining.Skills.SuperBreaker.Other.On=&a{0}&2 has used &cSuper Breaker! +Mining.Skills.SuperBreaker.Refresh=&a Eich &e Super Torri\'r &a 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! +Mining.Blast.Boom=&7**BOOM** +Mining.Blast.Radius.Increase= Chwyth Cynnydd Radiws &e {0} +Mining.Blast.Rank=Blast Mining: &e Rank {0}/8 &7({1}) +Mining.Blast.Other.On=&a{0}&2 has used &cBlast Mining! +Mining.Blast.Refresh=&a Eich &e Mwyngloddio Chwyth &a gallu ei hadnewyddu! Repair.SubSkill.Repair.Name=Repair Repair.SubSkill.Repair.Description=Repair Tools & Armor Repair.SubSkill.GoldRepair.Name=Gold Repair ({0}+ SKILL) @@ -164,44 +164,44 @@ 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.Error=&4mcMMO encountered an error attempting to repair this item! +Repair.Listener.Anvil=&4You have placed an anvil, anvils can repair tools and armor. +Repair.Listener.Anvil2=&4You 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.Skills.AdeptSalvage=&4You\'re not skilled enough to Salvage items. +Repair.Skills.AdeptDiamond=&4 Dydych chi ddim yn ddigon medrus i drwsio Diemwnt. +Repair.Skills.AdeptGold=&4 Dydych chi ddim yn ddigon medrus i drwsio Aur. +Repair.Skills.AdeptIron=&4You\'re not skilled enough to repair Iron. +Repair.Skills.AdeptStone=&4 Dydych chi ddim yn ddigon medrus i drwsio cerrig. +Repair.Skills.Adept=You must be level &e{0}&c to repair &e{1} +Repair.Skills.FeltEasy=&7That felt easy. +Repair.Skills.FullDurability=&7That is at full durability. +Repair.Skills.SalvageSuccess=&7Item salvaged! +Repair.Skills.NotFullDurability=&4You can\'t salvage damaged items. +Repair.Skills.Mastery=Repair Mastery: &eExtra {0} durability restored +Repair.Skills.StackedItems=&4You can\'t repair stacked items. +Repair.Skills.Super.Chance=Super Repair Chance: &e{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.Chance.Downgrade=&7AF Downgrade Chance: &e{0}% +Repair.Arcane.Chance.Success=&7 Cyfradd Llwyddiant AF: &e {0}% Repair.Arcane.Downgrade=Arcane power has decreased for this item. -Repair.Arcane.Fail=P\u0175er dirgel wedi gadael yr eitem barhaol +Repair.Arcane.Fail=Pŵer 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! +Repair.Arcane.Perfect=&aYou have sustained the arcane energies in this item. +Repair.Arcane.Rank=Arcane Forging: &eRank {0}/4 +Swords.Ability.Lower=&7 ** I LEIHAU EICH CLEDDYF ** +Swords.Ability.Ready=&a ** CHI\'N BAROD EICH SWORD ** +Swords.Combat.Bleed.Chance=Bleed Chance: &e{0} +Swords.Combat.Bleed.Length=Bleed Length: &e{0} ticks +Swords.Combat.Bleed.Note=&7NOTE: &e1 Tick happens every 2 seconds +Swords.Combat.Bleeding.Started=&4 You\'re bleeding! +Swords.Combat.Bleeding.Stopped=&7 y gwaedu wedi &a rhoi\'r gorau i &7! +Swords.Combat.Bleeding=&a** GELYN GWAEDU\'N** +Swords.Combat.Counter.Chance=Counter Attack Chance: &e{0} +Swords.Combat.Counter.Hit=&4Hit with a counter-attack! +Swords.Combat.Countered=&a ** GWRTH-YMOSOD ** +Swords.Combat.SS.Struck=&4 Taro gan Streiciau danheddog! Swords.SubSkill.CounterAttack.Name=Counter Attack Swords.SubSkill.SerratedStrikes.Name=Serrated Strikes Swords.Effect.4=Serrated Strikes Bleed+ @@ -210,12 +210,12 @@ 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.Skills.SS.On=&a ** Streiciau danheddog actifadu ** +Swords.Skills.SS.Refresh=&aYour &eSerrated Strikes &aability is refreshed! +Swords.Skills.SS.Other.Off= Streiciau danheddog &a wedi gwisgo i ffwrdd ar gyfer &e {0} +Swords.Skills.SS.Other.On=&a {0} &2 wedi defnyddio &c Streiciau danheddog! Swords.Skillup=Swords skill increased by {0}. Total ({1}) -Swords.SS.Length=Serrated Strikes Length: [[YELLOW]]{0}s +Swords.SS.Length=Serrated Strikes Length: &e{0}s Taming.Ability.Bonus.0=Environmentally Aware Taming.Ability.Bonus.1=Wolves avoid danger Taming.Ability.Bonus.2=Ffwr Trwchus @@ -228,15 +228,15 @@ 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.Combat.Chance.Gore=Gore Chance: &e{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.CallOfTheWild.Description.2=&7COTW (Ocelot): Crouch and left-click with {0} Fish in hand +Taming.Effect.15=&7COTW (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 @@ -247,22 +247,22 @@ 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.Wolf=&8 Eich sgrialu i blaidd yn ôl i chi ... Taming.Listener=Taming: Taming.SkillName=TAMING -Taming.Skillup= sgiliau Ddofi cynyddu {0}.\u00a0Cyfanswm ({1}) -Taming.Summon.Complete=[[GREEN]]Summoning complete +Taming.Skillup= sgiliau Ddofi cynyddu {0}. Cyfanswm ({1}) +Taming.Summon.Complete=&aSummoning 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.Berserk.Length=Berserk Length: &e{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.Chance.ArrowDeflect= Saeth wyro cyfle: &e {0} +Unarmed.Ability.Chance.Disarm=Disarm Chance: &e{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.Ability.IronGrip.Defender=&aYour iron grip kept you from being disarmed! +Unarmed.Ability.Lower=&7**YOU LOWER YOUR FISTS** +Unarmed.Ability.Ready=&a**YOU READY YOUR FISTS** Unarmed.SubSkill.Berserk.Name=Berserk Unarmed.SubSkill.Berserk.Description=+50% DMG, Breaks weak materials Unarmed.SubSkill.Disarm.Name=Disarm (Players) @@ -274,15 +274,15 @@ 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.Skills.Berserk.On=&a**BERSERK ACTIVATED** +Unarmed.Skills.Berserk.Other.Off= arno\'i hun &a wedi gwisgo i ffwrdd ar gyfer &e {0} +Unarmed.Skills.Berserk.Other.On=&a {0} &2 wedi defnyddio &c arno\'i hun! +Unarmed.Skills.Berserk.Refresh=&aYour &eBerserk &aability 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.Chance.DDrop=Double Drop Chance: &e{0} +Woodcutting.Ability.Length=Tree Feller Length: &e{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 @@ -293,34 +293,34 @@ 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.On=&a**TREE FELLER ACTIVATED** +Woodcutting.Skills.TreeFeller.Refresh=&a Eich &e Feller Coed &a gallu ei hadnewyddu! +Woodcutting.Skills.TreeFeller.Other.Off= Feller Coed &a wedi gwisgo i ffwrdd ar gyfer &e {0} +Woodcutting.Skills.TreeFeller.Other.On=&a{0}&2 has used &cTree 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** +Ability.Generic.Refresh=&a**ABILITIES REFRESHED!** +Ability.Generic.Template.Lock=&7{0} +Ability.Generic.Template=&6{0}: &3{1} +Combat.ArrowDeflect=&f**ARROW DEFLECT** +Combat.BeastLore=&a ** bwystfil llên ** +Combat.BeastLoreHealth=&3 Iechyd (&a {0} &3 / {1}) +Combat.BeastLoreOwner=&3Owner (&c{0}&3) +Combat.Gore=&a**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! +Combat.TargetDazed=Target was &4Dazed +Combat.TouchedFuzzy=&4 cyffwrdd Fuzzy. Teimlo benysgafn. +Commands.addlevels.AwardAll.1=&aYou 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.1=&aYou 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.addxp.AwardAll=&aYou were awarded {0} experience in all skills! +Commands.addxp.AwardSkill=&aYou were awarded {0} experience in {1}! +Commands.Ability.Off=Ability use toggled &coff +Commands.Ability.On=Ability use toggled &aon +Commands.AdminChat.Off=Admin Sgwrs unig &c Oddi ar +Commands.AdminChat.On=Admin Chat only &aOn Commands.AdminToggle= - sgwrs gweinyddol Toggle Commands.Chat.Console=*Console* Commands.Disabled= Mae\'r gorchymyn yn anabl. @@ -328,45 +328,45 @@ 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= [[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= [[RED]]- Leaderboards -Commands.mcc.Header=---[][[YELLOW]]mcMMO Commands[[RED]][]--- +Commands.Inspect= &c- View detailed player info +Commands.Party.Invite.Accepted=&a Gwahodd Derbyniwyd. Yr ydych wedi ymuno parti {0} +Commands.Invite.Success=&aInvite sent successfully. +Commands.Leaderboards= &c- Leaderboards +Commands.mcc.Header=---[]&emcMMO Commands&c[]--- 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] [[RED]] - Targed addasu -Commands.mmoedit.Modified.1=[[GREEN]]Your level in {0} was set to {1}! +Commands.mcpurge.Success=&aThe database was successfully purged! +Commands.mcrank.Heading=&6-=PERSONAL RANKINGS=- +Commands.mcrank.Overall=Overall&a - &6Rank &f#&a{0} +Commands.mcrank.Player=TARGET: &f{0} +Commands.mcrank.Skill={0}&a - &6Rank &f#&a{1} +Commands.mcrank.Unranked=&fUnranked +Commands.mcremove.Success=&a{0} was successfully removed from the database! +Commands.mctop.Tip=&6Tip: Use &c/mcrank&6 to view all of your personal rankings! +Commands.mmoedit=[chwaraewr] &c - Targed addasu +Commands.mmoedit.Modified.1=&aYour 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.Other=&a--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.Chat.Off=Party Chat only &cOff +Commands.Party.Chat.On=Party Chat only &aOn +Commands.Party.Commands=&a--PARTY COMMANDS-- +Commands.Party.Invite.0= RHYBUDD: &a 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= [[RED]]- Teleport to party member +Commands.Party.Teleport= &c- 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.PowerLevel.Leaderboard=--mcMMO &9{0}&e Leaderboard-- +Commands.PowerLevel=&4POWER LEVEL: &a{0} +Commands.Reset.All=&aAll of your skill levels have been reset successfully. +Commands.Reset.Single=&aYour {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.Skill.Leaderboard=--mcMMO &9{0}&e Leaderboard-- Commands.Stats.Self=YOUR STATS Commands.Stats=- View your mcMMO stats Commands.ToggleAbility=- Toggle ability activation with right click @@ -380,26 +380,26 @@ 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. +mcMMO.NoPermission=&4Insufficient permissions. +mcMMO.NoSkillNote=&8If 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.InvalidName=&4That 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.NotInYourParty=&4{0} is not in your party +Party.NotOwner=&4You are not the party owner +Party.Owner.New=&a{0} is the new party leader. +Party.Owner.NotLeader=&4You are no longer the party leader. +Party.Owner.Player=&aYou are now the party leader. Party.Password.Incorrect=Party password is incorrect. -Party.Password.Set=[[GREEN]] Blaid cyfrinair wedi ei osod i {0} +Party.Password.Set=&a 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.Player=&aYou 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 +Party.Teleport.Target=&a {0} wedi teleported i chi. +Party.Unlocked=&7 Blaid yn cael ei gloi Commands.XPGain.Acrobatics=Falling Commands.XPGain.Archery=Attacking Monsters Commands.XPGain.Axes=Attacking Monsters @@ -409,59 +409,62 @@ 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.Taming=Anifeiliaid Taming, neu ymladd â\'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.XPGain=&8 Cael Profiad: &f {0} +Commands.xplock.locked=&6Your XP BAR is now locked to {0}! +Commands.xplock.unlocked=&6Your XP BAR is now &aUNLOCKED&6! 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 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! +Commands.xprate.started.0=&6XP EVENT FOR mcMMO HAS STARTED! +Commands.xprate.started.1=&6mcMMO XP RATE IS NOW {0}x! +XPRate.Event=&6 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]]=- +Effects.Level=&8LVL: &a{0} &3XP&e(&6{1}&e/&6{2}&e) +Effects.Template=&3{0}: &a{1} +Guides.Available=&7Guide for {0} available - type /{1} ? [page] +Guides.Header=&6-=&a{0} Guide&6=- 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.OfflineStats=mcMMO Stats for Offline Player &e{0} +Inspect.Stats=&amcMMO Stats for &e{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 +Item.Injured.Wait=You were injured recently and must wait to use this. &e({0}s) +Skills.Disarmed=&4 Rydych wedi cael eich diarfogi! +Skills.Header=-----[]&a{0}&c[]----- +Skills.NeedMore=&4 y bydd angen mwy o &7{0} +Skills.Stats={0}&a{1}&3 XP(&7{2}&3/&7{3}&3) +Skills.TooTired= Yr ydych yn rhy flinedig i ddefnyddio\'r gallu eto. &e({0}s) +Stats.Header.Combat=&6 - = GWRTHSEFYLL SGILIAU = - +Stats.Header.Gathering=&6 -= CASGLU SGILIAU = = - +Stats.Header.Misc=&6-=MISC SKILLS=- +Stats.Own.Stats=&a[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.Lucky.Bonus=&6 ({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}% +Perks.ActivationTime.Bonus=&6 ({0}s with Endurance Perk) +MOTD.Donate=&3Donation Info: +MOTD.Hardcore.DeathStatLoss.Stats=&6[mcMMO] &3Skill Death Penalty: &4{0}% +MOTD.Hardcore.Vampirism.Stats=&6[mcMMO] &3Vampirism Stat Leech: &4{0}% MOTD.PerksPrefix=[mcMMO Perks] -MOTD.Version=[[GOLD]][mcMMO] Running version [[DARK_AQUA]]{0} -MOTD.Website=[[GOLD]][mcMMO] [[GREEN]]{0}[[YELLOW]] - mcMMO Website +MOTD.Version=&6[mcMMO] Running version &3{0} +MOTD.Website=&6[mcMMO] &a{0}&e - mcMMO Website Skills.AbilityGateRequirementFail= Smelting.SubSkill.UnderstandingTheArt.Name= +Commands.XPBar.Usage=Proper usage is /mmoxpbar +Commands.Description.mmoxpbar=Player settings for mcMMO XP bars +Commands.Description.mmocompat=Information about mcMMO and whether or not its in compatibility mode or fully functional. diff --git a/src/main/resources/locale/locale_da.properties b/src/main/resources/locale/locale_da.properties index 087f11d89..6207fe433 100644 --- a/src/main/resources/locale/locale_da.properties +++ b/src/main/resources/locale/locale_da.properties @@ -1,376 +1,376 @@ -Acrobatics.Ability.Proc=[[GREEN]]**Yndefuld Landing** -Acrobatics.Combat.Proc=[[GREEN]]**Undviget** -Acrobatics.DodgeChance=Afv\u00e6rgnings Chance: [[YELLOW]]{0} +Acrobatics.Ability.Proc=&a**Yndefuld Landing** +Acrobatics.Combat.Proc=&a**Undviget** +Acrobatics.DodgeChance=Afværgnings Chance: &e{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.GracefulRoll.Description=Dobbelt så effektiv som en normal rulning +Acrobatics.SubSkill.Dodge.Name=Afværg 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.SubSkill.Roll.Chance=Rulle Chance: &e{0} +Acrobatics.SubSkill.Roll.GraceChance=Yndefuldt Rul Chance: &e{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} +Acrobatics.Skillup=Akrobatik evne forøget med {0}. Total ({1}) +Archery.Combat.DazeChance=Chance for at blive forvirret: &e{0} +Archery.Combat.RetrieveChance=Chance for at Genbruge Pile: &e{0} +Archery.Combat.SkillshotBonus=Skyde Evne Bonus Skade: &e{0} Archery.SubSkill.SkillShot.Name=Evne Skud -Archery.SubSkill.SkillShot.Description=For\u00f8ger skade for\u00e5rsaget med buer +Archery.SubSkill.SkillShot.Description=Forøger skade forårsaget 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 +Archery.Skillup=Bueskydnings evne forøget med {0}. Total ({1}) +Axes.Ability.Bonus.0=Økse 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.Ability.Bonus.3=Påfør {0} Bonus Skade til rustning +Axes.Ability.Bonus.4=Større Slag +Axes.Ability.Bonus.5=Påfør {0} Bonus Skade til ubevæbnede fjender +Axes.Ability.Lower=&7**DU SÆNKER DIN ØKSE** +Axes.Ability.Ready=&a**DU GØR DIN ØKSE KLAR** +Axes.Combat.CritStruck=&4Du er blevet KRITISK ramt! +Axes.Combat.CritChance=Chance for at ramme kritisk: &e{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.Combat.GI.Proc=&a**RAMT AF STOR KRAFT** +Axes.Combat.GI.Struck=**RAMT AF STØRRE SLAG** +Axes.Combat.SS.Length=Kranie Splitter Længde: &e{0}s Axes.SubSkill.SkullSplitter.Name=Kranie Splitter (Evne) -Axes.SubSkill.SkullSplitter.Description=For\u00e5rsag Omr\u00e5de Skade +Axes.SubSkill.SkullSplitter.Description=Forårsag Område 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.AxeMastery.Name=Økse Mestring +Axes.SubSkill.AxeMastery.Description=Tilføjer 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.SubSkill.GreaterImpact.Name=Større Slag +Axes.SubSkill.GreaterImpact.Description=Giv bonus skade til ubevæbnede fjender +Axes.Listener=Økser: +Axes.SkillName=ØKSER 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** +Axes.Skills.SS.On=&a**Kranie Knuser AKTIVERET** +Axes.Skills.SS.Refresh=&aDin &eKranie Splitter &aevne er genindlæst! +Axes.Skills.SS.Other.Off=Kranie Knuser&a er aftaget i &e{0} +Axes.Skills.SS.Other.On=&a{0}&2 har brugt &cKranie Splitter! +Axes.Skillup=Økse evner forbedret med {0}. Ialt ({1}) +Excavation.Ability.Lower=&7**DU SÆNKER DIN SKOVL** +Excavation.Ability.Ready=&a**DU GØR 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.Name=Skatte Jæger Excavation.SubSkill.TreasureHunter.Description=Evne til at grave efter skatte -Excavation.Effect.Length=Giga Borer L\u00e6ngde: [[YELLOW]]{0}s +Excavation.Effect.Length=Giga Borer Længde: &e{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) +Excavation.Skills.GigaDrillBreaker.On=&a**Super Bor AKTIVERET** +Excavation.Skills.GigaDrillBreaker.Refresh=&aDin &eGiga Borer &aevne er genindlæst! +Excavation.Skills.GigaDrillBreaker.Other.Off=Giga Borer&a er aftaget i &e{0} +Excavation.Skills.GigaDrillBreaker.Other.On=&a{0}&2 har brugt &cGiga Borer! +Excavation.Skillup=Udgravningsevne forøget med {0}. Total ({1}) +Fishing.Ability.Info=Magisk Jæger: &7 **Forbedres med skattejagts ranken** +Fishing.Ability.Locked.0=LÅST INDTIL {0}+ EVNE (RYST) +Fishing.Ability.Rank=Skatte Jæger Rank: &e{0}/5 +Fishing.Ability.TH.MagicRate=Magi Jæger Chance: &e{0} +Fishing.Ability.Shake=Ryste Chance: &e{0} +Fishing.Ability.FD=Fiskers Diet: &eRank {0} +Fishing.SubSkill.TreasureHunter.Name=Skatte Jæger (Passiv) Fishing.SubSkill.TreasureHunter.Description=Fisk diverse objekter op. -Fishing.SubSkill.MagicHunter.Name=Magi J\u00e6ger +Fishing.SubSkill.MagicHunter.Name=Magi Jæger Fishing.SubSkill.MagicHunter.Description=Find Fortryllede Ting. -Fishing.SubSkill.Shake.Name=Ryst (Mod V\u00e6sner) +Fishing.SubSkill.Shake.Name=Ryst (Mod Væsner) 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.Chance.Raining=&9 Regn Bonus Fishing.Listener=Fiskeri: -Fishing.Ability.TH.MagicFound=[[GRAY]]Du f\u00f8ler et strejf a magi med denne fangst... +Fishing.Ability.TH.MagicFound=&7Du føler 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) +Fishing.Skillup=Fisker evne forøget med {0}. Total ({1}) +Herbalism.Ability.DoubleDropChance=2x Tabs Chance: &e{0} +Herbalism.Ability.GTe.Length=Grøn Terra Længde: &e{0}s +Herbalism.Ability.GTe.NeedMore=Du mangler flere frø for at sprede Grøn Terra. +Herbalism.Ability.GTh.Chance=Grønne Fingre Chance: &e{0} +Herbalism.Ability.GTh.Fail=**GRØNNE FINGRE MISLYKKEDES** +Herbalism.Ability.GTh.Stage=Grønne Fingre Stadie: &e Planter gror i stadie {0} +Herbalism.Ability.GTh=&a**GRØNNE FINGRE** +Herbalism.Ability.Lower=&7**DU SÆNKER DIt LUGEJERN** +Herbalism.Ability.Ready=&a**DU GØR DIT LUGEJERN KLAR** +Herbalism.SubSkill.GreenTerra.Name=Grøn 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.GreenThumb.Name=Grønne Fingre (Hvede) +Herbalism.SubSkill.GreenThumb.Description=Auto-Planter afgrøder mens du høster +Herbalism.SubSkill.GreenThumb.Description.2=Lav Mursten Mossede, eller få græs 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.SubSkill.DoubleDrops.Description=Gør din normale udbytte dobblet så 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.Skills.GTe.On=&a**GRØN TERRA AKTIVERET** +Herbalism.Skills.GTe.Refresh=&aDin &eGrønne Terra &aevne er genindlæst! +Herbalism.Skills.GTe.Other.Off=Grøn Terra&a er aftaget i &e{0} +Herbalism.Skills.GTe.Other.On=&a{0}&2 har brugt &cGrøn 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.Ability.Length=Super Ødelægger Længde: &e{0}s +Mining.Ability.Locked.0=LÅST INDTIL {0}+ EVNE (BLAST MINING) +Mining.Ability.Locked.1=LÅST INDTIL {0}+ EVNE (STØRRE BOMBER) +Mining.Ability.Locked.2=LÅST INDTIL {0}+ EVNE (NEDRIVNINGS EXPERTISE) +Mining.Ability.Lower=&7**DU SÆNKER DIN HAKKE** +Mining.Ability.Ready=&a**DU GØR DIN HAKKE KLAR** +Mining.SubSkill.SuperBreaker.Name=Super Ødelægger (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.Name=Større 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.Effect.Decrease=Nedrivingings Expert Skade nedsættelse: &e{0} +Mining.Effect.DropChance=2x Tabs Chance: &e{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! +Mining.Skills.SuperBreaker.Off=**Super Ødelægger er aftaget** +Mining.Skills.SuperBreaker.On=&a**SUPER ØDELÆGGER AKTIVERET** +Mining.Skills.SuperBreaker.Other.Off=Super Ødelægger&a er aftaget i &e{0} +Mining.Skills.SuperBreaker.Other.On=&a{0}&2 har brugt &cSuper Ødelægger! +Mining.Skills.SuperBreaker.Refresh=&aDin &eSuper Smadrer &aevne er genindlæst! +Mining.Skillup=Minedriftsevne forøget med {0}. Total ({1}) +Mining.Blast.Boom=&7**BOOM** +Mining.Blast.Radius.Increase=Eksplosions Radius Forøgelse: &e+{0} +Mining.Blast.Rank=Blast Mining: &e Rank {0}/8 &7({1}) +Mining.Blast.Other.On=&a{0}&2 her brugt &cBlast Mining! +Mining.Blast.Refresh=&aDin &eSpring Mining &aevne er genindlæst! Repair.SubSkill.Repair.Name=Reparer -Repair.SubSkill.Repair.Description=Reparer V\u00e6rkt\u00f8jer & Rustning +Repair.SubSkill.Repair.Description=Reparer Værktøjer & Rustning Repair.SubSkill.GoldRepair.Name=Guld Reparer ({0}+ EVNE) -Repair.SubSkill.GoldRepair.Description=Reparer Guld V\u00e6rkt\u00f8jer & Rustning +Repair.SubSkill.GoldRepair.Description=Reparer Guld Værktøjer & Rustning Repair.SubSkill.IronRepair.Name=Jern Reparer ({0}+ EVNE) -Repair.SubSkill.IronRepair.Description=Reparer Jern V\u00e6rkt\u00f8jer & Rustning +Repair.SubSkill.IronRepair.Description=Reparer Jern Værktøjer & Rustning Repair.SubSkill.StoneRepair.Name=Sten Reparer ({0}+ EVNE) -Repair.SubSkill.StoneRepair.Description=Reparer Sten V\u00e6rkt\u00f8jer +Repair.SubSkill.StoneRepair.Description=Reparer Sten Værktøjer Repair.SubSkill.RepairMastery.Name=Reperations Beherskelse -Repair.SubSkill.RepairMastery.Description=For\u00f8get reperations m\u00e6ngde +Repair.SubSkill.RepairMastery.Description=Forøget reperations mængde 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.DiamondRepair.Description=Reparer Diamant Værktøjer & 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.SubSkill.Salvage.Description=Genbrugelige Værktøjer og Rustninger +Repair.Error=&4mcMMO mødte en fejl mens den forsøgte at reparere dette objekt! +Repair.Listener.Anvil=&4Du har placeret en armbolt, armbolte kan reparere værktøj og rustning. +Repair.Listener.Anvil2=&4Du har placeret en Genbrugs Ambolt, Brug den til at Genbruge Værktøjer og Rustning (Få 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.Skills.AdeptSalvage=&4 Du har ikke Evner nok til at bruge Genbrug på Objekter. +Repair.Skills.AdeptDiamond=&4Du er ikke kvalificeret nok til at reparere diamant. +Repair.Skills.AdeptGold=&4Du er ikke kvalificeret nok til at reparere guld. +Repair.Skills.AdeptIron=&4Du har ikke evner nok til at reparere Jern. +Repair.Skills.AdeptStone=&4Du er ikke kvalificeret nok til at reparere sten. +Repair.Skills.Adept=Du skal være level &e{0}&c for at reparere &e{1} +Repair.Skills.FeltEasy=&7Det var nemt. +Repair.Skills.FullDurability=&7Det er på fuld holdbarhed +Repair.Skills.SalvageSuccess=&7Genstand genbrugt! +Repair.Skills.NotFullDurability=&4Du kan ikke genbruge ødelagte værktøjer og rustninger. +Repair.Skills.Mastery=Reperations Beherskelse: &eExtra {0} Modstand gendannet +Repair.Skills.StackedItems=&4Du kan ikke reparere ting i stabler. +Repair.Skills.Super.Chance=Super Reparerings Chance: &e{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.Chance.Downgrade=&7AF Degraderings Chance: &e{0}% +Repair.Arcane.Chance.Success=&7AF Success Ratio: &e{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! +Repair.Arcane.Perfect=&aDu har vedligeholdt de magiske energier i dette objekt. +Repair.Arcane.Rank=Magisk Smedning: &eRank {0}/4 +Swords.Ability.Lower=&7**DU SÆNKER DIT SVÆRD** +Swords.Ability.Ready=&a**DU HAR FORBEREDT DIT SVÆRD** +Swords.Combat.Bleed.Chance=Bløde Chance: &e{0} +Swords.Combat.Bleed.Length=Blødnings Længde: &e{0} ticks +Swords.Combat.Bleed.Note=&7NOTER: &e1 Tick sker hver 2 sekund +Swords.Combat.Bleeding.Started=&4 Du Bløder! +Swords.Combat.Bleeding.Stopped=&7Blødningen er &astoppet&7! +Swords.Combat.Bleeding=&a**MODSTANDEREN BLØDER** +Swords.Combat.Counter.Chance=Modangrebs Chance: &e{0} +Swords.Combat.Counter.Hit=&4Angrib med et modangreb! +Swords.Combat.Countered=&a**MODANGREBET** +Swords.Combat.SS.Struck=&4Ramt af Fægtekunstens Sår! 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 +Swords.SubSkill.SerratedStrikes.Name=FægteKunst (Evne) +Swords.Effect.4=FægteKunst Blødning+ +Swords.SubSkill.Bleed.Name=Bløde +Swords.SubSkill.Bleed.Description=Sæt en Blødning med skade over tid (DoT=Skade over tid) +Swords.Listener=Sværd: +Swords.SkillName=SVÆRD +Swords.Skills.SS.Off=**Fokuseret Fægtekunst er aftaget** +Swords.Skills.SS.On=&a**FÆGTEKUNST AKTIVERET** +Swords.Skills.SS.Refresh=&aDin &eFægtekunst &aevne er genindlæst! +Swords.Skills.SS.Other.Off=Fægtekunst&a er aftaget i &e{0} +Swords.Skills.SS.Other.On=&a{0}&2 har brugt &cFÆGTEKUNST! +Swords.Skillup=Sværd evne forøget med {0}. Total ({1}) +Swords.SS.Length=Fægtekunstens Længde: &e{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.6=Skærpet Kløer 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.Ability.Locked.0=LÅST INDTIL {0}+ EVNE (OMGIVELSES BEVIDST) +Taming.Ability.Locked.1=LÅST INDTIL {0}+ EVNE (TYK PELS) +Taming.Ability.Locked.2=LÅST INDTIL {0}+ EVNE (SHOCK SIKKER) +Taming.Ability.Locked.3=LÅST INDTIL {0}+ EVNE (SKÆRPEDE KLØER) +Taming.Ability.Locked.4=LÅST INDTIL {0}+ EVNE (FAST FOOD SERVICE) +Taming.Combat.Chance.Gore=Spidnings Chance: &e{0} +Taming.SubSkill.BeastLore.Name=&a**TIGGENDE MONSTER** +Taming.SubSkill.BeastLore.Description=Slå på 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.CallOfTheWild.Description.2=&7COTW (Ocelot): Crouch og venstre-click med {0} en Fisk i hånden +Taming.Effect.15=&7COTW (Wolf): Crouch og venstre-click med {0} Knogler i din hånd. 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.FastFoodService.Description=Chance for Ulve liver op når de angriber +Taming.SubSkill.Gore.Name=Mål Punkt. +Taming.SubSkill.Gore.Description=Kritisk slag some får dig til at Bløde +Taming.SubSkill.SharpenedClaws.Name=Skærpet Kløer 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 +Taming.Listener.Wolf=&8Din ulv smutter tilbage til dig... +Taming.Listener=Tæmning: +Taming.SkillName=TÆMMER +Taming.Skillup=Tæmningsevne forøget med {0}. Total ({1}) +Taming.Summon.Complete=&aSkabelse Komplet +Taming.Summon.Fail.Ocelot=Der er for mange Ocelotter i nærheden af dig til at du kan spawne flere. +Taming.Summon.Fail.Wolf=Der er for mange Ulve i nærheden af dig til at du kan spawne flere. +Unarmed.Ability.Berserk.Length=Berserker Længde: &e{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.Chance.ArrowDeflect=Pile Undvignings Chance: &e{0} +Unarmed.Ability.Chance.Disarm=Afvæbnings Chance: &e{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.Ability.IronGrip.Defender=&aDit Jerngreb lod dig modstå afvæbning! +Unarmed.Ability.Lower=&7**DU SÆNKER DINE NÆVER** +Unarmed.Ability.Ready=&a**DU KLARGØR DIN NÆVE** 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.Berserk.Description=+50% skade, ødelægger svage materialer +Unarmed.SubSkill.Disarm.Name=Afvæbn (Spiller) +Unarmed.SubSkill.Disarm.Description=Få objektet i din fjendes hånd til at ryge ned på jorden. Unarmed.SubSkill.IronArmStyle.Name=Jern Arm Stil -Unarmed.SubSkill.IronArmStyle.Description=Forst\u00e6rker din arm over tiden +Unarmed.SubSkill.IronArmStyle.Description=Forstærker 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.Listener=Ubevæbnet: +Unarmed.SkillName=UBEVÆBNET 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 +Unarmed.Skills.Berserk.On=&a**BERSERKER AKTIVERET** +Unarmed.Skills.Berserk.Other.Off=Berserker&a er aftaget i &e{0} +Unarmed.Skills.Berserk.Other.On=&a{0}&2 har brugt &cBerserker! +Unarmed.Skills.Berserk.Refresh=&aDine &eBerserker &aevner er genindlæst! +Unarmed.Skillup=Ubevæbnet evne forøget med {0}. Total ({1}) +Woodcutting.Ability.0=Blad Blæser +Woodcutting.Ability.1=Blæs blade væk +Woodcutting.Ability.Chance.DDrop=2x Tabs Chance: &e{0} +Woodcutting.Ability.Length=Træ Hugger Længde: &e{0}s +Woodcutting.Ability.Locked.0=LÅST INDTIL {0}+ EVNE (BLAD BLÆSER) +Woodcutting.SubSkill.TreeFeller.Name=Træ Hugger (EVNE) +Woodcutting.SubSkill.TreeFeller.Description=Får træer til at explodere +Woodcutting.SubSkill.LeafBlower.Name=Blad Blæser +Woodcutting.SubSkill.LeafBlower.Description=Spræng blade væk 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** +Woodcutting.Listener=Træfældning: +Woodcutting.SkillName=TRÆFÆLDNING +Woodcutting.Skills.TreeFeller.Off=**Træ Hugger er nu aftaget** +Woodcutting.Skills.TreeFeller.On=&a**TRÆ HUGGER AKTIVERET** +Woodcutting.Skills.TreeFeller.Refresh=&aDin &eTræ Hugger &aevne er genindlæst! +Woodcutting.Skills.TreeFeller.Other.Off=Træ hugger&a er aftaget i &e{0} +Woodcutting.Skills.TreeFeller.Other.On=&a{0}&2 har brugt &cTræ hugger! +Woodcutting.Skills.TreeFeller.Splinter=DIN ØKSE SPLINTRER I TUSINDER AF STYKKER! +Woodcutting.Skills.TreeFeller.Threshold=Det træ er for stort! +Woodcutting.Skillup=Træhugningsevne forøget med {0}. Total ({1}) +Ability.Generic.Refresh=&a**EVNER GENINDLÆST!** +Ability.Generic.Template.Lock=&7{0} +Ability.Generic.Template=&6{0}: &3{1} +Combat.ArrowDeflect=&f**UNDVIGER PIL** +Combat.BeastLore=&a**TIGGENDE MONSTER** +Combat.BeastLoreHealth=&3Liv (&a{0}&3/{1}) +Combat.BeastLoreOwner=&3Ejer (&c{0}&3) +Combat.Gore=&a**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 +Combat.TargetDazed=Målet er nu &4Bedøvet +Combat.TouchedFuzzy=&4Rørte Plysse. Følte mig svimmel. +Commands.addlevels.AwardAll.1=&aDu har fået {0} Exp i alle evner! +Commands.addlevels.AwardAll.2=Alle evner er blevet ændret til {0}. +Commands.addlevels.AwardSkill.1=&aDu har fået{0} levels i {1}! +Commands.addlevels.AwardSkill.2={0} er blevet ændret for {1}. +Commands.addxp.AwardAll=&aDu har fået {0} Exp i alle evner! +Commands.addxp.AwardSkill=&aDu har fået {0} Exp i {1}! +Commands.Ability.Off=Evne brug sat til &aSand +Commands.Ability.On=Evne brug sat til &aSand +Commands.AdminChat.Off=Admin Chat kun &cSlukket +Commands.AdminChat.On=Kun Admin Chat &aRigtigt Commands.AdminToggle=- Skift admin chatten Commands.Chat.Console=*Konsol* -Commands.Disabled=Denne kommando er sl\u00e5et fra. +Commands.Disabled=Denne kommando er slået 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= [[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= [[RED]]- Ranglister -Commands.mcc.Header=---[][[YELLOW]]mcMMO Kommandoer[[RED]][]--- +Commands.Inspect= &c- Se detaljeret spiller Info +Commands.Party.Invite.Accepted=&aInvitation Accepteret. Du har sluttet dig til en gruppe {0} +Commands.Invite.Success=&aInvitation sendt successfuldt +Commands.Leaderboards= &c- Ranglister +Commands.mcc.Header=---[]&emcMMO Kommandoer&c[]--- 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] [[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.mcpurge.Success=&aDatabasen er blevet succesfuldt renset! +Commands.mcrank.Heading=&6-=PERSONLIGE RANGLISTER=- +Commands.mcrank.Overall=Overall&a - &6Rang &f#&a{0} +Commands.mcrank.Player=MÅL: &f{0} +Commands.mcrank.Skill={0}&a - &6Rang &f#&a{1} +Commands.mcrank.Unranked=&fDegraderet +Commands.mcrefresh.Success={0}\'\'s nedkøling er blevet genindlæst. +Commands.mcremove.Success=&a{0} er succesfuldt fjernet fra databasen! +Commands.mctop.Tip=&6Tip: Brug &c/mcrank&6 for at se all dine personlige rangs! +Commands.mmoedit=[player] &c - Ændrer målet +Commands.mmoedit.Modified.1=&aDit level i {0} er sat til {1}! +Commands.mmoedit.Modified.2={0} er blevet ændret for {1}. +Commands.ModDescription=- Læs den korte mod beskrivelse Commands.NoConsole=Denne kommando er ikke supported af konsollen. -Commands.Other=[[GREEN]]--ANDRE KOMMANDOER-- +Commands.Other=&a--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.Chat.Off=Gruppe Chat kun &cSlukket +Commands.Party.Chat.On=Kun Gruppe Chat &aRigtigt +Commands.Party.Commands=&a--GRUPPE KOMMANDOER-- +Commands.Party.Invite.0=INFORMATION: &aDu 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= [[RED]]- Teleporter til gruppe medlem +Commands.Party.Quit=- Forlad din nuværende Gruppe +Commands.Party.Teleport= &c- 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.PowerLevel.Leaderboard=--mcMMO&9 Kraft Level &eRangliste-- +Commands.PowerLevel.Capped=&4KRAFT LEVEL: &a{0} &4MAX LEVEL: &e{1} +Commands.PowerLevel=&4Kraft level: &a{0} +Commands.Reset.All=&aDine {0} Evne levels er blevet gendannet succesfuldt +Commands.Reset.Single=&aDine {0} Evne levels er blevet gendannet succesfuldt +Commands.Reset=Genindlæs en evnes level til 0 Commands.Skill.Invalid=Det er ikke et brugbart evnenavn! -Commands.Skill.Leaderboard=--mcMMO [[BLUE]]{0}[[YELLOW]] Rangliste-- +Commands.Skill.Leaderboard=--mcMMO &9{0}&e Rangliste-- Commands.Stats.Self=DINE STATS Commands.Stats=- Se dine mcMMO statistikker. -Commands.ToggleAbility=- Skift evne aktivering med h\u00f8jre-click +Commands.ToggleAbility=- Skift evne aktivering med højre-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} @@ -380,27 +380,27 @@ 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. +mcMMO.NoInvites= Du har ingen invitationer på nuværende tidspunkt +mcMMO.NoPermission=&4Ikke nok Tilladelser. +mcMMO.NoSkillNote=&8Hvis 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.InvalidName=&4Dette er ikke et gruppe navn. +Party.IsLocked=Denne gruppe er allerede låst! +Party.IsntLocked=Denne gruppe er ikke låst! +Party.Locked=Festen er låst, kun gruppe lederen kan invitere. +Party.NotInYourParty=&4{0} er ikke i din gruppe +Party.NotOwner=&4Du er ikke gruppe lederen. +Party.Owner.New=&a{0} er den nye gruppe leder. +Party.Owner.NotLeader=&4Du er ikke længere gruppens leder. +Party.Owner.Player=&aDu er nu gruppe lederen. Party.Password.Incorrect=Gruppe kodeord er forkert. -Party.Password.Set=[[GREEN]]Gruppe adgangskode sat til {0} +Party.Password.Set=&aGruppe 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.Dead=Du kan ikke teleportere til en død spiller. +Party.Teleport.Player=&aDu 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 +Party.Teleport.Target=&a{0} har teleporteret til dig. +Party.Unlocked=&7Gruppe er åben Commands.XPGain.Acrobatics=Falder Commands.XPGain.Archery=Angriber Monstre Commands.XPGain.Axes=Angriver Monstre @@ -410,57 +410,60 @@ 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.Taming=Dyretæmning, 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 -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! +Commands.XPGain.Woodcutting=Hugger træer ned +Commands.XPGain=&8XP FORTJENST: &f{0} +Commands.xplock.locked=&6Din XP BAR er nu låst til {0}! +Commands.xplock.unlocked=&6Din XP BAR er nu &aÅBEN&6! +Commands.xprate.modified=The XP er blevet ændret til {0} +Commands.xprate.over=mcMMO XP bedømnings begivenhed er SLUT!! +Commands.xprate.proper.0=Den rigtige måde at ændre XP ratio er /xprate +Commands.xprate.proper.1=Rigtig brug for at sætte XP level til 0 er /xprate reset +Commands.xprate.proper.2=Vælg sandt eller falsk for at vise om dette er en XP begivenhed eller ikke +Commands.xprate.started.0=&6XP BEGIVENHEDER FOR mcMMO ER STARTET! +Commands.xprate.started.1=&6mcMMO XP BEDØMMELSE ER NU {0}x! +XPRate.Event=&6mcMMO er lige nu i gang med et XP bedømnings begivenhed! XP bedømning 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]]=- +Effects.Level=&8LVL: &a{0} &3XP&e(&6{1}&e/&6{2}&e) +Effects.Template=&3{0}: &a{1} +Guides.Available=&7Guide for {0} tilgængelige - skriv /{1} ? [page] +Guides.Header=&6-=&a{0} Guide&6=- 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]]) +Inspect.OfflineStats=mcMMO Stats for Offline Spillere &e{0} +Inspect.Stats=&amcMMO Færdigheder for &e{0} +Inspect.TooFar=Du er for langt væk til at inspicere denne spiller! +Item.ChimaeraWing.Fail=**KIMÆRE VINGE FEJLEDE!** +Item.ChimaeraWing.Pass=**KIMÆRE VINGE** +Item.Injured.Wait=Du var for nylig skadet og må derfor vente med at bruge dette. &e({0}s) +Skills.Disarmed=&4Du er blevet afvæbnet! +Skills.Header=-----[]&a{0}&c[]----- +Skills.NeedMore=&4Du mangler mere +Skills.Stats={0}&a{1}&3 XP(&7{2}&3/&7{3}&3) 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 +Stats.Header.Combat=&6-=KAMP EVNER=- +Stats.Header.Gathering=&6-=INDSAMLINGS EVNER=- +Stats.Header.Misc=&6-=MISC SKILLS=- +Stats.Own.Stats=&a[mcMMO] Færdigheder 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.Lucky.Bonus=&6 ({0} med heldig frynsegode) Perks.Cooldowns.Name=Hurtig Bedring -Perks.Cooldowns.Desc=Sk\u00e6rer Nedk\u00f8lings tiden ned med {0}. +Perks.Cooldowns.Desc=Skærer Nedkølings 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}% +Perks.ActivationTime.Desc=Forlænger evne aktivations tid med {0} sekunder +Perks.ActivationTime.Bonus=&6 ({0}s med Udholdenheds Frynsegode) +MOTD.Donate=&3Donations Info: +MOTD.Hardcore.DeathStatLoss.Stats=&6[mcMMO] &3Evne døds straf: &4{0}% +MOTD.Hardcore.Vampirism.Stats=&6[mcMMO] &3Vampyr Statistik Igle: &4{0}% MOTD.PerksPrefix=[mcMMO Frynsegoder] -MOTD.Version=[[GOLD]][mcMMO] K\u00f8rer version [[DARK_AQUA]]{0} -MOTD.Website=[[GOLD]][mcMMO] [[GREEN]]{0}[[YELLOW]] - mcMMO Hjemmeside +MOTD.Version=&6[mcMMO] Kører version &3{0} +MOTD.Website=&6[mcMMO] &a{0}&e - mcMMO Hjemmeside +Commands.XPBar.Usage=Proper usage is /mmoxpbar +Commands.Description.mmoxpbar=Player settings for mcMMO XP bars +Commands.Description.mmocompat=Information about mcMMO and whether or not its in compatibility mode or fully functional. diff --git a/src/main/resources/locale/locale_de.properties b/src/main/resources/locale/locale_de.properties index 4a1fb3f96..a820ad309 100644 --- a/src/main/resources/locale/locale_de.properties +++ b/src/main/resources/locale/locale_de.properties @@ -1,1034 +1,1096 @@ -Ability.Generic.Refresh = &a**Deine F\u00E4higkeiten sind wieder bereit** -Ability.Generic.Template = &3{0}: &a{1} +Ability.Generic.Refresh = &a**Deine Fähigkeiten sind wieder bereit** +Ability.Generic.Template = &3{0}: &a{1} Ability.Generic.Template.Custom = &3{0} -Ability.Generic.Template.Lock = &7{0} +Ability.Generic.Template.Lock = &7{0} -Acrobatics.Ability.Proc = &a&o**Du bist Anmutig Gelandet** -Acrobatics.Combat.Proc = &a&o**Du bist Ausgewichen** -Acrobatics.Listener = Akrobatik: -Acrobatics.Roll.Text = &a&o**Du hast dich abgerollt** -Acrobatics.SkillName = Akrobatik -Acrobatics.SubSkill.Dodge.Description = Reduziert den erhaltenen Angriffsschaden um die H\u00E4lfte. -Acrobatics.SubSkill.Dodge.Name = Ausweichen -Acrobatics.SubSkill.Dodge.Stat = Chance Auszuweichen -Acrobatics.SubSkill.GracefulRoll.Description = Doppelt so Effektiv wie normales Abrollen. -Acrobatics.SubSkill.GracefulRoll.Name = Anmutiges Abrollen -Acrobatics.SubSkill.Roll.Chance = Chance Abzurollen: &e{0} -Acrobatics.SubSkill.Roll.Description = Lande gezielt, um deinen Fallschaden zu reduzieren. -Acrobatics.SubSkill.Roll.GraceChance = Chance Anmutig Abzurollen: &e{0} -Acrobatics.SubSkill.Roll.Mechanics = &7Abrollen ist eine aktive F\u00E4higkeit mit einem passiven Teil. Immer, wenn du Fallschaden nimmst, gibt es eine Chance, dass der Schaden reduziert wird, je nachdem wie hoch dein Akrobatik Level ist. Auf Level 50 hast du eine &e{0}%&7 Chance, den Schaden zu reduzieren bzw. &e{1}%&7 wenn Anmutiges Abrollen aktiviert wird. Die ErfolgsChance steigt linear bis Level &e{2}&7, auf welchem es seinen maximalen Wert erreicht. Jedes Akrobatik Level gibt dir eine &e{3}%&7 Chance zum erfolgreichen Abrollen. H\u00E4lst du im Fall die Duck-Taste (Standardm\u00E4\u00DFig Shift), aktivierst du Anmutiges Abrollen, welches den Fallschaden um noch mehr Schaden reduzieren oder sogar komplett verhindern kann. Normales Abrollen wird maximal &c{4}&7 Schaden verhindern, Anmutiges Abrollen bis zu &a{5}&7. -Acrobatics.SubSkill.Roll.Name = Abrollen -Acrobatics.SubSkill.Roll.Stat = Chance Abzurollen -Acrobatics.SubSkill.Roll.Stat.Extra = Chance Anmutig Abzurollen -Acrobatics.SubSkill.Roll.Stats = &6Chance Abzurollen &e{0}% &6Chance Anmutig Abzurollen &e{1}% +Acrobatics.Ability.Proc = &a&o**Du bist anmutig gelandet** +Acrobatics.Combat.Proc = &a&o**Du bist ausgewichen** +Acrobatics.Listener = Akrobatik: +Acrobatics.Roll.Text = &a&o**Du hast dich abgerollt** +Acrobatics.SkillName = Akrobatik +Acrobatics.SubSkill.Dodge.Description = Reduziert den erhaltenen Angriffsschaden um die Hälfte. +Acrobatics.SubSkill.Dodge.Name = Ausweichen +Acrobatics.SubSkill.Dodge.Stat = Chance auszuweichen +Acrobatics.SubSkill.GracefulRoll.Description = Doppelt so effektiv wie normales Abrollen. +Acrobatics.SubSkill.GracefulRoll.Name = Anmutiges Abrollen +Acrobatics.SubSkill.Roll.Chance = Chance abzurollen: &e{0} +Acrobatics.SubSkill.Roll.Description = Lande gezielt, um deinen Fallschaden zu reduzieren. +Acrobatics.SubSkill.Roll.GraceChance = Chance anmutig abzurollen: &e{0} +Acrobatics.SubSkill.Roll.Mechanics = &7Abrollen ist eine aktive Fähigkeit mit einem passiven Teil. Immer, wenn du Fallschaden nimmst, gibt es eine Chance, dass der Schaden reduziert wird, je nachdem wie hoch dein Akrobatik-Level ist. Auf Level 50 hast du eine &e{0}%&7 Chance, den Schaden zu reduzieren bzw. &e{1}%&7 wenn Anmutiges Abrollen aktiviert wird. Die Erfolgschance steigt linear bis Level &e{2}&7, auf welchem es seinen maximalen Wert erreicht. Jedes Akrobatik-Level gibt dir eine &e{3}%&7 Chance zum erfolgreichen Abrollen. Hältst du im Fall die Duck-Taste (standardmäßig Shift), aktivierst du Anmutiges Abrollen, welches den Fallschaden auf noch weniger Schaden reduzieren oder sogar komplett verhindern kann. Normales Abrollen wird maximal &c{4}&7 Schaden verhindern, Anmutiges Abrollen bis zu &a{5}&7. +Acrobatics.SubSkill.Roll.Name = Abrollen +Acrobatics.SubSkill.Roll.Stat = Chance abzurollen +Acrobatics.SubSkill.Roll.Stat.Extra = Chance anmutig abzurollen +Acrobatics.SubSkill.Roll.Stats = &6Chance abzurollen &e{0}% &6Chance anmutig abzurollen &e{1}% -Alchemy.Ability.Locked.0 = &cGesperrt bis Level {0}! -Alchemy.Listener = Alchemie: -Alchemy.SkillName = Alchemie -Alchemy.SubSkill.Catalysis.Description = Erh\u00F6ht die Braugeschwindigkeit von Tr\u00E4nken. -Alchemy.SubSkill.Catalysis.Name = Katalyse -Alchemy.SubSkill.Catalysis.Stat = Braugeschwindigkeit -Alchemy.SubSkill.Concoctions.Description = Braue Tr\u00E4nke mit neuen Zutaten. -Alchemy.SubSkill.Concoctions.Name = Gebr\u00E4u -Alchemy.SubSkill.Concoctions.Stat = Gebr\u00E4u Rang: &a{0}&3/&a{1} -Alchemy.SubSkill.Concoctions.Stat.Extra = Zutaten [&a{0}&3]: &a{1} +Alchemy.Ability.Locked.0 = &cGesperrt bis Level {0}! +Alchemy.Listener = Alchemie: +Alchemy.SkillName = Alchemie +Alchemy.SubSkill.Catalysis.Description = Erhöht die Braugeschwindigkeit von Tränken. +Alchemy.SubSkill.Catalysis.Name = Katalyse +Alchemy.SubSkill.Catalysis.Stat = Braugeschwindigkeit +Alchemy.SubSkill.Concoctions.Description = Braue Tränke mit neuen Zutaten. +Alchemy.SubSkill.Concoctions.Name = Gebräu +Alchemy.SubSkill.Concoctions.Stat = Gebräu Rang: &a{0}&3/&a{1} +Alchemy.SubSkill.Concoctions.Stat.Extra = Zutaten [&a{0}&3]: &a{1} -Anvil.Unbreakable = Dieses Item ist unzerst\u00F6rbar! +Anvil.SingleItemStack = &cDu kannst nicht mehrere Items gleichzeitig zerlegen oder reparieren, versuche es erstmal mit einem einzelnen Item. +Anvil.Unbreakable = Dieses Item ist unzerstörbar! -Archery.Listener = Bogenschie\u00DFen: -Archery.SkillName = Bogenschie\u00DFen -Archery.SubSkill.ArcheryLimitBreak.Description = \u00DCberschreite deine Grenzen. -Archery.SubSkill.ArcheryLimitBreak.Name = \u00DCberwindung -Archery.SubSkill.ArcheryLimitBreak.Stat = Bonus Schaden durch \u00DCberwindung -Archery.SubSkill.ArrowRetrieval.Description = Chance, Pfeile von Leichen zur\u00FCck zu gewinnen -Archery.SubSkill.ArrowRetrieval.Name = Pfeilbergung -Archery.SubSkill.ArrowRetrieval.Stat = Chance, Pfeile zu bergen -Archery.SubSkill.Daze.Description = Verwirrt Feinde und f\u00FCgt Bonus Schaden zu. -Archery.SubSkill.Daze.Name = Bet\u00E4ubung -Archery.SubSkill.Daze.Stat = Chance, zu bet\u00E4uben -Archery.SubSkill.SkillShot.Description = Erh\u00F6ht den von B\u00F6gen erteilten Schaden. -Archery.SubSkill.SkillShot.Name = Skillshot -Archery.SubSkill.SkillShot.Stat = Skillshot Bonus Schaden +Archery.Listener = Bogenschießen: +Archery.SkillName = Bogenschießen +Archery.SubSkill.ArcheryLimitBreak.Description = Überschreite deine Grenzen. +Archery.SubSkill.ArcheryLimitBreak.Name = Überwindung +Archery.SubSkill.ArcheryLimitBreak.Stat = Bonus-Schaden durch Überwindung +Archery.SubSkill.ArrowRetrieval.Description = Chance, Pfeile von Leichen zurück zu gewinnen. +Archery.SubSkill.ArrowRetrieval.Name = Pfeilbergung +Archery.SubSkill.ArrowRetrieval.Stat = Chance, Pfeile zu bergen +Archery.SubSkill.Daze.Description = Verwirrt Feinde und fügt Bonus-Schaden zu. +Archery.SubSkill.Daze.Name = Betäubung +Archery.SubSkill.Daze.Stat = Chance, zu betäuben +Archery.SubSkill.SkillShot.Description = Erhöht den von Bögen erteilten Schaden. +Archery.SubSkill.SkillShot.Name = Skillshot +Archery.SubSkill.SkillShot.Stat = Skillshot Bonus-Schaden -Axes.Ability.Bonus.0 = Axtmeister -Axes.Ability.Bonus.1 = {0} Bonus Schaden. -Axes.Ability.Bonus.2 = R\u00FCstungsbruch -Axes.Ability.Bonus.3 = Verursacht {0} Bonus Schaden gegen R\u00FCstungen. -Axes.Ability.Bonus.4 = Wuchtschlag -Axes.Ability.Bonus.5 = Verursacht {0} Bonus Schaden gegen Gegner ohne R\u00FCstung. -Axes.Ability.Lower = &7Du senkst deine Axt wieder. -Axes.Ability.Ready = &3Du &6hebst&3 deine Axt... -Axes.Combat.CritStruck = &cDu wurdest &4SCHWER &cverwundet! -Axes.Combat.CriticalHit = &4&lKRITISCHER TREFFER! -Axes.Combat.GI.Proc = &a**Du landest einen &2GEWALTIGEN &aSchlag** -Axes.Combat.GI.Struck = &a&o**Von einem Wucht Schlag getroffen** -Axes.Combat.SS.Struck = &4&o**Von einem Sch\u00E4delspalter getroffen** -Axes.Listener = Axtkampf: -Axes.SkillName = Axtkampf -Axes.Skills.SS.Off = &a&o**Sch\u00E4delspalter wurde abgenutzt** -Axes.Skills.SS.On = &a&o**Sch\u00E4delspalter aktiviert!** -Axes.Skills.SS.Other.Off = &2Sch\u00E4delspalter &aist abgenutzt f\u00FCr &e{0} -Axes.Skills.SS.Other.On = &a{0} hat &cSch\u00E4delspalter &2benutzt! -Axes.Skills.SS.Refresh = &aDein &eSch\u00E4delspalter &aist wieder bereit! -Axes.SubSkill.ArmorImpact.Description = Treffe mit gen\u00FCgend Gewalt um R\u00FCstungen zu zerschmettern. -Axes.SubSkill.ArmorImpact.Name = R\u00FCstungsbruch -Axes.SubSkill.AxeMastery.Description = Verursacht Bonus Schaden. -Axes.SubSkill.AxeMastery.Name = Axtmeister -Axes.SubSkill.AxesLimitBreak.Description = \u00DCberschreite deine Grenzen. -Axes.SubSkill.AxesLimitBreak.Name = \u00DCberwindung -Axes.SubSkill.AxesLimitBreak.Stat = Bonus Schaden durch \u00DCberwindung +Axes.Ability.Bonus.0 = Axtmeister +Axes.Ability.Bonus.1 = {0} Bonus-Schaden. +Axes.Ability.Bonus.2 = Rüstungsbruch +Axes.Ability.Bonus.3 = Verursacht {0} Bonus-Schaden gegen Rüstungen. +Axes.Ability.Bonus.4 = Wuchtschlag +Axes.Ability.Bonus.5 = Verursacht {0} Bonus-Schaden gegen Gegner ohne Rüstung. +Axes.Ability.Lower = &7&o**Du senkst deine Axt.** +Axes.Ability.Ready = &a&o**Du hebst deine Axt...** +Axes.Ability.Ready.Extra = &3Du &6hebst&3 deine Axt. &7({0} ist für {1}s pausiert) +Axes.Combat.CritStruck = &cDu wurdest &4schwer &cverwundet! +Axes.Combat.CriticalHit = &4Kritischer Treffer! +Axes.Combat.GI.Proc = &a**Du landest einen &2gewaltigen &aSchlag** +Axes.Combat.GI.Struck = &a&o**Von einem Wuchtschlag getroffen** +Axes.Combat.SS.Struck = &a&o**Von einem Schädelspalter getroffen** +Axes.Listener = Axtkampf: +Axes.SkillName = Axtkampf +Axes.Skills.SS.Off = &a&o**Schädelspalter wurde abgenutzt** +Axes.Skills.SS.On = &a&o**Schädelspalter aktiviert!** +Axes.Skills.SS.Other.Off = &2Schädelspalter &aist abgenutzt für &e{0}. +Axes.Skills.SS.Other.On = &a{0} hat &cSchädelspalter &2benutzt! +Axes.Skills.SS.Refresh = &aDein &eSchädelspalter &aist wieder bereit! +Axes.SubSkill.ArmorImpact.Description = Treffe mit genügend Gewalt um Rüstungen zu zerschmettern. +Axes.SubSkill.ArmorImpact.Name = Rüstungsbruch +Axes.SubSkill.AxeMastery.Description = Verursacht Bonus-Schaden. +Axes.SubSkill.AxeMastery.Name = Axtmeister +Axes.SubSkill.AxesLimitBreak.Description = Überschreite deine Grenzen. +Axes.SubSkill.AxesLimitBreak.Name = Überwindung +Axes.SubSkill.AxesLimitBreak.Stat = Bonus-Schaden durch Überwindung Axes.SubSkill.CriticalStrikes.Description = Doppelter Schaden. -Axes.SubSkill.CriticalStrikes.Name = Kritischer Treffer -Axes.SubSkill.CriticalStrikes.Stat = Chance f\u00FCr kritischen Treffer -Axes.SubSkill.GreaterImpact.Description = Zusatzschaden gegen Feinde ohne R\u00FCstung. -Axes.SubSkill.GreaterImpact.Name = Wuchtschlag -Axes.SubSkill.SkullSplitter.Description = Verursacht einen Fl\u00E4chenschaden. -Axes.SubSkill.SkullSplitter.Name = Sch\u00E4delspalter -Axes.SubSkill.SkullSplitter.Stat = Sch\u00E4delspalter L\u00E4nge +Axes.SubSkill.CriticalStrikes.Name = Kritischer Treffer +Axes.SubSkill.CriticalStrikes.Stat = Chance für kritischen Treffer +Axes.SubSkill.GreaterImpact.Description = Zusatzschaden gegen Feinde ohne Rüstung. +Axes.SubSkill.GreaterImpact.Name = Wuchtschlag +Axes.SubSkill.SkullSplitter.Description = Verursacht einen Flächenschaden. +Axes.SubSkill.SkullSplitter.Name = Schädelspalter +Axes.SubSkill.SkullSplitter.Stat = Schädelspalter Länge -Combat.ArrowDeflect = &a&o**Pfeil abgelenkt** -Combat.BeastLore = &a&o**Biestkunde** +Broadcasts.LevelUpMilestone = &6(&amcMMO&6) {0}&7 hat nun Level &a{1}&7 mit der Fähigkeit &3{2}&7 erreicht! + +Chat.Channel.Off = &6(&amcMMO-Chat&6) &7Deine Nachrichten werden nicht länger automatisch an die spezifischen Kanäle versendet. +Chat.Channel.On = &6(&amcMMO-Chat&6) &eDeine Nachrichten werden nun automatisch an den &a{0}&e Kanal gesendet. +Chat.Identity.Console = &6* Konsole * +Chat.Spy.Party = &6[&eSPION&6-&a{2}&6] &r{0} &b→ &r{1} +Chat.Style.Admin = &b(A) &r{0} &b→ &r{1} +Chat.Style.Party = &a(P) &r{0} &a→ &r{1} +Chat.Style.Party.Leader = &a(P) &r{0} &6→ &r{1} + +Combat.ArrowDeflect = &a&o**Pfeil abgelenkt** +Combat.BeastLore = &a&o**Biestkunde** Combat.BeastLoreHealth = &3Gesundheit (&a{0}&3/{1}) -Combat.BeastLoreOwner = &3Besitzer (&c{0}&3) -Combat.Gore = &a&o**Aufgeschlitzt** -Combat.StruckByGore = &a&o**du wurdest AUFGESCHLITZT** -Combat.TargetDazed = Ziel wurde &4bet\u00E4ubt! -Combat.TouchedFuzzy = &a&o**Du wurdest ungl\u00FCcklich ber\u00FChrt, rin Schwindelgef\u00FChl kommt dir auf...** +Combat.BeastLoreHorseJumpStrength = &3Pferde-Sprungstärke (&aMaximal {0} Blöcke&3) +Combat.BeastLoreHorseSpeed =&3Pferde-Laufgeschwindigkeit (&a{0} Blöcke/s&3) +Combat.BeastLoreOwner = &3Besitzer (&c{0}&3) +Combat.Gore = &a&o**Aufgeschlitzt** +Combat.StruckByGore = &a&o**Du wurdest aufgeschlitzt** +Combat.TargetDazed = Ziel wurde &4betäubt! +Combat.TouchedFuzzy = &a&o**Du wurdest unglücklich berührt, ein Schwindelgefühl kommt dir auf...** -Commands.Ability.Off = F\u00E4higkeiten Benutzung &cdeaktiviert -Commands.Ability.On = F\u00E4higkeiten Benutzung &aaktiviert -Commands.Ability.Toggle = Benutzung von F\u00E4higkeiten wurde f\u00FCr &e{0} ge\u00E4ndert -Commands.AdminChat.Off = Exklusiver Admin Chat wurde &c deaktiviert -Commands.AdminChat.On = Exklusiver Admin Chat wurde &a aktiviert -Commands.AdminChatSpy.Chat = &6[Spy: &a{0}&6] &f{1} -Commands.AdminChatSpy.Disabled = mcMMO Party Chat-Spy deaktiviert -Commands.AdminChatSpy.Enabled = mcMMO Party Chat-Spy aktiviert -Commands.AdminChatSpy.Toggle = mcMMO Party Chat w\u00FCrde ver\u00E4ndert f\u00FCr &e{0} -Commands.AdminToggle = &a- Schalte den Adminchat an/aus -Commands.Chat.Console = Konsole -Commands.Cooldowns.Header = &6--= &amcMMO F\u00E4higkeiten Cooldowns&6 =-- -Commands.Cooldowns.Row.N = \ &c{0}&f - &6{1} Sekunden verbleiben -Commands.Cooldowns.Row.Y = \ &b{0}&f - &2Bereit! -Commands.Database.Processing = Dein vorheriger Befehl wird noch verarbeitet. Bitte warten. -Commands.Description.Skill = Zeige detaillierte Informationen zum {0} Skill -Commands.Description.addlevels = Gib einem Spieler Skill Level -Commands.Description.addxp = Gib einem Spieler Skillerfahrung -Commands.Description.adminchat = Schalte den Adminchat an/aus oder sende Adminchat Nachrichten -Commands.Description.hardcore = \u00C4ndere den Hardcore Prozentsatz oder schalte den Hardcore Modus an oder aus -Commands.Description.inspect = Sieh detaillierte Informationen \u00FCber einen anderen Spieler -Commands.Description.mcability = Schalte die Bereitschaft von F\u00E4higkeiten bei Rechtsklick an oder aus -Commands.Description.mcchatspy = Schalte den Party Chat-Spy an oder aus -Commands.Description.mcconvert = Konvertiert Datenbanktypen oder Erfahrungsformeln -Commands.Description.mccooldown = Sieh alle F\u00E4higkeiten Cooldowns -Commands.Description.mcgod = Schalte mcMMO godmode an oder aus -Commands.Description.mchud = \u00C4ndere deinen HUD Stil -Commands.Description.mcmmo = Zeige eine kurze Beschreibung \u00FCber mcMMO -Commands.Description.mcnotify = Schalte F\u00E4higkeiten Hinweise im Chat an oder aus -Commands.Description.mcpurge = Bereinige die mcMMO Datenbank von Spielern die {0} Monate nicht online waren oder keine Level haben. -Commands.Description.mcrank = Zeige das Skill Ranking f\u00FCr einen Spieler -Commands.Description.mcrefresh = Aktualisiere alle Cooldowns -Commands.Description.mcremove = Entferne einen Benutzer aus der Datenbank -Commands.Description.mcscoreboard = Verwalte deine Skill \u00DCbersicht -Commands.Description.mcstats = Zeige deine Skill Level und Erfahrung -Commands.Description.mctop = Zeige die Skill Bestenlisten -Commands.Description.mmoedit = Editiere die Skill Level eines Spielers -Commands.Description.mmoinfo = Lese Details \u00FCber einen Skill oder andere Funktion -Commands.Description.mmoshowdb = Zeige den Namen der aktuellen Datenbank (zur Benutzung mit /mmoupdate) -Commands.Description.mmoupdate = Kopiere Daten von einer alten Datenbank zur aktuell benutzen -Commands.Description.party = \u00C4ndere verschiedene Party Einstellungen -Commands.Description.partychat = Schalte den mcMMO Party Chat an oder aus oder sende Party Nachrichten -Commands.Description.ptp = Teleportiere zu einem Party Mitglied -Commands.Description.skillreset = Setze die Skills eines Spielers zur\u00FCck -Commands.Description.vampirism = Schalte Vampirismus an oder aus bzw. \u00E4ndere den Vampirismus Prozentsatz -Commands.Description.xplock = Setze deine Erfahrungs-Leiste auf einen bestimmten Skill fest -Commands.Description.xprate = \u00C4ndere die Erfahrungs Rate oder starte ein Erfahrungs Event -Commands.Disabled = Dieser Befehl ist deaktiviert. -Commands.DoesNotExist = &cSpieler in Datenbank nicht vorhanden! -Commands.Event.Start = &aSkill&6 Event! -Commands.Event.Stop = &aSkill&3 Event vorbei! -Commands.Event.Stop.Subtitle = &aWir hoffen, du hattest Spa\u00DF! -Commands.Event.XP = &3Erfahrungs Rate ist jetzt &6{0}&3x -Commands.GodMode.Disabled = mcMMO Godmode deaktiviert -Commands.GodMode.Enabled = mcMMO Godmode aktiviert -Commands.GodMode.Forbidden = [mcMMO] Der Godmode ist in dieser Welt nicht erlaubt -Commands.GodMode.Toggle = Godmode wurde f\u00FCr &e{0} aktiviert -Commands.Healthbars.Changed.BAR = [mcMMO] Deine Lebensanzeige wurde zu &eK\u00E4stchen&f ge\u00E4ndert. -Commands.Healthbars.Changed.DISABLED = [mcMMO] Die Mob-Lebensanzeige wurde &7deaktiviert&f. -Commands.Healthbars.Changed.HEARTS = [mcMMO]Deine Lebensanzeige wurde zu &cHerzen&f ge\u00E4ndert. -Commands.Healthbars.Invalid = Ung\u00FCltiger Lebensanzeige Typ! -Commands.Inspect = &a- Siehe detaillierte Spielerinformationen -Commands.Invite.Success = &aEinladung erfolgreich gesendet. -Commands.Leaderboards = &a- Bestenlisten -Commands.MmoInfo.DetailsHeader = &3-=[]=====[]&a Details &3[]=====[]=- -Commands.MmoInfo.Header = &3-=[]=====[]&6 MMO Info &3[]=====[]=- -Commands.MmoInfo.Mechanics = &3-=[]=====[]&6 Funktionen &3[]=====[]=- -Commands.MmoInfo.Mystery = &7Diese F\u00E4higkeit hast du noch nicht freigeschaltet, wenn du das tust, kannst du hier Details \u00FCber diese finden! -Commands.MmoInfo.NoMatch = Diese F\u00E4higkeit existiert nicht! -Commands.MmoInfo.OldSkill = &7mcMMO skills are being converted into an improved modular skill system, unfortunately this skill has not been converted yet and lacks detailed stats. The new system will allow for faster release times for new mcMMO skills and greater flexibility with existing skills. -Commands.MmoInfo.Stats = STATS: {0} -Commands.MmoInfo.SubSkillHeader = &6Name:&e {0} -Commands.ModDescription = &a- Kurze Modbeschreibung -Commands.NegativeNumberWarn = Benutze keine negativen Zahlen! -Commands.NoConsole = Dieser Befehl kann nicht aus der Konsole verwendet werden. -Commands.NotLoaded = Spielerprofil wurde noch nicht geladen. -Commands.Notifications.Off = F\u00E4higkeiten Hinweise wurden &cdeaktiviert -Commands.Notifications.On = F\u00E4higkeiten Hinweise wurden &aaktiviert -Commands.Offline = Dieser Befehl funktioniert nur bei eingeloggten Spielern. -Commands.Other = ---[]&aBesondere Befehle&c[]--- -Commands.Party.Accept = &a- Nimm Party Einladung an -Commands.Party.Alliance.Ally = &f{0} &8Ist verb\u00FCndet mit: &f{1} -Commands.Party.Alliance.AlreadyAllies = Deine Party ist bereits in einem B\u00FCndnis. Trenne es mit&3/party alliance disband -Commands.Party.Alliance.Header = -----[]&aParty B\u00FCndnisse&c[]----- -Commands.Party.Alliance.Help.0 = Diese Party ist in keinem B\u00FCndnis. Lade einen Party Anf\u00FChrer ein. -Commands.Party.Alliance.Help.1 = &c um zu verb\u00FCnden &3/party alliance invite &c. -Commands.Party.Alliance.Invite.0 = ALERT: &aDu hast eine B\u00FCndnis Anfrage f\u00FCr {0} von {1} erhalten -Commands.Party.Alliance.Invite.1 = Tippe &a/party alliance accept&e um die Anfrage anzunehmen -Commands.Party.Alliance.Invite.Accepted = &aB\u00FCndnis Anfrage angenommen -Commands.Party.Alliance.Members.Header = -----[]&aB\u00FCndnis Mitglieder&c[]----- -Commands.Party.Alliance.None = Deine Party hat keine Verb\u00FCndeten. -Commands.Party.AlreadyExists = &4Party {0} ist bereits vorhanden! -Commands.Party.Chat.Off = Exklusiver Party Chat &cdeaktiviert -Commands.Party.Chat.On = Exklusiver Party Chat &aaktiviert -Commands.Party.Commands = ---[]&aParty Befehle&c[]--- -Commands.Party.Create = &7Erstellte Party: {0} -Commands.Party.ExpShare = &7Erfahrung &3({0}) -Commands.Party.Features.Header = -----[]&aFunktionen&c[]----- -Commands.Party.Header = &c-----[]&aParty&c[]----- -Commands.Party.Invite = &a- Sende eine Party Einladung -Commands.Party.Invite.0 = ALERT: &aDu hast eine Party Einladung f\u00FCr {0} von {1} erhalten. -Commands.Party.Invite.1 = &eBenutze &a/party accept&e um die Einladung anzunehmen -Commands.Party.Invite.Accepted = &aEinladung angenommen. Du bist der {0} Party beigetreten. -Commands.Party.ItemShare = &7Item &3({0}) -Commands.Party.ItemShareCategories = &8Teile Items: &7&o{0} -Commands.Party.Join = &7Beigetretene Party: {0} -Commands.Party.Kick = &cDu wurdest von Party &a{0} ¢fernt! -Commands.Party.Leave = &eDu hast die Party verlassen -Commands.Party.Members.Header = &c-----[]&aMitglieder&c[]----- -Commands.Party.MembersNear = &8In der N\u00E4he: &3{0}&8/&3{1} -Commands.Party.None = &cDu bist in keiner Party. -Commands.Party.PartyFull = &6{0}&c ist voll! -Commands.Party.PartyFull.Invite = Du kannst &e{0}&c nicht zur Party &a{1}&c einladen, weil sie schon &3{2}&c Spieler hat! -Commands.Party.PartyFull.InviteAccept = Du kannst der Party &a{0}&c nicht beitreten, weil sie schon &3{1}&c Spieler hat! -Commands.Party.Quit = &a- Verlasse deine aktuelle Party. -Commands.Party.Rename = &7Party Name wurde zu &f{0} &7ver\u00E4ndert -Commands.Party.SetSharing = &7Party {0} teilen: &3{1} -Commands.Party.ShareMode = &8Teilen Modus: -Commands.Party.Status = &8Name: &f{0} {1} &8Level: &3{2} -Commands.Party.Status.Alliance = &8Verb\u00FCndeter: &f{0} -Commands.Party.Teleport = &a- Teleportiere dich zu Partymitgliedern. -Commands.Party.Toggle = &a- Schalte den Party Chat an oder aus. -Commands.Party.ToggleShareCategory = &7Party Item Teilen f\u00FCr&6{0} &7wurde &3{1} -Commands.Party.UnlockedFeatures = &8Freigeschaltete Features: &7&o{0} -Commands.Party1 = &a- Erstelle eine neue Party -Commands.Party2 = &a- Tritt der Party eines Spielers bei. -Commands.PowerLevel = &4GESAMT LEVEL: &a{0} -Commands.PowerLevel.Capped = &4Gesamtlevel: &a{0} &4H\u00F6chstlevel: &e{1} -Commands.PowerLevel.Leaderboard = --mcMMO&9 Power Level &eBestenliste-- -Commands.Reset = &a- Setze ein Skilllevel auf 0 -Commands.Reset.All = &aAlle deine Skilllevel wurden erfolgreich zur\u00FCckgesetzt. -Commands.Reset.Single = &aDein {0} Skilllevel wurde erfolgreich zur\u00FCckgesetzt. -Commands.Scoreboard.Clear = &3Das Scoreboard wurde ausgeblendet. -Commands.Scoreboard.Help.0 = &6 == &aHilfe f\u00FCr&c/mcscoreboard&6 == -Commands.Scoreboard.Help.1 = &3/mcscoreboard&b clear &f - blende die \u00DCbersicht aus -Commands.Scoreboard.Help.2 = &3/mcscoreboard&b keep &f - behalte die \u00DCbersicht offen -Commands.Scoreboard.Help.3 = &3/mcscoreboard&b time [n] &f - blende die \u00DCbersicht nach &dn&f Sekunden aus -Commands.Scoreboard.Keep = &3Die Stats \u00DCbersicht bleibt sichtbar bis du &a/mcscoreboard clear&3 verwendest. -Commands.Scoreboard.NoBoard = &cDie Stats Anzeige ist nicht sichtbar. -Commands.Scoreboard.Timer = &3Das Scoreboard wird nach &6{0}&3 Sekunden verschwinden. -Commands.Scoreboard.Tip.Clear = &6Tipp: Benutze &c/mcscoreboard clear&6 um die \u00DCbersicht auszublenden -Commands.Scoreboard.Tip.Keep = &6Tipp: Benutze &c/mcscoreboard keep&6 um das Scoreboard sichtbar zu lassen -Commands.Skill.ChildSkill = Unterskills sind f\u00FCr diesen Befehl nicht benutzbar! -Commands.Skill.Invalid = Das ist kein g\u00FCltiger Skillname! -Commands.Skill.Leaderboard = --mcMMO &9{0}&e Bestenliste-- -Commands.SkillInfo = &a- Detaillierte Informationen zu einem Skill -Commands.Stats = &a- Zeige deine Skill Statistiken -Commands.Stats.Self.Overhaul = Statistiken -Commands.ToggleAbility = &a- Schalte F\u00E4higkeiten-Aktivierung mit Rechtsklick an oder aus -Commands.Usage.0 = &cDie korrekte Verwendung ist /{0} -Commands.Usage.1 = &cDie korrekte Verwendung ist /{0} {1} -Commands.Usage.2 = &cDie korrekte Verwendung ist /{0} {1} {2} -Commands.Usage.3 = &cDie korrekte Verwendung ist /{0} {1} {2} {3} -Commands.Usage.FullClassName = Klassenname -Commands.Usage.Level = Level -Commands.Usage.Message = Nachricht -Commands.Usage.Page = Seite -Commands.Usage.PartyName = Name -Commands.Usage.Password = Passwort -Commands.Usage.Player = Spieler -Commands.Usage.Rate = Rate -Commands.Usage.Skill = Skill -Commands.Usage.SubSkill = F\u00E4higkeit -Commands.Usage.XP = Erfahrung -Commands.XPGain = &8XP ZUWACHS: &f{0} -Commands.XPGain.Acrobatics = Fallen -Commands.XPGain.Alchemy = Tr\u00E4nke brauen -Commands.XPGain.Archery = Monster angreifen -Commands.XPGain.Axes = Monster angreifen -Commands.XPGain.Child = Levelerhalt durch Verbesserung der Elternskills -Commands.XPGain.Excavation = Graben und Sch\u00E4tze finden -Commands.XPGain.Fishing = Angeln (Ach was :o) -Commands.XPGain.Herbalism = Ernten -Commands.XPGain.Mining = Erze und Steine abbauen -Commands.XPGain.Overhaul = &6Erfahrungserhalt: &3{0} -Commands.XPGain.Repair = Reparieren -Commands.XPGain.Swords = Monster angreifen -Commands.XPGain.Taming = Monster z\u00E4hmen, mit dem Wolf k\u00E4mpfen -Commands.XPGain.Unarmed = Monster angreifen -Commands.XPGain.Woodcutting = B\u00E4ume f\u00E4llen -Commands.addlevels.AwardAll.1 = &aDir wurden {0} Level in allen Skills gutgeschrieben! -Commands.addlevels.AwardAll.2 = Alle Skills wurden um {0} ge\u00E4ndert. -Commands.addlevels.AwardSkill.1 = &aDir wurden {0} Level in {1} gutgeschrieben! -Commands.addlevels.AwardSkill.2 = {0} wurde um {1} ge\u00E4ndert. -Commands.addxp.AwardAll = &aDir wurden {0} Erfahrungspunkte in Skills gutgeschrieben! -Commands.addxp.AwardSkill = &aDir wurde {0} Erfahrung in {1} gutgeschrieben! -Commands.mcc.Header = ---[]&amcMMO Befehle&c[]--- -Commands.mcconvert.Database.Finish = &7Datenbanken Umzug vollendet - die {1} Datenbank hat nun alle Daten von der {0} Datenbank. -Commands.mcconvert.Database.InvalidType = {0} ist kein g\u00FCltiger Datenbanktyp. -Commands.mcconvert.Database.Same = Du benutzt bereits eine {0} Datenbank! -Commands.mcconvert.Database.Start = &7Beginne Konvertierung von {0} zu {1}... -Commands.mcconvert.Experience.Finish = &7Konvertierung vollendet - es wird jetzt die {0} Erfahrungs Kurve verwendet. -Commands.mcconvert.Experience.Invalid = Unbekannter Formeltyp! G\u00FCltige Typen sind: &aLINEAR &cund &aEXPONENTIAL. -Commands.mcconvert.Experience.Same = Formeltyp {0} wird bereits verwendet -Commands.mcconvert.Experience.Start = &7Beginne Konvertierung von Kurve {0} zu Kurve {1} -Commands.mcgod = &a- Schalte Godmode um -Commands.mchud.Invalid = Das ist kein g\u00FCltiger HUD Typ. -Commands.mcpurge.Success = &aDie Datenbank wurde erfolgreich ges\u00E4ubert! -Commands.mcrank.Heading = &6-=Pers\u00F6nliche Rangliste=- -Commands.mcrank.Overall = Insgesamt&a - &6Rang &f#&a{0} -Commands.mcrank.Player = &eRangliste f\u00FCr &f{0} -Commands.mcrank.Skill = {0}&a - &6Rangliste &f#&a{1} -Commands.mcrank.Unranked = &fOhne Rang -Commands.mcrefresh.Success = {0}''s Cooldowns wurden erneuert. -Commands.mcremove.Success = &a{0} wurde erfolgreich von der Datenbank entfernt! -Commands.mctop.Tip = &6Tipp: Benutze &c/mcrank&6 um deine pers\u00F6nlichen Statistiken zu sehen! -Commands.mmoedit = [player] &a - Ziel modifizieren -Commands.mmoedit.AllSkills.1 = &aDein Level in allen F\u00E4higkeiten wurde auf {0} gesetzt! -Commands.mmoedit.Modified.1 = &aDein Level in {0} wurde auf {1} gesetzt! -Commands.mmoedit.Modified.2 = {0} wurde bei {1} modifiziert. -Commands.mmoshowdb = Die zurzeit verwendete Datenbank ist &a{0} -Commands.ptp.AcceptAny.Disabled = Party Teleport Anfragenbest\u00E4tigung &cdeaktiviert -Commands.ptp.AcceptAny.Enabled = Party Teleport Anfragenbest\u00E4tigung &aaktiviert -Commands.ptp.Disabled = Party Teleport &cdeaktiviert -Commands.ptp.Enabled = Party Teleport &aaktiviert -Commands.ptp.NoRequests = Du hast aktuell keine Teleportanfragen. -Commands.ptp.NoWorldPermissions = &c[mcMMO] Du hast nicht die n\u00F6tigen Rechte um dich in die Welt {0} zu teleportieren. -Commands.ptp.Request1 = {0} &am\u00F6chte sich zu dir teleportieren. -Commands.ptp.Request2 = &aUm zu teleportieren tippe&e/ptp accept&a. Die Anfrage l\u00E4uft in&c{0} &aSekunden aus. -Commands.ptp.RequestExpired = &cParty Teleport Anfrage ist ausgelaufen. -Commands.xplock.locked = &6Deine Erfahrungs Anzeige ist nun auf {0} festgesetzt! -Commands.xplock.unlocked = &6Deine Erfahrungs Anzeige ist nun wieder &afreigeschaltet&6! -Commands.xprate.modified = The Erfahrungs Rate wurde auf {0} gesetzt! -Commands.xprate.over = Das Skill Erfahrungs Raten Event ist vor\u00FCber! -Commands.xprate.proper.0 = &cKorrekte Eingabe f\u00FCr Erfahrungs Raten Wechsel: /xprate -Commands.xprate.proper.1 = &cKorrekte Eingabe f\u00FCr R\u00FCcksetzung auf Standard Erfahrungs Rate: /xprate reset -Commands.xprate.proper.2 = &cBitte entscheide mit true/false ob dies ein XP-Event ist oder nicht. -Commands.xprate.started.0 = &6Ein Erfahungs Event f\u00FCr Skills hat begonnen! -Commands.xprate.started.1 = &6Die Skill Erfahrungs Rate liegt jetzt bei {0}x! +Commands.Ability.Off = Fähigkeiten Benutzung &cdeaktiviert +Commands.Ability.On = Fähigkeiten Benutzung &aaktiviert +Commands.Ability.Toggle = Benutzung von Fähigkeiten wurde für &e{0} geändert. +Commands.AdminChat.Off = Exklusiver Admin-Chat wurde &c deaktiviert. +Commands.AdminChat.On = Exklusiver Admin-Chat wurde &a aktiviert. +Commands.AdminChatSpy.Chat = &6[Spy: &a{0}&6] &f{1} +Commands.AdminChatSpy.Disabled = mcMMO Party Chat-Spy deaktiviert +Commands.AdminChatSpy.Enabled = mcMMO Party Chat-Spy aktiviert +Commands.AdminChatSpy.Toggle = mcMMO Party Chat würde verändert für &e{0} +Commands.AdminToggle = &a- Schalte den Admin-Chat an/aus +Commands.Chat.Console = Konsole +Commands.Cooldowns.Header = &6--= &amcMMO Fähigkeiten Cooldowns&6 =-- +Commands.Cooldowns.Row.N = &c{0}&f - &6{1} Sekunden verbleiben +Commands.Cooldowns.Row.Y = &b{0}&f - &2Bereit! +Commands.Database.Cooldown = Du musst {0} Sekunden warten bis du diesen Befehl wieder ausführen kannst! +Commands.Database.CooldownMS = Du musst {0}ms warten bis du diesen Befehl wieder ausführen kannst! +Commands.Database.Processing = Dein vorheriger Befehl wird noch verarbeitet. Bitte warten. +Commands.Description.Skill = Zeige detaillierte Informationen zum {0} Skill. +Commands.Description.addlevels = Gib einem Spieler Skill-Level. +Commands.Description.addxp = Gib einem Spieler Skillerfahrung. +Commands.Description.adminchat = Schalte den Admin-Chat an/aus oder sende Admin-Chat Nachrichten. +Commands.Description.hardcore = Ändere den Hardcore Prozentsatz oder schalte den Hardcore Modus an oder aus. +Commands.Description.inspect = Sieh detaillierte Informationen über einen anderen Spieler. +Commands.Description.mcability = Schalte die Bereitschaft von Fähigkeiten bei Rechtsklick an oder aus. +Commands.Description.mcchatspy = Schalte den Party Chat-Spy an oder aus. +Commands.Description.mcconvert = Konvertiert Datenbanktypen oder Erfahrungsformeln. +Commands.Description.mccooldown = Sieh alle Fähigkeiten-Cooldowns. +Commands.Description.mcgod = Schalte mcMMO Godmode an oder aus. +Commands.Description.mchud = Ändere deinen HUD Stil. +Commands.Description.mcmmo = Zeige eine kurze Beschreibung über mcMMO. +Commands.Description.mcnotify = Schalte Fähigkeiten-Hinweise im Chat an oder aus. +Commands.Description.mcpurge = Bereinige die mcMMO Datenbank von Spielern die {0} Monate nicht online waren oder keine Level haben. +Commands.Description.mcrank = Zeige das Skill-Ranking für einen Spieler. +Commands.Description.mcrefresh = Aktualisiere alle Cooldowns. +Commands.Description.mcremove = Entferne einen Benutzer aus der Datenbank. +Commands.Description.mcscoreboard = Verwalte deine Skill-Übersicht. +Commands.Description.mcstats = Zeige deine Skill-Level und Erfahrung. +Commands.Description.mctop = Zeige die Skill-Bestenlisten. +Commands.Description.mmocompat = Informationen darüber, ob mcMMO im Kompatibilitätsmodus oder voll funktionsfähig ist. +Commands.Description.mmodebug = (De)aktiviere den Debugging-Modus, welcher nützliche Informationen ausgibt, wenn du einen Block schlägst. +Commands.Description.mmoedit = Editiere die Skill-Level eines Spielers. +Commands.Description.mmoinfo = Zeige Details über einen Skill oder andere Funktionen. +Commands.Description.mmoshowdb = Zeige den Namen der aktuellen Datenbank (zur Benutzung mit /mmoupdate). +Commands.Description.mmoupdate = Kopiere Daten von einer alten Datenbank zur aktuell benutzen. +Commands.Description.mmoxpbar = Spielereinstellungen für die mcMMO Erfahrungsleisten. +Commands.Description.party = Ändere verschiedene Party-Einstellungen. +Commands.Description.partychat = Schalte den mcMMO Party-Chat an oder aus oder sende Party-Nachrichten. +Commands.Description.ptp = Teleportiere zu einem Party-Mitglied. +Commands.Description.skillreset = Setze die Skills eines Spielers zurück. +Commands.Description.vampirism = Schalte Vampirismus an oder aus bzw. ändere den Vampirismus Prozentsatz. +Commands.Description.xplock = Setze deine Erfahrungsleiste auf einen bestimmten Skill fest. +Commands.Description.xprate = Ändere die Erfahrungsrate oder starte ein Erfahrungs-Event. +Commands.Disabled = Dieser Befehl ist deaktiviert. +Commands.DoesNotExist = &cSpieler in Datenbank nicht vorhanden! +Commands.Event.Start = &aSkill&6 Event! +Commands.Event.Stop = &aSkill&3 Event vorbei! +Commands.Event.Stop.Subtitle = &aWir hoffen, du hattest Spaß! +Commands.Event.XP = &3Erfahrungsrate ist jetzt &6{0}&3x +Commands.GodMode.Disabled = mcMMO Godmode deaktiviert +Commands.GodMode.Enabled = mcMMO Godmode aktiviert +Commands.GodMode.Forbidden = [mcMMO] Der Godmode ist in dieser Welt nicht erlaubt. +Commands.GodMode.Toggle = Godmode wurde für &e{0} aktiviert. +Commands.Healthbars.Changed.BAR = [mcMMO] Deine Lebensanzeige wurde zu &eKästchen&f geändert. +Commands.Healthbars.Changed.DISABLED = [mcMMO] Die Mob-Lebensanzeige wurde &7deaktiviert&f. +Commands.Healthbars.Changed.HEARTS = [mcMMO] Deine Lebensanzeige wurde zu &cHerzen&f geändert. +Commands.Healthbars.Invalid = Ungültiger Lebensanzeige-Typ! +Commands.Inspect = &a- Siehe detaillierte Spielerinformationen +Commands.Invite.Success = &aEinladung erfolgreich gesendet. +Commands.Leaderboards = &a- Bestenlisten +Commands.MmoInfo.DetailsHeader = &3-=[]=====[]&a Details &3[]=====[]=- +Commands.MmoInfo.Header = &3-=[]=====[]&6 MMO Info &3[]=====[]=- +Commands.MmoInfo.Mechanics = &3-=[]=====[]&6 Funktionen &3[]=====[]=- +Commands.MmoInfo.Mystery = &7Diese Fähigkeit hast du noch nicht freigeschaltet, wenn du das tust, kannst du hier Details über diese finden! +Commands.MmoInfo.NoMatch = Diese Fähigkeit existiert nicht! +Commands.MmoInfo.OldSkill = &7mcMMO Skills werden in ein verbessertes und modulares Skill-System konvertiert - wovon dieser Skill jedoch noch nicht betroffen ist, weswegen detaillierte Statistiken fehlen. Das neue System ermöglicht eine schnellere Veröffentlichung neuer mcMMO-Skills und eine größere Flexibilität mit bereits existenten Skills. +Commands.MmoInfo.Stats = Statistik: {0} +Commands.MmoInfo.SubSkillHeader = &6Name:&e {0} +Commands.Mmodebug.Toggle = Der mcMMO Debugging-Modus ist nun &6{0}&7, benutze den Befehl erneut, um dies rückgängig zu machen. Wenn der Debugging-Modus aktiviert wurde kannst du Blöcke schlagen, um nützliche Informationen zu erhalten. Dies ist für den Support sehr nützlich. +Commands.ModDescription = &a- Kurze Modbeschreibung +Commands.NegativeNumberWarn = Benutze keine negativen Zahlen! +Commands.NoConsole = Dieser Befehl kann nicht aus der Konsole verwendet werden. +Commands.NotLoaded = Spielerprofil wurde noch nicht geladen. +Commands.Notifications.Off = Fähigkeiten Hinweise wurden &cdeaktiviert. +Commands.Notifications.On = Fähigkeiten Hinweise wurden &aaktiviert. +Commands.Offline = Dieser Befehl funktioniert nur bei eingeloggten Spielern. +Commands.Other = ---[]&aBesondere Befehle&c[]--- +Commands.Party.Accept = &a- Nimm Party-Einladung an +Commands.Party.Alliance.Ally = &f{0} &8Ist verbündet mit: &f{1} +Commands.Party.Alliance.AlreadyAllies = Deine Party ist bereits in einem Bündnis. Trenne es mit&3/party alliance disband&e. +Commands.Party.Alliance.Header = -----[]&aParty-Bündnisse&c[]----- +Commands.Party.Alliance.Help.0 = Diese Party ist in keinem Bündnis. Lade einen Party-Anführer ein. +Commands.Party.Alliance.Help.1 = &c Zum Verbünden: &3/party alliance invite &c. +Commands.Party.Alliance.Invite.0 = ACHTUNG: &aDu hast eine Bündnis-Anfrage für {0} von {1} erhalten. +Commands.Party.Alliance.Invite.1 = Tippe &a/party alliance accept&e um die Anfrage anzunehmen. +Commands.Party.Alliance.Invite.Accepted = &aBündnis-Anfrage angenommen +Commands.Party.Alliance.Members.Header = -----[]&aBündnis-Mitglieder&c[]----- +Commands.Party.Alliance.None = Deine Party hat keine Verbündeten. +Commands.Party.AlreadyExists = &4Party {0} ist bereits vorhanden! +Commands.Party.Chat.Off = Exklusiver Party Chat &cdeaktiviert +Commands.Party.Chat.On = Exklusiver Party Chat &aaktiviert +Commands.Party.Commands = ---[]&aParty Befehle&c[]--- +Commands.Party.Create = &7Erstellte Party: {0} +Commands.Party.ExpShare = &7Erfahrung &3({0}) +Commands.Party.Features.Header = -----[]&aFunktionen&c[]----- +Commands.Party.Header = &c-----[]&aParty&c[]----- +Commands.Party.Invite = &a- Sende eine Party-Einladung +Commands.Party.Invite.0 = ACHTUNG: &aDu hast eine Party-Einladung für {0} von {1} erhalten. +Commands.Party.Invite.1 = &eBenutze &a/party accept&e um die Einladung anzunehmen. +Commands.Party.Invite.Accepted = &aEinladung angenommen. Du bist der {0} Party beigetreten. +Commands.Party.ItemShare = &7Item &3({0}) +Commands.Party.ItemShareCategories = &8Teile Items: &7&o{0} +Commands.Party.Join = &7Beigetretene Party: {0} +Commands.Party.Kick = &cDu wurdest von Party &a{0} ¢fernt! +Commands.Party.Leave = &eDu hast die Party verlassen. +Commands.Party.Members.Header = &c-----[]&aMitglieder&c[]----- +Commands.Party.MembersNear = &8In der Nähe: &3{0}&8/&3{1} +Commands.Party.None = &cDu bist in keiner Party. +Commands.Party.PartyFull = &6{0}&c ist voll! +Commands.Party.PartyFull.Invite = Du kannst &e{0}&c nicht zur Party &a{1}&c einladen, weil sie schon &3{2}&c Spieler hat! +Commands.Party.PartyFull.InviteAccept = Du kannst der Party &a{0}&c nicht beitreten, weil sie schon &3{1}&c Spieler hat! +Commands.Party.Quit = &a- Verlasse deine aktuelle Party. +Commands.Party.Rename = &7Party Name wurde zu &f{0} &7verändert. +Commands.Party.SetSharing = &7Party {0} teilen: &3{1} +Commands.Party.ShareMode = &8Teilen-Modus: +Commands.Party.Status = &8Name: &f{0} {1} &8Level: &3{2} +Commands.Party.Status.Alliance = &8Verbündeter: &f{0} +Commands.Party.Teleport = &a- Teleportiere dich zu Partymitgliedern. +Commands.Party.Toggle = &a- Schalte den Party-Chat an oder aus. +Commands.Party.ToggleShareCategory = &7Party Item teilen für&6{0} &7wurde &3{1} +Commands.Party.UnlockedFeatures = &8Freigeschaltete Features: &7&o{0} +Commands.Party1 = &a- Erstelle eine neue Party. +Commands.Party2 = &a- Tritt der Party eines Spielers bei. +Commands.PowerLevel = &4Gesamtlevel: &a{0} +Commands.PowerLevel.Capped = &4Gesamtlevel: &a{0} &4Höchstlevel: &e{1} +Commands.PowerLevel.Leaderboard = --mcMMO&9 Power-Level &eBestenliste-- +Commands.Reset = &a- Setze ein Skill-Level auf 0 +Commands.Reset.All = &aAlle deine Skill-Level wurden erfolgreich zurückgesetzt. +Commands.Reset.Single = &aDein {0} Skill-Level wurde erfolgreich zurückgesetzt. +Commands.Scoreboard.Clear = &3Das Scoreboard wurde ausgeblendet. +Commands.Scoreboard.Help.0 = &6 == &aHilfe für&c /mcscoreboard&6 == +Commands.Scoreboard.Help.1 = &3/mcscoreboard&b clear &f - blende die Übersicht aus +Commands.Scoreboard.Help.2 = &3/mcscoreboard&b keep &f - behalte die Übersicht offen +Commands.Scoreboard.Help.3 = &3/mcscoreboard&b time [n] &f - blende die Übersicht nach &dn&f Sekunden aus +Commands.Scoreboard.Keep = &3Die Stats-Übersicht bleibt sichtbar bis du &a/mcscoreboard clear&3 verwendest. +Commands.Scoreboard.NoBoard = &cDie Stats-Anzeige ist nicht sichtbar. +Commands.Scoreboard.Timer = &3Das Scoreboard wird nach &6{0}&3 Sekunden verschwinden. +Commands.Scoreboard.Tip.Clear = &6Tipp: Benutze &c/mcscoreboard clear&6 um die Übersicht auszublenden. +Commands.Scoreboard.Tip.Keep = &6Tipp: Benutze &c/mcscoreboard keep&6 um das Scoreboard sichtbar zu lassen. +Commands.Skill.ChildSkill = Unterskills sind für diesen Befehl nicht benutzbar! +Commands.Skill.Invalid = Das ist kein gültiger Skillname! +Commands.Skill.Leaderboard = --mcMMO &9{0}&e Bestenliste-- +Commands.SkillInfo = &a- Detaillierte Informationen zu einem Skill. +Commands.Stats = &a- Zeige deine Skill-Statistiken. +Commands.Stats.Self.Overhaul = Statistiken +Commands.ToggleAbility = &a- Schalte Fähigkeiten-Aktivierung mit Rechtsklick an oder aus. +Commands.Usage.0 = &cDie korrekte Verwendung ist /{0} +Commands.Usage.1 = &cDie korrekte Verwendung ist /{0} {1} +Commands.Usage.2 = &cDie korrekte Verwendung ist /{0} {1} {2} +Commands.Usage.3 = &cDie korrekte Verwendung ist /{0} {1} {2} {3} +Commands.Usage.3.XP = &cDie korrekte Verwendung ist /{0} {1} {2} {3}&7 (Du kannst auch -s an das Ende des Befehls hinzufügen, damit der Spieler nicht benachrichtigt wird.) +Commands.Usage.FullClassName = Klassenname +Commands.Usage.Level = Level +Commands.Usage.Message = Nachricht +Commands.Usage.Page = Seite +Commands.Usage.PartyName = Name +Commands.Usage.Password = Passwort +Commands.Usage.Player = Spieler +Commands.Usage.Rate = Rate +Commands.Usage.Skill = Skill +Commands.Usage.SubSkill = Fähigkeit +Commands.Usage.XP = Erfahrung +Commands.XPBar.DisableAll = &6Alle mcMMO Erfahrungsleisten wurden deaktiviert, benutze &c/mmoxpbar reset&6 um die Standardeinstellungen wiederherzustellen. +Commands.XPBar.Reset = &6Die Erfahrungsleisten-Einstellungen für mcMMO wurden zurückgesetzt. +Commands.XPBar.SettingChanged = &6Die Erfahrungsleisten-Einstellungen für &a{0}&6 wurden gesetzt auf: &a{1} +Commands.XPBar.Usage = Die korrekte Verwendung ist &a/mmoxpbar +Commands.XPGain = &8XP-Zuwachs: &f{0} +Commands.XPGain.Acrobatics = Fallen +Commands.XPGain.Alchemy = Tränke brauen +Commands.XPGain.Archery = Monster angreifen +Commands.XPGain.Axes = Monster angreifen +Commands.XPGain.Child = Levelerhalt durch Verbesserung der Elternskills +Commands.XPGain.Excavation = Graben und Schätze finden +Commands.XPGain.Fishing = Angeln +Commands.XPGain.Herbalism = Ernten +Commands.XPGain.Mining = Erze und Steine abbauen +Commands.XPGain.Overhaul = &6Erfahrungserhalt: &3{0} +Commands.XPGain.Repair = Reparieren +Commands.XPGain.Swords = Monster angreifen +Commands.XPGain.Taming = Monster zähmen, mit dem Wolf kämpfen +Commands.XPGain.Unarmed = Monster angreifen +Commands.XPGain.Woodcutting = Bäume fällen +Commands.addlevels.AwardAll.1 = &aDir wurden {0} Level in allen Skills gutgeschrieben! +Commands.addlevels.AwardAll.2 = Alle Skills wurden um {0} geändert. +Commands.addlevels.AwardSkill.1 = &aDir wurden {0} Level in {1} gutgeschrieben! +Commands.addlevels.AwardSkill.2 = {0} wurde um {1} geändert. +Commands.addxp.AwardAll = &aDir wurden {0} Erfahrungspunkte in Skills gutgeschrieben! +Commands.addxp.AwardSkill = &aDir wurde {0} Erfahrung in {1} gutgeschrieben! +Commands.mcc.Header = ---[]&amcMMO Befehle&c[]--- +Commands.mcconvert.Database.Finish = &7Datenbanken-Umzug vollendet - die {1} Datenbank hat nun alle Daten von der {0} Datenbank. +Commands.mcconvert.Database.InvalidType = {0} ist kein gültiger Datenbanktyp. +Commands.mcconvert.Database.Same = Du benutzt bereits eine {0} Datenbank! +Commands.mcconvert.Database.Start = &7Beginne Konvertierung von {0} zu {1}... +Commands.mcconvert.Experience.Finish = &7Konvertierung vollendet - es wird jetzt die {0} Erfahrungskurve verwendet. +Commands.mcconvert.Experience.Invalid = Unbekannter Formeltyp! Gültige Typen sind: &aLINEAR &cund &aEXPONENTIAL. +Commands.mcconvert.Experience.Same = Formeltyp {0} wird bereits verwendet. +Commands.mcconvert.Experience.Start = &7Beginne Konvertierung von Kurve {0} zu Kurve {1}. +Commands.mcgod = &a- Schalte den Godmode um +Commands.mchud.Invalid = Das ist kein gültiger HUD Typ. +Commands.mcpurge.Success = &aDie Datenbank wurde erfolgreich gesäubert! +Commands.mcrank.Heading = &6-=Persönliche Rangliste=- +Commands.mcrank.Overall = Insgesamt&a - &6Rang &f#&a{0} +Commands.mcrank.Player = &eRangliste für &f{0} +Commands.mcrank.Skill = {0}&a - &6Rangliste &f#&a{1} +Commands.mcrank.Unranked = &fOhne Rang +Commands.mcrefresh.Success = {0}''s Cooldowns wurden erneuert. +Commands.mcremove.Success = &a{0} wurde erfolgreich von der Datenbank entfernt! +Commands.mctop.Tip = &6Tipp: Benutze &c/mcrank&6 um deine persönlichen Statistiken zu sehen! +Commands.mmoedit = [player] &a - Ziel modifizieren +Commands.mmoedit.AllSkills.1 = &aDein Level in allen Fähigkeiten wurde auf {0} gesetzt! +Commands.mmoedit.Modified.1 = &aDein Level in {0} wurde auf {1} gesetzt! +Commands.mmoedit.Modified.2 = {0} wurde bei {1} modifiziert. +Commands.mmoshowdb = Die zurzeit verwendete Datenbank ist &a{0} +Commands.ptp.AcceptAny.Disabled = Party-Teleportierung - Anfragenbestätigung &cdeaktiviert +Commands.ptp.AcceptAny.Enabled = Party-Teleportierung - Anfragenbestätigung &aaktiviert +Commands.ptp.Disabled = Party-Teleportierung &cdeaktiviert +Commands.ptp.Enabled = Party-Teleportierung &aaktiviert +Commands.ptp.NoRequests = Du hast aktuell keine Teleportierungsanfragen. +Commands.ptp.NoWorldPermissions = &c[mcMMO] Du hast nicht die nötigen Rechte um dich in die Welt {0} zu teleportieren. +Commands.ptp.Request1 = {0} &amöchte sich zu dir teleportieren. +Commands.ptp.Request2 = &aZum Teleportieren tippe &e/ptp accept&a. Die Anfrage läuft in &c{0} &aSekunden aus. +Commands.ptp.RequestExpired = &cParty-Teleportierungsanfrage ist ausgelaufen. +Commands.xplock.locked = &6Deine Erfahrungsanzeige ist nun auf {0} festgesetzt! +Commands.xplock.unlocked = &6Deine Erfahrungsanzeige ist nun wieder &afreigeschaltet&6! +Commands.xprate.modified = Die Erfahrungsrate wurde auf {0} gesetzt! +Commands.xprate.over = Das Bonuserfahrungs-Event für Skills ist vorüber! +Commands.xprate.proper.0 = &cKorrekte Eingabe für Erfahrungsratenwechsel: /xprate +Commands.xprate.proper.1 = &cKorrekte Eingabe für Rücksetzung auf Standard-Erfahrungsrate: /xprate reset +Commands.xprate.proper.2 = &cBitte entscheide mit true/false ob dies ein XP-Event ist oder nicht. +Commands.xprate.started.0 = &6Ein Bonuserfahrungs-Event für Skills hat begonnen! +Commands.xprate.started.1 = &6Die Erfahrungsrate für Skills liegt jetzt bei {0}x! -Effects.Child.Overhaul = &3Unterskill Level&e {0}&3: {1} -Effects.Child.ParentList = &a{0}&6(&3Level&e{1}&6) -Effects.Effects = Effekte -Effects.Level.Overhaul = &6Level: &e{0} &3Erfahrung&e(&6{1}&e/&6{2}&e) -Effects.Parent = &6{0} - -Effects.SubSkills.Overhaul = F\u00E4higkeiten -Effects.Template = &3{0}: &a{1} +Compatibility.Layer.PartialSupport = &6Diese Version besitzt keine vollständige Unterstützung für &a{0}&6, jedoch verwendet mcMMO ein System, welches versucht die fehlenden Features zu emulieren. +Compatibility.Layer.Unsupported = &6Diese Version von Minecraft ist nicht kompatibel mit &a{0}&6. -Excavation.Ability.Lower = &a&o**Du senkst deine Schaufel ...** -Excavation.Ability.Ready = &a&o**Du hebst deine Schaufel!** -Excavation.Listener = Graben: -Excavation.SkillName = Graben -Excavation.Skills.GigaDrillBreaker.Off = &a&o**Dein Gigabohrer ist ausgelaufen** -Excavation.Skills.GigaDrillBreaker.On = &a&o**Gigabohrer wurde aktiviert** -Excavation.Skills.GigaDrillBreaker.Other.Off = {0}s &cGigabohrer&a ist &aausgelaufen -Excavation.Skills.GigaDrillBreaker.Other.On = &a{0}&2 benutzte &cGigabohrer! -Excavation.Skills.GigaDrillBreaker.Refresh = &aDein &eGigabohrer &aist wieder bereit! -Excavation.SubSkill.Archaeology.Description = Ergrabe die Sch\u00E4tze der Unterwelt! -Excavation.SubSkill.Archaeology.Name = Arch\u00E4ologie -Excavation.SubSkill.GigaDrillBreaker.Description = Dreifache Droprate, Dreifache Erfahrung und Bonus Geschwindigkeit. -Excavation.SubSkill.GigaDrillBreaker.Name = Gigabohrer -Excavation.SubSkill.GigaDrillBreaker.Stat = Gigabohrer Dauer +Effects.Child.Overhaul = &3Unterskill Level&e {0}&3: {1} +Effects.Child.ParentList = &a{0}&6(&3Level&e{1}&6) +Effects.Effects = Effekte +Effects.Level.Overhaul = &6Level: &e{0} &3Erfahrung&e(&6{1}&e/&6{2}&e) +Effects.Parent = &6{0} - +Effects.SubSkills.Overhaul = Fähigkeiten +Effects.Template = &3{0}: &a{1} -Fishing.Ability.Info = Zauberj\u00E4ger: &7 **Verbessert sich mit Schatzj\u00E4ger Rang** -Fishing.Ability.Locked.0 = Gesperrt bis Level {0}! -Fishing.Ability.Locked.1 = Gesperrt bis Level {0}! -Fishing.Ability.Locked.2 = Gesperrt bis Level {0}! -Fishing.Ability.TH.Boom = &c&lDeine Angelschnur hat sich in einer &4&lSeemine &c&lverfangen! -Fishing.Ability.TH.MagicFound = &bDu f\u00FChlst etwas magisches in diesem Fang... -Fishing.Ability.TH.Poison = &7Irgendentwas stinkt hier... -Fishing.Chance.Raining = &9 Regen Bonus -Fishing.Exhausting = &c&oUnsachgem\u00E4\u00DFe Nutzung der Angelrute f\u00FChrt zu Erm\u00FCdung und abnutzen der Rute. -Fishing.Listener = Angeln: -Fishing.LowResourcesTip = &7Dein Gesp\u00FChr sagt dir, dass es hier kaum noch Fische gibt. Versuche es mindestens {0} Bl\u00F6cke entfernt. -Fishing.ScarcityTip = &e&oDas Gebiet ist \u00FCberfischt. Versuche es woanders, mindestens {0} Bl\u00F6cke entfernt. -Fishing.Scared = &7&oHektische Bewegungen ver\u00E4ngstigen Fische! -Fishing.SkillName = Angeln -Fishing.SubSkill.FishermansDiet.Description = Verbessert den N\u00E4hrwert von geangelter Nahrung -Fishing.SubSkill.FishermansDiet.Name = Fischers Di\u00E4t -Fishing.SubSkill.FishermansDiet.Stat = Fishers Di\u00E4t:&a Rang {0} -Fishing.SubSkill.IceFishing.Description = Erm\u00F6glicht dir in Eisbiomen zu angeln -Fishing.SubSkill.IceFishing.Name = Eisangeln -Fishing.SubSkill.IceFishing.Stat = Eisangeln -Fishing.SubSkill.MagicHunter.Description = Finde verzauberte Gegenst\u00E4nde -Fishing.SubSkill.MagicHunter.Name = Zauber J\u00E4ger -Fishing.SubSkill.MagicHunter.Stat = Zauber J\u00E4ger Chance -Fishing.SubSkill.MasterAngler.Description = Erh\u00F6ht die Chance des Anbei\u00DFens beim Angeln -Fishing.SubSkill.MasterAngler.Name = Superangel -Fishing.SubSkill.MasterAngler.Stat = Erh\u00F6hte Anbei\u00DFChance am aktuellen Ort: &a+&e{0} -Fishing.SubSkill.Shake.Description = Rei\u00DFe Gegenst\u00E4nde weg von Lebewesen und Spielern mit deiner Angel -Fishing.SubSkill.Shake.Name = Rei\u00DFen -Fishing.SubSkill.Shake.Stat = Rei\u00DFen Chance -Fishing.SubSkill.TreasureHunter.Description = Angle verschiedene Objekte -Fishing.SubSkill.TreasureHunter.Name = Schatz J\u00E4ger -Fishing.SubSkill.TreasureHunter.Stat = Schatz J\u00E4ger Rang: &a{0}&3/&a{1} -Fishing.SubSkill.TreasureHunter.Stat.Extra = Drop Rate: &7\u00DCblich: &e{0} &aUn\u00FCblich: &e{1}\r\n&9Selten: &e{2} &dEpisch: &e{3} &6Legend\u00E4r: &e{4} &bSchallplatte: &e{5} +Excavation.Ability.Lower = &7&o**Du senkst deine Schaufel.** +Excavation.Ability.Ready = &a&o**Du hebst deine Schaufel...** +Excavation.Listener = Graben: +Excavation.SkillName = Graben +Excavation.Skills.GigaDrillBreaker.Off = &a&o**Dein Gigabohrer ist ausgelaufen** +Excavation.Skills.GigaDrillBreaker.On = &a&o**Gigabohrer wurde aktiviert** +Excavation.Skills.GigaDrillBreaker.Other.Off = {0}s &cGigabohrer&a ist &aausgelaufen. +Excavation.Skills.GigaDrillBreaker.Other.On = &a{0}&2 benutzte &cGigabohrer! +Excavation.Skills.GigaDrillBreaker.Refresh = &aDein &eGigabohrer &aist wieder bereit! +Excavation.SubSkill.Archaeology.Description = Ergrabe die Schätze der Unterwelt! +Excavation.SubSkill.Archaeology.Name = Archäologie +Excavation.SubSkill.Archaeology.Stat = Archäologie Erfahrungspunkte-Chance +Excavation.SubSkill.Archaeology.Stat.Extra = Archäologie Erfahrungspunkte-Anzahl +Excavation.SubSkill.GigaDrillBreaker.Description = Dreifache Droprate, dreifache Erfahrung und Bonus-Abbaugeschwindigkeit. +Excavation.SubSkill.GigaDrillBreaker.Name = Gigabohrer +Excavation.SubSkill.GigaDrillBreaker.Stat = Gigabohrer-Dauer -Guides.Acrobatics.Section.0 = &3\u00DCber Akrobatik:\n&eAkrobatik ist die Kunst sich anmutig fortzubewegen.\n&eFall- und Kampfschaden werden reduziert\n\n&3XP GAIN:\n&eErfahrung sammelst du indem du in K\u00E4mpfen\n&eausweichst oder St\u00FCrze aus gro\u00DFen H\u00F6hen \u00FCberlebst. -Guides.Acrobatics.Section.1 = &3Wie funktioniert Abrollen?\n&eAb und zu rollst du beim Fallen ab und der Fallschaden wird\n&ereduziert. Wenn du den Schleichen Knopf w\u00E4hrend dem Fallen\n&eh\u00E4ltst, verdoppelt sich die Chance abzurollen.\n&eIn dem Fall rollst du anmutig ab.\n&eAnmutige Rollen sind wie normale Rollen, nur dass\n&esie \u00F6fter passieren und damit mehr Schutz vor St\u00FCrzen\n&eliefern. -Guides.Acrobatics.Section.2 = &3Wie funktioniert Ausweichen?\n&eAusweichen ist eine passive F\u00E4higkeit\n&edie ab und zu den Schaden in K\u00E4mpfen halbiert.\n&eDie Chance auszuweichen ist abh\u00E4ngig vom \n&eAkrobatiklevel. -Guides.Alchemy.Section.0 = &3\u00DCber Alchemie:\n&eIn Alchemie musst du Tr\u00E4nke brauen.\n&eMit h\u00F6herem Level werden die Tr\u00E4nke schneller\n&egebraut und neue Zutaten f\u00FCr zun\u00E4chst unerh\u00E4ltliche Tr\u00E4nke \n&efreigeschaltet.\n\n&3XP ZUWACHS:\n&eTr\u00E4nke brauen. -Guides.Alchemy.Section.1 = &3Wie funktioniert Katalyse?\n&eKatalyse beschleunigt das Brauen von Tr\u00E4nken bis\n&ezu 4-facher Geschwindigkeit bei Level 1000.\n&e -Guides.Alchemy.Section.2 = &3Wie funktioniert Gebräu?\n&eGebräu erm\u00F6glich das Brauen weiterer Tr\u00E4nke mit neuen\n&eZutaten.\n&eWelche Zutaten m\u00F6glich sind, h\u00E4ngt vom Rang ab.\n&eInsgesamt gibt es 8 R\u00E4nge zum freischalten. -Guides.Alchemy.Section.3 = &3Gebräu Tier 1 Zutaten:\n&eLohnenstaub, Fermentierte Spinnenaugen, Ghast Tr\u00E4nen,\n&eRedstone, Glowstonestaub, Zucker, Glitzernde Melone,\n&eGoldene Karotte, Magma Creme, Netherwarzen, Spinnenaugen, \n&eSchwarzpulver, Seerose, Kugelfisch (Vanilla Tr\u00E4nke) -Guides.Alchemy.Section.4 = &3Gebräu Tier 2 Zutaten:\n&eKarotte (Eile)\n&eSchleimball (Langsamkeit)\n\n&3Gebräu Tier 3 Zutaten:\n&eQuarz (Absoption)\n&eRoter Pilz (Springen) -Guides.Alchemy.Section.5 = &3Gebräu Tier 4 Zutaten:\n&eApfel (Gesundheitsboost)\n&eVerrottetes Fleisch (Hunger)\n\n&3Gebräu Tier 5 Zutaten:\n&eBrauner Pilz(\u00DCbelkeit)\n&eTintensack (Blindheit) -Guides.Alchemy.Section.6 = &3Gebräu Tier 6 Zutaten:\n&eGras (S\u00E4ttigung)\n\n&3Gebräu Tier 7 Zutaten:\n&eGiftige Kartoffel(Verwesung)\n\n&3Gebräu Tier 8 Zutaten:\n&eNormaler Goldener Apfel (Resistenz) -Guides.Archery.Section.0 = &3\u00DCber Bogenschie\u00DFen:\n&eIn Bogenschie\u00DFen geht es um die Verwendung von Pfeil und\n&eBogen.\n\n&eEs gibt unterschiedliche Kampfboni, wie Zusatzschaden,\n&eder mit dem Level steigt und der F\u00E4higkeit Feinde im PVP\n&ezu bet\u00E4uben. Zus\u00E4tzlich kannst du einige verschossene\n&ePfeile aus den Leichen deiner Feinde wiedergewinnen. -Guides.Archery.Section.1 = &3XP ZUWACHS:\n&eXP erh\u00E4ltst du durch das Abschie\u00DFen von Monstern und\n&eanderen Spielern. -Guides.Archery.Section.2 = &3Wie funktioniert der Kunstschuss?\n&eKunstschuss erh\u00F6ht den Schaden deines Schusses.\n&eDer Zusatzschaden steigt mit deinem Bogen Level.\n&eIn den Standardeinstellungen steigt der Schaden um 10%\n&ealle 50 Level, mit einem Maximum von 200% extra. -Guides.Archery.Section.3 = &3Wie Funktioniert Bet\u00E4ubung?\n&eDu hast eine passive Chance andere Spieler\n&ezu bet\u00E4uben wenn du sie anschie\u00DFt. Der Spieler wird\n&egezwungen f\u00FCr eine kurze Weile senkrecht nach oben zu\n&eschauen.\n&eEin Bet\u00E4ubungsschuss f\u00FCgt au\u00DFerdem 4 Schadenspunkte \n&e(2 Herzen) extra zu. -Guides.Available = &7Anleitung f\u00FCr {0} vorhanden - tippe /{1} ? [Seite] -Guides.Axes.Section.0 = &3\u00DCber Axt:\n&eMit dem Axt Skill kannst du die Axt f\u00FCr viel mehr als\n&enur abholzen verwenden! Du kannst Monster und Spieler\n&esprichw\u00F6rtlich weghacken und ihnen t\u00F6dliche\n&eSchl\u00E4ge verpassen oder sie zur\u00FCckweichen lassen\n&eDeine Axt zerst\u00F6rt au\u00DFerdem sehr gut R\u00FCstungen,\n&ewas mit h\u00F6herem Level noch mehr ansteigt. -Guides.Axes.Section.1 = &3XP ZUWACHS:\n&eUm XP zu bekommen musst du Spieler oder Monster \n&emit einer Axt schlagen. -Guides.Axes.Section.2 = &3Wie funktioniert der Sch\u00E4delspalter?\n&eDiese F\u00E4higkeit erlaubt dir einen Angriff mit Fl\u00E4chenschaden\n&eauszuf\u00FChren.\n&eDer Fl\u00E4chenschaden ist halb so gro\u00DF wie der \n&eHauptangriff, also perfekt f\u00FCr gro\u00DFe Ansammlungen von Mobs. -Guides.Axes.Section.3 = &3Wie funktionieren kritische Treffer?\n&eKritische Treffer sind eine passive F\u00E4higkeit\n&edie ab und zu Zusatzschaden zuf\u00FCgen.\n&eIn den Standardeinstellungen wird alle 2 Level \n&edie Chance um 0.1% erh\u00F6ht. Das f\u00FCgt Mobs\n&edoppelten und anderen Spielern 1,5 fachen Schaden zu. -Guides.Axes.Section.4 = &3Wie funktioniert die Axt-Beherrschung?\n&eAxt Beherrschung ist eine passive F\u00E4higkeit die deinen\n&eAxt-Schl\u00E4gen Zusatzschaden hinzuf\u00FCgt.\n&eStandardm\u00E4\u00DFig steigt der Schaden um 1 alle 50 Level,\n&emaximal auf 4 Extraschaden bei Level 200. -Guides.Axes.Section.5 = &3Wie funktioniert Wucht?\n&eSchlage m\u00E4chtig zu und zerst\u00F6re R\u00FCstungen!\n&eWucht hat eine passive Chance gegnerische\n&eR\u00FCstung zu besch\u00E4digen. Dieser Schaden steigt mit deinem Axt\n&eLevel. -Guides.Excavation.Section.0 = &3\u00DCber Graben:\n&eGraben ist die F\u00E4higkeit Sch\u00E4tze im Dreck zu finden.\n&eDurch Aufgraben des Landes wirst du Sch\u00E4tze finden\n&eJe l\u00E4nger du das tust, desto mehr Sch\u00E4tze findest du.\n\n&3XP ZUWACHS:\n&eXP erh\u00E4ltst du durch Schaufeln.\n&eNur bestimmte Materialen geben XP und Sch\u00E4tze. -Guides.Excavation.Section.1 = &3Kompatible Materialien:\n&eGras, Erde, Sand, Lehm, Kies, Myzel, Seelensand, Schnee -Guides.Excavation.Section.2 = &3Wie funktioniert der Giga Bohrer?\n&eHalte eine Schaufel in der Hand und mach Rechtsklick.\n&eVon nun an hast du ca. 4 Sekunden um einen kompatiblem\n&eBlock abzubauen.\n&eDaraufhin wird der Giga Bohrer aktiviert. -Guides.Excavation.Section.3 = &3Was ist der Giga Bohrer?\n&eGiga Bohrer ist eine F\u00E4higkeit deren Dauer vom Graben Skill\n&eabh\u00E4ngt.\n&eEs verdreifacht die Chance Sch\u00E4tze zu finden\n&eund erm\u00F6glicht sofortiges Abbauen kompatibler Materialien. -Guides.Excavation.Section.4 = &3Wie funktioniert der Schatz J\u00E4ger?\n&eJeder m\u00F6gliche Schatz hat seine eigene Level Voraussetzung\n&eum zu erscheinen, folglich ist es schwer&ezu sagen inwiefern es \n&edir hilft ein h\u00F6heres Level zu haben.\n&eJe h\u00F6her das Level, desto mehr Sch\u00E4tze k\u00F6nnen gefunden\n&ewerden. -Guides.Excavation.Section.5 = Beachte au\u00DFerdem, dass jedes kompatible Material seine\n&eeigenen einzigartigen Sch\u00E4tze hat.\n&eAnders ausgedr\u00FCckt: Sch\u00E4tze die du in Kies findest\n&egibt es nicht zwingend in Erde. -Guides.Fishing.Section.0 = &3\u00DCber Angeln:\n&eMit dem Angeln Skill ist Angeln wieder aufregend!\n&eFinde versteckte Sch\u00E4tze oder Rei\u00DFe Items von Monstern.\n\n&3XP ZUWACHS:\n&eFang Fische. -Guides.Fishing.Section.1 = &3Wie funktioniert der Schatz J\u00E4ger?\n&eMit dieser F\u00E4higkeit kannst du beim Angeln Sch\u00E4tze finden.\n&eDiese k\u00F6nnen sogar verzaubert sein!\n&eJeder m\u00F6gliche Schatz kann mit jedem Level gefunden\n&ewerden. Die H\u00E4ufigkeit h\u00E4ngt von dem Wert des Items ab.\n&eJe h\u00F6her der Angeln Skill ist, desto einfacher wird es\n&ewertvolle Sch\u00E4tze zu finden. -Guides.Fishing.Section.2 = &3Wie funktioniert Eisangeln?\n&eMit dieser F\u00E4higkeit kannst du in Eisseen angeln!\n&eWirf deine Angeln in einem Eissee aus\n&eum ein kleines Loch zum Angeln zu erstellen. -Guides.Fishing.Section.3 = &3Wie funktioniert die Profiangel?\n&eMit dieser passiven F\u00E4higkeit bei\u00DFen mehr Fische an.\n&eSobald die F\u00E4higkeit freigeschaltet ist bringt das Angeln\n&ein einem Boot oder Ozean die doppelte \n&eAnbei\u00DFChance. -Guides.Fishing.Section.4 = &3Wie funktioniert Rei\u00DFen?\n&eDiese F\u00E4higkeit erm\u00F6glich es Monstern Items zu entrei\u00DFen,\n&eindem du sie an deine Angel h\u00E4ngst. \n&eDie Monster lassen das Item, das sie normalerweise beim Tod\n&efallen lassen fallen.\n&eAu\u00DFerdem gibt es eine kleine Chance Monstersch\u00E4del\n&ezu bekommen. -Guides.Fishing.Section.5 = &3Wie funktioniert die Fischer-Mahlzeit?\n&eDu wirst beim Essen von Fisch besser satt. -Guides.Fishing.Section.6 = &3Bemerkung zum Angeln:\n&eAngeln Drops sind vollkommen anpassbar.\n&eErgebnisse unterscheiden sich deshalb von Server zu Server. -Guides.Header = &6-=&a{0} Anleitung&6=- -Guides.Herbalism.Section.0 = &3\u00DCber Kräuterkunde\n&eIn Kräuterkunde geht es um das Ernten.\n\n\n&3XP ZUWACHS:\n&eErnte Pflanzen. -Guides.Herbalism.Section.1 = &3Kompatible Blocks\n&eWeizen, Kartoffeln, Karotten, Melonen, K\u00FCrbisse,\n&eZuckerrohr, Kakaobohnen, Blumen, Kakteen,\n&ePilze, Netherwarzen, Seerosen und Ranken. -Guides.Herbalism.Section.2 = &3Wie funktioniert Gr\u00FCnes Land?\n&eGr\u00FCnes Land ist eine aktive F\u00E4higkeit die du aktivierst indem du\n&emit einer Harke in der Hand rechtsklickst.\n&eGr\u00FCnes Land erm\u00F6glicht einen 3-fachen Ertrag beim Ernten.\n&eAu\u00DFerdem erm\u00F6glich es Leben in zu hauchen und sie\n&emithilfe von Samen aus dem Inventar zu verwandeln. -Guides.Herbalism.Section.3 = &3Wie funktioniert der Gr\u00FCne Daumen (Samen)?\n&eDiese passive F\u00E4higkeit pflanz automatisch beim Ernten nach.\n&eDer Erfolg h\u00E4ngt vom Kräuterkunde Level ab. -Guides.Herbalism.Section.4 = &3Wie funktioniert der Gr\u00FCne Daumen(Blocks)?\n&eDiese aktive F\u00E4higkeit erm\u00F6glich es Bl\u00F6cke in ihre \n&e"Naturverwandte" Form zu verwandeln. Klicke dazu mit der\n&erechten Maustaste auf einen Block, w\u00E4hrend du Samen in\n&eder Hand h\u00E4ltst. \n&ePro Versuch kostet es dich einen Samen.\n&eDer Erfolg h\u00E4ngt vom Kräuterkunde Level ab. -Guides.Herbalism.Section.5 = &3Wie funktioniert das Bauernfr\u00FChst\u00FCck?\n&eDu wirst beim Essen von Brot, Keksen, Melonen, Pilzsuppe,\n&eKarotten und Kartoffeln satter. -Guides.Herbalism.Section.6 = &3Wie funktioniert Hylians Gl\u00FCck?\n&eDiese passive F\u00E4higkeit gibt dir eine Chance Items zu finden\n&ewenn du bestimmte Bl\u00F6cke mit dem Schwert abbaust. -Guides.Herbalism.Section.7 = &3Wie funktionieren Doppeldrops?\n&eDu erh\u00E4ltst beim Ernten mehr Ertrag. -Guides.Mining.Section.0 = &3\u00DCber Bergbau:\n&eIm Bergbau musst du Steine und Erze sammeln. Du erh\u00E4ltst\n&eab und zu zus\u00E4tzliche Drops.\n\n&3XP ZUWACHS:\n&eUm Erfahrung zu sammeln musst du mit der Spitzhacke abbauen.\n&eNur bestimmte Blocks geben XP. -Guides.Mining.Section.1 = &3Kompatible Materialien:\n&eStein, Kohleerz, Eisenerz, Golderz, Diamanterz, Redstoneerz,\n&eLapiserz, Obsidian, Bemooster Bruchstein, Endstein,\n&eGlowstone, und Netherrack. -Guides.Mining.Section.2 = &3Wie funktioniert Super-Brecher?:\n&eMache einen Rechtsklick w\u00E4hrend du eine Spitzhacke in der\n&eHand h\u00E4ltst.\n&eVon nun an hast du ungef\u00E4hr 4 Sekunden um ein mit Bergbau\n&ekompatibles Material abzubauen, daraufhin wird Super-Brecher\n&eaktiviert. -Guides.Mining.Section.3 = &3Was ist Super-Brecher?\n&eSuper-Brecher ist eine F\u00E4higkeit deren Dauer\n&evom Bergbau Skill abh\u00E4ngt. Es verdreifacht die \n&eChance Sch\u00E4tze zu finden und erm\u00F6glicht\n&esofortiges Abbauen kompatibler Materialien. -Guides.Mining.Section.4 = &3Wie benutzt man Z\u00FCndstoff?:\n&eHalte eine Spitzhacke in der Hand, b\u00FCck dich und klicke aus\n&esicherer Entfernung mit der rechten Maustaste auf das TNT.\n&eDas TNT wird sofort explodieren. -Guides.Mining.Section.5 = &3Wie funktioniert Z\u00FCndstoff?\n&eZ\u00FCndstoff ist eine F\u00E4higkeit mit einer Abklingzeit, deren St\u00E4rke\n&evom Level abh\u00E4ngt. Sie erlaubt dir beim Abbauen mit TNT dieses\n&eaus der Ferne zu z\u00FCnden. Z\u00FCndstoff besteht aus 3 Teilen.\n&eErstens dem Sprengmeister mit gr\u00F6\u00DFeren Explosionen\n&eZweitens dem Explosions-Experten, der Schaden von TNT\n&ereduziert.\n&eDie dritte F\u00E4higkeit erh\u00F6ht einfach den Erzertrag und\n&eund reduziert den Schutt. -Guides.Page.Invalid = Keine g\u00FCltige Seitenzahl! -Guides.Page.OutOfRange = Es gibt nur insgesamt {0} Seiten. -Guides.Repair.Section.0 = &3\u00DCber Reparatur:\n&eReparatur erlaub dir an einem Eisenblock Werkzeuge und\n&eWaffen zu reparieren.\n\n&3XP ZUWACHS:\n&eRepariere Werkzeuge am Eisenblockamboss\n&cAchtung: &eDas ist nicht der normale Minecraft Amboss! -Guides.Repair.Section.1 = &3Wie kann ich Reparatur verwenden?\n&ePlatziere einen mcMMO Amboss, halte das zu reparierende Item\n&ein der Hand und klicke mit der rechten Maustaste auf ihn. Zum\n&eReparieren ben\u00F6tigst du die Ausgangsmaterialien im Inventar,\n&ediese werden dir im Zuge der Reparatur abgezogen. -Guides.Repair.Section.2 = &3Wie funktioniert der Reparatur Meister?\n&eMit dem Reparatur Meister wird dein Werkzeug ein bisschen\n&ebesser als normalerweise repariert.\n&eDer Bonus ist abh\u00E4ngig vom Reparatur Level. -Guides.Repair.Section.3 = &3Wie funktioniert Super Reparatur?\n&eMit Super Reparatur werden ab und zu deine Items\n&edoppelt so gut repariert. -Guides.Repair.Section.4 = &3Wie funktioniert Arkanes Schmieden?\n&eDiese F\u00E4higkeit erm\u00F6glicht dir mit einer gewissen\n&eChance Verzauberungen auf Items zu erhalten.\n&eVerzauberungen k\u00F6nnen erhalten, vermindert werden oder\n&eganz verloren gehen. -Guides.Salvage.Section.0 = &3\u00DCber Verwerten:\n&eMit einem Goldamboss kannst du R\u00FCstungen und\n&eWerkzeuge verwerten.\n\n&3XP ZUWACHS:\n&eVerwerten ist ein vom Angeln und Reparieren abh\u00E4ngiger Skill\n&eSein Level ist die H\u00E4lfte von deren Summe. -Guides.Salvage.Section.1 = &3Wie funktioniert Verwerten?\n&ePlatziere einen Goldamboss und rechtsklicke mit dem Item in\n&eder Hand. Das item wird zerst\u00F6rt und in seine\n&eBestandteile zerlegt.\n\n&eBeispielsweise gibt eine Eisenaxt Eisenbarren. -Guides.Salvage.Section.2 = &3Wie funktioniert Fortgeschrittenes Verwerten?\n&eSobald freigeschaltet, kannst du besch\u00E4digte Items verwerten.\n&eDer Ertrag steigt mit dem Level.\n&eDer Mindestertrag ist immer 1 Item, ansonsten kannst du nicht\n&everwerten. -Guides.Salvage.Section.3 = &3Zur Verbildlichung ein Beispiel:\n&eSagen wir verwerten eine Goldene Spitzhacke mit 80%\n&eHaltbarkeit, bedeutet das, dass wir nur 2 Gold bekommen\n&ek\u00F6nnen (Spitzhacke=3 Goldbarren, also jeder 33,33%\n&eHaltbarkeit) was 66% entspricht. Wenn dein\n&eErtragsprozentsatz unter 66% liegt wirst du keine 2 Barren\n&ebekommen k\u00F6nnen. Wenn sie dar\u00FCber ist, kannst du den\n&e"gesamten Betrag" bekommen, der aus 2 Eisenbarren besteht. -Guides.Salvage.Section.4 = &3Wie funktioniert Arkanes Verwerten?\n&eDiese F\u00E4higkeit erm\u00F6glicht es verzauberte B\u00FCcher beim\n&eVerwerten von verzauberten Items zu bekommen.\n&eVerzauberungen k\u00F6nnen vollkommen oder teilweise extrahiert\n&ewerden.\n&eBei einer teilweisen Extraktion wird das Verzauberungslevel\n&ereduziert. -Guides.Smelting.Section.0 = Kommt irgendwann mal... -Guides.Swords.Section.0 = &3\u00DCber Schwerter:\n&eDiese F\u00E4higkeit gibt Kampfboni bei Benutzung\n&edes Schwertes.\n\n&3XP ZUWACHS:\n&eVerletze Monster und Spieler mit dem Schwert. -Guides.Swords.Section.1 = &3Wie funktioniert der S\u00E4gezahnschlag??\n&eS\u00E4gezahnschlag ist eine aktive F\u00E4higkeit die du mit Rechtsklick \n&eaktivierst.\n&eMit dieser F\u00E4higkeit kannst du Fl\u00E4chenschaden verteilen. \n&eAu\u00DFerdem blutet das Ziel f\u00FCr kurze Zeit. -Guides.Swords.Section.2 = &3Wie funktioniert der Gegenangriff?\n&eGegenangriff ist eine aktive F\u00E4higkeit,\n&ebei der Angriffe von Monstern beim Blocken um bis zu 50%\n&edes erhaltenen Schadens reflektiert werden k\u00F6nnen. -Guides.Swords.Section.3 = &3Wie funktioniert Blutung?\n&eBlutung f\u00FCgt den Gegnern alle 2 Sekunden Schaden zu. Das\n&eBluten geht solange bis die F\u00E4higkeit ausl\u00E4uft oder der\n&eGegner stirbt.\n&eDie Dauer der Blutung erh\u00F6ht sich mit dem Schwert Skill. -Guides.Taming.Section.0 = &3\u00DCber Z\u00E4hmen:\n&eZ\u00E4hmen gibt dem Spieler diverse Kampfboni beim Kampf mit\n&egez\u00E4hmten W\u00F6lfen.\n\n&3XP ZUWACHS:\n&eUm XP zu bekommen musst du Tiere z\u00E4hmen oder mit\n&edeinen W\u00F6lfen k\u00E4mpfen. -Guides.Taming.Section.1 = &3Wie funktioniert Ruf der Wildnis?\n&eRuf der Wildnis ist eine aktive F\u00E4higkeit die dir erlaubt\n&eeinen Wolf, einen Ozelot oder ein Pferd an deine Seite zu\n&erufen. \n&eDas tust du, indem du Linksklickst w\u00E4hrend du Knochen, Fisch\n&eoder \u00C4pfel in der Hand h\u00E4ltst. -Guides.Taming.Section.2 = &3Wie funktioniert Bestienkunde?\n&eBestienkunde erlaubt es die Haustiere zu inspizieren\n&eHalte einen Knochen in der Hand und klick mit linker Maustaste\n&eauf das Haustier um Bestienkunde zu aktivieren. -Guides.Taming.Section.3 = &3Wie funktioniert Aufschlitzen?\n&eAufschlitzen ist eine passive F\u00E4higkeit die beim Ziel\n&edes Wolfes Blutungen hervorrufen kann. Der Erfolg h\u00E4ngt\n&evom Z\u00E4hmen Level ab. -Guides.Taming.Section.4 = &3Wie funktionieren gesch\u00E4rfte Klauen?\n&eGesch\u00E4rfte Klauen geben Zusatzschaden in Abh\u00E4ngigkeit\n&evom Z\u00E4hmen Level. -Guides.Taming.Section.5 = &3Wie funktioniert Umweltbewusst?\n&eDiese passive F\u00E4higkeit erm\u00F6glich W\u00F6lfen sich zu dir zu\n&eteleportieren wenn sie in die N\u00E4he von Gefahren wie \n&eKakteen/Lava kommen. \n&eZus\u00E4tzlich sind W\u00F6lfe immun gegen Fallschaden. -Guides.Taming.Section.6 = &3Wie funktioniert Dicker Pelz?\n&eDiese passive F\u00E4higkeit reduziert Schaden und \n&emacht W\u00F6lfe feuerresistent. -Guides.Taming.Section.7 = &3Wie funktioniert Schocksicher?\n&eDiese passive F\u00E4higkeit reduziert den Schaden\n&edurch Explosionen. -Guides.Taming.Section.8 = &3Wie funktioniert Schnell-Imbiss?\n&eDiese passive F\u00E4higkeit gibt dem Wolf eine Chance sich zu \n&eerholen wann immer er einen Gegner verletzt. -Guides.Unarmed.Section.0 = &3\u00DCber Unbewaffnet:\n&eMit Unbewaffnet kann der echte Mann endlich mit seinen\n&eF\u00E4usten angemessen zuschlagen. \n\n&3XP ZUWACHS:\n&eK\u00E4mpfe unbewaffnet gegen Monster und andere Spieler -Guides.Unarmed.Section.1 = &3Wie funktioniert Berserker?\n&eBerserker ist eine aktive F\u00E4higkeit die mit Rechtsklick\n&eaktiviert wird.\n&eIm Berserker Modus f\u00FCgst du 50% mehr Schaden zu und\n&ekannst weiche Materiale wie Gras und Erde sofort abbauen. -Guides.Unarmed.Section.2 = &3Wie funktioniert der Eiserne Arm?\n&eEiserner Arm erh\u00F6ht den Monstern und Spielern mit den\n&eF\u00E4usten zugef\u00FCgten Schaden. -Guides.Unarmed.Section.3 = &3Wie funktioniert Pfeilablenkung?\n&ePfeilablenkung ist eine passive F\u00E4higkeit die ab und zu\n&ePfeile von Skeletten und angreifenden Spielern ablenkt.\n&eDiese Pfeile prallen einfach ab und fallen auf den Boden. -Guides.Unarmed.Section.4 = &3Wie funktioniert der Eiserne Griff?\n&eEiserner Griff ist eine passive F\u00E4higkeit die Entwaffnung\n&everhindert. Mit h\u00F6herem Level ist es umso einfacher\n&eEntwaffnung zu verhindern. -Guides.Unarmed.Section.5 = &3Wie funktioniert Entwaffnen?\n&eDiese passive F\u00E4higkeit erm\u00F6glich es den Gegner zu\n&eentwaffnen, sodass seine Waffe auf den Boden f\u00E4llt. -Guides.Usage = Der Befehl ist /{0} ? [Seite] -Guides.Woodcutting.Section.0 = &3\u00DCber Holzf\u00E4ller:\n&eIm Holzf\u00E4llen geht es um das F\u00E4llen von B\u00E4umen.\n\n&3XP ZUWACHS:\n&eDu kriegst XP f\u00FCr das abholzen von Baumst\u00E4mmen. -Guides.Woodcutting.Section.1 = &3Wie funktioniert der Baumf\u00E4ller?\n&eBaumf\u00E4ller ist eine aktive F\u00E4higkeit. Mache mit der Axt in der\n&eHand einen Rechtsklick um sie zu aktivieren. Der Baum\n&ewird sofortig gef\u00E4llt und alle St\u00E4mme abgebaut. -Guides.Woodcutting.Section.2 = &3Wie funktioniert Bl\u00E4ttersturm?\n&eBl\u00E4ttersturm ist eine passive F\u00E4higkeit die Bl\u00E4tter\n&ebei Ber\u00FChrung mit der Axt sofortig bricht. Standardm\u00E4\u00DFig\n&ewird diese F\u00E4higkeit bei Level 100 freigeschaltet. -Guides.Woodcutting.Section.3 = &3Wie funktionieren Doppel-Drops?\n&eDiese passive F\u00E4higkeit gibt dir ab und zu doppelten\n&eErtrag f\u00FCr jeden Stamm den du f\u00E4llst. +Fishing.Ability.Info = Zauberjäger: &7**Verbessert sich mit Schatzjäger-Rang** +Fishing.Ability.Locked.0 = Gesperrt bis Level {0}! +Fishing.Ability.Locked.1 = Gesperrt bis Level {0}! +Fishing.Ability.Locked.2 = Gesperrt bis Level {0}! +Fishing.Ability.TH.Boom = &c&lDeine Angelschnur hat sich in einer &4&lSeemine &c&lverfangen! +Fishing.Ability.TH.MagicFound = &bDu fühlst etwas Magisches an diesem Fang... +Fishing.Ability.TH.Poison = &7Irgendetwas stinkt hier... +Fishing.Chance.Raining = &9Regen-Bonus +Fishing.Exhausting = &c&oUnsachgemäße Nutzung der Angelrute führt zu Ermüdung und Abnutzen der Rute. +Fishing.Listener = Angeln: +Fishing.LowResourcesTip = &7Dein Gespür sagt dir, dass es hier kaum noch Fische gibt. Versuche es mindestens {0} Blöcke entfernt. +Fishing.ScarcityTip = &e&oDas Gebiet ist überfischt. Versuche es woanders, mindestens {0} Blöcke entfernt. +Fishing.Scared = &7&oHektische Bewegungen verängstigen Fische! +Fishing.SkillName = Angeln +Fishing.SubSkill.FishermansDiet.Description = Verbessert den Nährwert von geangelter Nahrung. +Fishing.SubSkill.FishermansDiet.Name = Fischers-Diät +Fishing.SubSkill.FishermansDiet.Stat = Fischers-Diät:&a Rang {0} +Fishing.SubSkill.IceFishing.Description = Ermöglicht es dir in Eisbiomen zu angeln. +Fishing.SubSkill.IceFishing.Name = Eisangeln +Fishing.SubSkill.IceFishing.Stat = Eisangeln +Fishing.SubSkill.MagicHunter.Description = Finde verzauberte Gegenstände. +Fishing.SubSkill.MagicHunter.Name = Zauber-Jäger +Fishing.SubSkill.MagicHunter.Stat = Zauber-Jäger Chance +Fishing.SubSkill.MasterAngler.Description = Fische können häufiger gefangen werden, mit einem Boot funktioniert es umso besser. +Fishing.SubSkill.MasterAngler.Name = Superangel +Fishing.SubSkill.MasterAngler.Stat = Mindestwartezeit beim Angeln reduziert um: &a-{0} Sekunden +Fishing.SubSkill.MasterAngler.Stat.Extra = Maximalwartezeit beim Angeln reduziert um: &a-{0} Sekunden +Fishing.SubSkill.Shake.Description = Entreiße Lebewesen und Spielern mit deiner Angel Gegenstände. +Fishing.SubSkill.Shake.Name = Reißen +Fishing.SubSkill.Shake.Stat = Reißen Chance +Fishing.SubSkill.TreasureHunter.Description = Angle verschiedene Objekte. +Fishing.SubSkill.TreasureHunter.Name = Schatz-Jäger +Fishing.SubSkill.TreasureHunter.Stat = Schatz-Jäger Rang: &a{0}&3/&a{1} +Fishing.SubSkill.TreasureHunter.Stat.Extra = Drop-Rate: &7Üblich: &e{0} &aUnüblich: &e{1}\n&9Selten: &e{2} &dEpisch: &e{3} &6Legendär: &e{4} &bMythic: &e{5} -Hardcore.DeathStatLoss.Name = Skillverlust bei Tod: -Hardcore.DeathStatLoss.PercentageChanged = &6[mcMMO] Der Verlustprozentsatz wurde auf {0} ge\u00E4ndert. -Hardcore.DeathStatLoss.PlayerDeath = &6[mcMMO] &4Du hast durch den Tod&9{0}&4 Level verloren. -Hardcore.Mode.Disabled = &6[mcMMO] Hardcore Modus {0} deaktiviert f\u00FCr {1}. -Hardcore.Mode.Enabled = &6[mcMMO] Hardcore Modus {0} aktiviert f\u00FCr {1}. -Hardcore.Vampirism.Killer.Failure = &6[mcMMO] &e{0}&7 war nicht erfahren genug um dir Wissen zu hinterlassen. -Hardcore.Vampirism.Killer.Success = &6[mcMMO] &3Du hast &9{0}&3 Level von &e{1} &3 gestohlen. -Hardcore.Vampirism.Name = Vampirismus -Hardcore.Vampirism.PercentageChanged = &6[mcMMO] Der Vampirismus Prozentsatz wurde auf {0} ge\u00E4ndert. -Hardcore.Vampirism.Victim.Failure = &6[mcMMO] &e{0}&7 hat es nicht geschafft Wissen von dir zu stehlen! -Hardcore.Vampirism.Victim.Success = &6[mcMMO] &e{0}&4 hat&9{1}&4 Level von dir gestohlen! +Guides.Acrobatics.Section.0 = &3Über Akrobatik:\n&eAkrobatik ist die Kunst sich anmutig fortzubewegen.\n&eFall- und Kampfschaden werden reduziert.\n\n&3XP-Zuwachs:\n&eErfahrung sammelst du indem du in Kämpfen\n&eausweichst oder Stürze aus großen Höhen überlebst. +Guides.Acrobatics.Section.1 = &3Wie funktioniert Abrollen?\n&eAb und zu rollst du beim Fallen ab und der Fallschaden wird\n&ereduziert. Wenn du die Schleichen-Taste während dem Fallen\n&ehältst, verdoppelt sich die Chance abzurollen.\n&eIn dem Fall rollst du anmutig ab.\n&eAnmutige Rollen sind wie normale Rollen, nur dass\n&esie öfter passieren und damit mehr Schutz vor Stürzen\n&eliefern. +Guides.Acrobatics.Section.2 = &3Wie funktioniert Ausweichen?\n&eAusweichen ist eine passive Fähigkeit\n&edie ab und zu den Schaden in Kämpfen halbiert.\n&eDie Chance auszuweichen ist abhängig vom \n&eAkrobatiklevel. +Guides.Alchemy.Section.0 = &3Über Alchemie:\n&eIn Alchemie musst du Tränke brauen.\n&eMit höherem Level werden die Tränke schneller\n&egebraut und neue Zutaten für zunächst unerhältliche Tränke \n&efreigeschaltet.\n\n&3XP-Zuwachs:\n&eTränke brauen. +Guides.Alchemy.Section.1 = &3Wie funktioniert Katalyse?\n&eKatalyse beschleunigt das Brauen von Tränken bis\n&ezu 4-facher Geschwindigkeit bei Level 1000. +Guides.Alchemy.Section.2 = &3Wie funktioniert Gebräu?\n&eGebräu ermöglich das Brauen weiterer Tränke mit neuen\n&eZutaten.\n&eWelche Zutaten möglich sind, hängt vom Rang ab.\n&eInsgesamt gibt es 8 Ränge freizuschalten. +Guides.Alchemy.Section.3 = &3Gebräu Tier 1 Zutaten:\n&eLohnenstaub, Fermentierte Spinnenaugen, Ghast Tränen,\n&eRedstone, Glowstonestaub, Zucker, Glitzernde Melone,\n&eGoldene Karotte, Magma Creme, Netherwarzen, Spinnenaugen, \n&eSchwarzpulver, Seerose, Kugelfisch (Vanilla Tränke) +Guides.Alchemy.Section.4 = &3Gebräu Tier 2 Zutaten:\n&eKarotte (Eile)\n&eSchleimball (Langsamkeit)\n\n&3Gebräu Tier 3 Zutaten:\n&eQuarz (Absorption)\n&eRoter Pilz (Sprungkraft) +Guides.Alchemy.Section.5 = &3Gebräu Tier 4 Zutaten:\n&eApfel (Gesundheitsboost)\n&eVerrottetes Fleisch (Hunger)\n\n&3Gebräu Tier 5 Zutaten:\n&eBrauner Pilz(Übelkeit)\n&eTintensack (Blindheit) +Guides.Alchemy.Section.6 = &3Gebräu Tier 6 Zutaten:\n&eGras (Sättigung)\n\n&3Gebräu Tier 7 Zutaten:\n&eGiftige Kartoffel (Verwesung)\n\n&3Gebräu Tier 8 Zutaten:\n&eNormaler Goldener Apfel (Resistenz) +Guides.Archery.Section.0 = &3Über Bogenschießen:\n&eIn Bogenschießen geht es um die Verwendung von Pfeil und\n&eBogen.\n\n&eEs gibt unterschiedliche Kampfboni, wie Zusatzschaden,\n&eder mit dem Level steigt und der Fähigkeit Feinde im PVP\n&ezu betäuben. Zusätzlich kannst du einige verschossene\n&ePfeile aus den Leichen deiner Feinde wiedergewinnen. +Guides.Archery.Section.1 = &3XP-Zuwachs:\n&eXP erhältst du durch das Abschießen von Monstern und\n&eanderen Spielern. +Guides.Archery.Section.2 = &3Wie funktioniert der Kunstschuss?\n&eKunstschuss erhöht den Schaden deines Schusses.\n&eDer Zusatzschaden steigt mit deinem Bogen-Level.\n&eIn den Standardeinstellungen steigt der Schaden um 10%\n&ealle 50 Level, mit einem Maximum von 200% extra. +Guides.Archery.Section.3 = &3Wie Funktioniert Betäubung?\n&eDu hast eine passive Chance andere Spieler\n&ezu betäuben wenn du sie anschießt. Der Spieler wird\n&egezwungen für eine kurze Weile senkrecht nach oben zu\n&eschauen.\n&eEin Betäubungsschuss fügt außerdem 4 Schadenspunkte \n&e(2 Herzen) extra zu. +Guides.Available = &7Anleitung für {0} vorhanden - tippe /{1} ? [Seite] +Guides.Axes.Section.0 = &3Über Axt:\n&eMit dem Axt-Skill kannst du die Axt für viel mehr als\n&enur abholzen verwenden! Du kannst Monster und Spieler\n&esprichwörtlich weghacken und ihnen tödliche\n&eSchläge verpassen oder sie zurückweichen lassen.\n&eDeine Axt zerstört außerdem sehr gut Rüstungen,\n&ewas mit höherem Level noch mehr ansteigt. +Guides.Axes.Section.1 = &3XP-Zuwachs:\n&eUm XP zu bekommen musst du Spieler oder Monster \n&emit einer Axt schlagen. +Guides.Axes.Section.2 = &3Wie funktioniert der Schädelspalter?\n&eDiese Fähigkeit erlaubt dir einen Angriff mit Flächenschaden\n&eauszuführen.\n&eDer Flächenschaden ist halb so groß wie der \n&eHauptangriff, also perfekt für große Ansammlungen von Mobs. +Guides.Axes.Section.3 = &3Wie funktionieren kritische Treffer?\n&eKritische Treffer sind eine passive Fähigkeit\n&edie ab und zu Zusatzschaden zufügen.\n&eIn den Standardeinstellungen wird alle 2 Level \n&edie Chance um 0.1% erhöht. Das fügt Mobs\n&edoppelten und anderen Spielern 1,5-fachen Schaden zu. +Guides.Axes.Section.4 = &3Wie funktioniert die Axt-Beherrschung?\n&eAxt-Beherrschung ist eine passive Fähigkeit die deinen\n&eAxt-Schlägen Zusatzschaden hinzufügt.\n&eStandardmäßig steigt der Schaden um 1 alle 50 Level,\n&emaximal auf 4 Extraschaden bei Level 200. +Guides.Axes.Section.5 = &3Wie funktioniert Wucht?\n&eSchlage mächtig zu und zerstöre Rüstungen!\n&eWucht hat eine passive Chance gegnerische\n&eRüstung zu beschädigen. Dieser Schaden steigt mit deinem Axt-\n&eLevel. +Guides.Excavation.Section.0 = &3Über Graben:\n&eGraben ist die Fähigkeit Schätze im Dreck zu finden.\n&eDurch Aufgraben des Landes wirst du Schätze finden.\n&eJe länger du das tust, desto mehr Schätze findest du.\n\n&3XP-Zuwachs:\n&eXP erhältst du durch Schaufeln.\n&eNur bestimmte Materialen geben XP und Schätze. +Guides.Excavation.Section.1 = &3Kompatible Materialien:\n&eGras, Erde, Sand, Lehm, Kies, Myzel, Seelensand, Schnee +Guides.Excavation.Section.2 = &3Wie funktioniert der Giga-Bohrer?\n&eHalte eine Schaufel in der Hand und mach Rechtsklick.\n&eVon nun an hast du ca. 4 Sekunden um einen kompatiblem\n&eBlock abzubauen.\n&eDaraufhin wird der Giga-Bohrer aktiviert. +Guides.Excavation.Section.3 = &3Was ist der Giga-Bohrer?\n&eGiga-Bohrer ist eine Fähigkeit deren Dauer vom Graben-Skill\n&eabhängt.\n&eEs verdreifacht die Chance Schätze zu finden\n&eund ermöglicht sofortiges Abbauen kompatibler Materialien. +Guides.Excavation.Section.4 = &3Wie funktioniert der Schatz-Jäger?\n&eJeder mögliche Schatz hat seine eigene Level-Voraussetzung\n&eum zu erscheinen, folglich ist es schwer&ezu sagen inwiefern es \n&edir hilft ein höheres Level zu haben.\n&eJe höher das Level, desto mehr Schätze können gefunden\n&ewerden. +Guides.Excavation.Section.5 = Beachte außerdem, dass jedes kompatible Material seine\n&eeigenen einzigartigen Schätze hat.\n&eAnders ausgedrückt: Schätze die du in Kies findest\n&egibt es nicht zwingend in Erde. +Guides.Fishing.Section.0 = &3Über Angeln:\n&eMit dem Angeln-Skill ist Angeln wieder aufregend!\n&eFinde versteckte Schätze oder reiße Items von Monstern.\n\n&3XP-Zuwachs:\n&eFange Fische. +Guides.Fishing.Section.1 = &3Wie funktioniert der Schatz-Jäger?\n&eMit dieser Fähigkeit kannst du beim Angeln Schätze finden.\n&eDiese können sogar verzaubert sein!\n&eJeder mögliche Schatz kann mit jedem Level gefunden\n&ewerden. Die Häufigkeit hängt von dem Wert des Items ab.\n&eJe höher der Angeln-Skill ist, desto einfacher wird es\n&ewertvolle Schätze zu finden. +Guides.Fishing.Section.2 = &3Wie funktioniert Eisangeln?\n&eMit dieser Fähigkeit kannst du in Eisseen angeln!\n&eWirf deine Angeln in einem Eissee aus\n&eum ein kleines Loch zum Angeln zu erstellen. +Guides.Fishing.Section.3 = &3Wie funktioniert die Profiangel?\n&eMit dieser passiven Fähigkeit beißen mehr Fische an.\n&eSobald die Fähigkeit freigeschaltet ist bringt das Angeln\n&ein einem Boot oder Ozean die doppelte \n&eAnbeißchance. +Guides.Fishing.Section.4 = &3Wie funktioniert Reißen?\n&eDiese Fähigkeit ermöglich es Monstern Items zu entreißen,\n&eindem du sie an deine Angel hängst. \n&eDie Monster lassen das Item, das sie normalerweise beim Tod\n&efallen lassen, fallen.\n&eAußerdem gibt es eine kleine Chance Monsterschädel\n&ezu bekommen. +Guides.Fishing.Section.5 = &3Wie funktioniert die Fischer-Mahlzeit?\n&eDu wirst beim Essen von Fisch besser satt. +Guides.Fishing.Section.6 = &3Bemerkung zum Angeln:\n&eAngel-Drops sind vollkommen anpassbar.\n&eErgebnisse unterscheiden sich deshalb von Server zu Server. +Guides.Header = &6-=&a{0} Anleitung&6=- +Guides.Herbalism.Section.0 = &3Über Kräuterkunde\n&eIn Kräuterkunde geht es um das Ernten.\n\n&3XP-Zuwachs:\n&eErnte Pflanzen. +Guides.Herbalism.Section.1 = &3Kompatible Pflanzen:\n&eWeizen, Kartoffeln, Karotten, Melonen, Kürbisse,\n&eZuckerrohr, Kakaobohnen, Blumen, Kakteen,\n&ePilze, Netherwarzen, Seerosen und Ranken. +Guides.Herbalism.Section.2 = &3Wie funktioniert Grünes Land?\n&eGrünes Land ist eine aktive Fähigkeit die du aktivierst indem du\n&emit einer Harke in der Hand rechtsklickst.\n&eGrünes Land ermöglicht einen 3-fachen Ertrag beim Ernten.\n&eAußerdem ermöglich es Leben einzuhauchen und sie\n&emithilfe von Samen aus dem Inventar zu verwandeln. +Guides.Herbalism.Section.3 = &3Wie funktioniert der Grüne Daumen (Samen)?\n&eDiese passive Fähigkeit pflanz automatisch beim Ernten nach.\n&eDer Erfolg hängt vom Kräuterkunde Level ab. +Guides.Herbalism.Section.4 = &3Wie funktioniert der Grüne Daumen (Blöcke)?\n&eDiese aktive Fähigkeit ermöglich es Blöcke in ihre \n&e"naturverwandte" Form zu verwandeln. Klicke dazu mit der\n&erechten Maustaste auf einen Block, während du Samen in\n&eder Hand hältst. \n&ePro Versuch kostet es dich einen Samen.\n&eDer Erfolg hängt vom Kräuterkunde-Level ab. +Guides.Herbalism.Section.5 = &3Wie funktioniert das Bauernfrühstück?\n&eDu wirst beim Essen von Brot, Keksen, Melonen, Pilzsuppe,\n&eKarotten und Kartoffeln satter. +Guides.Herbalism.Section.6 = &3Wie funktioniert Hylians Glück?\n&eDiese passive Fähigkeit gibt dir eine Chance Items zu finden\n&ewenn du bestimmte Blöcke mit dem Schwert abbaust. +Guides.Herbalism.Section.7 = &3Wie funktionieren Doppeldrops?\n&eDu erhältst beim Ernten mehr Ertrag. +Guides.Mining.Section.0 = &3Über Bergbau:\n&eIm Bergbau musst du Steine und Erze sammeln. Du erhältst\n&eab und zu zusätzliche Drops.\n\n&3XP-Zuwachs:\n&eUm Erfahrung zu sammeln musst du mit der Spitzhacke abbauen.\n&eNur bestimmte Blöcke geben XP. +Guides.Mining.Section.1 = &3Kompatible Materialien:\n&eStein, Kohleerz, Eisenerz, Golderz, Diamanterz, Redstoneerz,\n&eLapiserz, Obsidian, Bemooster Bruchstein, Endstein,\n&eGlowstone, und Netherrack. +Guides.Mining.Section.2 = &3Wie funktioniert der Super-Brecher?:\n&eMache einen Rechtsklick während du eine Spitzhacke in der\n&eHand hältst.\n&eVon nun an hast du ungefähr 4 Sekunden um ein mit Bergbau\n&ekompatibles Material abzubauen, daraufhin wird der Super-Brecher\n&eaktiviert. +Guides.Mining.Section.3 = &3Was ist der Super-Brecher?\n&eSuper-Brecher ist eine Fähigkeit deren Dauer\n&evom Bergbau-Skill abhängt. Es verdreifacht die \n&eChance Schätze zu finden und ermöglicht\n&esofortiges Abbauen kompatibler Materialien. +Guides.Mining.Section.4 = &3Wie benutzt man Zündstoff?:\n&eHalte eine Spitzhacke in der Hand, bück dich und klicke aus\n&esicherer Entfernung mit der rechten Maustaste auf das TNT.\n&eDas TNT wird sofort explodieren. +Guides.Mining.Section.5 = &3Wie funktioniert Zündstoff?\n&eZündstoff ist eine Fähigkeit mit einer Abklingzeit, deren Stärke\n&evom Level abhängt. Sie erlaubt dir beim Abbauen mit TNT dieses\n&eaus der Ferne zu zünden. Zündstoff besteht aus 3 Teilen.\n&eErstens dem Sprengmeister mit größeren Explosionen.\n&eZweitens dem Explosions-Experten, der Schaden von TNT\n&ereduziert.\n&eDie dritte Fähigkeit erhöht einfach den Erzertrag\n&eund reduziert den Schutt. +Guides.Page.Invalid = Keine gültige Seitenzahl! +Guides.Page.OutOfRange = Es gibt nur insgesamt {0} Seiten. +Guides.Repair.Section.0 = &3Über Reparatur:\n&eReparatur erlaubt dir an einem Eisenblock Werkzeuge und\n&eWaffen zu reparieren.\n\n&3XP-Zuwachs:\n&eRepariere Werkzeuge am Eisenblock-Amboss\n&cAchtung: &eDas ist nicht der normale Minecraft Amboss! +Guides.Repair.Section.1 = &3Wie kann ich Reparatur verwenden?\n&ePlatziere einen mcMMO Amboss, halte das zu reparierende Item\n&ein der Hand und klicke mit der rechten Maustaste auf ihn. Zum\n&eReparieren benötigst du die Ausgangsmaterialien im Inventar,\n&ediese werden dir im Zuge der Reparatur abgezogen. +Guides.Repair.Section.2 = &3Wie funktioniert der Reparatur Meister?\n&eMit dem Reparatur Meister wird dein Werkzeug ein bisschen\n&ebesser als normalerweise repariert.\n&eDer Bonus ist abhängig vom Reparatur Level. +Guides.Repair.Section.3 = &3Wie funktioniert Super-Reparatur?\n&eMit Super-Reparatur werden ab und zu deine Items\n&edoppelt so gut repariert. +Guides.Repair.Section.4 = &3Wie funktioniert Arkanes Schmieden?\n&eDiese Fähigkeit ermöglicht dir mit einer gewissen\n&eChance Verzauberungen auf Items zu erhalten.\n&eVerzauberungen können erhalten werden, vermindert werden oder\n&eganz verloren gehen. +Guides.Salvage.Section.0 = &3Über Verwerten:\n&eMit einem Goldamboss kannst du Rüstungen und\n&eWerkzeuge verwerten.\n\n&3XP-Zuwachs:\n&eVerwerten ist ein vom Angeln und Reparieren abhängiger Skill.\n&eSein Level ist die Hälfte von deren Summe. +Guides.Salvage.Section.1 = &3Wie funktioniert Verwerten?\n&ePlatziere einen Goldamboss und rechtsklicke mit dem Item in\n&eder Hand. Das Item wird zerstört und in seine\n&eBestandteile zerlegt.\n\n&eBeispielsweise gibt eine Eisenaxt Eisenbarren. +Guides.Salvage.Section.2 = &3Wie funktioniert Fortgeschrittenes Verwerten?\n&eSobald freigeschaltet, kannst du beschädigte Items verwerten.\n&eDer Ertrag steigt mit dem Level.\n&eDer Mindestertrag ist immer 1 Item, ansonsten kannst du nicht\n&everwerten. +Guides.Salvage.Section.3 = &3Zur Verbildlichung ein Beispiel:\n&eVerwerten wir eine Goldspitzhacke mit 80%\n&eHaltbarkeit, bedeutet das, dass wir nur 2 Gold bekommen\n&ekönnen (Spitzhacke=3 Goldbarren, also jeder 33,33%\n&eHaltbarkeit) was 66% entspricht. Wenn dein\n&eErtragsprozentsatz unter 66% liegt wirst du keine 2 Barren\n&ebekommen können. Wenn sie darüber ist, kannst du den\n&e"gesamten Betrag" bekommen, der aus 2 Eisenbarren besteht. +Guides.Salvage.Section.4 = &3Wie funktioniert Arkanes Verwerten?\n&eDiese Fähigkeit ermöglicht es verzauberte Bücher beim\n&eVerwerten von verzauberten Items zu bekommen.\n&eVerzauberungen können vollkommen oder teilweise extrahiert\n&ewerden.\n&eBei einer teilweisen Extraktion wird das Verzauberungslevel\n&ereduziert. +Guides.Smelting.Section.0 = Kommt irgendwann mal... +Guides.Swords.Section.0 = &3Über Schwerter:\n&eDiese Fähigkeit gibt Kampfboni bei Benutzung\n&edes Schwertes.\n\n&3XP-Zuwachs:\n&eVerletze Monster und Spieler mit dem Schwert. +Guides.Swords.Section.1 = &3Wie funktioniert der Sägezahnschlag?\n&eSägezahnschlag ist eine aktive Fähigkeit die du mit Rechtsklick \n&eaktivierst.\n&eMit dieser Fähigkeit kannst du Flächenschaden verteilen.\n&eAußerdem blutet das Ziel für kurze Zeit. +Guides.Swords.Section.2 = &3Wie funktioniert der Gegenangriff?\n&eGegenangriff ist eine aktive Fähigkeit,\n&ebei der Angriffe von Monstern beim Blocken um bis zu 50%\n&edes erhaltenen Schadens reflektiert werden können. +Guides.Swords.Section.3 = &3Wie funktioniert Blutung?\n&eBlutung fügt den Gegnern alle 2 Sekunden Schaden zu. Das\n&eBluten geht solange bis die Fähigkeit ausläuft oder der\n&eGegner stirbt.\n&eDie Dauer der Blutung erhöht sich mit dem Schwert-Skill. +Guides.Taming.Section.0 = &3Über Zähmen:\n&eZähmen gibt dem Spieler diverse Kampfboni beim Kampf mit\n&egezähmten Wölfen.\n\n&3XP-Zuwachs:\n&eUm XP zu bekommen musst du Tiere zähmen oder mit\n&edeinen Wölfen kämpfen. +Guides.Taming.Section.1 = &3Wie funktioniert Ruf der Wildnis?\n&eRuf der Wildnis ist eine aktive Fähigkeit die dir erlaubt\n&eeinen Wolf, einen Ozelot oder ein Pferd an deine Seite zu\n&erufen.\n&eDas tust du, indem du linksklickst während du Knochen, Fisch\n&eoder Äpfel in der Hand hältst. +Guides.Taming.Section.2 = &3Wie funktioniert Bestienkunde?\n&eBestienkunde erlaubt es die Haustiere zu inspizieren.\n&eHalte einen Knochen in der Hand und klick mit linker Maustaste\n&eauf das Haustier um Bestienkunde zu aktivieren. +Guides.Taming.Section.3 = &3Wie funktioniert Aufschlitzen?\n&eAufschlitzen ist eine passive Fähigkeit die beim Ziel\n&edes Wolfes Blutungen hervorrufen kann. Der Erfolg hängt\n&evom Zähmen-Level ab. +Guides.Taming.Section.4 = &3Wie funktionieren geschärfte Klauen?\n&eGeschärfte Klauen geben Zusatzschaden in Abhängigkeit\n&evom Zähmen-Level. +Guides.Taming.Section.5 = &3Wie funktioniert Umweltbewusst?\n&eDiese passive Fähigkeit ermöglich Wölfen sich zu dir zu\n&eteleportieren wenn sie in die Nähe von Gefahren wie\n&eKakteen/Lava kommen.\n&eZusätzlich sind Wölfe immun gegen Fallschaden. +Guides.Taming.Section.6 = &3Wie funktioniert Dicker Pelz?\n&eDiese passive Fähigkeit reduziert Schaden und\n&emacht Wölfe feuerresistent. +Guides.Taming.Section.7 = &3Wie funktioniert Schocksicher?\n&eDiese passive Fähigkeit reduziert den Schaden\n&edurch Explosionen. +Guides.Taming.Section.8 = &3Wie funktioniert Schnell-Imbiss?\n&eDiese passive Fähigkeit gibt dem Wolf eine Chance sich zu\n&eerholen wann immer er einen Gegner verletzt. +Guides.Unarmed.Section.0 = &3Über Unbewaffnet:\n&eMit Unbewaffnet kann der echte Mann endlich mit seinen\n&eFäusten angemessen zuschlagen.\n\n&3XP-Zuwachs:\n&eKämpfe unbewaffnet gegen Monster und andere Spieler. +Guides.Unarmed.Section.1 = &3Wie funktioniert Berserker?\n&eBerserker ist eine aktive Fähigkeit die mit Rechtsklick\n&eaktiviert wird.\n&eIm Berserker-Modus fügst du 50% mehr Schaden zu und\n&ekannst weiche Materialien wie Gras und Erde sofort abbauen. +Guides.Unarmed.Section.2 = &3Wie funktioniert der Eiserne Arm?\n&eEiserner Arm erhöht den Monstern und Spielern mit den\n&eFäusten zugefügten Schaden. +Guides.Unarmed.Section.3 = &3Wie funktioniert Pfeilablenkung?\n&ePfeilablenkung ist eine passive Fähigkeit die ab und zu\n&ePfeile von Skeletten und angreifenden Spielern ablenkt.\n&eDiese Pfeile prallen einfach ab und fallen auf den Boden. +Guides.Unarmed.Section.4 = &3Wie funktioniert der Eiserne Griff?\n&eEiserner Griff ist eine passive Fähigkeit die Entwaffnung\n&everhindert. Mit höherem Level ist es umso einfacher\n&eEntwaffnung zu verhindern. +Guides.Unarmed.Section.5 = &3Wie funktioniert Entwaffnen?\n&eDiese passive Fähigkeit ermöglich es den Gegner zu\n&eentwaffnen, sodass seine Waffe auf den Boden fällt. +Guides.Usage = Der Befehl ist /{0} ? [Seite] +Guides.Woodcutting.Section.0 = &3Über Holzfäller:\n&eIm Holzfällen geht es um das Fällen von Bäumen.\n\n&3XP-Zuwachs:\n&eDu bekommst XP für das Abholzen von Baumstämmen. +Guides.Woodcutting.Section.1 = &3Wie funktioniert der Baumfäller?\n&eBaumfäller ist eine aktive Fähigkeit. Mache mit der Axt in der\n&eHand einen Rechtsklick um sie zu aktivieren. Der Baum\n&ewird sofortig gefällt und alle Stämme abgebaut. +Guides.Woodcutting.Section.2 = &3Wie funktioniert Blättersturm?\n&eBlättersturm ist eine passive Fähigkeit die Blätter\n&ebei Berührung mit der Axt sofortig bricht. Standardmäßig\n&ewird diese Fähigkeit bei Level 100 freigeschaltet. +Guides.Woodcutting.Section.3 = &3Wie funktionieren Doppel-Drops?\n&eDiese passive Fähigkeit gibt dir ab und zu doppelten\n&eErtrag für jeden Stamm den du fällst. -Herbalism.Ability.GTe.NeedMore = Du brauchst mehr Samen um Gr\u00FCnes Land zu verbreiten. -Herbalism.Ability.GTh = &a**GR\u00DCNER DAUMEN** -Herbalism.Ability.GTh.Fail = **Gr\u00FCner Daumen GESCHEITERT** -Herbalism.Ability.Lower = &7**Du senkst deine HARKE** -Herbalism.Ability.Ready = &a**Deine HARKE ist bereit** -Herbalism.Ability.ShroomThumb.Fail = **GR\u00DCNE ZEHE GESCHEITERT** -Herbalism.Effect.4 = Gr\u00FCner Daumen -Herbalism.HylianLuck = &aHeute ist das Gl\u00FCck von Hyrule mit dir! -Herbalism.Listener = Kr\u00E4uterkunde: -Herbalism.SkillName = Kr\u00E4uterkunde -Herbalism.Skills.GTe.Off = **Gr\u00FCnes Land ist ausgelaufen** -Herbalism.Skills.GTe.On = &a**Gr\u00FCnes Land AKTIVIERT** -Herbalism.Skills.GTe.Other.Off = {0}s &cGr\u00FCnes Land&a ist &aausgelaufen. -Herbalism.Skills.GTe.Other.On = &a{0}&2 benutzte &cGr\u00FCnes Land! -Herbalism.Skills.GTe.Refresh = &aDeine &eGr\u00FCnes Land &aF\u00E4higkeit ist wieder bereit! -Herbalism.SubSkill.DoubleDrops.Description = Verdoppelt die normale Ausbeute (Loot) -Herbalism.SubSkill.DoubleDrops.Name = Doppel Drops (Alle Pflanzen) -Herbalism.SubSkill.DoubleDrops.Stat = Doppeldrop Chance -Herbalism.SubSkill.FarmersDiet.Description = Erh\u00F6ht Effektivit\u00E4t von geernteter Nahrung -Herbalism.SubSkill.FarmersDiet.Name = Bauernfr\u00FChst\u00FCck -Herbalism.SubSkill.FarmersDiet.Stat = Bauernfr\u00FChst\u00FCck &aRang {0} -Herbalism.SubSkill.GreenTerra.Description = Ernte das Land ab, 3x Drops -Herbalism.SubSkill.GreenTerra.Name = Gr\u00FCnes Land -Herbalism.SubSkill.GreenTerra.Stat = Dauer von Gr\u00FCnem Land -Herbalism.SubSkill.GreenThumb.Description = Auto-Saat, s\u00E4ht Weizen wenn abgeerntet -Herbalism.SubSkill.GreenThumb.Description.2 = Bemoost Steinziegel , l\u00E4sst Gras wachsen -Herbalism.SubSkill.GreenThumb.Name = Gr\u00FCner Daumen -Herbalism.SubSkill.GreenThumb.Stat = Gr\u00FCner Daumen Chance -Herbalism.SubSkill.GreenThumb.Stat.Extra = Gr\u00FCner Daumen Stufe: &aErnte w\u00E4chst in Stufe &2{0} -Herbalism.SubSkill.HylianLuck.Description = Gibt eine kleine M\u00F6glichkeit, seltene Gegenst\u00E4nde zu finden -Herbalism.SubSkill.HylianLuck.Name = Hylian Gl\u00FCck -Herbalism.SubSkill.HylianLuck.Stat = Hylian Gl\u00FCck Chance -Herbalism.SubSkill.ShroomThumb.Description = Verbreite Myzel auf Gras und Erde -Herbalism.SubSkill.ShroomThumb.Name = Pilz Zehe -Herbalism.SubSkill.ShroomThumb.Stat = Pilz Zehe Chance +Hardcore.DeathStatLoss.Name = Skillverlust bei Tod: +Hardcore.DeathStatLoss.PercentageChanged = &6[mcMMO] Der Verlustprozentsatz wurde auf {0} geändert. +Hardcore.DeathStatLoss.PlayerDeath = &6[mcMMO] &4Du hast durch den Tod &9{0}&4 Level verloren. +Hardcore.Mode.Disabled = &6[mcMMO] Hardcore Modus {0} deaktiviert für {1}. +Hardcore.Mode.Enabled = &6[mcMMO] Hardcore Modus {0} aktiviert für {1}. +Hardcore.Vampirism.Killer.Failure = &6[mcMMO] &e{0}&7 war nicht erfahren genug um dir Wissen zu hinterlassen. +Hardcore.Vampirism.Killer.Success = &6[mcMMO] &3Du hast &9{0}&3 Level von &e{1} &3 gestohlen. +Hardcore.Vampirism.Name = Vampirismus +Hardcore.Vampirism.PercentageChanged = &6[mcMMO] Der Vampirismus Prozentsatz wurde auf {0} geändert. +Hardcore.Vampirism.Victim.Failure = &6[mcMMO] &e{0}&7 hat es nicht geschafft Wissen von dir zu stehlen! +Hardcore.Vampirism.Victim.Success = &6[mcMMO] &e{0}&4 hat &9{1}&4 Level von dir gestohlen! -Holiday.Anniversary = &9Alles gute zu mcMMO's {0} j\u00E4hrigen Geburtstag!\r\n&9In Ehren von nossr50 und all den anderen flei\u00DFigen Entwicklern, hier ist eine kleine Feuerwerk Show! +Herbalism.Ability.GTe.NeedMore = Du brauchst mehr Samen um Grünes Land zu verbreiten. +Herbalism.Ability.GTh = &a**Grüner Daumen** +Herbalism.Ability.GTh.Fail = **Grüner Daumen gescheitert** +Herbalism.Ability.Lower = &7&o**Du senkst deine Harke.** +Herbalism.Ability.Ready = &a&o**Du hebst deine Harke...** +Herbalism.Ability.ShroomThumb.Fail = **Grüner Daumen gescheitert** +Herbalism.Effect.4 = Grüner Daumen +Herbalism.HylianLuck = &aHeute ist das Glück von Hyrule mit dir! +Herbalism.Listener = Kräuterkunde: +Herbalism.SkillName = Kräuterkunde +Herbalism.Skills.GTe.Off = &a&o**Grünes Land ist ausgelaufen** +Herbalism.Skills.GTe.On = &a&o**Grünes Land aktiviert** +Herbalism.Skills.GTe.Other.Off = {0}s &cGrünes Land&a ist &aausgelaufen. +Herbalism.Skills.GTe.Other.On = &a{0}&2 benutzte &cGrünes Land! +Herbalism.Skills.GTe.Refresh = &aDeine &eGrünes Land &aFähigkeit ist wieder bereit! +Herbalism.SubSkill.DoubleDrops.Description = Verdoppelt die normale Ausbeute (Loot). +Herbalism.SubSkill.DoubleDrops.Name = Doppeldrops (Alle Pflanzen) +Herbalism.SubSkill.DoubleDrops.Stat = Doppeldrop Chance +Herbalism.SubSkill.FarmersDiet.Description = Erhöht Effektivität von geernteter Nahrung. +Herbalism.SubSkill.FarmersDiet.Name = Bauernfrühstück +Herbalism.SubSkill.FarmersDiet.Stat = Bauernfrühstück &aRang {0} +Herbalism.SubSkill.GreenTerra.Description = Ernte das Land ab, 3x Drops. +Herbalism.SubSkill.GreenTerra.Name = Grünes Land +Herbalism.SubSkill.GreenTerra.Stat = Dauer von Grünem Land +Herbalism.SubSkill.GreenThumb.Description = Auto-Saat, säht Weizen wenn abgeerntet. +Herbalism.SubSkill.GreenThumb.Description.2 = Bemoost Steinziegel , lässt Gras wachsen. +Herbalism.SubSkill.GreenThumb.Name = Grüner Daumen +Herbalism.SubSkill.GreenThumb.Stat = Grüner Daumen Chance +Herbalism.SubSkill.GreenThumb.Stat.Extra = Grüner Daumen Stufe: &aErnte wächst in Stufe &2{0} +Herbalism.SubSkill.HylianLuck.Description = Gibt eine kleine Möglichkeit, seltene Gegenstände zu finden. +Herbalism.SubSkill.HylianLuck.Name = Hylian Glück +Herbalism.SubSkill.HylianLuck.Stat = Hylian Glück Chance +Herbalism.SubSkill.ShroomThumb.Description = Verbreite Myzel auf Gras und Erde. +Herbalism.SubSkill.ShroomThumb.Name = Pilz-Daumen +Herbalism.SubSkill.ShroomThumb.Stat = Pilz-Daumen Chance + +Holiday.Anniversary = &9Alles Gute zu mcMMO's {0} jährigen Geburtstag!\n&9In Ehren von nossr50 und all den anderen fleißigen Entwicklern ist hier eine kleine Feuerwerk-Show! Holiday.AprilFools.Levelup = &6{0} ist jetzt Level &a{1}&6! -Inspect.Offline = &cDu hast nicht die Rechte um offline Spieler zu inspizieren! -Inspect.OfflineStats = mcMMO Stats f\u00FCr Offline Spieler &e{0} -Inspect.Stats = &amcMMO Stats f\u00FCr &e{0} -Inspect.TooFar = Du bist zu weit entfernt um den Spieler zu inspizieren! +Inspect.Offline = &cDu hast nicht die Rechte um Offline-Spieler zu inspizieren! +Inspect.OfflineStats = mcMMO Stats für Offline-Spieler &e{0} +Inspect.Stats = &amcMMO Stats für &e{0} +Inspect.TooFar = Du bist zu weit entfernt um den Spieler zu inspizieren! -Item.ChimaeraWing.Fail = &c**CHIMAERA FL\u00DCGEL GESCHEITERT!** -Item.ChimaeraWing.Lore = &7Teleportiert dich zu deinem Bett. -Item.ChimaeraWing.Name = Chimaera Fl\u00FCgel -Item.ChimaeraWing.NotEnough = Du ben\u00F6tigst &e{0}&c weitere &6{1}&c! -Item.ChimaeraWing.Pass = **CHIMAERA FL\u00DCGEL* -Item.FluxPickaxe.Lore.1 = &7Hat eine Chance Erze sofort zu schmelzen. -Item.FluxPickaxe.Lore.2 = &7Ben\u00F6tigt Schmelzen Level {0} oder mehr -Item.FluxPickaxe.Name = Schmelzhacke -Item.Generic.Wait = &eDu musst noch &6{0}s &ewarten bis du das wieder verwenden kannst. -Item.Injured.Wait = &eDu wurdest vor kurzem verletzt und musst noch &6{0}s &ewarten bis du das wieder verwenden kannst. -Item.NotEnough = Du ben\u00F6tigst &e{0}&c weitere &6{1}&c! +Item.ChimaeraWing.Fail = &c**Chimaera Flügel gescheitert!** +Item.ChimaeraWing.Lore = &7Teleportiert dich zu deinem Bett. +Item.ChimaeraWing.Name = Chimaera Flügel +Item.ChimaeraWing.NotEnough = Du benötigst &e{0}&c weitere &6{1}&c! +Item.ChimaeraWing.Pass = **Chimarea Flügel** +Item.FluxPickaxe.Lore.1 = &7Hat eine Chance Erze sofort zu schmelzen. +Item.FluxPickaxe.Lore.2 = &7Benötigt Schmelzen-Level {0} oder mehr. +Item.FluxPickaxe.Name = Schmelzhacke +Item.Generic.Wait = &eDu musst noch &6{0}s &ewarten bis du das wieder verwenden kannst. +Item.Injured.Wait = &eDu wurdest vor kurzem verletzt und musst noch &6{0}s &ewarten bis du das wieder verwenden kannst. +Item.NotEnough = Du benötigst &e{0}&c weitere &6{1}&c! -JSON.Acrobatics = Akrobatik +JSON.Acrobatics = Akrobatik JSON.Acrobatics.Roll.Interaction.Activated = &cAbgerollt -JSON.Acrobatics.SubSkill.Roll.Details.Tips = Wenn du beim Fallen schleichst, kannst du bis zu zweimal so viel Schaden verhindern, wie du eigentlich erleiden w\u00FCrdest! -JSON.Alchemy = Alchemie -JSON.Archery = Bogenschie\u00DFen -JSON.Axes = Axtkampf -JSON.DescriptionHeader = Beschreibung -JSON.Excavation = Graben -JSON.Fishing = Angeln -JSON.Herbalism = Kr\u00E4uterkunde -JSON.Hover.AtSymbolSkills = &e@ -JSON.Hover.AtSymbolURL = &e@ -JSON.Hover.MaxRankSkillName = &6{0}&r -JSON.Hover.Mystery = &7??? -JSON.Hover.Mystery2 = &e[&8{0}&e]&8???&r -JSON.Hover.NextRank = &7&oN\u00E4chstes Upgrade bei Level {0} -JSON.Hover.Rank = &e&lRang:&r &f{0} -JSON.Hover.SkillName = &3{0}&r -JSON.Hover.SuperAbility = &5{0}&r -JSON.Hover.Tips = Hinweise -JSON.JWrapper.Header = Details -JSON.JWrapper.Perks.Header = &6Gl\u00FCcksstr\u00E4ne -JSON.JWrapper.Perks.Lucky = {0}% Bessere Chancen -JSON.JWrapper.Target.Block = Block -JSON.JWrapper.Target.Player = Spieler -JSON.JWrapper.Target.Type = Zieltyp: -JSON.LevelRequirement = Level Voraussetzung -JSON.Locked = -=[NICHT VERF\u00DCGBAR]=- -JSON.Mining = Bergbau -JSON.Notification.SuperAbility = {0} -JSON.Rank = Rang -JSON.Repair = Reparatur -JSON.Salvage = Bergung -JSON.SkillUnlockMessage = &6[ mcMMO&e @&3{0} &6Rang &3{1}&6 freigeschaltet! ] -JSON.Swords = Schwertkampf -JSON.Taming = Z\u00E4hmen -JSON.Type.Active = Aktiv -JSON.Type.Passive = Passiv -JSON.Type.SuperAbility = Superf\u00E4higkeit -JSON.URL.Discord = Der offizielle (englische) mcMMO Discord Server! -JSON.URL.Patreon = Unterst\u00FCtze die Entwicklung von mcMMO \u00FCber nossr50's Patreon! -JSON.URL.Spigot = Die offizielle mcmmo Spigot Seite -JSON.URL.Translation = \u00DCbersetze mcMMO in andere Sprachen! -JSON.URL.Website = Die offizielle mcMMO Website! -JSON.URL.Wiki = Das offizielle mcMMO Wiki! -JSON.Unarmed = Faustkampf -JSON.Woodcutting = Holzf\u00E4llen +JSON.Acrobatics.SubSkill.Roll.Details.Tips = Wenn du beim Fallen schleichst, kannst du bis zu zweimal so viel Schaden verhindern, wie du eigentlich erleiden würdest! +JSON.Alchemy = Alchemie +JSON.Archery = Bogenschießen +JSON.Axes = Axtkampf +JSON.DescriptionHeader = Beschreibung +JSON.Excavation = Graben +JSON.Fishing = Angeln +JSON.Herbalism = Kräuterkunde +JSON.Hover.AtSymbolSkills = &e@ +JSON.Hover.AtSymbolURL = &e@ +JSON.Hover.MaxRankSkillName = &6{0}&r +JSON.Hover.Mystery = &7??? +JSON.Hover.Mystery2 = &e[&8{0}&e]&8???&r +JSON.Hover.NextRank = &7&oNächstes Upgrade bei Level {0} +JSON.Hover.Rank = &e&lRang:&r &f{0} +JSON.Hover.SkillName = &3{0}&r +JSON.Hover.SuperAbility = &5{0}&r +JSON.Hover.Tips = Hinweise +JSON.JWrapper.Header = Details +JSON.JWrapper.Perks.Header = &6Glückssträne +JSON.JWrapper.Perks.Lucky = {0}% Bessere Chancen +JSON.JWrapper.Target.Block = Block +JSON.JWrapper.Target.Player = Spieler +JSON.JWrapper.Target.Type = Zieltyp: +JSON.LevelRequirement = Level-Voraussetzung +JSON.Locked = -=[NICHT VERFÜGBAR]=- +JSON.Mining = Bergbau +JSON.Notification.SuperAbility = {0} +JSON.Rank = Rang +JSON.Repair = Reparatur +JSON.Salvage = Bergung +JSON.SkillUnlockMessage = &6[ mcMMO&e @&3{0} &6Rang &3{1}&6 freigeschaltet! ] +JSON.Swords = Schwertkampf +JSON.Taming = Zähmen +JSON.Type.Active = Aktiv +JSON.Type.Passive = Passiv +JSON.Type.SuperAbility = Superfähigkeit +JSON.URL.Discord = Der offizielle (englische) mcMMO Discord Server! +JSON.URL.Patreon = Unterstütze die Entwicklung von mcMMO über nossr50's Patreon! +JSON.URL.Spigot = Die offizielle mcMMO Spigot-Seite. +JSON.URL.Translation = Übersetze mcMMO in andere Sprachen! +JSON.URL.Website = Die offizielle mcMMO Website! +JSON.URL.Wiki = Das offizielle mcMMO Wiki! +JSON.Unarmed = Faustkampf +JSON.Woodcutting = Holzfällen -MOTD.Donate = &3Spenden Info: +LevelCap.PowerLevel = &6(&amcMMO&6) &eDu hast das Level-Limit von &c{0}&e erreicht. Du kannst deine Fähigkeiten nun nicht mehr weiter verbessern. +LevelCap.Skill = &6(&amcMMO&6) &eDu hast das Level-Limit von &c{0}&e für &6{1}&e erreicht. Du kannst diese Fähigkeit von nun an nicht mehr weiter verbessern. + +Locale.Reloaded = &aDie Sprachdateien wurden neu geladen! + +MOTD.Donate = &3Spenden Info: MOTD.Hardcore.DeathStatLoss.Stats = &6[mcMMO] &3Skillverlust bei Tod: &4{0}% -MOTD.Hardcore.Enabled = &6[mcMMO] &3Hardcore Modus aktiviert: &4{0} -MOTD.Hardcore.Vampirism.Stats = &6[mcMMO] &3Vampirismus Prozentsatz: &4{0}% -MOTD.PerksPrefix = &6[mcMMO Boni] -MOTD.Version = &6[mcMMO] Verwende Version&3{0} -MOTD.Version.Overhaul = &6[mcMMO] &3\u00DCberholungs Era&6 - &3{0} -MOTD.Website = &6[mcMMO] &a{0}&e - mcMMO Website +MOTD.Hardcore.Enabled = &6[mcMMO] &3Hardcore Modus aktiviert: &4{0} +MOTD.Hardcore.Vampirism.Stats = &6[mcMMO] &3Vampirismus Prozentsatz: &4{0}% +MOTD.PerksPrefix = &6[mcMMO Boni] +MOTD.Version = &6[mcMMO] Verwende Version &3{0} +MOTD.Version.Overhaul = &6[mcMMO] &3Überholungs Era&6 - &3{0} +MOTD.Website = &6[mcMMO] &a{0}&e - mcMMO Website -Mining.Ability.Locked.0 = GESPERRT bis Skill {0}+ (Z\u00FCndstoff) -Mining.Ability.Locked.1 = GESPERRT bis Skill {0}+ (Sprengmeister) -Mining.Ability.Locked.2 = GESPERRT bis Skill {0}+ (Explosions-Experte) -Mining.Ability.Lower = &7**Du senkst deine SPITZHACKE** -Mining.Ability.Ready = &a**Deine SPITZHACKE ist bereit** -Mining.Blast.Boom = &7**BOOM** -Mining.Blast.Effect = +{0} Erze {1}x Drops -Mining.Blast.Other.On = &a{0}&2 benutzte &cZ\u00FCndstoff! -Mining.Blast.Refresh = &aDein &eZ\u00FCndstoff &aist wieder bereit! -Mining.Listener = Bergbau: -Mining.SkillName = BERGBAU -Mining.Skills.SuperBreaker.Off = **Super-Brecher ist ausgelaufen** -Mining.Skills.SuperBreaker.On = &a**Super-Brecher AKTIVIERT** -Mining.Skills.SuperBreaker.Other.Off = {0}s &cSuper-Brecher&a ist &aausgelaufen. -Mining.Skills.SuperBreaker.Other.On = &a{0}&2 benutzte &cSuper-Brecher! -Mining.Skills.SuperBreaker.Refresh = &aDein &eSuper-Brecher &aist wieder bereit! -Mining.SubSkill.BiggerBombs.Description = Erh\u00F6ht den Explosions-Radius -Mining.SubSkill.BiggerBombs.Name = Sprengmeister -Mining.SubSkill.BlastMining.Description = Bonus beim Abbaue mit TNT -Mining.SubSkill.BlastMining.Name = Z\u00FCndstoff -Mining.SubSkill.BlastMining.Stat = Z\u00FCndstoff:&a Rang {0}/{1} &7({2}) -Mining.SubSkill.BlastMining.Stat.Extra = Explosionsradius Bonus: &a+{0} -Mining.SubSkill.DemolitionsExpertise.Description = Reduziert die Verletzung durch TNT Explosionen -Mining.SubSkill.DemolitionsExpertise.Name = Explosions-Experte -Mining.SubSkill.DemolitionsExpertise.Stat = Explosions-Experte Schadenserh\u00F6hung -Mining.SubSkill.DoubleDrops.Description = Verdoppelt die normale Ausbeute -Mining.SubSkill.DoubleDrops.Name = Doppel Drops -Mining.SubSkill.DoubleDrops.Stat = Doppeldrop Chance -Mining.SubSkill.SuperBreaker.Description = Abbaugeschwindigkeit+, Dreifach-Drop Chance -Mining.SubSkill.SuperBreaker.Name = Superbrecher -Mining.SubSkill.SuperBreaker.Stat = Superbrecher L\u00E4nge +Mining.Ability.Locked.0 = Gesperrt bis Skill {0}+ (Zündstoff) +Mining.Ability.Locked.1 = Gesperrt bis Skill {0}+ (Sprengmeister) +Mining.Ability.Locked.2 = Gesperrt bis Skill {0}+ (Explosions-Experte) +Mining.Ability.Lower = &7&o**Du senkst deine Spitzhacke.** +Mining.Ability.Ready = &a&o**Du hebst deine Spitzhacke...** +Mining.Blast.Boom = &7**BOOM** +Mining.Blast.Cooldown = +Mining.Blast.Effect = +{0} Erze {1}x Drops +Mining.Blast.Other.On = &a{0}&2 benutzte &cZündstoff! +Mining.Blast.Refresh = &aDein &eZündstoff &aist wieder bereit! +Mining.Listener = Bergbau: +Mining.SkillName = Bergbau +Mining.Skills.SuperBreaker.Off = &a&o**Super-Brecher ist ausgelaufen** +Mining.Skills.SuperBreaker.On = &a&o**Super-Brecher aktiviert** +Mining.Skills.SuperBreaker.Other.Off = {0}s &cSuper-Brecher&a ist &aausgelaufen. +Mining.Skills.SuperBreaker.Other.On = &a{0}&2 benutzte &cSuper-Brecher! +Mining.Skills.SuperBreaker.Refresh = &aDein &eSuper-Brecher &aist wieder bereit! +Mining.SubSkill.BiggerBombs.Description = Erhöht den Explosionsradius. +Mining.SubSkill.BiggerBombs.Name = Sprengmeister +Mining.SubSkill.BlastMining.Description = Bonus beim Abbauen mit TNT. +Mining.SubSkill.BlastMining.Name = Zündstoff +Mining.SubSkill.BlastMining.Stat = Zündstoff:&a Rang {0}/{1} &7({2}) +Mining.SubSkill.BlastMining.Stat.Extra = Explosionsradius Bonus: &a+{0} +Mining.SubSkill.DemolitionsExpertise.Description = Reduziert die Verletzung durch TNT-Explosionen. +Mining.SubSkill.DemolitionsExpertise.Name = Explosions-Experte +Mining.SubSkill.DemolitionsExpertise.Stat = Explosions-Experte Schadenserhöhung +Mining.SubSkill.DoubleDrops.Description = Verdoppelt die normale Ausbeute. +Mining.SubSkill.DoubleDrops.Name = Doppeldrops +Mining.SubSkill.DoubleDrops.Stat = Doppeldrop Chance +Mining.SubSkill.SuperBreaker.Description = Abbaugeschwindigkeit+, Dreifach-Drop Chance +Mining.SubSkill.SuperBreaker.Name = Superbrecher +Mining.SubSkill.SuperBreaker.Stat = Superbrecher Länge -Overhaul.Levelup = [[BOLD]]{0} erh\u00F6ht auf [[RESET]][[GREEN]][[BOLD]]{2}[[RESET]][[WHITE]]. -Overhaul.Name.Acrobatics = Akrobatik -Overhaul.Name.Alchemy = Alchemie -Overhaul.Name.Archery = Bogenschie\u00DFen -Overhaul.Name.Axes = Axtkampf -Overhaul.Name.Excavation = Graben -Overhaul.Name.Fishing = Angeln -Overhaul.Name.Herbalism = Kr\u00E4uterkunde -Overhaul.Name.Mining = Bergbau -Overhaul.Name.Repair = Reparatur -Overhaul.Name.Salvage = Bergung -Overhaul.Name.Smelting = Schmelzen -Overhaul.Name.Swords = Schwertkampf -Overhaul.Name.Taming = Z\u00E4hmen -Overhaul.Name.Unarmed = Faustkampf -Overhaul.Name.Woodcutting = Holzf\u00E4llen -Overhaul.mcMMO.Header = &c[]=====[]&a mcMMO - \u00DCberholungs \u00C4ra &c[]=====[] -Overhaul.mcMMO.MmoInfo.Wiki = &e[&fLese \u00FCber diesen Skill im Wiki!&e] -Overhaul.mcMMO.Url.Wrap.Prefix = [[RED]][| -Overhaul.mcMMO.Url.Wrap.Suffix = [[RED]]|] +Notifications.Admin.Format.Others = &6(&amcMMO &3Admin&6) &7{0} +Notifications.Admin.Format.Self = &6(&amcMMO&6) &7{0} +Notifications.Admin.XPRate.End.Others = {0} &7hat das Bonuserfahrungs-Event beendet. +Notifications.Admin.XPRate.End.Self = &7Du hast das Bonuserfahrungs-Event beendet. +Notifications.Admin.XPRate.Start.Others = {0} &7hat ein Bonuserfahrungs-Event mit einem Faktor von {1}x gestartet. +Notifications.Admin.XPRate.Start.Self = &7Du hast den globalen Erfahrungsraten-Multiplikator auf &6{0}x&7 gesetzt. -Party.Alliance.Disband = &7Deine Gruppe ist nicht mehr verb\u00FCndet mit &c{0} -Party.Alliance.Formed = &7Deine Gruppe ist jetzt verb\u00FCndet mit &a{0} -Party.Disband = &7Die Gruppe wurde aufgel\u00F6st -Party.Feature.Alliance = B\u00FCndnisse -Party.Feature.Chat = Gruppenchat -Party.Feature.Disabled.1 = &cGruppenchat ist noch nicht freigeschaltet. -Party.Feature.Disabled.2 = &cGruppenteleport ist noch nicht freigeschaltet. -Party.Feature.Disabled.3 = &cGruppenb\u00FCndnisse sind noch nicht freigeschaltet. -Party.Feature.Disabled.4 = &cGruppen Itemteilung ist noch nicht freigeschaltet. -Party.Feature.Disabled.5 = &cGruppen Erfahrungsteilung ist noch nicht freigeschaltet. -Party.Feature.ItemShare = Itemteilung -Party.Feature.Locked.Alliance = Gesperrt bis Gruppenlevel {0} (B\u00FCndnisse) -Party.Feature.Locked.Chat = Gesperrt bis Gruppenlevel {0} (Gruppenchat) -Party.Feature.Locked.ItemShare = Gesperrt bis Gruppenlevel {0} (Itemteilung) -Party.Feature.Locked.Teleport = Gesperrt bis Gruppenlevel {0} (Gruppenteleport) -Party.Feature.Locked.XpShare = Gesperrt bis Gruppenlevel {0} (Erfahrungsteilung) -Party.Feature.Teleport = Gruppenteleport -Party.Feature.XpShare = Erfahrungsteilung -Party.Forbidden = [mcMMO] Gruppen sind in dieser Welt nicht erlaubt! -Party.Help.0 = &cDie korrekte Benutzung ist &3{0} [passwort]. -Party.Help.1 = &cUm eine Gruppe zu erstellen, nutze &3{0} [gruppenpasswort]. -Party.Help.10 = &cNutze &3{0} &cum Erfahrungsteilung mit Mitgliedern zu aktivieren -Party.Help.2 = &cNutze &3{0} &cf\u00FCr mehr Informationen -Party.Help.3 = &cNutze &3{0} [passwort] &czum beitreten oder &3{1} &czum verlassen -Party.Help.4 = &cUm deine Gruppe zu sperren oder entsperren, nutze &3{0} -Party.Help.5 = &cUm deine Gruppe per Passwort zu sch\u00FCtzen, nutze &3{0} -Party.Help.6 = &cUm einen Spieler aus deiner Gruppe zu entfernen, nutze &3{0} -Party.Help.7 = &cUm die Gruppenleitung auf einen anderen Spieler zu \u00FCbertragen, nutze &3{0} -Party.Help.8 = &cUm deine Gruppe aufzul\u00F6sen, nutze &3{0} -Party.Help.9 = &cNutze &3{0} &cum Items mit deinen Mitgliedern zu teilen -Party.InformedOnJoin = {0} &aist deiner Gruppe beigetreten -Party.InformedOnNameChange = &6{0} &ahat den Gruppennamen ver\u00E4ndert zu: &f{1} -Party.InformedOnQuit = {0} &ahat deine Gruppe verlassen -Party.InvalidName = &4Das ist kein m\u00F6glicher Gruppenname -Party.Invite.Self = &cDu kannst dich nicht selbst einladen! -Party.IsLocked = &cDiese Gruppe ist bereits gesperrt! -Party.IsntLocked = &cDiese Gruppe ist nicht gesperrt! -Party.ItemShare.Category.Herbalism = Kr\u00E4uterkunde -Party.ItemShare.Category.Loot = Loot -Party.ItemShare.Category.Mining = Bergbau -Party.ItemShare.Category.Misc = Verschiedenes -Party.ItemShare.Category.Woodcutting = Holzf\u00E4llen -Party.Join.Self = &cDu kannst dich nicht selbst betreten! -Party.LevelUp = Gruppen Level aufgestiegen auf {1}! -Party.Locked = Gruppe ist gesperrt, nur Gruppenleiter darf Spieler einladen. -Party.NotInYourParty = &4{0} ist nicht in deiner Gruppe -Party.NotOnline = &4{0} ist nicht online! -Party.NotOwner = &4Du bist nicht der Gruppenleiter. -Party.Owner.New = &a{0} ist jetzt der neue Gruppenleiter! -Party.Owner.NotLeader = &4Du bist jetzt nicht mehr der Gruppenleiter. -Party.Owner.Player = &aDu bist jetzt der Gruppenleiter! -Party.Password.Incorrect = &cDieses Passwort ist nicht korrekt. -Party.Password.None = Diese Gruppe ist Passwortgesch\u00FCtzt. -Party.Password.Removed = &aGruppenpasswort wurde entfernt. -Party.Password.Set = &aGruppenpasswort ist jetzt: {0} -Party.Player.InSameParty = {0} ist bereits in deiner Gruppe! -Party.Player.Invalid = Das ist kein m\u00F6glicher Spieler. -Party.PlayerNotInParty = &4{0} ist in keiner Gruppe -Party.Rename.Same = &cDas ist bereits der Name der Gruppe! -Party.ShareMode.Equal = Gleiche Teilung -Party.ShareMode.None = Keine Teilung -Party.ShareMode.Random = Zuf\u00E4llige Teilung -Party.ShareType.Item = Item -Party.ShareType.Xp = Erfahrung -Party.Specify = &cDu musst eine Gruppe angeben. -Party.Status.Locked = &4(Exklusiv) -Party.Status.Unlocked = &2(Offen) -Party.Target.NotOwner = &4{0} ist nicht der Gruppenleiter. -Party.Teleport.Dead = &cDu kannst dich nicht zu einem toten Spieler teleportieren. -Party.Teleport.Disabled = &c{0} erlaubt keine Teleportation. -Party.Teleport.Hurt = &cDu wurdest in den letzten {0} Sekunden verletzt und kannst dich daher nciht teleportieren. -Party.Teleport.Player = &aDu wurdest zu {0} teleportiert. -Party.Teleport.Self = &cDu kannst dich nicht zu dir selbst teleportieren! -Party.Teleport.Target = &a{0} hat sich zu dir teleportiert. -Party.Unlocked = &7Gruppe ist entsperrt. +Overhaul.Levelup = &l{0} erhöht auf &r&a&l{2}&r&f. +Overhaul.Name.Acrobatics = Akrobatik +Overhaul.Name.Alchemy = Alchemie +Overhaul.Name.Archery = Bogenschießen +Overhaul.Name.Axes = Axtkampf +Overhaul.Name.Excavation = Graben +Overhaul.Name.Fishing = Angeln +Overhaul.Name.Herbalism = Kräuterkunde +Overhaul.Name.Mining = Bergbau +Overhaul.Name.Repair = Reparatur +Overhaul.Name.Salvage = Bergung +Overhaul.Name.Smelting = Schmelzen +Overhaul.Name.Swords = Schwertkampf +Overhaul.Name.Taming = Zähmen +Overhaul.Name.Unarmed = Faustkampf +Overhaul.Name.Woodcutting = Holzfällen +Overhaul.mcMMO.Header = &c[]=====[]&a mcMMO - Überholungs Ära &c[]=====[] +Overhaul.mcMMO.MmoInfo.Wiki = &e[&fLese über diesen Skill im Wiki!&e] +Overhaul.mcMMO.Url.Wrap.Prefix = &c[| +Overhaul.mcMMO.Url.Wrap.Suffix = &c|] + +Party.Alliance.Disband = &7Deine Gruppe ist nicht mehr verbündet mit &c{0}. +Party.Alliance.Formed = &7Deine Gruppe ist jetzt verbündet mit &a{0}. +Party.Disband = &7Die Gruppe wurde aufgelöst. +Party.Feature.Alliance = Bündnisse +Party.Feature.Chat = Gruppenchat +Party.Feature.Disabled.1 = &cGruppenchat ist noch nicht freigeschaltet. +Party.Feature.Disabled.2 = &cGruppenteleport ist noch nicht freigeschaltet. +Party.Feature.Disabled.3 = &cGruppenbündnisse sind noch nicht freigeschaltet. +Party.Feature.Disabled.4 = &cGruppen-Itemteilung ist noch nicht freigeschaltet. +Party.Feature.Disabled.5 = &cGruppen-Erfahrungsteilung ist noch nicht freigeschaltet. +Party.Feature.ItemShare = Itemteilung +Party.Feature.Locked.Alliance = Gesperrt bis Gruppenlevel {0} (Bündnisse) +Party.Feature.Locked.Chat = Gesperrt bis Gruppenlevel {0} (Gruppenchat) +Party.Feature.Locked.ItemShare = Gesperrt bis Gruppenlevel {0} (Itemteilung) +Party.Feature.Locked.Teleport = Gesperrt bis Gruppenlevel {0} (Gruppenteleport) +Party.Feature.Locked.XpShare = Gesperrt bis Gruppenlevel {0} (Erfahrungsteilung) +Party.Feature.Teleport = Gruppenteleport +Party.Feature.XpShare = Erfahrungsteilung +Party.Forbidden = [mcMMO] Gruppen sind in dieser Welt nicht erlaubt! +Party.Help.0 = &cDie korrekte Benutzung ist &3{0} [passwort]. +Party.Help.1 = &cUm eine Gruppe zu erstellen, nutze &3{0} [gruppenpasswort]. +Party.Help.10 = &cNutze &3{0} &cum Erfahrungsteilung mit Mitgliedern zu aktivieren. +Party.Help.2 = &cNutze &3{0} &cfür mehr Informationen. +Party.Help.3 = &cNutze &3{0} [passwort] &czum Beitreten oder &3{1} &czum Verlassen. +Party.Help.4 = &cUm deine Gruppe zu sperren oder entsperren, nutze &3{0}. +Party.Help.5 = &cUm deine Gruppe per Passwort zu schützen, nutze &3{0} . +Party.Help.6 = &cUm einen Spieler aus deiner Gruppe zu entfernen, nutze &3{0} . +Party.Help.7 = &cUm die Gruppenleitung auf einen anderen Spieler zu übertragen, nutze &3{0} . +Party.Help.8 = &cUm deine Gruppe aufzulösen, nutze &3{0}. +Party.Help.9 = &cNutze &3{0} &cum Items mit deinen Mitgliedern zu teilen. +Party.InformedOnJoin = {0} &aist deiner Gruppe beigetreten. +Party.InformedOnNameChange = &6{0} &ahat den Gruppennamen verändert zu: &f{1} +Party.InformedOnQuit = {0} &ahat deine Gruppe verlassen. +Party.InvalidName = &4Das ist kein möglicher Gruppenname. +Party.Invite.Self = &cDu kannst dich nicht selbst einladen! +Party.IsLocked = &cDiese Gruppe ist bereits gesperrt! +Party.IsntLocked = &cDiese Gruppe ist nicht gesperrt! +Party.ItemShare.Category.Herbalism = Kräuterkunde +Party.ItemShare.Category.Loot = Loot +Party.ItemShare.Category.Mining = Bergbau +Party.ItemShare.Category.Misc = Verschiedenes +Party.ItemShare.Category.Woodcutting = Holzfällen +Party.Join.Self = &cDu kannst deine eigene Party nicht selbst betreten! +Party.LevelUp = Gruppenlevel aufgestiegen auf {1}! +Party.Locked = Gruppe ist gesperrt, nur der Gruppenleiter darf Spieler einladen. +Party.NotInYourParty = &4{0} ist nicht in deiner Gruppe. +Party.NotOnline = &4{0} ist nicht online! +Party.NotOwner = &4Du bist nicht der Gruppenleiter. +Party.Owner.New = &a{0} ist jetzt der neue Gruppenleiter! +Party.Owner.NotLeader = &4Du bist jetzt nicht mehr der Gruppenleiter. +Party.Owner.Player = &aDu bist jetzt der Gruppenleiter! +Party.Password.Incorrect = &cDieses Passwort ist nicht korrekt. +Party.Password.None = Diese Gruppe ist passwortgeschützt. +Party.Password.Removed = &aGruppenpasswort wurde entfernt. +Party.Password.Set = &aGruppenpasswort ist jetzt: {0} +Party.Player.InSameParty = {0} ist bereits in deiner Gruppe! +Party.Player.Invalid = Das ist kein möglicher Spieler. +Party.PlayerNotInParty = &4{0} ist in keiner Gruppe. +Party.Rename.Same = &cDas ist bereits der Name der Gruppe! +Party.ShareMode.Equal = Gleiche Teilung +Party.ShareMode.None = Keine Teilung +Party.ShareMode.Random = Zufällige Teilung +Party.ShareType.Item = Item +Party.ShareType.Xp = Erfahrung +Party.Specify = &cDu musst eine Gruppe angeben. +Party.Status.Locked = &4(Exklusiv) +Party.Status.Unlocked = &2(Offen) +Party.Target.NotOwner = &4{0} ist nicht der Gruppenleiter. +Party.Teleport.Dead = &cDu kannst dich nicht zu einem toten Spieler teleportieren. +Party.Teleport.Disabled = &c{0} erlaubt keine Teleportation. +Party.Teleport.Hurt = &cDu wurdest in den letzten {0} Sekunden verletzt und kannst dich daher nicht teleportieren. +Party.Teleport.Player = &aDu wurdest zu {0} teleportiert. +Party.Teleport.Self = &cDu kannst dich nicht zu dir selbst teleportieren! +Party.Teleport.Target = &a{0} hat sich zu dir teleportiert. +Party.Unlocked = &7Gruppe ist entsperrt. Perks.ActivationTime.Bonus = &6 ({0}s mit Ausdauer Bonus) -Perks.ActivationTime.Desc = Erh\u00F6ht die F\u00E4higkeitszeit um {0} Sekunden. -Perks.ActivationTime.Name = Ausdauer -Perks.Cooldowns.Desc = Verk\u00FCrzt die Abklingzeit um {0}. -Perks.Cooldowns.Name = Schnelle Erholung -Perks.Lucky.Bonus = &6 ({0} mit Gl\u00FCcksbonus) -Perks.Lucky.Desc = {0} Skills und F\u00E4higkeiten werden um 33.3% \u00F6fter aktiviert. -Perks.Lucky.Desc.Login = Bestimmte Skills und F\u00E4higkeiten werden um 33.3% \u00F6fter aktiviert. -Perks.Lucky.Name = Gl\u00FCck -Perks.XP.Desc = Erhalte mehr Erfahrung in bestimmen Skills. -Perks.XP.Name = Erfahrung +Perks.ActivationTime.Desc = Erhöht die Fähigkeitszeit um {0} Sekunden. +Perks.ActivationTime.Name = Ausdauer +Perks.Cooldowns.Desc = Verkürzt die Abklingzeit um {0}. +Perks.Cooldowns.Name = Schnelle Erholung +Perks.Lucky.Bonus = &6 ({0} mit Glücksbonus) +Perks.Lucky.Desc = {0} Skills und Fähigkeiten werden um 33.3% öfter aktiviert. +Perks.Lucky.Desc.Login = Bestimmte Skills und Fähigkeiten werden um 33.3% öfter aktiviert. +Perks.Lucky.Name = Glück +Perks.XP.Desc = Erhalte mehr Erfahrung in bestimmten Skills. +Perks.XP.Name = Erfahrung -Profile.Loading.Success = &aDein Profil wurde geladen. +Profile.Loading.FailureNotice = &4[A] &cmcMMO konnte die Spielerdaten von &e{0}&c leider nicht laden. Bitte Überprüfe deine Datenbankeinstellungen. &dVersuche: {1}. +Profile.Loading.FailurePlayer = &cmcMMO hat Probleme beim Laden deiner Daten nach &a{0}&c Versuchen. &8Kontaktiere den Serveradmin bezüglich dieses Problems. mcMMO wird weiterhin versuchen, deine Daten zu laden, bis du den Server verlässt. So lange kannst du keine Skillerfahrung sammeln und diese auch nicht nutzen. +Profile.Loading.Success = &aDein Profil wurde geladen. +Profile.PendingLoad = &cDeine mcMMO Daten wurden noch nicht geladen. -Repair.Arcane.Downgrade = Zauber-Wert des Gegenstands vermindert. -Repair.Arcane.Fail = Der Gegenstands wurde entzaubert. -Repair.Arcane.Lost = Du hast nicht gen\u00FCgend Skill um Verzauberungen zu erhalten. -Repair.Arcane.Perfect = &aDu hast den Zauber-Wert des Gegenstands erhalten. -Repair.Error = &4mcMMO ist beim Versuch dieses Item zu reparieren auf einen Fehler gesto\u00DFen! -Repair.Listener = Reparatur: -Repair.Listener.Anvil = &4Du hast einen Amboss platziert, Ambosse k\u00F6nnen Waffen und R\u00FCstung reparieren. -Repair.Pretty.Name = Reparatur -Repair.SkillName = REPARATUR -Repair.Skills.Adept = Du ben\u00F6tigst Level &e{0}&c um &e{1} zu reparieren. -Repair.Skills.AdeptDiamond = &4Du hast nicht gen\u00FCgend Level um Diamant zu reparieren. -Repair.Skills.AdeptGold = &4Du hast nicht gen\u00FCgend Level um Gold zu reparieren. -Repair.Skills.AdeptIron = &4Du hast nicht gen\u00FCgend Level um Eisen zu reparieren -Repair.Skills.AdeptStone = &4Du hast nicht gen\u00FCgend Level um Stein zu reparieren -Repair.Skills.FeltEasy = &7Das f\u00FChlte sich einfach an. -Repair.Skills.FullDurability = &7Dieser Gegenstand hat volle Haltbarkeit. -Repair.Skills.StackedItems = &4Du kannst keine gestapelten Gegenst\u00E4nde reparieren. -Repair.SubSkill.ArcaneForging.Description = Repariere magische Gegenst\u00E4nde -Repair.SubSkill.ArcaneForging.Name = Arkanes Schmieden -Repair.SubSkill.ArcaneForging.Stat = Arkanes Schmieden: &eRang {0}/{1} -Repair.SubSkill.ArcaneForging.Stat.Extra = [[DARK_AQUA]]Arkanes Schmieden Chancen:[[GRAY]] Erfolg [[GREEN]]{0}[[GRAY]]%, Verlust [[RED]]{1}[[GRAY]]% -Repair.SubSkill.DiamondRepair.Description = Repariere Diamant-Werkzeuge & R\u00FCstung -Repair.SubSkill.DiamondRepair.Name = Diamant Reparatur ({0}+ SKILL) -Repair.SubSkill.GoldRepair.Description = Repariere Gold-Werkzeuge & R\u00FCstung -Repair.SubSkill.GoldRepair.Name = Gold Reparatur ({0}+ SKILL) -Repair.SubSkill.IronRepair.Description = Repariere Eisen-Werkzeuge & R\u00FCstung -Repair.SubSkill.IronRepair.Name = Eisen Reparatur ({0}+ SKILL) -Repair.SubSkill.Repair.Description = Repariere Werkzeuge & R\u00FCstung -Repair.SubSkill.Repair.Name = Reparatur -Repair.SubSkill.RepairMastery.Description = Erh\u00F6ht den Reparatur-Wert -Repair.SubSkill.RepairMastery.Name = Reparatur Meister -Repair.SubSkill.RepairMastery.Stat = Reparaturmeister: &aF\u00FCgt {0} extra Haltbarkeit beim Reparieren hinzu. -Repair.SubSkill.StoneRepair.Description = Repariere Stein-Werkzeuge -Repair.SubSkill.StoneRepair.Name = Stein Reparatur ({0}+ SKILL) -Repair.SubSkill.SuperRepair.Description = Doppelte Effektivit\u00E4t -Repair.SubSkill.SuperRepair.Name = Super-Reparatur -Repair.SubSkill.SuperRepair.Stat = Chance auf Superreparatur +Reminder.Squelched = &7Erinnerung: Du erhältst aktuell keinerlei Benachrichtigungen von mcMMO, um dies zu ändern, nutze den /mcnotify Befehl. Dies ist eine stündliche, automatische Erinnerung. -Salvage.Ability.Bonus.0 = Fortgeschrittenes Verwerten -Salvage.Ability.Bonus.1 = Max Ertrag {0} Item zerst\u00F6rt -Salvage.Ability.Locked.0 = GESPERRT bis Skill {0}+ (Fortgeschrittenes Verwerten) -Salvage.Arcane.ExtractFull = &7Verwerten: Gesamte Verzauberung Chance -Salvage.Arcane.ExtractPartial = &7Verwerten: Teil-Verzauberung Chance -Salvage.Listener = Bergung: -Salvage.Listener.Anvil = &4Du hast einen Verwertungs-Amboss platziert, benutze ihn um Werkzeuge und R\u00FCstung zu verwerten. -Salvage.Pretty.Name = Verwerten -Salvage.SkillName = Bergung -Salvage.Skills.Adept.Damaged = &4Deine F\u00E4higkeit ist nicht hoch genug um besch\u00E4digte Items zu verwerten. -Salvage.Skills.Adept.Level = Du musst Level &e{0}&c sein um &e{1} &c zu verwerten. -Salvage.Skills.ArcaneFailed = Es ist dir nicht gelungen das Wissen aus diesem Item zu extrahieren. -Salvage.Skills.ArcanePartial = Es ist dir gelungen ein bisschen Wissen zu extrahieren. -Salvage.Skills.ArcaneSuccess = &aDu konntest alles Wissen aus diesem Item extrahieren! -Salvage.Skills.Success = &aItem verwertet! -Salvage.Skills.TooDamaged = &4Das Item ist zu besch\u00E4digt um verwertet zu werden. -Salvage.SubSkill.AdvancedSalvage.Description = Verwerte besch\u00E4digte Items -Salvage.SubSkill.AdvancedSalvage.Name = Fortgeschrittenes Verwerten -Salvage.SubSkill.ArcaneSalvage.Description = Extrahiere Verzauberungen aus Items. -Salvage.SubSkill.ArcaneSalvage.Name = Magische Bergung -Salvage.SubSkill.ArcaneSalvage.Stat = Magische Bergung: &eRank {0}/{1} -Salvage.SubSkill.UnderstandingTheArt.Description = Du w\u00FChlst nicht einfach nur durch den M\u00FCll deines Nachbarn, du k\u00FCmmerst dich auch um die Umwelt! Gibt Boni zu verschiedenen Aspekten der Bergung. -Salvage.SubSkill.UnderstandingTheArt.Name = Die Lehre der Bergung +Repair.Arcane.Downgrade = Zauber-Wert des Gegenstands vermindert. +Repair.Arcane.Fail = Der Gegenstands wurde entzaubert. +Repair.Arcane.Lost = Du hast nicht genügend Skill um Verzauberungen zu erhalten. +Repair.Arcane.Perfect = &aDu hast den Zauber-Wert des Gegenstands erhalten. +Repair.Error = &4mcMMO ist beim Versuch dieses Item zu reparieren auf einen Fehler gestoßen! +Repair.Listener = Reparatur: +Repair.Listener.Anvil = &4Du hast einen Amboss platziert, Ambosse können Waffen und Rüstung reparieren. +Repair.Pretty.Name = Reparatur +Repair.SkillName = Reparatur +Repair.Skills.Adept = Du benötigst Level &e{0}&c um &e{1} zu reparieren. +Repair.Skills.AdeptDiamond = &4Du hast nicht genügend Level um Diamant zu reparieren. +Repair.Skills.AdeptGold = &4Du hast nicht genügend Level um Gold zu reparieren. +Repair.Skills.AdeptIron = &4Du hast nicht genügend Level um Eisen zu reparieren. +Repair.Skills.AdeptStone = &4Du hast nicht genügend Level um Stein zu reparieren. +Repair.Skills.FeltEasy = &7Das fühlte sich einfach an. +Repair.Skills.FullDurability = &7Dieser Gegenstand hat volle Haltbarkeit. +Repair.Skills.StackedItems = &4Du kannst keine gestapelten Gegenstände reparieren. +Repair.SubSkill.ArcaneForging.Description = Repariere magische Gegenstände. +Repair.SubSkill.ArcaneForging.Name = Arkanes Schmieden +Repair.SubSkill.ArcaneForging.Stat = Arkanes Schmieden: &eRang {0}/{1} +Repair.SubSkill.ArcaneForging.Stat.Extra = &3Arkanes Schmieden Chancen:&7 Erfolg &a{0}&7%, Verlust &c{1}&7% +Repair.SubSkill.DiamondRepair.Description = Repariere Diamant-Werkzeuge & -Rüstung. +Repair.SubSkill.DiamondRepair.Name = Diamant-Reparatur ({0}+ SKILL) +Repair.SubSkill.GoldRepair.Description = Repariere Gold-Werkzeuge & -Rüstung. +Repair.SubSkill.GoldRepair.Name = Gold-Reparatur ({0}+ SKILL) +Repair.SubSkill.IronRepair.Description = Repariere Eisen-Werkzeuge & -Rüstung. +Repair.SubSkill.IronRepair.Name = Eisen-Reparatur ({0}+ SKILL) +Repair.SubSkill.Repair.Description = Repariere Werkzeuge & Rüstung. +Repair.SubSkill.Repair.Name = Reparatur +Repair.SubSkill.RepairMastery.Description = Erhöht den Reparatur-Wert. +Repair.SubSkill.RepairMastery.Name = Reparaturmeister +Repair.SubSkill.RepairMastery.Stat = Reparaturmeister: &aFügt {0} extra Haltbarkeit beim Reparieren hinzu. +Repair.SubSkill.StoneRepair.Description = Repariere Stein-Werkzeuge. +Repair.SubSkill.StoneRepair.Name = Stein-Reparatur ({0}+ SKILL) +Repair.SubSkill.SuperRepair.Description = Doppelte Effektivität. +Repair.SubSkill.SuperRepair.Name = Super-Reparatur +Repair.SubSkill.SuperRepair.Stat = Chance auf Super-Reparatur + +Salvage.Ability.Bonus.0 = Fortgeschrittenes Verwerten +Salvage.Ability.Bonus.1 = Max Ertrag {0} Item zerstört +Salvage.Arcane.ExtractFull = &7Verwerten: Gesamte Verzauberung Chance +Salvage.Arcane.ExtractPartial = &7Verwerten: Teil-Verzauberung Chance +Salvage.Listener = Bergung: +Salvage.Listener.Anvil = &4Du hast einen Verwertungs-Amboss platziert, benutze ihn um Werkzeuge und Rüstung zu verwerten. +Salvage.Pretty.Name = Verwerten +Salvage.SkillName = Bergung +Salvage.Skills.Adept.Damaged = &4Deine Fähigkeit ist nicht hoch genug um beschädigte Items zu verwerten. +Salvage.Skills.Adept.Level = Du musst Level &e{0}&c sein um &e{1} &c zu verwerten. +Salvage.Skills.ArcaneFailed = Es ist dir nicht gelungen das Wissen aus diesem Item zu extrahieren. +Salvage.Skills.ArcanePartial = Es ist dir gelungen ein bisschen Wissen zu extrahieren. +Salvage.Skills.ArcaneSuccess = &aDu konntest alles Wissen aus diesem Item extrahieren! +Salvage.Skills.Lottery.Normal = &6Du konntest &3{0}&6 Ressourcen durch die Verschrottung von &e{1}&6 gewinnen. +Salvage.Skills.Lottery.Perfect = &a&lPerfekt!&r&6 Du konntest &3{1}&6 erfolgreich verschrotten und &3{0}&6 Ressourcen gewinnen. +Salvage.Skills.Lottery.Untrained = &7Du bist noch zu ungeschickt beim Verschrotten. Du konntest lediglich &c{0}&7 Ressourcen vom &a{1}&7 zurückgewinnen. +Salvage.Skills.Success = &aItem verwertet! +Salvage.Skills.TooDamaged = &4Das Item ist zu beschädigt um verwertet zu werden. +Salvage.SubSkill.ArcaneSalvage.Description = Extrahiere Verzauberungen aus Items. +Salvage.SubSkill.ArcaneSalvage.Name = Magische Bergung +Salvage.SubSkill.ArcaneSalvage.Stat = Magische Bergung: &eRang {0}/{1} +Salvage.SubSkill.ScrapCollector.Description = Verschrotte einen Gegenstand, um Materialien zurückzugewinnen; eine perfekte Verschrottung erfordert Glück und Geschick. +Salvage.SubSkill.ScrapCollector.Name = Schrottsammler +Salvage.SubSkill.ScrapCollector.Stat = Schrottsammler: &aVerschrotte bis zu &e{0}&a Gegenstände. Hierbei spielt Glück eine gewisse Rolle. +Salvage.SubSkill.UnderstandingTheArt.Description = Du wühlst nicht einfach nur durch den Müll deines Nachbarn, du kümmerst dich auch um die Umwelt! Gibt Boni zu verschiedenen Aspekten der Bergung. +Salvage.SubSkill.UnderstandingTheArt.Name = Die Lehre der Bergung Scoreboard.Header.PlayerCooldowns = mcMMO Abklingzeiten -Scoreboard.Header.PlayerInspect = mcMMO Stats: {0} -Scoreboard.Header.PlayerRank = mcMMO Bestenlisten -Scoreboard.Header.PlayerStats = mcMMO Stats -Scoreboard.Header.PowerLevel = Gesamt Level -Scoreboard.Misc.Ability = F\u00E4higkeit -Scoreboard.Misc.Cooldown = &dAbklingzeit -Scoreboard.Misc.CurrentXP = &aAktuelle XP -Scoreboard.Misc.Level = &3Level -Scoreboard.Misc.Overall = &6Insgesamt -Scoreboard.Misc.PowerLevel = &6Gesamt Level -Scoreboard.Misc.RemainingXP = Verbliebene XP +Scoreboard.Header.PlayerInspect = mcMMO Stats: {0} +Scoreboard.Header.PlayerRank = mcMMO Bestenlisten +Scoreboard.Header.PlayerStats = mcMMO Stats +Scoreboard.Header.PowerLevel = Gesamt-Level +Scoreboard.Misc.Ability = Fähigkeit +Scoreboard.Misc.Cooldown = &dAbklingzeit +Scoreboard.Misc.CurrentXP = &aAktuelle XP +Scoreboard.Misc.Level = &3Level +Scoreboard.Misc.Overall = &6Insgesamt +Scoreboard.Misc.PowerLevel = &6Gesamt-Level +Scoreboard.Misc.RemainingXP = Verbleibende XP -Skills.AbilityGateRequirementFail = &7Du ben\u00F6tigst &e{0}&7 weitere Level in &3{1}&7 um diese Superf\u00E4higkeit zu benutzen! -Skills.Cancelled = {0} abgebrochen! -Skills.Child = &6(VERWANDTER SKILL) -Skills.ChildStats = {0}&a{1} -Skills.ConfirmOrCancel = &aErneuter Rechtsklick zur Best\u00E4tigung &6{0}&a. Linksklick zum abbrechen. -Skills.Disarmed = &4Du wurdest entwaffnet! -Skills.Header = -----[]&a{0}&c[]----- -Skills.NeedMore = &4Du brauchst mehr &7{0} -Skills.NeedMore.Extra = &4Du ben\u00F6tigst mehr &7{0}{1}! -Skills.Overhaul.Header = [[RED]][]=====[][[GREEN]] {0} [[RED]][]=====[] -Skills.Parents = ELTERN -Skills.Stats = {0}&a{1}&3 XP(&7{2}&3/&7{3}&3) -Skills.TooTired = Du bist zu m\u00FCde um diese F\u00E4higkeit zu verwenden. &e({0}s) +Server.ConsoleName = &e[Server] -Smelting.Ability.Locked.0 = GESPERRT bis {0}+ Skill (XP BOOST) -Smelting.Ability.Locked.1 = GESPERRT bis {0}+ Skill (SCHMELZTIEGEL) -Smelting.Effect.4 = Vanilla XP Boost -Smelting.Effect.5 = Erh\u00F6ht die erhaltene Erfahrung beim Schmelzen -Smelting.Listener = Schmelzen: -Smelting.SkillName = SCHMELZEN -Smelting.SubSkill.FluxMining.Description = M\u00F6glichkeit, Erze direkt beim Abbauen zu Schmelzen -Smelting.SubSkill.FluxMining.Name = Schmelztiegel -Smelting.SubSkill.FluxMining.Stat = Schmelztiegel Chance -Smelting.SubSkill.FuelEfficiency.Description = Erh\u00F6he die Brenndauer des Brennstoffes in \u00D6fen -Smelting.SubSkill.FuelEfficiency.Name = Brennstoff Effizienz -Smelting.SubSkill.FuelEfficiency.Stat = Brennstoff Effizienz Multiplikator: &e{0}x -Smelting.SubSkill.SecondSmelt.Description = Verdoppelt den Ertrag beim Schmelzen -Smelting.SubSkill.SecondSmelt.Name = Extra Schmelzung -Smelting.SubSkill.SecondSmelt.Stat = Extra Schmelzung Chance -Smelting.SubSkill.UnderstandingTheArt.Description = M\u00F6glicherweise verbringst du etwas zu viel zeit damit, Erze in H\u00F6hlen zu schmelzen. Gibt Boni zu verschiedenen Aspekten des Bergbaus. -Smelting.SubSkill.UnderstandingTheArt.Name = Die Kunst des Bergbaus -Smelting.SubSkill.UnderstandingTheArt.Stat = Vanilla Erfahrungsmultiplikator: &e{0}x +Skills.AbilityGateRequirementFail = &7Du benötigst &e{0}&7 weitere Level in &3{1}&7 um diese Superfähigkeit zu benutzen! +Skills.Cancelled = {0} abgebrochen! +Skills.Child = &6(VERWANDTER SKILL) +Skills.ChildStats = {0}&a{1} +Skills.ConfirmOrCancel = &aErneuter Rechtsklick zur Bestätigung &6{0}&a. Linksklick zum Abbrechen. +Skills.Disarmed = &4Du wurdest entwaffnet! +Skills.Header = -----[]&a{0}&c[]----- +Skills.MaxXP = Max +Skills.NeedMore = &4Du brauchst mehr &7{0}. +Skills.NeedMore.Extra = &4Du benötigst mehr &7{0}{1}! +Skills.Overhaul.Header = &c[]=====[]&a {0} &c[]=====[] +Skills.Parents = ELTERN +Skills.Stats = {0}&a{1}&3 XP(&7{2}&3/&7{3}&3) +Skills.TooTired = Du bist zu müde um diese Fähigkeit zu verwenden. &e({0}s) +Skills.TooTired.Extra = &6{0} &eSuperfähigkeit CDs - {1} +Skills.TooTired.Named = &7(&6{0}&e {1}s&7) -Stats.Header.Combat = &6-=Kampfskills=- +Smelting.Ability.Locked.0 = Gesperrt bis {0}+ Skill (XP-Boost) +Smelting.Ability.Locked.1 = Gesperrt bis {0}+ Skill (Schmelztiegel) +Smelting.Effect.4 = Vanilla XP-Boost +Smelting.Effect.5 = Erhöht die erhaltene Erfahrung beim Schmelzen. +Smelting.Listener = Schmelzen: +Smelting.SkillName = Schmelzen +Smelting.SubSkill.FluxMining.Description = Möglichkeit, um Erze direkt beim Abbauen zu schmelzen. +Smelting.SubSkill.FluxMining.Name = Schmelztiegel +Smelting.SubSkill.FluxMining.Stat = Schmelztiegel Chance +Smelting.SubSkill.FuelEfficiency.Description = Erhöhe die Brenndauer des Brennstoffes in Öfen. +Smelting.SubSkill.FuelEfficiency.Name = Brennstoff Effizienz +Smelting.SubSkill.FuelEfficiency.Stat = Brennstoff Effizienz-Multiplikator: &e{0}x +Smelting.SubSkill.SecondSmelt.Description = Verdoppelt den Ertrag beim Schmelzen. +Smelting.SubSkill.SecondSmelt.Name = Extra Schmelzung +Smelting.SubSkill.SecondSmelt.Stat = Extra Schmelzung Chance +Smelting.SubSkill.UnderstandingTheArt.Description = Möglicherweise verbringst du etwas zu viel Zeit damit, Erze in Höhlen zu schmelzen. Gibt Boni zu verschiedenen Aspekten des Bergbaus. +Smelting.SubSkill.UnderstandingTheArt.Name = Die Kunst des Bergbaus +Smelting.SubSkill.UnderstandingTheArt.Stat = Vanilla Erfahrungsmultiplikator: &e{0}x + +Stats.Header.Combat = &6-=Kampfskills=- Stats.Header.Gathering = &6-=Sammelskills=- -Stats.Header.Misc = &6-=Weitere Skills=- -Stats.Own.Stats = &aSkill Statistik +Stats.Header.Misc = &6-=Weitere Skills=- +Stats.Own.Stats = &aSkill-Statistik -Swords.Ability.Lower = &7**Du senkst dein SCHWERT** -Swords.Ability.Ready = &a**Dein SCHWERT ist bereit** -Swords.Combat.Bleeding = &a**GEGNER BLUTET** -Swords.Combat.Bleeding.Started = &4 Du blutest! -Swords.Combat.Bleeding.Stopped = &7Das Bluten hat &aaufgeh\u00F6rt&7! -Swords.Combat.Counter.Hit = &4Treffer durch Gegenangriff! -Swords.Combat.Countered = &a**GEGENANGRIFF** -Swords.Combat.Rupture.Note = &7INFO: &eEin Tick passiert jede halbe Sekunde! -Swords.Combat.SS.Struck = &4Getroffen von S\u00C4GEZAHNSCHLAG! -Swords.Effect.4 = S\u00E4gezahnschlag, Blutung+ -Swords.Effect.5 = {0} Ticks Blutung -Swords.Listener = Schwert: -Swords.SkillName = SCHWERT -Swords.Skills.SS.Off = **S\u00E4gezahnschlag abgenutzt** -Swords.Skills.SS.On = &a**S\u00E4gezahnschlag AKTIVIERT** -Swords.Skills.SS.Other.Off = {0}s &cS\u00E4gezahnschlag&a ist &aabgenutzt. -Swords.Skills.SS.Other.On = &a{0}&2 benutzte &cS\u00E4gezahnschlag! -Swords.Skills.SS.Refresh = &aDein &eS\u00E4gezahnschlag &aist wieder bereit! -Swords.SubSkill.CounterAttack.Description = Reflektiere {0} des Schadens w\u00E4hrend du blockierst -Swords.SubSkill.CounterAttack.Name = Gegenangriff -Swords.SubSkill.CounterAttack.Stat = Gegenangriff Chance -Swords.SubSkill.Rupture.Description = Erteilt einen kr\u00E4ftigen Zeitbasierten Schaden. -Swords.SubSkill.Rupture.Name = Entzweiung -Swords.SubSkill.Rupture.Stat = Entzweiungschance -Swords.SubSkill.Rupture.Stat.Extra = Entzweiung: &a{0} ticks [{1} Schaden gegen Spieler] [{2} Schaden gegen Tiere und Monster] -Swords.SubSkill.SerratedStrikes.Description = {0} Fl\u00E4chenschaden, Fl\u00E4chenblutung+ -Swords.SubSkill.SerratedStrikes.Name = S\u00E4gezahnschlag -Swords.SubSkill.SerratedStrikes.Stat = S\u00E4gezahnschlag L\u00E4nge -Swords.SubSkill.Stab.Description = F\u00FCgt extra Schaden zu deinem Angriff hinzu. -Swords.SubSkill.Stab.Name = Erstechen -Swords.SubSkill.Stab.Stat = Schaden durch Erstechen -Swords.SubSkill.SwordsLimitBreak.Description = \u00DCberschreite deine Grenzen. -Swords.SubSkill.SwordsLimitBreak.Name = \u00DCberwindung -Swords.SubSkill.SwordsLimitBreak.Stat = Bonus Schaden durch \u00DCberwindung +Swords.Ability.Lower = &7&o**Du senkst dein Schwert.** +Swords.Ability.Ready = &a&o**Du hebst dein Schwert...** +Swords.Combat.Bleeding = &a**Gegner blutet** +Swords.Combat.Bleeding.Started = &4Du blutest! +Swords.Combat.Bleeding.Stopped = &7Das Bluten hat &aaufgehört&7! +Swords.Combat.Counter.Hit = &4Treffer durch Gegenangriff! +Swords.Combat.Countered = &a**Gegenangriff** +Swords.Combat.Rupture.Note = &7INFO: &eEin Tick passiert jede halbe Sekunde! +Swords.Combat.SS.Struck = &4Getroffen von Sägezahnschlag! +Swords.Effect.4 = Sägezahnschlag, Blutung+ +Swords.Effect.5 = {0} Ticks Blutung +Swords.Listener = Schwert: +Swords.SkillName = Schwert +Swords.Skills.SS.Off = &a&o**Sägezahnschlag abgenutzt** +Swords.Skills.SS.On = &a&o**Sägezahnschlag aktiviert** +Swords.Skills.SS.Other.Off = {0}s &cSägezahnschlag&a ist &aabgenutzt. +Swords.Skills.SS.Other.On = &a{0}&2 benutzte &cSägezahnschlag! +Swords.Skills.SS.Refresh = &aDein &eSägezahnschlag &aist wieder bereit! +Swords.SubSkill.CounterAttack.Description = Reflektiere {0} des Schadens während du blockierst. +Swords.SubSkill.CounterAttack.Name = Gegenangriff +Swords.SubSkill.CounterAttack.Stat = Gegenangriff Chance +Swords.SubSkill.Rupture.Description = Erteilt einen kräftigen zeitbasierten Schaden. +Swords.SubSkill.Rupture.Name = Entzweiung +Swords.SubSkill.Rupture.Stat = Entzweiungschance +Swords.SubSkill.Rupture.Stat.Extra = Entzweiung: &a{0} ticks [{1} Schaden gegen Spieler] [{2} Schaden gegen Tiere und Monster] +Swords.SubSkill.SerratedStrikes.Description = {0} Flächenschaden, Flächenblutung+ +Swords.SubSkill.SerratedStrikes.Name = Sägezahnschlag +Swords.SubSkill.SerratedStrikes.Stat = Sägezahnschlag Länge +Swords.SubSkill.Stab.Description = Fügt deinem Angriff extra Schaden hinzu. +Swords.SubSkill.Stab.Name = Erstechen +Swords.SubSkill.Stab.Stat = Schaden durch Erstechen +Swords.SubSkill.SwordsLimitBreak.Description = Überschreite deine Grenzen. +Swords.SubSkill.SwordsLimitBreak.Name = Überwindung +Swords.SubSkill.SwordsLimitBreak.Stat = Bonus-Schaden durch Überwindung -Taming.Ability.Bonus.0 = Umweltbewusst -Taming.Ability.Bonus.1 = W\u00F6lfe weichen Gefahren aus -Taming.Ability.Bonus.10 = Heiliger Hund -Taming.Ability.Bonus.11 = Regenerierung auch mit Tr\u00E4nken und Zaubern m\u00F6glich -Taming.Ability.Bonus.2 = Dicker Pelz -Taming.Ability.Bonus.3 = 1/{0} Schaden, Feuer-Resistent -Taming.Ability.Bonus.4 = Schock-Sicher -Taming.Ability.Bonus.5 = Explosionen f\u00FCgen 1/{0} des normalen Schadens zu -Taming.Ability.Bonus.6 = Gesch\u00E4rfte Krallen -Taming.Ability.Bonus.7 = +{0} Schaden -Taming.Ability.Bonus.8 = Schnell-Imbiss -Taming.Ability.Bonus.9 = {0} Chance auf Heilung bei einer Attacke -Taming.Ability.Locked.0 = GESPERRT bis Skill {0}+ (Umweltbewusst) -Taming.Ability.Locked.1 = GESPERRT bis Skill {0}+ (Dicker Pelz) -Taming.Ability.Locked.2 = GESPERRT bis Skill {0}+ (Schock-Sicher) -Taming.Ability.Locked.3 = GESPERRT bis Skill {0}+ (Gesch\u00E4rfte Krallen) -Taming.Ability.Locked.4 = GESPERRT bis Skill {0}+ (Schnell-Imbiss) -Taming.Ability.Locked.5 = GESPERRT bis Skill {0}+ (Heiliger Hund) -Taming.Combat.Chance.Gore = Aufschlitzen Chance: &e{0} -Taming.Listener = Z\u00E4hmen: -Taming.Listener.Wolf = &8Dein Wolf hastet zu dir zur\u00FCck... -Taming.SkillName = Z\u00C4HMEN -Taming.SubSkill.BeastLore.Description = Knochenschlag inspiziert W\u00F6lfe und Ozelots -Taming.SubSkill.BeastLore.Name = Bestienkunde -Taming.SubSkill.CallOfTheWild.Description = Beschw\u00F6re ein Tier an deine Seite -Taming.SubSkill.CallOfTheWild.Description.2 = &7RdW: B\u00FCcken und Linksklick mit {0} {1} (Ozelot), {2} {3} (Wolf), {4} {5} (Pferd) -Taming.SubSkill.CallOfTheWild.Name = Ruf der Wildnis -Taming.SubSkill.EnvironmentallyAware.Description = Kaktus/Lava-Furcht, Immun gegen Fall-Schaden -Taming.SubSkill.EnvironmentallyAware.Name = Umweltbewusst -Taming.SubSkill.FastFoodService.Description = Chance auf Heilung bei Attacke (Wolf) -Taming.SubSkill.FastFoodService.Name = Schnell-Imbiss -Taming.SubSkill.Gore.Description = Kritische Treffer verursachen Blutung -Taming.SubSkill.Gore.Name = Aufschlitzen -Taming.SubSkill.HolyHound.Description = Heilung durch Magie und Tr\u00E4nke -Taming.SubSkill.HolyHound.Name = Heiliger Hund -Taming.SubSkill.Pummel.Description = Deine W\u00F6lfe haben eine Chance, Gegner zur\u00FCck zu schlagen. -Taming.SubSkill.Pummel.Name = Pummel -Taming.SubSkill.Pummel.TargetMessage = Du wurdest von einem Wolf zur\u00FCckgeschlagen! -Taming.SubSkill.SharpenedClaws.Description = Schadens-Bonus -Taming.SubSkill.SharpenedClaws.Name = Gesch\u00E4rfte Krallen -Taming.SubSkill.ShockProof.Description = Reduktion von Explosions-Schaden -Taming.SubSkill.ShockProof.Name = Schock-Sicher -Taming.SubSkill.ThickFur.Description = Verminderter Schaden, Feuer-Resistent -Taming.SubSkill.ThickFur.Name = Dicker Pelz -Taming.Summon.Complete = &aBeschw\u00F6rung abgeschlossen -Taming.Summon.Fail.Horse = Du hast zu viele Pferde um dich, um weitere zu beschw\u00F6ren. -Taming.Summon.Fail.Ocelot = Du hast zu viele Ozelots um dich, um weitere zu beschw\u00F6ren. -Taming.Summon.Fail.TooMany = Du hast das Maximum an beschworenen Tieren erreicht &e({0}) -Taming.Summon.Fail.Wolf = Du hast zu viele W\u00F6lfe um dich, um weitere zu beschw\u00F6ren. -Taming.Summon.Lifespan = (Lebenszeit: {0}s) -Taming.Summon.Name.Format = {0}''s {1} +Taming.Ability.Bonus.0 = Umweltbewusst +Taming.Ability.Bonus.1 = Wölfe weichen Gefahren aus. +Taming.Ability.Bonus.10 = Heiliger Hund +Taming.Ability.Bonus.11 = Regenerierung ist auch mit Tränken und Zaubern möglich. +Taming.Ability.Bonus.2 = Dicker Pelz +Taming.Ability.Bonus.3 = 1/{0} Schaden, Feuer-Resistent +Taming.Ability.Bonus.4 = Schock-Sicher +Taming.Ability.Bonus.5 = Explosionen fügen 1/{0} des normalen Schadens zu. +Taming.Ability.Bonus.6 = Geschärfte Krallen +Taming.Ability.Bonus.7 = +{0} Schaden +Taming.Ability.Bonus.8 = Schnell-Imbiss +Taming.Ability.Bonus.9 = {0} Chance auf Heilung bei einer Attacke. +Taming.Ability.Locked.0 = Gesperrt bis Skill {0}+ (Umweltbewusst) +Taming.Ability.Locked.1 = Gesperrt bis Skill {0}+ (Dicker Pelz) +Taming.Ability.Locked.2 = Gesperrt bis Skill {0}+ (Schock-Sicher) +Taming.Ability.Locked.3 = Gesperrt bis Skill {0}+ (Geschärfte Krallen) +Taming.Ability.Locked.4 = Gesperrt bis Skill {0}+ (Schnell-Imbiss) +Taming.Ability.Locked.5 = Gesperrt bis Skill {0}+ (Heiliger Hund) +Taming.Combat.Chance.Gore = Aufschlitzen Chance: &e{0} +Taming.Listener = Zähmen: +Taming.Listener.Wolf = &8Dein Wolf läuft zu dir zurück... +Taming.SkillName = ZÄHMEN +Taming.SubSkill.BeastLore.Description = Knochenschlag inspiziert Wölfe und Ozelots. +Taming.SubSkill.BeastLore.Name = Bestienkunde +Taming.SubSkill.CallOfTheWild.Description = Beschwöre ein Tier an deine Seite. +Taming.SubSkill.CallOfTheWild.Description.2 = &7Ruf der Wildnis: Bücken und Linksklick mit {0} {1} (Ozelot), {2} {3} (Wolf), {4} {5} (Pferd) +Taming.SubSkill.CallOfTheWild.Name = Ruf der Wildnis +Taming.SubSkill.EnvironmentallyAware.Description = Kaktus/Lava-Furcht, Immun gegen Fallschaden +Taming.SubSkill.EnvironmentallyAware.Name = Umweltbewusst +Taming.SubSkill.FastFoodService.Description = Chance auf Heilung bei Attacke (Wolf). +Taming.SubSkill.FastFoodService.Name = Schnell-Imbiss +Taming.SubSkill.Gore.Description = Kritische Treffer verursachen Blutung. +Taming.SubSkill.Gore.Name = Aufschlitzen +Taming.SubSkill.HolyHound.Description = Heilung durch Magie und Tränke. +Taming.SubSkill.HolyHound.Name = Heiliger Hund +Taming.SubSkill.Pummel.Description = Deine Wölfe haben eine Chance, Gegner zurück zu schlagen. +Taming.SubSkill.Pummel.Name = Pummel +Taming.SubSkill.Pummel.TargetMessage = Du wurdest von einem Wolf zurückgeschlagen! +Taming.SubSkill.SharpenedClaws.Description = Schadens-Bonus +Taming.SubSkill.SharpenedClaws.Name = Geschärfte Krallen +Taming.SubSkill.ShockProof.Description = Reduktion von Explosionsschaden. +Taming.SubSkill.ShockProof.Name = Schock-Sicher +Taming.SubSkill.ThickFur.Description = Verminderter Schaden, Feuer-Resistenz +Taming.SubSkill.ThickFur.Name = Dicker Pelz +Taming.Summon.COTW.BreedingDisallowed = &a(Ruf der Wildnis) &cBeschworene Tiere können nicht gezüchtet werden. +Taming.Summon.COTW.Limit = &a(Ruf der Wildnis) &7Du kannst immer nur jeweils &c{0} &7beschworene &7{1} Tiere zugleich besitzen. +Taming.Summon.COTW.NeedMoreItems = &a(Ruf der Wildnis) &7Du benötigst &e{0}&7 mehr von &3{1}. +Taming.Summon.COTW.Removed = &a(Ruf der Wildnis) &7Dein beschworenes &6{0}&7 Tier hat sich aus dem Staub gemacht. +Taming.Summon.COTW.Success.WithLifespan = &a(Ruf der Wildnis) &7Du hast erfolgreich ein &6{0}&7 beschworen und es wird &6{1}&7 Sekunden lang bleiben. +Taming.Summon.COTW.Success.WithoutLifespan = &a(Ruf der Wildnis) &7Du hast ein &6{0}&7 beschworen. +Taming.Summon.COTW.TimeExpired = &a(Ruf der Wildnis) &7Die Zeit ist um, dein &6{0}&7 muss gehen. +Taming.Summon.Name.Format = {0}''s {1} -Teleport.Cancelled = &4Teleport abgebrochen! +Teleport.Cancelled = &4Teleport abgebrochen! Teleport.Commencing = &7Beginne Teleport in &6({0}) &7Sekunden, bitte stillhalten... -Unarmed.Ability.Bonus.0 = Eiserner Arm -Unarmed.Ability.Bonus.1 = +{0} Schadens-Bonus -Unarmed.Ability.IronGrip.Attacker = Dein Gegner hat einen eisernen Griff! -Unarmed.Ability.IronGrip.Defender = &aDein eiserner Griff hat dich vor Entwaffnung gesch\u00FCtzt! -Unarmed.Ability.Lower = &7**Du senkst deine F\u00C4USTE** -Unarmed.Ability.Ready = &a**Deine F\u00C4USTE sind bereit** -Unarmed.Listener = Faustkampf: -Unarmed.SkillName = Faustkampf -Unarmed.Skills.Berserk.Off = **Berserker ausgelaufen** -Unarmed.Skills.Berserk.On = &a**Berserker AKTIVIERT** -Unarmed.Skills.Berserk.Other.Off = {0}s &cBerserker&a ist &aausgelaufen -Unarmed.Skills.Berserk.Other.On = &a{0}&2 benutzte &cBerserker! -Unarmed.Skills.Berserk.Refresh = &aDein &eBerserker &aist wieder bereit! -Unarmed.SubSkill.ArrowDeflect.Description = Lenkt Pfeile ab -Unarmed.SubSkill.ArrowDeflect.Name = Pfeil-Ablenkung -Unarmed.SubSkill.ArrowDeflect.Stat = Pfeil-Ablenkung Chance -Unarmed.SubSkill.Berserk.Description = +50% Schaden, Zerbricht weiche Materialien -Unarmed.SubSkill.Berserk.Name = Berserker -Unarmed.SubSkill.Berserk.Stat = Berserker L\u00E4nge -Unarmed.SubSkill.BlockCracker.Description = Durchbreche Stein mit deinen F\u00E4usten -Unarmed.SubSkill.BlockCracker.Name = Schwarzgurt -Unarmed.SubSkill.Disarm.Description = L\u00E4sst Gegenstand aus der Hand des Feindes fallen -Unarmed.SubSkill.Disarm.Name = Entwaffnen -Unarmed.SubSkill.Disarm.Stat = Entwaffnen Chance -Unarmed.SubSkill.IronArmStyle.Description = Erh\u00F6ht kurzfristig deine Schlagkraft -Unarmed.SubSkill.IronArmStyle.Name = Eiserner Arm -Unarmed.SubSkill.IronGrip.Description = Sch\u00FCtzt dich davor, entwaffnet zu werden -Unarmed.SubSkill.IronGrip.Name = Eisen Griff -Unarmed.SubSkill.IronGrip.Stat = Eisen Griff Chance +Unarmed.Ability.Bonus.0 = Eiserner Arm +Unarmed.Ability.Bonus.1 = +{0} Schadens-Bonus +Unarmed.Ability.IronGrip.Attacker = Dein Gegner hat einen eisernen Griff! +Unarmed.Ability.IronGrip.Defender = &aDein eiserner Griff hat dich vor Entwaffnung geschützt! +Unarmed.Ability.Lower = &7&o**Du senkst deine Fäuste.** +Unarmed.Ability.Ready = &a&o**Du hebst deine Fäuste...** +Unarmed.Listener = Faustkampf: +Unarmed.SkillName = Faustkampf +Unarmed.Skills.Berserk.Off = **Berserker ausgelaufen** +Unarmed.Skills.Berserk.On = &a**Berserker aktiviert** +Unarmed.Skills.Berserk.Other.Off = {0}s &cBerserker&a ist &aausgelaufen. +Unarmed.Skills.Berserk.Other.On = &a{0}&2 benutzte &cBerserker! +Unarmed.Skills.Berserk.Refresh = &aDein &eBerserker &aist wieder bereit! +Unarmed.SubSkill.ArrowDeflect.Description = Lenkt Pfeile ab. +Unarmed.SubSkill.ArrowDeflect.Name = Pfeil-Ablenkung +Unarmed.SubSkill.ArrowDeflect.Stat = Pfeil-Ablenkung Chance +Unarmed.SubSkill.Berserk.Description = +50% Schaden, zerbricht weiche Materialien. +Unarmed.SubSkill.Berserk.Name = Berserker +Unarmed.SubSkill.Berserk.Stat = Berserker Länge +Unarmed.SubSkill.BlockCracker.Description = Durchbreche Stein mit deinen Fäusten. +Unarmed.SubSkill.BlockCracker.Name = Schwarzgurt +Unarmed.SubSkill.Disarm.Description = Lässt den Gegenstand aus der Hand des Feindes fallen. +Unarmed.SubSkill.Disarm.Name = Entwaffnen +Unarmed.SubSkill.Disarm.Stat = Entwaffnen Chance +Unarmed.SubSkill.IronGrip.Description = Schützt dich davor, entwaffnet zu werden. +Unarmed.SubSkill.IronGrip.Name = Eiserner Griff +Unarmed.SubSkill.IronGrip.Stat = Eiserner Griff Chance +Unarmed.SubSkill.SteelArmStyle.Description = Verstärkt deinen Arm mit der Zeit. +Unarmed.SubSkill.SteelArmStyle.Name = Stählerner Arm Unarmed.SubSkill.UnarmedLimitBreak.Description = Durchbreche deine Grenzen! -Unarmed.SubSkill.UnarmedLimitBreak.Name = \u00DCberwindung -Unarmed.SubSkill.UnarmedLimitBreak.Stat = Bonus Schaden durch \u00DCberwindung +Unarmed.SubSkill.UnarmedLimitBreak.Name = Überwindung +Unarmed.SubSkill.UnarmedLimitBreak.Stat = Bonus-Schaden durch Überwindung -UpdateChecker.NewAvailable = Eine neue Version von mcMMO ist auf Spigot erh\u00E4ltlich! -UpdateChecker.Outdated = Du verwendest eine veraltete mcMMO Version! +UpdateChecker.NewAvailable = Eine neue Version von mcMMO ist auf Spigot erhältlich! +UpdateChecker.Outdated = Du verwendest eine veraltete mcMMO Version! -Woodcutting.Ability.0 = Bl\u00E4ttersturm -Woodcutting.Ability.1 = Bl\u00E4st Bl\u00E4tter davon -Woodcutting.Ability.Locked.0 = GESPERRT bis Skill {0}+ (Bl\u00E4ttersturm) -Woodcutting.Listener = Holzf\u00E4llen: -Woodcutting.SkillName = Holzf\u00E4llen -Woodcutting.Skills.TreeFeller.Off = **Baumf\u00E4ller abgelaufen** -Woodcutting.Skills.TreeFeller.On = &a**Baumf\u00E4ller AKTIVIERT** -Woodcutting.Skills.TreeFeller.Other.Off = {0}s &cBaumf\u00E4ller&a ist &aabgelaufen -Woodcutting.Skills.TreeFeller.Other.On = &a{0}&2 benutzte &cBaumf\u00E4ller! -Woodcutting.Skills.TreeFeller.Refresh = &aDein &eBaumf\u00E4ller &aist wieder bereit! -Woodcutting.Skills.TreeFeller.Splinter = Deine Axt zersplittert in tausend kleine Teile! -Woodcutting.Skills.TreeFeller.Threshold = Dieser Baum ist zu gro\u00DF! -Woodcutting.SubSkill.BarkSurgeon.Description = Erhalte n\u00FCtzliche Ressourcen beim Entrinden von B\u00E4umen -Woodcutting.SubSkill.BarkSurgeon.Name = Rindenchirurg -Woodcutting.SubSkill.HarvestLumber.Description = Verdoppelt die Ausbeute -Woodcutting.SubSkill.HarvestLumber.Name = Doppel Drops -Woodcutting.SubSkill.HarvestLumber.Stat = Doppeldrop Chance -Woodcutting.SubSkill.LeafBlower.Description = Bl\u00E4st Bl\u00E4tter davon -Woodcutting.SubSkill.LeafBlower.Name = Bl\u00E4ttersturm -Woodcutting.SubSkill.NaturesBounty.Description = Erhalte Erfahrung von der Natur -Woodcutting.SubSkill.NaturesBounty.Name = Naturwunder -Woodcutting.SubSkill.Splinter.Description = F\u00E4lle B\u00E4ume effizienter. -Woodcutting.SubSkill.Splinter.Name = Splitter -Woodcutting.SubSkill.TreeFeller.Description = L\u00E4sst B\u00E4ume explodieren -Woodcutting.SubSkill.TreeFeller.Name = Baumf\u00E4ller -Woodcutting.SubSkill.TreeFeller.Stat = Baumf\u00E4ller L\u00E4nge +Woodcutting.Ability.0 = Blättersturm +Woodcutting.Ability.1 = Bläst Blätter davon. +Woodcutting.Ability.Locked.0 = Gesperrt bis Skill {0}+ (Blättersturm) +Woodcutting.Listener = Holzfällen: +Woodcutting.SkillName = Holzfällen +Woodcutting.Skills.TreeFeller.Off = &a&o**Baumfäller abgelaufen** +Woodcutting.Skills.TreeFeller.On = &a&o**Baumfäller aktiviert** +Woodcutting.Skills.TreeFeller.Other.Off = {0}s &cBaumfäller&a ist &aabgelaufen. +Woodcutting.Skills.TreeFeller.Other.On = &a{0}&2 benutzte &cBaumfäller! +Woodcutting.Skills.TreeFeller.Refresh = &aDein &eBaumfäller &aist wieder bereit! +Woodcutting.Skills.TreeFeller.Splinter = Deine Axt zersplittert in tausend kleine Teile! +Woodcutting.Skills.TreeFeller.Threshold = Dieser Baum ist zu groß! +Woodcutting.SubSkill.BarkSurgeon.Description = Erhalte nützliche Ressourcen beim Entrinden von Bäumen. +Woodcutting.SubSkill.BarkSurgeon.Name = Rindenchirurg +Woodcutting.SubSkill.HarvestLumber.Description = Verdoppelt die Ausbeute. +Woodcutting.SubSkill.HarvestLumber.Name = Doppeldrops +Woodcutting.SubSkill.HarvestLumber.Stat = Doppeldrop Chance +Woodcutting.SubSkill.KnockOnWood.Description = Zusätliche Drops durch Baumfäller. +Woodcutting.SubSkill.KnockOnWood.Loot.Normal = Standard-Loot von Bäumen +Woodcutting.SubSkill.KnockOnWood.Loot.Rank2 = Standard-Loot von Bäumen und Erfahrungspunkte +Woodcutting.SubSkill.KnockOnWood.Name = Auf Holz geklopft +Woodcutting.SubSkill.KnockOnWood.Stat = Auf Holz geklopft +Woodcutting.SubSkill.LeafBlower.Description = Bläst Blätter davon. +Woodcutting.SubSkill.LeafBlower.Name = Blättersturm +Woodcutting.SubSkill.NaturesBounty.Description = Erhalte Erfahrung von der Natur. +Woodcutting.SubSkill.NaturesBounty.Name = Naturwunder +Woodcutting.SubSkill.Splinter.Description = Fälle Bäume effizienter. +Woodcutting.SubSkill.Splinter.Name = Splitter +Woodcutting.SubSkill.TreeFeller.Description = Lässt Bäume explodieren. +Woodcutting.SubSkill.TreeFeller.Name = Baumfäller +Woodcutting.SubSkill.TreeFeller.Stat = Baumfäller Länge -XPBar.Acrobatics = Akrobatik Level: &6{0} -XPBar.Alchemy = Alchemie Level: &6{0} -XPBar.Archery = Bogenschie\u00DFen Level: &6{0} -XPBar.Axes = Axtkampf Level: &6{0} +XPBar.Acrobatics = Akrobatik Level: &6{0} +XPBar.Alchemy = Alchemie Level: &6{0} +XPBar.Archery = Bogenschießen Level: &6{0} +XPBar.Axes = Axtkampf Level: &6{0} XPBar.Complex.Template = {0} &3 {4}&f% &3(&f{1}&3/&f{2}&3) -XPBar.Excavation = Graben Level: &6{0} -XPBar.Fishing = Angeln Level: &6{0} -XPBar.Herbalism = Kr\u00E4uterkunde Level: &6{0} -XPBar.Mining = Bergbau Level: &6{0} -XPBar.Repair = Reparatur Level: &6{0} -XPBar.Salvage = Bergung Level: &6{0} -XPBar.Smelting = Schmelzen Level: &6{0} -XPBar.Swords = Schwertkampf Level: &6{0} -XPBar.Taming = Z\u00E4hmen Level: &6{0} -XPBar.Unarmed = Faustkampf Level: &6{0} -XPBar.Woodcutting = Holzf\u00E4llen Level: &6{0} +XPBar.Excavation = Graben Level: &6{0} +XPBar.Fishing = Angeln Level: &6{0} +XPBar.Herbalism = Kräuterkunde Level: &6{0} +XPBar.Mining = Bergbau Level: &6{0} +XPBar.Repair = Reparatur Level: &6{0} +XPBar.Salvage = Bergung Level: &6{0} +XPBar.Smelting = Schmelzen Level: &6{0} +XPBar.Swords = Schwertkampf Level: &6{0} +XPBar.Taming = Zähmen Level: &6{0} +XPBar.Template = {0} +XPBar.Template.EarlyGameBoost = &6Du erlernst eine neue Fähigkeit... +XPBar.Unarmed = Faustkampf Level: &6{0} +XPBar.Woodcutting = Holzfällen Level: &6{0} -XPRate.Event = &6Es findet derzeit ein Skill Event statt! Du bekommst aktuell &c{0} &6mal so viel Erfahrung f\u00FCr deine Skills wie normal! +XPRate.Event = &6Es findet derzeit ein Skill-Event statt! Du bekommst aktuell &c{0} &6mal so viel Erfahrung für deine Skills wie normal! -mcMMO.Description = &3\u00DCber das &emcMMO&3 Projekt:,&6mcMMO ist ein &copen source&6 RPG mod erstellt in Februar 2011&6von &9nossr50&6. Das Ziel ist es ein qualitatives RPG Erlebnis zu liefern.,&3Tips:,&6 - &aNutze &c/mcmmo help&a um Befehle zu sehen &6,- &aNutze &c/skillname&a f\u00FCr detaillierte Skill Infos,&3Entwickler:,&6 - &anossr50 &9(Erfinder & Projektleitung),&6 - &aGJ &9(Fr\u00FChere Projektleitung),&6 - &aNuclearW &9(Entwickler),&6 - &abm01 &9(Entwickler),&6 - &aTfT_02 &9(Entwickler),&6 - &aGlitchfinder &9(Entwickler),&6 - &at00thpick1 &9(Entwickler),&6 - &alumis31 &9 (Urspr\u00FCngliche Deutsche \u00DCbersetzung),&6 - &aOverCrave &9 (Neue Deutsche \u00DCbersetzung & \u00DCberarbeitung),&3N\u00FCtzliche Links:,&6 - &ahttps://github.com/mcMMO-Dev/mcMMO/issues&6 Bug Reporting,&6 - &ahttps://discord.gg/EJGVanb &6 Offizieller Discord (Englisch) -mcMMO.NoInvites = &cDu hast zurzeit keine Einladungen +mcMMO.Description = &3Über das &emcMMO&3 Projekt: &6mcMMO ist ein &copen source&6 RPG-Mod erstellt im Februar 2011 &6von &9nossr50&6. Das Ziel ist es ein qualitatives RPG Erlebnis zu liefern. &3Tipps:&6 - &aNutze &c/mcmmo help&a um Befehle zu sehen, &6 - &aNutze &c/skillname&a für detaillierte Skill Infos, &3Entwickler:&6 - &anossr50 &9(Erfinder & Projektleitung),&6 - &aGJ &9(Frühere Projektleitung),&6 - &aNuclearW &9(Entwickler),&6 - &abm01 &9(Entwickler),&6 - &aTfT_02 &9(Entwickler),&6 - &aGlitchfinder &9(Entwickler),&6 - &at00thpick1 &9(Entwickler),&6 - &alumis31 &9(Ursprüngliche Deutsche Übersetzung),&6 - &aOverCrave &9(Neue Deutsche Übersetzung & Überarbeitung),&6 - &aAnseba &9(Überarbeitung Deutsche Übersetzung), &3Nützliche Links:&6 - &ahttps://github.com/mcMMO-Dev/mcMMO/issues&6 Bug Reporting,&6 - &ahttps://discord.gg/EJGVanb &6 Offizieller Discord (Englisch) +mcMMO.Description.FormerDevs = &3Ehemalige Entwickler: &aGJ, NuclearW, bm01, TfT_02, Glitchfinder +mcMMO.NoInvites = &cDu hast zurzeit keine Einladungen. mcMMO.NoPermission = &4Unzureichende Berechtigungen. -mcMMO.NoSkillNote = &8Wenn du keinen Zugriff auf einen Skill hast wird er hier nicht angezeigt. -Commands.Database.CooldownMS=Du musst {0}ms warten, bis du diesen Befehl wieder ausführen kannst! -Profile.PendingLoad=&cDeine mcMMO Daten wurden noch nicht geladen. -Profile.Loading.FailureNotice=&4[A] &cmcMMO konnte die Spielerdaten von &e{0}&c leider nicht laden. Bitte überprüfe deine Datenbankeinstellungen. &dVersuche: {1}. -Reminder.Squelched=&7Erinnerung: Du erhälst aktuell keinerlei Benachrichtigungen von mcMMO, um dies zu ändern, nutze den /mcnotify Befehl. Dies ist eine stündliche, automatische Erinnerung. -Profile.Loading.FailurePlayer=&cmcMMO hat Probleme beim Laden deiner Daten nach &a{0}&c Versuchen. &8Kontaktiere den Serveradmin bezüglich diesem Problem. mcMMO wird weiterhin versuchen, deine Daten zu laden, bis du den Server verlässt. So lange kannst du keine Skillerfahrung sammeln und diese auch nicht nutzen. +mcMMO.NoSkillNote = &8Wenn du keinen Zugriff auf einen Skill hast wird er hier nicht angezeigt. +mcMMO.Template.Prefix = &6(&amcMMO&6) &7{0} diff --git a/src/main/resources/locale/locale_en_US.properties b/src/main/resources/locale/locale_en_US.properties index 9d2b3ca7a..992ea77a3 100644 --- a/src/main/resources/locale/locale_en_US.properties +++ b/src/main/resources/locale/locale_en_US.properties @@ -1,4 +1,5 @@ #I'm going to try to normalize our locale file, forgive the mess for now. +# TODO: Update JSON to support hex #DO NOT USE COLOR CODES IN THE JSON KEYS #COLORS ARE DEFINED IN advanced.yml IF YOU WISH TO CHANGE THEM @@ -13,7 +14,7 @@ JSON.LevelRequirement=Level Requirement JSON.JWrapper.Target.Type=Target Type: JSON.JWrapper.Target.Block=Block JSON.JWrapper.Target.Player=Player -JSON.JWrapper.Perks.Header=[[GOLD]]Lucky Perks +JSON.JWrapper.Perks.Header=&6Lucky Perks JSON.JWrapper.Perks.Lucky={0}% Better Odds JSON.Hover.Tips=Tips JSON.Acrobatics=Acrobatics @@ -36,53 +37,53 @@ JSON.URL.Patreon=Support nossr50 and his work for mcMMO on Patreon! JSON.URL.Spigot=The official mcMMO Spigot Resource Page! JSON.URL.Translation=Translate mcMMO into other languages! JSON.URL.Wiki=The official mcMMO wiki! -JSON.SkillUnlockMessage=[[GOLD]][ mcMMO[[YELLOW]] @[[DARK_AQUA]]{0} [[GOLD]]Rank [[DARK_AQUA]]{1}[[GOLD]] Unlocked! ] +JSON.SkillUnlockMessage=&6[ mcMMO&e @&3{0} &6Rank &3{1}&6 Unlocked! ] JSON.Hover.Rank=&e&lRank:&r &f{0} JSON.Hover.NextRank=&7&oNext upgrade at level {0} # for JSON.Hover.Mystery you can add {0} to insert the level required into the name, I don't like how that looks so I'm not doing that atm -JSON.Hover.Mystery=[[GRAY]]??? -JSON.Hover.Mystery2=[[YELLOW]][[[DARK_GRAY]]{0}[[YELLOW]]][[DARK_GRAY]]???&r -JSON.Hover.SkillName=[[DARK_AQUA]]{0}&r -JSON.Hover.SuperAbility=[[DARK_PURPLE]]{0}&r -JSON.Hover.MaxRankSkillName=[[GOLD]]{0}&r -JSON.Hover.AtSymbolSkills=[[YELLOW]]@ -JSON.Hover.AtSymbolURL=[[YELLOW]]@ +JSON.Hover.Mystery=&7??? +JSON.Hover.Mystery2=&e[&8{0}&e]&8???&r +JSON.Hover.SkillName=&3{0}&r +JSON.Hover.SuperAbility=&5{0}&r +JSON.Hover.MaxRankSkillName=&6{0}&r +JSON.Hover.AtSymbolSkills=&e@ +JSON.Hover.AtSymbolURL=&e@ #This is the message sent to players when an ability is activated JSON.Notification.SuperAbility={0} #These are the JSON Strings used for SubSkills -JSON.Acrobatics.Roll.Interaction.Activated=Test [[RED]]Rolled Test +JSON.Acrobatics.Roll.Interaction.Activated=Test &cRolled Test JSON.Acrobatics.SubSkill.Roll.Details.Tips=If you hold sneak while falling you can prevent up to twice the damage that you would normally take! -Anvil.SingleItemStack=[[RED]]You cannot salvage or repair item stacks that have more than one item, split the stack first. +Anvil.SingleItemStack=&cYou cannot salvage or repair item stacks that have more than one item, split the stack first. #DO NOT USE COLOR CODES IN THE JSON KEYS #COLORS ARE DEFINED IN advanced.yml IF YOU WISH TO CHANGE THEM -mcMMO.Template.Prefix=[[GOLD]]([[GREEN]]mcMMO[[GOLD]]) [[GRAY]]{0} +mcMMO.Template.Prefix=&6(&amcMMO&6) &7{0} # BEGIN STYLING -Ability.Generic.Refresh=[[GREEN]]**ABILITIES REFRESHED!** -Ability.Generic.Template.Lock=[[GRAY]]{0} +Ability.Generic.Refresh=&a**ABILITIES REFRESHED!** +Ability.Generic.Template.Lock=&7{0} # Skill Command Styling -Ability.Generic.Template=[[DARK_AQUA]]{0}: [[GREEN]]{1} -Ability.Generic.Template.Custom=[[DARK_AQUA]]{0} -Skills.Overhaul.Header=[[RED]][]=====[][[GREEN]] {0} [[RED]][]=====[] +Ability.Generic.Template=&3{0}: &a{1} +Ability.Generic.Template.Custom=&3{0} +Skills.Overhaul.Header=&c[]=====[]&a {0} &c[]=====[] Effects.Effects=EFFECTS Effects.SubSkills.Overhaul=Sub-Skills -Effects.Child.Overhaul=[[DARK_AQUA]]Child Lv.[[YELLOW]] {0}[[DARK_AQUA]]: {1} -Effects.Child.ParentList=[[GREEN]]{0}[[GOLD]]([[DARK_AQUA]]Lv.[[YELLOW]]{1}[[GOLD]]) -Effects.Level.Overhaul=[[GOLD]]LVL: [[YELLOW]]{0} [[DARK_AQUA]]XP[[YELLOW]]([[GOLD]]{1}[[YELLOW]]/[[GOLD]]{2}[[YELLOW]]) -Effects.Parent=[[GOLD]]{0} - -Effects.Template=[[DARK_AQUA]]{0}: [[GREEN]]{1} +Effects.Child.Overhaul=&3Child Lv.&e {0}&3: {1} +Effects.Child.ParentList=&a{0}&6(&3Lv.&e{1}&6) +Effects.Level.Overhaul=&6LVL: &e{0} &3XP&e(&6{1}&e/&6{2}&e) +Effects.Parent=&6{0} - +Effects.Template=&3{0}: &a{1} Commands.Stats.Self.Overhaul=Stats -Commands.XPGain.Overhaul=[[GOLD]]XP GAIN: [[DARK_AQUA]]{0} -MOTD.Version.Overhaul=[[GOLD]][mcMMO] [[DARK_AQUA]]Overhaul Era[[GOLD]] - [[DARK_AQUA]]{0} -Overhaul.mcMMO.Header=[[RED]][]=====[][[GREEN]] mcMMO - Overhaul Era [[RED]][]=====[] -Overhaul.mcMMO.Url.Wrap.Prefix=[[RED]][| -Overhaul.mcMMO.Url.Wrap.Suffix=[[RED]]|] -Overhaul.mcMMO.MmoInfo.Wiki=[[YELLOW]][[[WHITE]]View this skill on the wiki![[YELLOW]]] +Commands.XPGain.Overhaul=&6XP GAIN: &3{0} +MOTD.Version.Overhaul=&6[mcMMO] &3Overhaul Era&6 - &3{0} +Overhaul.mcMMO.Header=&c[]=====[]&a mcMMO - Overhaul Era &c[]=====[] +Overhaul.mcMMO.Url.Wrap.Prefix=&c[| +Overhaul.mcMMO.Url.Wrap.Suffix=&c|] +Overhaul.mcMMO.MmoInfo.Wiki=&e[&fView this skill on the wiki!&e] # Overhaul.Levelup can take {0} - Skill Name defined in Overhaul.Name {1} - Amount of levels gained {2} - Level in skill -Overhaul.Levelup=[[BOLD]]{0} increased to [[RESET]][[GREEN]][[BOLD]]{2}[[RESET]][[WHITE]]. +Overhaul.Levelup=&l{0} increased to &r&a&l{2}&r&f. Overhaul.Name.Acrobatics=Acrobatics Overhaul.Name.Alchemy=Alchemy Overhaul.Name.Archery=Archery @@ -99,53 +100,53 @@ Overhaul.Name.Taming=Taming Overhaul.Name.Unarmed=Unarmed Overhaul.Name.Woodcutting=Woodcutting # /mcMMO Command Style Stuff -Commands.mcc.Header=[[RED]]---[][[GREEN]]mcMMO Commands[[RED]][]--- -Commands.Other=[[RED]]---[][[GREEN]]SPECIAL COMMANDS[[RED]][]--- -Commands.Party.Header=[[RED]]-----[][[GREEN]]PARTY[[RED]][]----- -Commands.Party.Features.Header=[[RED]]-----[][[GREEN]]FEATURES[[RED]][]----- +Commands.mcc.Header=&c---[]&amcMMO Commands&c[]--- +Commands.Other=&c---[]&aSPECIAL COMMANDS&c[]--- +Commands.Party.Header=&c-----[]&aPARTY&c[]----- +Commands.Party.Features.Header=&c-----[]&aFEATURES&c[]----- # XP BAR Allows for the following variables -- {0} = Skill Level, {1} Current XP, {2} XP Needed for next level, {3} Power Level, {4} Percentage of Level # Make sure you turn on Experience_Bars.ThisMayCauseLag.AlwaysUpdateTitlesWhenXPIsGained if you want the XP bar title to update every time a player gains XP! XPBar.Template={0} -XPBar.Template.EarlyGameBoost=[[GOLD]]Learning a new skill... -XPBar.Acrobatics=Acrobatics Lv.[[GOLD]]{0} -XPBar.Alchemy=Alchemy Lv.[[GOLD]]{0} -XPBar.Archery=Archery Lv.[[GOLD]]{0} -XPBar.Axes=Axes Lv.[[GOLD]]{0} -XPBar.Excavation=Excavation Lv.[[GOLD]]{0} -XPBar.Fishing=Fishing Lv.[[GOLD]]{0} -XPBar.Herbalism=Herbalism Lv.[[GOLD]]{0} -XPBar.Mining=Mining Lv.[[GOLD]]{0} -XPBar.Repair=Repair Lv.[[GOLD]]{0} -XPBar.Salvage=Salvage Lv.[[GOLD]]{0} -XPBar.Smelting=Smelting Lv.[[GOLD]]{0} -XPBar.Swords=Swords Lv.[[GOLD]]{0} -XPBar.Taming=Taming Lv.[[GOLD]]{0} -XPBar.Unarmed=Unarmed Lv.[[GOLD]]{0} -XPBar.Woodcutting=Woodcutting Lv.[[GOLD]]{0} +XPBar.Template.EarlyGameBoost=&6Learning a new skill... +XPBar.Acrobatics=Acrobatics Lv.&6{0} +XPBar.Alchemy=Alchemy Lv.&6{0} +XPBar.Archery=Archery Lv.&6{0} +XPBar.Axes=Axes Lv.&6{0} +XPBar.Excavation=Excavation Lv.&6{0} +XPBar.Fishing=Fishing Lv.&6{0} +XPBar.Herbalism=Herbalism Lv.&6{0} +XPBar.Mining=Mining Lv.&6{0} +XPBar.Repair=Repair Lv.&6{0} +XPBar.Salvage=Salvage Lv.&6{0} +XPBar.Smelting=Smelting Lv.&6{0} +XPBar.Swords=Swords Lv.&6{0} +XPBar.Taming=Taming Lv.&6{0} +XPBar.Unarmed=Unarmed Lv.&6{0} +XPBar.Woodcutting=Woodcutting Lv.&6{0} #This is just a preset template that gets used if the 'ExtraDetails' setting is turned on in experience.yml (off by default), you can ignore this template and just edit the strings above -XPBar.Complex.Template={0} [[DARK_AQUA]] {4}[[WHITE]]% [[DARK_AQUA]]([[WHITE]]{1}[[DARK_AQUA]]/[[WHITE]]{2}[[DARK_AQUA]]) +XPBar.Complex.Template={0} &3 {4}&f% &3(&f{1}&3/&f{2}&3) # XP BAR Allows for the following variables -- {0} = Skill Level, {1} Current XP, {2} XP Needed for next level, {3} Power Level, {4} Percentage of Level # Make sure you turn on Experience_Bars.ThisMayCauseLag.AlwaysUpdateTitlesWhenXPIsGained if you want the XP bar title to update every time a player gains XP! # END STYLING #ACROBATICS -Acrobatics.Ability.Proc=[[GREEN]]**Graceful Landing** -Acrobatics.Combat.Proc=[[GREEN]]**Dodged** -Acrobatics.SubSkill.Roll.Stats=[[GOLD]]Roll Chance [[YELLOW]]{0}%[[GOLD]] Graceful Roll Chance[[YELLOW]] {1}% +Acrobatics.Ability.Proc=&a**Graceful Landing** +Acrobatics.Combat.Proc=&a**Dodged** +Acrobatics.SubSkill.Roll.Stats=&6Roll Chance &e{0}%&6 Graceful Roll Chance&e {1}% Acrobatics.SubSkill.Roll.Stat=Roll Chance Acrobatics.SubSkill.Roll.Stat.Extra=Graceful Roll Chance Acrobatics.SubSkill.Roll.Name=Roll Acrobatics.SubSkill.Roll.Description=Land strategically to avoid damage. -Acrobatics.SubSkill.Roll.Chance=Roll Chance: [[YELLOW]]{0} -Acrobatics.SubSkill.Roll.GraceChance=Graceful Roll Chance: [[YELLOW]]{0} -Acrobatics.SubSkill.Roll.Mechanics=[[GRAY]]Rolling is an active Sub-Skill with a passive component.\nWhenever you take fall damage you have a chance to completely negate the damage based on your skill level, at level 50 you have a [[YELLOW]]{0}%[[GRAY]] chance to prevent damage, and [[YELLOW]]{1}%[[GRAY]] if you activate Graceful Roll.\nThe chance for success is scaled against your skill level in a linear curve until level [[YELLOW]]{2}[[GRAY]] where it maxes out, every level in Acrobatics gives you a [[YELLOW]]{3}%[[GRAY]] chance to succeed.\nBy holding the sneak button you can double your odds to avoid fall damage and avoid up to twice the fall damage! Holding sneak will transform a normal roll into a Graceful Roll.\nRolling will only prevent up to [[RED]]{4}[[GRAY]] damage. Graceful Rolls will prevent up to [[GREEN]]{5}[[GRAY]] damage. +Acrobatics.SubSkill.Roll.Chance=Roll Chance: &e{0} +Acrobatics.SubSkill.Roll.GraceChance=Graceful Roll Chance: &e{0} +Acrobatics.SubSkill.Roll.Mechanics=&7Rolling is an active Sub-Skill with a passive component.\nWhenever you take fall damage you have a chance to completely negate the damage based on your skill level, at level &e{6}%&7 you have a &e{0}%&7 chance to prevent damage, and &e{1}%&7 if you activate Graceful Roll.\nThe chance for success is scaled against your skill level in a linear curve until level &e{2}&7 where it maxes out, every level in Acrobatics gives you a &e{3}%&7 chance to succeed.\nBy holding the sneak button you can double your odds to avoid fall damage and avoid up to twice the fall damage! Holding sneak will transform a normal roll into a Graceful Roll.\nRolling will only prevent up to &c{4}&7 damage. Graceful Rolls will prevent up to &a{5}&7 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.SubSkill.Dodge.Stat=Dodge Chance Acrobatics.Listener=Acrobatics: -Acrobatics.Roll.Text=[[ITALIC]]**Rolled** +Acrobatics.Roll.Text=&o**Rolled** Acrobatics.SkillName=ACROBATICS #ALCHEMY Alchemy.SubSkill.Catalysis.Name=Catalysis @@ -153,8 +154,8 @@ Alchemy.SubSkill.Catalysis.Description=Increases potion brewing speed Alchemy.SubSkill.Catalysis.Stat=Brewing Speed Alchemy.SubSkill.Concoctions.Name=Concoctions Alchemy.SubSkill.Concoctions.Description=Brew potions with more ingredients -Alchemy.SubSkill.Concoctions.Stat=Concoctions Rank: [[GREEN]]{0}[[DARK_AQUA]]/[[GREEN]]{1} -Alchemy.SubSkill.Concoctions.Stat.Extra=Ingredients [[[GREEN]]{0}[[DARK_AQUA]]]: [[GREEN]]{1} +Alchemy.SubSkill.Concoctions.Stat=Concoctions Rank: &a{0}&3/&a{1} +Alchemy.SubSkill.Concoctions.Stat.Extra=Ingredients [&a{0}&3]: &a{1} Alchemy.Listener=Alchemy: Alchemy.Ability.Locked.0=LOCKED UNTIL {0}+ SKILL (CATALYSIS) Alchemy.SkillName=ALCHEMY @@ -182,13 +183,14 @@ Axes.Ability.Bonus.2=Armor 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=[[DARK_AQUA]]You [[GOLD]]ready[[DARK_AQUA]] your Axe. -Axes.Combat.CritStruck=[[DARK_RED]]You were CRITICALLY hit! +Axes.Ability.Lower=&7You lower your Axe. +Axes.Ability.Ready=&3You &6ready&3 your Axe. +Axes.Ability.Ready.Extra=&3You &6ready&3 your Axe. &7({0} is on cooldown for {1}s) +Axes.Combat.CritStruck=&4You were CRITICALLY hit! Axes.Combat.CriticalHit=CRITICAL HIT! -Axes.Combat.GI.Proc=[[GREEN]]**STRUCK WITH GREAT FORCE** +Axes.Combat.GI.Proc=&a**STRUCK WITH GREAT FORCE** Axes.Combat.GI.Struck=**HIT BY GREATER IMPACT** -Axes.Combat.SS.Struck=[[DARK_RED]]Struck by SKULL SPLITTER! +Axes.Combat.SS.Struck=&4Struck by SKULL SPLITTER! Axes.SubSkill.SkullSplitter.Name=Skull Splitter Axes.SubSkill.SkullSplitter.Description=Deal AoE Damage Axes.SubSkill.SkullSplitter.Stat=Skull Splitter Duration @@ -207,13 +209,13 @@ 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=[[GREEN]]**Skull Splitter ACTIVATED** -Axes.Skills.SS.Refresh=[[GREEN]]Your [[YELLOW]]Skull Splitter [[GREEN]]ability is refreshed! -Axes.Skills.SS.Other.Off=Skull Splitter[[GREEN]] has worn off for [[YELLOW]]{0} -Axes.Skills.SS.Other.On=[[GREEN]]{0}[[DARK_GREEN]] has used [[RED]]Skull Splitter! +Axes.Skills.SS.On=&a**Skull Splitter ACTIVATED** +Axes.Skills.SS.Refresh=&aYour &eSkull Splitter &aability is refreshed! +Axes.Skills.SS.Other.Off=Skull Splitter&a has worn off for &e{0} +Axes.Skills.SS.Other.On=&a{0}&2 has used &cSkull Splitter! #EXCAVATION -Excavation.Ability.Lower=[[GRAY]]You lower your shovel. -Excavation.Ability.Ready=[[DARK_AQUA]]You [[GOLD]]ready[[DARK_AQUA]] your Shovel. +Excavation.Ability.Lower=&7You lower your shovel. +Excavation.Ability.Ready=&3You &6ready&3 your Shovel. Excavation.SubSkill.GigaDrillBreaker.Name=Giga Drill Breaker Excavation.SubSkill.GigaDrillBreaker.Description=3x Drop Rate, 3x EXP, +Speed Excavation.SubSkill.GigaDrillBreaker.Stat=Giga Drill Breaker Duration @@ -224,23 +226,23 @@ Excavation.SubSkill.Archaeology.Stat.Extra=Archaeology Experience Orb Amount Excavation.Listener=Excavation: Excavation.SkillName=EXCAVATION 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.Skills.GigaDrillBreaker.On=&a**GIGA DRILL BREAKER ACTIVATED** +Excavation.Skills.GigaDrillBreaker.Refresh=&aYour &eGiga Drill Breaker &aability is refreshed! +Excavation.Skills.GigaDrillBreaker.Other.Off=Giga Drill Breaker&a has worn off for &e{0} +Excavation.Skills.GigaDrillBreaker.Other.On=&a{0}&2 has used &cGiga Drill Breaker! #FISHING -Fishing.ScarcityTip=[[YELLOW]]&oThis area is suffering from overfishing, cast your rod in a different spot for more fish. At least {0} blocks away. -Fishing.Scared=[[GRAY]]&oChaotic movements will scare fish! -Fishing.Exhausting=[[RED]]&oImproper use of the fishing rod will cause fatigue and wear out the rod! -Fishing.LowResourcesTip=[[GRAY]]You sense that there might not be many fish left in this area. Try fishing at least {0} blocks away. -Fishing.Ability.Info=Magic Hunter: [[GRAY]] **Improves With Treasure Hunter Rank** +Fishing.ScarcityTip=&e&oThis area is suffering from overfishing, cast your rod in a different spot for more fish. At least {0} blocks away. +Fishing.Scared=&7&oChaotic movements will scare fish! +Fishing.Exhausting=&c&oImproper use of the fishing rod will cause fatigue and wear out the rod! +Fishing.LowResourcesTip=&7You sense that there might not be many fish left in this area. Try fishing at least {0} blocks away. +Fishing.Ability.Info=Magic Hunter: &7 **Improves With Treasure Hunter Rank** Fishing.Ability.Locked.0=LOCKED UNTIL {0}+ SKILL (SHAKE) Fishing.Ability.Locked.1=LOCKED UNTIL {0}+ SKILL (ICE FISHING) Fishing.Ability.Locked.2=LOCKED UNTIL {0}+ SKILL (MASTER ANGLER) Fishing.SubSkill.TreasureHunter.Name=Treasure Hunter Fishing.SubSkill.TreasureHunter.Description=Fish up misc. objects -Fishing.SubSkill.TreasureHunter.Stat=Treasure Hunter Rank: [[GREEN]]{0}[[DARK_AQUA]]/[[GREEN]]{1} -Fishing.SubSkill.TreasureHunter.Stat.Extra=Drop Rate: [[GRAY]]Common: [[YELLOW]]{0} [[GREEN]]Uncommon: [[YELLOW]]{1}\n[[BLUE]]Rare: [[YELLOW]]{2} [[LIGHT_PURPLE]]Epic: [[YELLOW]]{3} [[GOLD]]Legendary: [[YELLOW]]{4} [[AQUA]]Record: [[YELLOW]]{5} +Fishing.SubSkill.TreasureHunter.Stat=Treasure Hunter Rank: &a{0}&3/&a{1} +Fishing.SubSkill.TreasureHunter.Stat.Extra=Drop Rate: &7Common: &e{0} &aUncommon: &e{1}\n&9Rare: &e{2} &dEpic: &e{3} &6Legendary: &e{4} &bMythic: &e{5} Fishing.SubSkill.MagicHunter.Name=Magic Hunter Fishing.SubSkill.MagicHunter.Description=Find Enchanted Items Fishing.SubSkill.MagicHunter.Stat=Magic Hunter Chance @@ -249,38 +251,39 @@ Fishing.SubSkill.Shake.Description=Shake items off of mobs or players w/ fishing Fishing.SubSkill.Shake.Stat=Shake Chance Fishing.SubSkill.FishermansDiet.Name=Fisherman's Diet Fishing.SubSkill.FishermansDiet.Description=Improves hunger restored from fished foods -Fishing.SubSkill.FishermansDiet.Stat=Fisherman's Diet:[[GREEN]] Rank {0} +Fishing.SubSkill.FishermansDiet.Stat=Fisherman's Diet:&a Rank {0} Fishing.SubSkill.MasterAngler.Name=Master Angler -Fishing.SubSkill.MasterAngler.Description=Improves chance of getting a bite while fishing -Fishing.SubSkill.MasterAngler.Stat=Added Bite Chance at your current location: [[GREEN]]+{0} +Fishing.SubSkill.MasterAngler.Description=Fish are caught more frequently, works better when fishing from a boat. +Fishing.SubSkill.MasterAngler.Stat=Fishing min wait time reduction: &a-{0} seconds +Fishing.SubSkill.MasterAngler.Stat.Extra=Fishing max wait time reduction: &a-{0} seconds Fishing.SubSkill.IceFishing.Name=Ice Fishing Fishing.SubSkill.IceFishing.Description=Allows you to fish in icy biomes Fishing.SubSkill.IceFishing.Stat=Ice Fishing -Fishing.Chance.Raining=[[BLUE]] Rain Bonus +Fishing.Chance.Raining=&9 Rain Bonus Fishing.Listener=Fishing: -Fishing.Ability.TH.MagicFound=[[GRAY]]You feel a touch of magic with this catch... -Fishing.Ability.TH.Boom=[[GRAY]]BOOM TIME!!! -Fishing.Ability.TH.Poison=[[GRAY]]Something doesn't smell quite right... +Fishing.Ability.TH.MagicFound=&7You feel a touch of magic with this catch... +Fishing.Ability.TH.Boom=&7BOOM TIME!!! +Fishing.Ability.TH.Poison=&7Something doesn't smell quite right... Fishing.SkillName=FISHING #HERBALISM Herbalism.Ability.GTe.NeedMore=You need more seeds to spread Green Terra. Herbalism.Ability.GTh.Fail=**GREEN THUMB FAIL** -Herbalism.Ability.GTh=[[GREEN]]**GREEN THUMB** -Herbalism.Ability.Lower=[[GRAY]]You lower your Hoe. -Herbalism.Ability.Ready=[[DARK_AQUA]]You [[GOLD]]ready[[DARK_AQUA]] your Hoe. +Herbalism.Ability.GTh=&a**GREEN THUMB** +Herbalism.Ability.Lower=&7You lower your Hoe. +Herbalism.Ability.Ready=&3You &6ready&3 your Hoe. Herbalism.Ability.ShroomThumb.Fail=**SHROOM THUMB FAIL** Herbalism.SubSkill.GreenTerra.Name=Green Terra Herbalism.SubSkill.GreenTerra.Description=Spread the Terra, 3x Drops, Boosts Green Thumb Herbalism.SubSkill.GreenTerra.Stat=Green Terra Duration Herbalism.SubSkill.GreenThumb.Name=Green Thumb -Herbalism.SubSkill.GreenThumb.Description=Auto-Plants crops when harvesting +Herbalism.SubSkill.GreenThumb.Description=Auto-Plants crops when harvesting with hoe Herbalism.SubSkill.GreenThumb.Stat=Green Thumb Chance -Herbalism.SubSkill.GreenThumb.Stat.Extra=Green Thumb Stage: [[GREEN]] Crops grow in stage {0} +Herbalism.SubSkill.GreenThumb.Stat.Extra=Green Thumb Stage: &a Crops grow in stage {0} Herbalism.Effect.4=Green Thumb (Blocks) 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.FarmersDiet.Stat=Farmer's Diet: [[GREEN]]Rank {0} +Herbalism.SubSkill.FarmersDiet.Stat=Farmer's Diet: &aRank {0} Herbalism.SubSkill.DoubleDrops.Name=Double Drops Herbalism.SubSkill.DoubleDrops.Description=Double the normal loot Herbalism.SubSkill.DoubleDrops.Stat=Double Drop Chance @@ -290,20 +293,20 @@ Herbalism.SubSkill.HylianLuck.Stat=Hylian Luck Chance Herbalism.SubSkill.ShroomThumb.Name=Shroom Thumb Herbalism.SubSkill.ShroomThumb.Description=Spread mycelium to dirt & grass Herbalism.SubSkill.ShroomThumb.Stat=Shroom Thumb Chance -Herbalism.HylianLuck=[[GREEN]]The luck of Hyrule is with you today! +Herbalism.HylianLuck=&aThe luck of Hyrule is with you today! Herbalism.Listener=Herbalism: Herbalism.SkillName=HERBALISM Herbalism.Skills.GTe.Off=**Green Terra has worn off** -Herbalism.Skills.GTe.On=[[GREEN]]**GREEN TERRA ACTIVATED** -Herbalism.Skills.GTe.Refresh=[[GREEN]]Your [[YELLOW]]Green Terra [[GREEN]]ability is refreshed! -Herbalism.Skills.GTe.Other.Off=Green Terra[[GREEN]] has worn off for [[YELLOW]]{0} -Herbalism.Skills.GTe.Other.On=[[GREEN]]{0}[[DARK_GREEN]] has used [[RED]]Green Terra! +Herbalism.Skills.GTe.On=&a**GREEN TERRA ACTIVATED** +Herbalism.Skills.GTe.Refresh=&aYour &eGreen Terra &aability is refreshed! +Herbalism.Skills.GTe.Other.Off=Green Terra&a has worn off for &e{0} +Herbalism.Skills.GTe.Other.On=&a{0}&2 has used &cGreen Terra! #MINING 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=[[DARK_AQUA]]You [[GOLD]]ready[[DARK_AQUA]] your pickaxe. +Mining.Ability.Lower=&7You lower your Pickaxe. +Mining.Ability.Ready=&3You &6ready&3 your pickaxe. Mining.SubSkill.SuperBreaker.Name=Super Breaker Mining.SubSkill.SuperBreaker.Description=Speed+, Triple Drop Chance Mining.SubSkill.SuperBreaker.Stat=Super Breaker Length @@ -312,8 +315,8 @@ Mining.SubSkill.DoubleDrops.Description=Double the normal loot Mining.SubSkill.DoubleDrops.Stat=Double Drop Chance Mining.SubSkill.BlastMining.Name=Blast Mining Mining.SubSkill.BlastMining.Description=Bonuses to mining with TNT -Mining.SubSkill.BlastMining.Stat=Blast Mining:[[GREEN]] Rank {0}/{1} [[GRAY]]({2}) -Mining.SubSkill.BlastMining.Stat.Extra=Blast Radius Increase: [[GREEN]]+{0} +Mining.SubSkill.BlastMining.Stat=Blast Mining:&a Rank {0}/{1} &7({2}) +Mining.SubSkill.BlastMining.Stat.Extra=Blast Radius Increase: &a+{0} Mining.SubSkill.BiggerBombs.Name=Bigger Bombs Mining.SubSkill.BiggerBombs.Description=Increases TNT explosion radius Mining.SubSkill.DemolitionsExpertise.Name=Demolitions Expertise @@ -323,16 +326,16 @@ Mining.SubSkill.DemolitionsExpertise.Stat=Demolitions Expert Damage Decrease Mining.Listener=Mining: 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]]Your [[YELLOW]]Super Breaker [[GREEN]]ability is refreshed! +Mining.Skills.SuperBreaker.On=&a**SUPER BREAKER ACTIVATED** +Mining.Skills.SuperBreaker.Other.Off=Super Breaker&a has worn off for &e{0} +Mining.Skills.SuperBreaker.Other.On=&a{0}&2 has used &cSuper Breaker! +Mining.Skills.SuperBreaker.Refresh=&aYour &eSuper Breaker &aability is refreshed! #Blast Mining -Mining.Blast.Boom=[[GRAY]]**BOOM** +Mining.Blast.Boom=&7**BOOM** Mining.Blast.Cooldown= Mining.Blast.Effect=+{0} ore yield, {1}x drops -Mining.Blast.Other.On=[[GREEN]]{0}[[DARK_GREEN]] has used [[RED]]Blast Mining! -Mining.Blast.Refresh=[[GREEN]]Your [[YELLOW]]Blast Mining [[GREEN]]ability is refreshed! +Mining.Blast.Other.On=&a{0}&2 has used &cBlast Mining! +Mining.Blast.Refresh=&aYour &eBlast Mining &aability is refreshed! #REPAIR Repair.SubSkill.Repair.Name=Repair Repair.SubSkill.Repair.Description=Repair Tools & Armor @@ -344,7 +347,7 @@ 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.RepairMastery.Stat=Repair Mastery: [[GREEN]]Extra {0} durability restored +Repair.SubSkill.RepairMastery.Stat=Repair Mastery: &aExtra {0} durability restored Repair.SubSkill.SuperRepair.Name=Super Repair Repair.SubSkill.SuperRepair.Description=Double effectiveness Repair.SubSkill.SuperRepair.Stat=Super Repair Chance @@ -352,65 +355,65 @@ 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=Repair magic items -Repair.SubSkill.ArcaneForging.Stat=Arcane Forging: [[YELLOW]]Rank {0}/{1} -Repair.SubSkill.ArcaneForging.Stat.Extra=[[DARK_AQUA]]Arcane Forging Odds:[[GRAY]] Success [[GREEN]]{0}[[GRAY]]%, Failure [[RED]]{1}[[GRAY]]% -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.SubSkill.ArcaneForging.Stat=Arcane Forging: &eRank {0}/{1} +Repair.SubSkill.ArcaneForging.Stat.Extra=&3Arcane Forging Odds:&7 Success &a{0}&7%, Failure &c{1}&7% +Repair.Error=&4mcMMO encountered an error attempting to repair this item! +Repair.Listener.Anvil=&4You have placed an anvil, anvils can repair tools and armor. Repair.Listener=Repair: Repair.SkillName=REPAIR -Repair.Skills.AdeptDiamond=[[DARK_RED]]You're not skilled enough to repair Diamond. -Repair.Skills.AdeptGold=[[DARK_RED]]You're not skilled enough to repair Gold. -Repair.Skills.AdeptIron=[[DARK_RED]]You're not skilled enough to repair Iron. -Repair.Skills.AdeptStone=[[DARK_RED]]You're not skilled enough to repair Stone. -Repair.Skills.Adept=[[RED]]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.StackedItems=[[DARK_RED]]You can't repair stacked items. +Repair.Skills.AdeptDiamond=&4You're not skilled enough to repair Diamond. +Repair.Skills.AdeptGold=&4You're not skilled enough to repair Gold. +Repair.Skills.AdeptIron=&4You're not skilled enough to repair Iron. +Repair.Skills.AdeptStone=&4You're not skilled enough to repair Stone. +Repair.Skills.Adept=&cYou must be level &e{0}&c to repair &e{1} +Repair.Skills.FeltEasy=&7That felt easy. +Repair.Skills.FullDurability=&7That is at full durability. +Repair.Skills.StackedItems=&4You can't repair stacked items. Repair.Pretty.Name=Repair #Arcane Forging Repair.Arcane.Downgrade=Arcane power has decreased for this item. Repair.Arcane.Fail=Arcane power has permanently left the item. 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.Perfect=&aYou have sustained the arcane energies in this item. #SALVAGE Salvage.Pretty.Name=Salvage Salvage.SubSkill.UnderstandingTheArt.Name=Understanding The Art Salvage.SubSkill.UnderstandingTheArt.Description=You're not just digging through your neighbors trash, you're taking care of the environment.\nPowers up various properties of Salvaging. Salvage.SubSkill.ScrapCollector.Name=Scrap Collector Salvage.SubSkill.ScrapCollector.Description=Salvage materials from an item, a perfect salvage depends on skill and luck. -Salvage.SubSkill.ScrapCollector.Stat=Scrap Collector: [[GREEN]]Salvage up to [[YELLOW]]{0}[[GREEN]] items. Some luck is involved. +Salvage.SubSkill.ScrapCollector.Stat=Scrap Collector: &aSalvage up to &e{0}&a items. Some luck is involved. Salvage.SubSkill.ArcaneSalvage.Name=Arcane Salvaging Salvage.SubSkill.ArcaneSalvage.Description=Extract enchantments from items -Salvage.SubSkill.ArcaneSalvage.Stat=Arcane Salvaging: [[YELLOW]]Rank {0}/{1} +Salvage.SubSkill.ArcaneSalvage.Stat=Arcane Salvaging: &eRank {0}/{1} Salvage.Ability.Bonus.0=Scrap Collector -Salvage.Ability.Bonus.1=Salvage up to [[YELLOW]]{0}[[GREEN]] items. Some luck is involved. -Salvage.Arcane.ExtractFull=[[GRAY]]AS Full-Enchant Chance -Salvage.Arcane.ExtractPartial=[[GRAY]]AS Partial-Enchant Chance -Salvage.Skills.Success=[[GREEN]]Item salvaged! -Salvage.Skills.Adept.Damaged=[[DARK_RED]]You aren't skilled enough to salvage damaged items. -Salvage.Skills.Adept.Level=You must be level [[YELLOW]]{0}[[RED]] to salvage [[YELLOW]]{1} -Salvage.Skills.TooDamaged=[[DARK_RED]]This item is too damaged to be salvaged. -Salvage.Skills.ArcaneFailed=[[RED]]You were unable to extract the knowledge contained within this item. -Salvage.Skills.ArcanePartial=[[RED]]You were only able to extract some of the knowledge contained within this item. -Salvage.Skills.ArcaneSuccess=[[GREEN]]You able to extract all of the knowledge contained within this item! -Salvage.Listener.Anvil=[[DARK_RED]]You have placed a Salvage anvil, use this to Salvage tools and armor. +Salvage.Ability.Bonus.1=Salvage up to &e{0}&a items. Some luck is involved. +Salvage.Arcane.ExtractFull=&7AS Full-Enchant Chance +Salvage.Arcane.ExtractPartial=&7AS Partial-Enchant Chance +Salvage.Skills.Success=&aItem salvaged! +Salvage.Skills.Adept.Damaged=&4You aren't skilled enough to salvage damaged items. +Salvage.Skills.Adept.Level=You must be level &e{0}&c to salvage &e{1} +Salvage.Skills.TooDamaged=&4This item is too damaged to be salvaged. +Salvage.Skills.ArcaneFailed=&cYou were unable to extract the knowledge contained within this item. +Salvage.Skills.ArcanePartial=&cYou were only able to extract some of the knowledge contained within this item. +Salvage.Skills.ArcaneSuccess=&aYou able to extract all of the knowledge contained within this item! +Salvage.Listener.Anvil=&4You have placed a Salvage anvil, use this to Salvage tools and armor. Salvage.Listener=Salvage: Salvage.SkillName=SALVAGE -Salvage.Skills.Lottery.Normal=[[GOLD]]You were able to salvage [[DARK_AQUA]]{0}[[GOLD]] materials from [[YELLOW]]{1}[[GOLD]]. -Salvage.Skills.Lottery.Perfect=[[GREEN]][[BOLD]]Perfect![[RESET]][[GOLD]] You salvaged [[DARK_AQUA]]{1}[[GOLD]] effortlessly, retrieving [[DARK_AQUA]]{0}[[GOLD]] materials. -Salvage.Skills.Lottery.Untrained=[[GRAY]]You aren't properly trained in salvaging. You were only able to recover [[RED]]{0}[[GRAY]] materials from [[GREEN]]{1}[[GRAY]]. +Salvage.Skills.Lottery.Normal=&6You were able to salvage &3{0}&6 materials from &e{1}&6. +Salvage.Skills.Lottery.Perfect=&a&lPerfect!&r&6 You salvaged &3{1}&6 effortlessly, retrieving &3{0}&6 materials. +Salvage.Skills.Lottery.Untrained=&7You aren't properly trained in salvaging. You were only able to recover &c{0}&7 materials from &a{1}&7. #Anvil (Shared between SALVAGE and REPAIR) Anvil.Unbreakable=This item is unbreakable! #SWORDS -Swords.Ability.Lower=[[GRAY]]You lower your sword. -Swords.Ability.Ready=[[DARK_AQUA]]You [[GOLD]]ready[[DARK_AQUA]] your Sword. -Swords.Combat.Rupture.Note=[[GRAY]]NOTE: [[YELLOW]]1 Tick happens every 0.5 seconds! -Swords.Combat.Bleeding.Started=[[DARK_RED]] You're bleeding! -Swords.Combat.Bleeding.Stopped=[[GRAY]]The bleeding has [[GREEN]]stopped[[GRAY]]! -Swords.Combat.Bleeding=[[GREEN]]**ENEMY BLEEDING** -Swords.Combat.Counter.Hit=[[DARK_RED]]Hit with a counter-attack! -Swords.Combat.Countered=[[GREEN]]**COUNTER-ATTACKED** -Swords.Combat.SS.Struck=[[DARK_RED]]Struck by SERRATED STRIKES! +Swords.Ability.Lower=&7You lower your sword. +Swords.Ability.Ready=&3You &6ready&3 your Sword. +Swords.Combat.Rupture.Note.Update.One=&7(Rupture Note): Periodic damage is non-lethal occurring twice a second and bypasses armor +Swords.Combat.Bleeding.Started=&4 You're bleeding! +Swords.Combat.Bleeding.Stopped=&7The bleeding has &astopped&7! +Swords.Combat.Bleeding=&a**ENEMY BLEEDING** +Swords.Combat.Counter.Hit=&4Hit with a counter-attack! +Swords.Combat.Countered=&a**COUNTER-ATTACKED** +Swords.Combat.SS.Struck=&4Struck by SERRATED STRIKES! Swords.SubSkill.CounterAttack.Name=Counter Attack Swords.SubSkill.CounterAttack.Description=Reflect a portion of damage when attacked! Swords.SubSkill.CounterAttack.Stat=Counter Attack Chance @@ -418,7 +421,7 @@ Swords.SubSkill.SerratedStrikes.Name=Serrated Strikes Swords.SubSkill.SerratedStrikes.Description=Deal partial damage in an AOE with a chance to apply Rupture! Swords.SubSkill.SerratedStrikes.Stat=Serrated Strikes Length Swords.SubSkill.Rupture.Name=Rupture -Swords.SubSkill.Rupture.Description=Apply a powerful bleed DoT +Swords.SubSkill.Rupture.Description=A damage over time effect that ends explosively Swords.SubSkill.Stab.Name=Stab Swords.SubSkill.Stab.Description=Adds bonus damage to your attacks. Swords.SubSkill.Stab.Stat=Stab Damage @@ -426,16 +429,18 @@ Swords.SubSkill.SwordsLimitBreak.Name=Swords Limit Break Swords.SubSkill.SwordsLimitBreak.Description=Breaking your limits. Increased damage against tough opponents. Intended for PVP, up to server settings for whether or not it will boost damage in PVE. Swords.SubSkill.SwordsLimitBreak.Stat=Limit Break Max DMG Swords.SubSkill.Rupture.Stat=Rupture Chance -Swords.SubSkill.Rupture.Stat.Extra=Rupture: [[GREEN]]{0} ticks [{1} DMG vs Player] [{2} DMG vs Mobs] +Swords.SubSkill.Rupture.Stat.Extra=[[DARK_AQUA]]Rupture Duration: &e{0}s&a vs Players, &e{1}s&a vs Mobs. +Swords.SubSkill.Rupture.Stat.TickDamage=[[DARK_AQUA]]Rupture Pure Tick Damage: &e{0}&a vs Players, &e{1}&a vs Mobs. +Swords.SubSkill.Rupture.Stat.ExplosionDamage=[[DARK_AQUA]]Rupture Explosion Damage: &e{0}&a vs Players, &e{1}&a vs Mobs Swords.Effect.4=Serrated Strikes Rupture+ Swords.Effect.5={0} Tick Rupture Swords.Listener=Swords: Swords.SkillName=SWORDS Swords.Skills.SS.Off=**Serrated Strikes has worn off** -Swords.Skills.SS.On=[[GREEN]]**SERRATED STRIKES ACTIVATED** -Swords.Skills.SS.Refresh=[[GREEN]]Your [[YELLOW]]Serrated Strikes [[GREEN]]ability is refreshed! -Swords.Skills.SS.Other.Off=Serrated Strikes[[GREEN]] has worn off for [[YELLOW]]{0} -Swords.Skills.SS.Other.On=[[GREEN]]{0}[[DARK_GREEN]] has used [[RED]]Serrated Strikes! +Swords.Skills.SS.On=&a**SERRATED STRIKES ACTIVATED** +Swords.Skills.SS.Refresh=&aYour &eSerrated Strikes &aability is refreshed! +Swords.Skills.SS.Other.Off=Serrated Strikes&a has worn off for &e{0} +Swords.Skills.SS.Other.On=&a{0}&2 has used &cSerrated Strikes! #TAMING Taming.Ability.Bonus.0=Environmentally Aware Taming.Ability.Bonus.1=Wolves avoid danger @@ -462,7 +467,7 @@ 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: Crouch and left-click with\n {0} {1} (Ocelot), {2} {3} (Wolf), {4} {5} (Horse) +Taming.SubSkill.CallOfTheWild.Description.2=&7COTW: Crouch and left-click with\n {0} {1} (Ocelot), {2} {3} (Wolf), {4} {5} (Horse) Taming.SubSkill.FastFoodService.Name=Fast Food Service Taming.SubSkill.FastFoodService.Description=Chance for wolves to heal on attack Taming.SubSkill.HolyHound.Name=Holy Hound @@ -478,23 +483,24 @@ Taming.SubSkill.ThickFur.Description=DMG Reduction, Fire Resistance Taming.SubSkill.Pummel.Name=Pummel Taming.SubSkill.Pummel.Description=Your Wolves have a chance of knocking back foes Taming.SubSkill.Pummel.TargetMessage=You've been knocked back by a wolf! -Taming.Listener.Wolf=[[DARK_GRAY]]Your wolf scurries back to you... +Taming.Listener.Wolf=&8Your wolf scurries back to you... Taming.Listener=Taming: Taming.SkillName=TAMING -Taming.Summon.COTW.Success.WithoutLifespan=[[GREEN]](Call Of The Wild) [[GRAY]]You have summoned a [[GOLD]]{0}[[GRAY]] -Taming.Summon.COTW.Success.WithLifespan=[[GREEN]](Call Of The Wild) [[GRAY]]You have summoned a [[GOLD]]{0}[[GRAY]] and it has a duration of [[GOLD]]{1}[[GRAY]] seconds. -Taming.Summon.COTW.Limit=[[GREEN]](Call Of The Wild) [[GRAY]]You can only have [[RED]]{0} [[GRAY]]summoned [[GRAY]]{1} pets at the same time. -Taming.Summon.COTW.TimeExpired=[[GREEN]](Call Of The Wild) [[GRAY]]Time is up, your [[GOLD]]{0}[[GRAY]] departs. -Taming.Summon.COTW.BreedingDisallowed=[[GREEN]](Call Of The Wild) [[RED]]You cannot breed a summoned animal. -Taming.Summon.COTW.NeedMoreItems=[[GREEN]](Call Of The Wild) [[GRAY]]You need [[YELLOW]]{0}[[GRAY]] more [[DARK_AQUA]]{1}[[GRAY]](s) -Taming.Summon.Name.Format=[[GOLD]](COTW) [[WHITE]]{0}'s {1} +Taming.Summon.COTW.Success.WithoutLifespan=&a(Call Of The Wild) &7You have summoned a &6{0}&7 +Taming.Summon.COTW.Success.WithLifespan=&a(Call Of The Wild) &7You have summoned a &6{0}&7 and it has a duration of &6{1}&7 seconds. +Taming.Summon.COTW.Limit=&a(Call Of The Wild) &7You can only have &c{0} &7summoned &7{1} pets at the same time. +Taming.Summon.COTW.TimeExpired=&a(Call Of The Wild) &7Time is up, your &6{0}&7 departs. +Taming.Summon.COTW.Removed=&a(Call Of The Wild) &7Your summoned &6{0}&7 has vanished from this world. +Taming.Summon.COTW.BreedingDisallowed=&a(Call Of The Wild) &cYou cannot breed a summoned animal. +Taming.Summon.COTW.NeedMoreItems=&a(Call Of The Wild) &7You need &e{0}&7 more &3{1}&7(s) +Taming.Summon.Name.Format=&6(COTW) &f{0}'s {1} #UNARMED -Unarmed.Ability.Bonus.0=Iron Arm Style +Unarmed.Ability.Bonus.0=Steel Arm Style Unarmed.Ability.Bonus.1=+{0} DMG Upgrade 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=[[DARK_AQUA]]You [[GOLD]]ready[[DARK_AQUA]] your Fists. +Unarmed.Ability.IronGrip.Defender=&aYour iron grip kept you from being disarmed! +Unarmed.Ability.Lower=&7You lower your fists. +Unarmed.Ability.Ready=&3You &6ready&3 your fists. Unarmed.SubSkill.Berserk.Name=Berserk Unarmed.SubSkill.Berserk.Description=+50% DMG, Breaks weak materials Unarmed.SubSkill.Berserk.Stat=Berserk Length @@ -504,8 +510,8 @@ Unarmed.SubSkill.Disarm.Stat=Disarm Chance Unarmed.SubSkill.UnarmedLimitBreak.Name=Unarmed Limit Break Unarmed.SubSkill.UnarmedLimitBreak.Description=Breaking your limits. Increased damage against tough opponents. Intended for PVP, up to server settings for whether or not it will boost damage in PVE. Unarmed.SubSkill.UnarmedLimitBreak.Stat=Limit Break Max DMG -Unarmed.SubSkill.IronArmStyle.Name=Iron Arm Style -Unarmed.SubSkill.IronArmStyle.Description=Hardens your arm over time +Unarmed.SubSkill.SteelArmStyle.Name=Steel Arm Style +Unarmed.SubSkill.SteelArmStyle.Description=Hardens your arm over time Unarmed.SubSkill.ArrowDeflect.Name=Arrow Deflect Unarmed.SubSkill.ArrowDeflect.Description=Deflect arrows Unarmed.SubSkill.ArrowDeflect.Stat=Arrow Deflect Chance @@ -517,10 +523,10 @@ Unarmed.SubSkill.BlockCracker.Description=Break rock with your fists Unarmed.Listener=Unarmed: Unarmed.SkillName=UNARMED Unarmed.Skills.Berserk.Off=**Berserk has worn off** -Unarmed.Skills.Berserk.On=[[GREEN]]**BERSERK ACTIVATED** -Unarmed.Skills.Berserk.Other.Off=Berserk[[GREEN]] has worn off for [[YELLOW]]{0} -Unarmed.Skills.Berserk.Other.On=[[GREEN]]{0}[[DARK_GREEN]] has used [[RED]]Berserk! -Unarmed.Skills.Berserk.Refresh=[[GREEN]]Your [[YELLOW]]Berserk [[GREEN]]ability is refreshed! +Unarmed.Skills.Berserk.On=&a**BERSERK ACTIVATED** +Unarmed.Skills.Berserk.Other.Off=Berserk&a has worn off for &e{0} +Unarmed.Skills.Berserk.Other.On=&a{0}&2 has used &cBerserk! +Unarmed.Skills.Berserk.Refresh=&aYour &eBerserk &aability is refreshed! #WOODCUTTING Woodcutting.Ability.0=Leaf Blower Woodcutting.Ability.1=Blow away leaves @@ -530,6 +536,11 @@ Woodcutting.SubSkill.TreeFeller.Description=Make trees explode Woodcutting.SubSkill.TreeFeller.Stat=Tree Feller Length Woodcutting.SubSkill.LeafBlower.Name=Leaf Blower Woodcutting.SubSkill.LeafBlower.Description=Blow Away Leaves +Woodcutting.SubSkill.KnockOnWood.Name=Knock On Wood +Woodcutting.SubSkill.KnockOnWood.Description=Find additional goodies when using Tree Feller +Woodcutting.SubSkill.KnockOnWood.Stat=Knock on Wood +Woodcutting.SubSkill.KnockOnWood.Loot.Normal=Standard loot from trees +Woodcutting.SubSkill.KnockOnWood.Loot.Rank2=Standard loot from trees and experience orbs Woodcutting.SubSkill.HarvestLumber.Name=Harvest Lumber Woodcutting.SubSkill.HarvestLumber.Description=Skillfully extract more Lumber Woodcutting.SubSkill.HarvestLumber.Stat=Double Drop Chance @@ -542,173 +553,177 @@ Woodcutting.SubSkill.NaturesBounty.Description=Gather experience from nature. Woodcutting.Listener=Woodcutting: Woodcutting.SkillName=WOODCUTTING Woodcutting.Skills.TreeFeller.Off=**Tree Feller has worn off** -Woodcutting.Skills.TreeFeller.On=[[GREEN]]**TREE FELLER ACTIVATED** -Woodcutting.Skills.TreeFeller.Refresh=[[GREEN]]Your [[YELLOW]]Tree Feller [[GREEN]]ability is refreshed! -Woodcutting.Skills.TreeFeller.Other.Off=Tree Feller[[GREEN]] has worn off for [[YELLOW]]{0} -Woodcutting.Skills.TreeFeller.Other.On=[[GREEN]]{0}[[DARK_GREEN]] has used [[RED]]Tree Feller! +Woodcutting.Skills.TreeFeller.On=&a**TREE FELLER ACTIVATED** +Woodcutting.Skills.TreeFeller.Refresh=&aYour &eTree Feller &aability is refreshed! +Woodcutting.Skills.TreeFeller.Other.Off=Tree Feller&a has worn off for &e{0} +Woodcutting.Skills.TreeFeller.Other.On=&a{0}&2 has used &cTree Feller! Woodcutting.Skills.TreeFeller.Splinter=YOUR AXE SPLINTERS INTO DOZENS OF PIECES! Woodcutting.Skills.TreeFeller.Threshold=That tree is too large! #ABILITIY #COMBAT -Combat.ArrowDeflect=[[WHITE]]**ARROW DEFLECT** -Combat.BeastLore=[[GREEN]]**BEAST LORE** -Combat.BeastLoreHealth=[[DARK_AQUA]]Health ([[GREEN]]{0}[[DARK_AQUA]]/{1}) -Combat.BeastLoreOwner=[[DARK_AQUA]]Owner ([[RED]]{0}[[DARK_AQUA]]) -Combat.BeastLoreHorseSpeed=[[DARK_AQUA]]Horse Movement Speed ([[GREEN]]{0} blocks/s[[DARK_AQUA]]) -Combat.BeastLoreHorseJumpStrength=[[DARK_AQUA]]Horse Jump Strength ([[GREEN]]Max {0} blocks[[DARK_AQUA]]) -Combat.Gore=[[GREEN]]**GORED** +Combat.ArrowDeflect=&f**ARROW DEFLECT** +Combat.BeastLore=&a**BEAST LORE** +Combat.BeastLoreHealth=&3Health (&a{0}&3/{1}) +Combat.BeastLoreOwner=&3Owner (&c{0}&3) +Combat.BeastLoreHorseSpeed=&3Horse Movement Speed (&a{0} blocks/s&3) +Combat.BeastLoreHorseJumpStrength=&3Horse Jump Strength (&aMax {0} blocks&3) +Combat.Gore=&a**GORED** Combat.StruckByGore=**YOU HAVE BEEN GORED** -Combat.TargetDazed=Target was [[DARK_RED]]Dazed -Combat.TouchedFuzzy=[[DARK_RED]]Touched Fuzzy. Felt Dizzy. +Combat.TargetDazed=Target was &4Dazed +Combat.TouchedFuzzy=&4Touched Fuzzy. Felt Dizzy. #COMMANDS ##generic -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]]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]]nossr50 [[BLUE]](Creator & Project Lead),[[GOLD]] - [[GREEN]]electronicboy [[BLUE]](Dev),[[GOLD]] - [[GREEN]]kashike [[BLUE]](Dev),[[GOLD]] - [[GREEN]]t00thpick1 [[BLUE]](Classic Maintainer) -mcMMO.Description.FormerDevs=[[DARK_AQUA]]Former Devs: [[GREEN]]GJ, NuclearW, bm01, TfT_02, Glitchfinder -Commands.addlevels.AwardAll.1=[[GREEN]]You were awarded {0} levels in all skills! +mcMMO.Description=&3About the &emcMMO&3 Project:,&6mcMMO is an &copen source&6 RPG mod created in February 2011,&6by &9nossr50&6. The goal is to provide a quality RPG experience.,&3Tips:,&6 - &aUse &c/mcmmo help&a to see commands,&6 - &aType &c/SKILLNAME&a to see detailed skill info,&3Developers:,&6 - &anossr50 &9(Creator & Project Lead),&6 - &aelectronicboy &9(Dev),&6 - &akashike &9(Dev),&6 - &at00thpick1 &9(Classic Maintainer) +mcMMO.Description.FormerDevs=&3Former Devs: &aGJ, NuclearW, bm01, TfT_02, Glitchfinder +Commands.addlevels.AwardAll.1=&aYou 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.1=&aYou 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.Ability.Toggle=Ability use has been toggled for [[YELLOW]]{0} -Commands.AdminChat.Off=Admin Chat only [[RED]]Off -Commands.AdminChat.On=Admin Chat only [[GREEN]]On -Commands.AdminToggle=[[GREEN]]- Toggle admin chat +Commands.addxp.AwardAll=&aYou were awarded {0} experience in all skills! +Commands.addxp.AwardSkill=&aYou were awarded {0} experience in {1}! +Commands.Ability.Off=Ability use toggled &coff +Commands.Ability.On=Ability use toggled &aon +Commands.Ability.Toggle=Ability use has been toggled for &e{0} +Commands.AdminChat.Off=Admin Chat only &cOff +Commands.AdminChat.On=Admin Chat only &aOn +Commands.AdminToggle=&a- Toggle admin chat Commands.Chat.Console=*Console* -Commands.Cooldowns.Header=[[GOLD]]--= [[GREEN]]mcMMO Ability Cooldowns[[GOLD]] =-- -Commands.Cooldowns.Row.N=\ [[RED]]{0}[[WHITE]] - [[GOLD]]{1} seconds left -Commands.Cooldowns.Row.Y=\ [[AQUA]]{0}[[WHITE]] - [[DARK_GREEN]]Ready! +Commands.Cooldowns.Header=&6--= &amcMMO Ability Cooldowns&6 =-- +Commands.Cooldowns.Row.N=\ &c{0}&f - &6{1} seconds left +Commands.Cooldowns.Row.Y=\ &b{0}&f - &2Ready! Commands.Database.CooldownMS=You must wait {0} milliseconds before using this command again. +Commands.Database.Cooldown=You must wait {0} seconds before using this command again. Commands.Database.Processing=Your previous command is still being processed. Please wait. Commands.Disabled=This command is disabled. -Commands.DoesNotExist= [[RED]]Player does not exist in the database! +Commands.DoesNotExist= &cPlayer does not exist in the database! Commands.GodMode.Disabled=mcMMO Godmode Disabled Commands.GodMode.Enabled=mcMMO Godmode Enabled Commands.AdminChatSpy.Enabled=mcMMO Party Chat Spy Enabled Commands.AdminChatSpy.Disabled=mcMMO Party Chat Spy Disabled -Commands.AdminChatSpy.Toggle=mcMMO Party Chat has been toggled for [[YELLOW]]{0} -Commands.AdminChatSpy.Chat=[[GOLD]][SPY: [[GREEN]]{0}[[GOLD]]] [[WHITE]]{1} +Commands.AdminChatSpy.Toggle=mcMMO Party Chat has been toggled for &e{0} +Commands.AdminChatSpy.Chat=&6[SPY: &a{0}&6] &f{1} Commands.GodMode.Forbidden=[mcMMO] God Mode not permitted on this world (See Permissions) -Commands.GodMode.Toggle=God mode has been toggled for [[YELLOW]]{0} -Commands.Healthbars.Changed.HEARTS=[mcMMO] Your healthbar display type was changed to [[RED]]Hearts[[WHITE]]. -Commands.Healthbars.Changed.BAR=[mcMMO] Your healthbar display type was changed to [[YELLOW]]Boxes[[WHITE]]. -Commands.Healthbars.Changed.DISABLED=[mcMMO] Your mob healthbars have been [[GRAY]]disabled[[WHITE]]. +Commands.GodMode.Toggle=God mode has been toggled for &e{0} +Commands.Healthbars.Changed.HEARTS=[mcMMO] Your healthbar display type was changed to &cHearts&f. +Commands.Healthbars.Changed.BAR=[mcMMO] Your healthbar display type was changed to &eBoxes&f. +Commands.Healthbars.Changed.DISABLED=[mcMMO] Your mob healthbars have been &7disabled&f. Commands.Healthbars.Invalid=Invalid healthbar type! -Commands.Inspect= [[GREEN]]- View detailed player info -Commands.Invite.Success=[[GREEN]]Invite sent successfully. -Commands.Leaderboards= [[GREEN]]- Leaderboards -Commands.mcgod=[[GREEN]]- Toggle GodMode +Commands.Inspect= &a- View detailed player info +Commands.Invite.Success=&aInvite sent successfully. +Commands.Leaderboards= &a- Leaderboards +Commands.mcgod=&a- 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=[[YELLOW]]Rankings for [[WHITE]]{0} -Commands.mcrank.Skill=[[YELLOW]]{0}[[GREEN]] - [[GOLD]]Rank [[WHITE]]#[[GREEN]]{1} -Commands.mcrank.Unranked=[[WHITE]]Unranked +Commands.mcpurge.Success=&aThe database was successfully purged! +Commands.mcrank.Heading=&6-=PERSONAL RANKINGS=- +Commands.mcrank.Overall=Overall&a - &6Rank &f#&a{0} +Commands.mcrank.Player=&eRankings for &f{0} +Commands.mcrank.Skill=&e{0}&a - &6Rank &f#&a{1} +Commands.mcrank.Unranked=&fUnranked Commands.mcrefresh.Success={0}''s cooldowns have been refreshed. -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=[player] [[GREEN]] - Modify target -Commands.mmoedit.AllSkills.1=[[GREEN]]Your level in all skills was set to {0}! -Commands.mmoedit.Modified.1=[[GREEN]]Your level in {0} was set to {1}! +Commands.mcremove.Success=&a{0} was successfully removed from the database! +Commands.mctop.Tip=&6Tip: Use &c/mcrank&6 to view all of your personal rankings! +Commands.mmoedit=[player] &a - Modify target +Commands.mmoedit.AllSkills.1=&aYour level in all skills was set to {0}! +Commands.mmoedit.Modified.1=&aYour level in {0} was set to {1}! Commands.mmoedit.Modified.2={0} has been modified for {1}. Commands.mcconvert.Database.Same=You are already using the {0} database! Commands.mcconvert.Database.InvalidType={0} is not a valid database type. -Commands.mcconvert.Database.Start=[[GRAY]]Starting conversion from {0} to {1}... -Commands.mcconvert.Database.Finish=[[GRAY]]Database migration complete; the {1} database now has all data from the {0} database. -Commands.mmoshowdb=The currently used database is [[GREEN]]{0} -Commands.mcconvert.Experience.Invalid=Unknown formula type! Valid types are: [[GREEN]]LINEAR [[RED]]and [[GREEN]]EXPONENTIAL. +Commands.mcconvert.Database.Start=&7Starting conversion from {0} to {1}... +Commands.mcconvert.Database.Finish=&7Database migration complete; the {1} database now has all data from the {0} database. +Commands.mmoshowdb=The currently used database is &a{0} +Commands.mcconvert.Experience.Invalid=Unknown formula type! Valid types are: &aLINEAR &cand &aEXPONENTIAL. Commands.mcconvert.Experience.Same=Already using formula type {0} -Commands.mcconvert.Experience.Start=[[GRAY]]Starting conversion from {0} to {1} curve -Commands.mcconvert.Experience.Finish=[[GRAY]]Formula conversion complete; now using {0} XP curve. -Commands.ModDescription=[[GREEN]]- Read brief mod description +Commands.mcconvert.Experience.Start=&7Starting conversion from {0} to {1} curve +Commands.mcconvert.Experience.Finish=&7Formula conversion complete; now using {0} XP curve. +Commands.ModDescription=&a- Read brief mod description Commands.NoConsole=This command does not support console usage. -Commands.Notifications.Off=Ability notifications toggled [[RED]]off -Commands.Notifications.On=Ability notifications toggled [[GREEN]]on +Commands.Notifications.Off=Ability notifications toggled &coff +Commands.Notifications.On=Ability notifications toggled &aon Commands.Offline=This command does not work for offline players. Commands.NotLoaded=Player profile is not loaded yet. -Commands.Party.Status=[[DARK_GRAY]]NAME: [[WHITE]]{0} {1} [[DARK_GRAY]]LEVEL: [[DARK_AQUA]]{2} -Commands.Party.Status.Alliance=[[DARK_GRAY]]ALLY: [[WHITE]]{0} -Commands.Party.UnlockedFeatures=[[DARK_GRAY]]Unlocked Features: [[GRAY]][[ITALIC]]{0} -Commands.Party.ShareMode=[[DARK_GRAY]]SHARE MODE: -Commands.Party.ItemShare=[[GRAY]]ITEM [[DARK_AQUA]]({0}) -Commands.Party.ExpShare=[[GRAY]]EXP [[DARK_AQUA]]({0}) -Commands.Party.ItemShareCategories=[[DARK_GRAY]]Sharing Items: [[GRAY]][[ITALIC]]{0} -Commands.Party.MembersNear=[[DARK_GRAY]]NEAR YOU [[DARK_AQUA]]{0}[[DARK_GRAY]]/[[DARK_AQUA]]{1} -Commands.Party.Accept=[[GREEN]]- Accept party invite -Commands.Party.Chat.Off=Party Chat only [[RED]]Off -Commands.Party.Chat.On=Party Chat only [[GREEN]]On -Commands.Party.Commands=[[RED]]---[][[GREEN]]PARTY COMMANDS[[RED]][]--- -Commands.Party.Invite.0=[[RED]]ALERT: [[GREEN]]You have received a party invite for {0} from {1} -Commands.Party.Invite.1=[[YELLOW]]Type [[GREEN]]/party accept[[YELLOW]] to accept the invite -Commands.Party.Invite=[[GREEN]]- Send party invite -Commands.Party.Invite.Accepted=[[GREEN]]Invite Accepted. You have joined party {0} -Commands.Party.Join=[[GRAY]]Joined Party: {0} -Commands.Party.PartyFull=[[GOLD]]{0}[[RED]] is full! -Commands.Party.PartyFull.Invite=You cannot invite [[YELLOW]]{0}[[RED]] to [[GREEN]]{1}[[RED]] because it already has [[DARK_AQUA]]{2}[[RED]] players in it! -Commands.Party.PartyFull.InviteAccept=You cannot join [[GREEN]]{0}[[RED]] because it already has [[DARK_AQUA]]{1}[[RED]] players in it! -Commands.Party.Create=[[GRAY]]Created Party: {0} -Commands.Party.Rename=[[GRAY]]Party name changed to: [[WHITE]]{0} -Commands.Party.SetSharing=[[GRAY]]Party {0} sharing set to: [[DARK_AQUA]]{1} -Commands.Party.ToggleShareCategory=[[GRAY]]Party item sharing for [[GOLD]]{0} [[GRAY]]has been [[DARK_AQUA]]{1} -Commands.Party.AlreadyExists=[[DARK_RED]]Party {0} already exists! -Commands.Party.Kick=[[RED]]You were kicked from party [[GREEN]]{0}[[RED]]! -Commands.Party.Leave=[[YELLOW]]You have left that party -Commands.Party.Members.Header=[[RED]]-----[][[GREEN]]MEMBERS[[RED]][]----- -Commands.Party.None=[[RED]]You are not in a party. -Commands.Party.Quit=[[GREEN]]- Leave your current party -Commands.Party.Teleport=[[GREEN]]- Teleport to party member -Commands.Party.Toggle=[[GREEN]]- Toggle Party Chat -Commands.Party1=[[GREEN]]- Create a new party -Commands.Party2=[[GREEN]]- Join a players party -Commands.Party.Alliance.Header=[[RED]]-----[][[GREEN]]PARTY ALLIANCE[[RED]][]----- -Commands.Party.Alliance.Ally=[[WHITE]]{0} [[DARK_GRAY]]IS ALLIED WITH: [[WHITE]]{1} -Commands.Party.Alliance.Members.Header=[[RED]]-----[][[GREEN]]ALLIANCE MEMBERS[[RED]][]----- -Commands.Party.Alliance.Invite.0=ALERT: [[GREEN]]You have received a party alliance invite for {0} from {1} -Commands.Party.Alliance.Invite.1=Type [[GREEN]]/party alliance accept[[YELLOW]] to accept the invite -Commands.Party.Alliance.Invite.Accepted=[[GREEN]]Alliance invite Accepted. -Commands.Party.Alliance.None=[[RED]]Your party does not have an ally. -Commands.Party.Alliance.AlreadyAllies=[[RED]]Your party already has an ally. Disband with [[DARK_AQUA]]/party alliance disband -Commands.Party.Alliance.Help.0=[[RED]]This party hasn't formed an alliance. Invite a party leader -Commands.Party.Alliance.Help.1=[[RED]] to an alliance with [[DARK_AQUA]]/party alliance invite [[RED]]. -Commands.ptp.Enabled=Party teleporting [[GREEN]]enabled -Commands.ptp.Disabled=Party teleporting [[RED]]disabled -Commands.ptp.NoRequests=[[RED]]You have no teleport requests at this time -Commands.ptp.NoWorldPermissions=[[RED]][mcMMO] You do not have permission to teleport to the world {0}. -Commands.ptp.Request1=[[YELLOW]]{0} [[GREEN]]has requested to teleport to you. -Commands.ptp.Request2=[[GREEN]]To teleport, type [[YELLOW]]/ptp accept[[GREEN]]. Request expires in [[RED]]{0} [[GREEN]]seconds. -Commands.ptp.AcceptAny.Enabled=Party teleport request confirmation [[GREEN]]enabled -Commands.ptp.AcceptAny.Disabled=Party teleport request confirmation [[RED]]disabled -Commands.ptp.RequestExpired=[[RED]]Party teleport request has expired! -Commands.PowerLevel.Leaderboard=[[YELLOW]]--mcMMO[[BLUE]] Power Level [[YELLOW]]Leaderboard-- -Commands.PowerLevel.Capped=[[DARK_RED]]POWER LEVEL: [[GREEN]]{0} [[DARK_RED]]MAX LEVEL: [[YELLOW]]{1} -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=[[GREEN]]- Reset a skill's level to 0 -Commands.Scoreboard.Clear=[[DARK_AQUA]]mcMMO scoreboard cleared. -Commands.Scoreboard.NoBoard=[[RED]]The mcMMO scoreboard is not active. -Commands.Scoreboard.Keep=[[DARK_AQUA]]The mcMMO scoreboard will stay up until you use [[GREEN]]/mcscoreboard clear[[DARK_AQUA]]. -Commands.Scoreboard.Timer=[[DARK_AQUA]]The mcMMO scoreboard will clear [[GOLD]]{0}[[DARK_AQUA]] seconds from now. -Commands.Scoreboard.Help.0=[[GOLD]] == [[GREEN]]Help for [[RED]]/mcscoreboard[[GOLD]] == -Commands.Scoreboard.Help.1=[[DARK_AQUA]]/mcscoreboard[[AQUA]] clear [[WHITE]] - clear the McMMO scoreboard -Commands.Scoreboard.Help.2=[[DARK_AQUA]]/mcscoreboard[[AQUA]] keep [[WHITE]] - keep the mcMMO scoreboard up -Commands.Scoreboard.Help.3=[[DARK_AQUA]]/mcscoreboard[[AQUA]] time [n] [[WHITE]] - clear the McMMO scoreboard after [[LIGHT_PURPLE]]n[[WHITE]] seconds -Commands.Scoreboard.Tip.Keep=[[GOLD]]Tip: Use [[RED]]/mcscoreboard keep[[GOLD]] while the scoreboard is shown to keep it from going away. -Commands.Scoreboard.Tip.Clear=[[GOLD]]Tip: Use [[RED]]/mcscoreboard clear[[GOLD]] to get rid of the scoreboard. +Commands.Party.Status=&8NAME: &f{0} {1} &8LEVEL: &3{2} +Commands.Party.Status.Alliance=&8ALLY: &f{0} +Commands.Party.UnlockedFeatures=&8Unlocked Features: &7&o{0} +Commands.Party.ShareMode=&8SHARE MODE: +Commands.Party.ItemShare=&7ITEM &3({0}) +Commands.Party.ExpShare=&7EXP &3({0}) +Commands.Party.ItemShareCategories=&8Sharing Items: &7&o{0} +Commands.Party.MembersNear=&8NEAR YOU &3{0}&8/&3{1} +Commands.Party.Accept=&a- Accept party invite +Commands.Party.Chat.Off=Party Chat only &cOff +Commands.Party.Chat.On=Party Chat only &aOn +Commands.Party.Commands=&c---[]&aPARTY COMMANDS&c[]--- +Commands.Party.Invite.0=&cALERT: &aYou have received a party invite for {0} from {1} +Commands.Party.Invite.1=&eType &a/party accept&e to accept the invite +Commands.Party.Invite=&a- Send party invite +Commands.Party.Invite.Accepted=&aInvite Accepted. You have joined party {0} +Commands.Party.Join=&7Joined Party: {0} +Commands.Party.PartyFull=&6{0}&c is full! +Commands.Party.PartyFull.Invite=You cannot invite &e{0}&c to &a{1}&c because it already has &3{2}&c players in it! +Commands.Party.PartyFull.InviteAccept=You cannot join &a{0}&c because it already has &3{1}&c players in it! +Commands.Party.Create=&7Created Party: {0} +Commands.Party.Rename=&7Party name changed to: &f{0} +Commands.Party.SetSharing=&7Party {0} sharing set to: &3{1} +Commands.Party.ToggleShareCategory=&7Party item sharing for &6{0} &7has been &3{1} +Commands.Party.AlreadyExists=&4Party {0} already exists! +Commands.Party.Kick=&cYou were kicked from party &a{0}&c! +Commands.Party.Leave=&eYou have left that party +Commands.Party.Members.Header=&c-----[]&aMEMBERS&c[]----- +Commands.Party.None=&cYou are not in a party. +Commands.Party.Quit=&a- Leave your current party +Commands.Party.Teleport=&a- Teleport to party member +Commands.Party.Toggle=&a- Toggle Party Chat +Commands.Party1=&a- Create a new party +Commands.Party2=&a- Join a players party +Commands.Party.Alliance.Header=&c-----[]&aPARTY ALLIANCE&c[]----- +Commands.Party.Alliance.Ally=&f{0} &8IS ALLIED WITH: &f{1} +Commands.Party.Alliance.Members.Header=&c-----[]&aALLIANCE MEMBERS&c[]----- +Commands.Party.Alliance.Invite.0=ALERT: &aYou have received a party alliance invite for {0} from {1} +Commands.Party.Alliance.Invite.1=Type &a/party alliance accept&e to accept the invite +Commands.Party.Alliance.Invite.Accepted=&aAlliance invite Accepted. +Commands.Party.Alliance.None=&cYour party does not have an ally. +Commands.Party.Alliance.AlreadyAllies=&cYour party already has an ally. Disband with &3/party alliance disband +Commands.Party.Alliance.Help.0=&cThis party hasn't formed an alliance. Invite a party leader +Commands.Party.Alliance.Help.1=&c to an alliance with &3/party alliance invite &c. +Commands.ptp.Enabled=Party teleporting &aenabled +Commands.ptp.Disabled=Party teleporting &cdisabled +Commands.ptp.NoRequests=&cYou have no teleport requests at this time +Commands.ptp.NoWorldPermissions=&c[mcMMO] You do not have permission to teleport to the world {0}. +Commands.ptp.Request1=&e{0} &ahas requested to teleport to you. +Commands.ptp.Request2=&aTo teleport, type &e/ptp accept&a. Request expires in &c{0} &aseconds. +Commands.ptp.AcceptAny.Enabled=Party teleport request confirmation &aenabled +Commands.ptp.AcceptAny.Disabled=Party teleport request confirmation &cdisabled +Commands.ptp.RequestExpired=&cParty teleport request has expired! +Commands.PowerLevel.Leaderboard=&e--mcMMO&9 Power Level &eLeaderboard-- +Commands.PowerLevel.Capped=&4POWER LEVEL: &a{0} &4MAX LEVEL: &e{1} +Commands.PowerLevel=&4POWER LEVEL: &a{0} +Commands.Reset.All=&aAll of your skill levels have been reset successfully. +Commands.Reset.Single=&aYour {0} skill level has been reset successfully. +Commands.Reset=&a- Reset a skill's level to 0 +Commands.Scoreboard.Clear=&3mcMMO scoreboard cleared. +Commands.Scoreboard.NoBoard=&cThe mcMMO scoreboard is not active. +Commands.Scoreboard.Keep=&3The mcMMO scoreboard will stay up until you use &a/mcscoreboard clear&3. +Commands.Scoreboard.Timer=&3The mcMMO scoreboard will clear &6{0}&3 seconds from now. +Commands.Scoreboard.Help.0=&6 == &aHelp for &c/mcscoreboard&6 == +Commands.Scoreboard.Help.1=&3/mcscoreboard&b clear &f - clear the McMMO scoreboard +Commands.Scoreboard.Help.2=&3/mcscoreboard&b keep &f - keep the mcMMO scoreboard up +Commands.Scoreboard.Help.3=&3/mcscoreboard&b time [n] &f - clear the McMMO scoreboard after &dn&f seconds +Commands.Scoreboard.Tip.Keep=&6Tip: Use &c/mcscoreboard keep&6 while the scoreboard is shown to keep it from going away. +Commands.Scoreboard.Tip.Clear=&6Tip: Use &c/mcscoreboard clear&6 to get rid of the scoreboard. +Commands.XPBar.Reset=&6XP Bar settings for mcMMO have been reset. +Commands.XPBar.SettingChanged=&6XP Bar setting for &a{0}&6 is now set to &a{1} Commands.Skill.Invalid=That is not a valid skillname! Commands.Skill.ChildSkill=Child skills are not valid for this command! -Commands.Skill.Leaderboard=--mcMMO [[BLUE]]{0}[[YELLOW]] Leaderboard-- -Commands.SkillInfo=[[GREEN]]- View detailed information about a skill -Commands.Stats=[[GREEN]]- View your mcMMO stats -Commands.ToggleAbility=[[GREEN]]- Toggle ability activation with right click -Commands.Usage.0=[[RED]]Proper usage is /{0} -Commands.Usage.1=[[RED]]Proper usage is /{0} {1} -Commands.Usage.2=[[RED]]Proper usage is /{0} {1} {2} -Commands.Usage.3=[[RED]]Proper usage is /{0} {1} {2} {3} +Commands.Skill.Leaderboard=--mcMMO &9{0}&e Leaderboard-- +Commands.SkillInfo=&a- View detailed information about a skill +Commands.Stats=&a- View your mcMMO stats +Commands.ToggleAbility=&a- Toggle ability activation with right click +Commands.Usage.0=&cProper usage is /{0} +Commands.Usage.1=&cProper usage is /{0} {1} +Commands.Usage.2=&cProper usage is /{0} {1} {2} +Commands.Usage.3=&cProper usage is /{0} {1} {2} {3} +Commands.Usage.3.XP=&cProper usage is /{0} {1} {2} {3}&7 (You can include -s at the end to execute the command without informing the player, effectively silencing it) Commands.Usage.FullClassName=classname Commands.Usage.Level=level Commands.Usage.Message=message @@ -721,69 +736,69 @@ Commands.Usage.Skill=skill Commands.Usage.SubSkill=subskill Commands.Usage.XP=xp Commands.Description.mmoinfo=Read details about a skill or mechanic. -Commands.MmoInfo.Mystery=[[GRAY]]You haven't unlocked this skill yet, but when you do you will be able to read details about it here! +Commands.MmoInfo.Mystery=&7You haven't unlocked this skill yet, but when you do you will be able to read details about it here! Commands.MmoInfo.NoMatch=That subskill doesn't exist! -Commands.MmoInfo.Header=[[DARK_AQUA]]-=[]=====[][[GOLD]] MMO Info [[DARK_AQUA]][]=====[]=- -Commands.MmoInfo.SubSkillHeader=[[GOLD]]Name:[[YELLOW]] {0} -Commands.MmoInfo.DetailsHeader=[[DARK_AQUA]]-=[]=====[][[GREEN]] Details [[DARK_AQUA]][]=====[]=- -Commands.MmoInfo.OldSkill=[[GRAY]]mcMMO skills are being converted into an improved modular skill system, unfortunately this skill has not been converted yet and lacks detailed stats. The new system will allow for faster release times for new mcMMO skills and greater flexibility with existing skills. -Commands.MmoInfo.Mechanics=[[DARK_AQUA]]-=[]=====[][[GOLD]] Mechanics [[DARK_AQUA]][]=====[]=- +Commands.MmoInfo.Header=&3-=[]=====[]&6 MMO Info &3[]=====[]=- +Commands.MmoInfo.SubSkillHeader=&6Name:&e {0} +Commands.MmoInfo.DetailsHeader=&3-=[]=====[]&a Details &3[]=====[]=- +Commands.MmoInfo.OldSkill=&7mcMMO skills are being converted into an improved modular skill system, unfortunately this skill has not been converted yet and lacks detailed stats. The new system will allow for faster release times for new mcMMO skills and greater flexibility with existing skills. +Commands.MmoInfo.Mechanics=&3-=[]=====[]&6 Mechanics &3[]=====[]=- Commands.MmoInfo.Stats=STATS: {0} -Commands.Mmodebug.Toggle=mcMMO Debug Mode is now [[GOLD]]{0}[[GRAY]], use this command again to toggle. With debug mode true, you can punch blocks to print useful information used for support. -mcMMO.NoInvites=[[RED]]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. +Commands.Mmodebug.Toggle=mcMMO Debug Mode is now &6{0}&7, use this command again to toggle. With debug mode true, you can punch blocks to print useful information used for support. +mcMMO.NoInvites=&cYou have no invites at this time +mcMMO.NoPermission=&4Insufficient permissions. +mcMMO.NoSkillNote=&8If you don't have access to a skill it will not be shown here. ##party Party.Forbidden=[mcMMO] Parties not permitted on this world (See Permissions) -Party.Help.0=[[RED]]Proper usage is [[DARK_AQUA]]{0} [password]. -Party.Help.1=[[RED]]To create a party, use [[DARK_AQUA]]{0} [password]. -Party.Help.2=[[RED]]Consult [[DARK_AQUA]]{0} [[RED]]for more information -Party.Help.3=[[RED]]Use [[DARK_AQUA]]{0} [password] [[RED]]to join or [[DARK_AQUA]]{1} [[RED]]to quit -Party.Help.4=[[RED]]To lock or unlock your party, use [[DARK_AQUA]]{0} -Party.Help.5=[[RED]]To password protect your party, use [[DARK_AQUA]]{0} -Party.Help.6=[[RED]]To kick a player from your party, use [[DARK_AQUA]]{0} -Party.Help.7=[[RED]]To transfer ownership of your party, use [[DARK_AQUA]]{0} -Party.Help.8=[[RED]]To disband your party, use [[DARK_AQUA]]{0} -Party.Help.9=[[RED]]Use [[DARK_AQUA]]{0} [[RED]]to share items with party members -Party.Help.10=[[RED]]Use [[DARK_AQUA]]{0} [[RED]]to enable XP sharing with party members -Party.InformedOnJoin={0} [[GREEN]]has joined your party -Party.InformedOnQuit={0} [[GREEN]]has left your party -Party.InformedOnNameChange=[[GOLD]]{0} [[GREEN]]has set the party name to [[WHITE]]{1} -Party.InvalidName=[[DARK_RED]]That is not a valid party name. -Party.Invite.Self=[[RED]]You can't invite yourself! -Party.IsLocked=[[RED]]This party is already locked! -Party.IsntLocked=[[RED]]This party is not locked! -Party.Locked=[[RED]]Party is locked, only party leader may invite. -Party.NotInYourParty=[[DARK_RED]]{0} is not in your party -Party.NotOwner=[[DARK_RED]]You are not the party leader. -Party.Target.NotOwner=[[DARK_RED]]{0} is not the party leader. -Party.Owner.New=[[GREEN]]{0} is the new party leader. -Party.Owner.NotLeader=[[DARK_RED]]You are no longer the party leader. -Party.Owner.Player =[[GREEN]]You are now the party leader. -Party.Password.None=[[RED]]This party is password protected. Please provide a password to join. -Party.Password.Incorrect=[[RED]]Party password is incorrect. -Party.Password.Set=[[GREEN]]Party password set to {0} -Party.Password.Removed=[[GREEN]]Party password has been cleared. -Party.Player.Invalid=[[RED]]That is not a valid player. -Party.NotOnline=[[DARK_RED]]{0} is not online! -Party.Player.InSameParty=[[RED]]{0} already is in your party! -Party.PlayerNotInParty=[[DARK_RED]]{0} is not in a party -Party.Specify=[[RED]]You must specify a party. -Party.Teleport.Dead=[[RED]]You can't teleport to a dead player. -Party.Teleport.Hurt=[[RED]]You have been hurt in the last {0} seconds and cannot teleport. -Party.Teleport.Player=[[GREEN]]You have teleported to {0}. -Party.Teleport.Self=[[RED]]You can't teleport to yourself! -Party.Teleport.Target=[[GREEN]]{0} has teleported to you. -Party.Teleport.Disabled=[[RED]]{0} doesn't allow party teleportation. -Party.Rename.Same=[[RED]]That is already the name of your party! -Party.Join.Self=[[RED]]You can't join yourself! -Party.Unlocked=[[GRAY]]Party is unlocked -Party.Disband=[[GRAY]]The party has been disbanded -Party.Alliance.Formed=[[GRAY]]Your party is now allies with [[GREEN]]{0} -Party.Alliance.Disband=[[GRAY]]Your party is no longer allies with [[RED]]{0} -Party.Status.Locked=[[DARK_RED]](INVITE-ONLY) -Party.Status.Unlocked=[[DARK_GREEN]](OPEN) -Party.LevelUp=[[YELLOW]]Party level increased by {0}. Total ({1}) +Party.Help.0=&cProper usage is &3{0} [password]. +Party.Help.1=&cTo create a party, use &3{0} [password]. +Party.Help.2=&cConsult &3{0} &cfor more information +Party.Help.3=&cUse &3{0} [password] &cto join or &3{1} &cto quit +Party.Help.4=&cTo lock or unlock your party, use &3{0} +Party.Help.5=&cTo password protect your party, use &3{0} +Party.Help.6=&cTo kick a player from your party, use &3{0} +Party.Help.7=&cTo transfer ownership of your party, use &3{0} +Party.Help.8=&cTo disband your party, use &3{0} +Party.Help.9=&cUse &3{0} &cto share items with party members +Party.Help.10=&cUse &3{0} &cto enable XP sharing with party members +Party.InformedOnJoin={0} &ahas joined your party +Party.InformedOnQuit={0} &ahas left your party +Party.InformedOnNameChange=&6{0} &ahas set the party name to &f{1} +Party.InvalidName=&4That is not a valid party name. +Party.Invite.Self=&cYou can't invite yourself! +Party.IsLocked=&cThis party is already locked! +Party.IsntLocked=&cThis party is not locked! +Party.Locked=&cParty is locked, only party leader may invite. +Party.NotInYourParty=&4{0} is not in your party +Party.NotOwner=&4You are not the party leader. +Party.Target.NotOwner=&4{0} is not the party leader. +Party.Owner.New=&a{0} is the new party leader. +Party.Owner.NotLeader=&4You are no longer the party leader. +Party.Owner.Player =&aYou are now the party leader. +Party.Password.None=&cThis party is password protected. Please provide a password to join. +Party.Password.Incorrect=&cParty password is incorrect. +Party.Password.Set=&aParty password set to {0} +Party.Password.Removed=&aParty password has been cleared. +Party.Player.Invalid=&cThat is not a valid player. +Party.NotOnline=&4{0} is not online! +Party.Player.InSameParty=&c{0} already is in your party! +Party.PlayerNotInParty=&4{0} is not in a party +Party.Specify=&cYou must specify a party. +Party.Teleport.Dead=&cYou can't teleport to a dead player. +Party.Teleport.Hurt=&cYou have been hurt in the last {0} seconds and cannot teleport. +Party.Teleport.Player=&aYou have teleported to {0}. +Party.Teleport.Self=&cYou can't teleport to yourself! +Party.Teleport.Target=&a{0} has teleported to you. +Party.Teleport.Disabled=&c{0} doesn't allow party teleportation. +Party.Rename.Same=&cThat is already the name of your party! +Party.Join.Self=&cYou can't join yourself! +Party.Unlocked=&7Party is unlocked +Party.Disband=&7The party has been disbanded +Party.Alliance.Formed=&7Your party is now allies with &a{0} +Party.Alliance.Disband=&7Your party is no longer allies with &c{0} +Party.Status.Locked=&4(INVITE-ONLY) +Party.Status.Unlocked=&2(OPEN) +Party.LevelUp=&eParty level increased by {0}. Total ({1}) Party.Feature.Chat=Party Chat Party.Feature.Teleport=Party Teleport Party.Feature.Alliance=Alliances @@ -794,11 +809,11 @@ Party.Feature.Locked.Teleport=LOCKED UNTIL {0}+ (PARTY TELEPORT) Party.Feature.Locked.Alliance=LOCKED UNTIL {0}+ (ALLIANCES) Party.Feature.Locked.ItemShare=LOCKED UNTIL {0}+ (ITEM SHARING) Party.Feature.Locked.XpShare=LOCKED UNTIL {0}+ (XP SHARING) -Party.Feature.Disabled.1=[[RED]]Party chat is not unlocked yet. -Party.Feature.Disabled.2=[[RED]]Party teleport is not unlocked yet. -Party.Feature.Disabled.3=[[RED]]Party alliances are not unlocked yet. -Party.Feature.Disabled.4=[[RED]]Party item sharing is not unlocked yet. -Party.Feature.Disabled.5=[[RED]]Party XP sharing is not unlocked yet. +Party.Feature.Disabled.1=&cParty chat is not unlocked yet. +Party.Feature.Disabled.2=&cParty teleport is not unlocked yet. +Party.Feature.Disabled.3=&cParty alliances are not unlocked yet. +Party.Feature.Disabled.4=&cParty item sharing is not unlocked yet. +Party.Feature.Disabled.5=&cParty XP sharing is not unlocked yet. Party.ShareType.Xp=XP Party.ShareType.Item=ITEM Party.ShareMode.None=NONE @@ -824,216 +839,219 @@ Commands.XPGain.Swords=Attacking Monsters Commands.XPGain.Taming=Animal Taming, or combat w/ your wolves Commands.XPGain.Unarmed=Attacking Monsters Commands.XPGain.Woodcutting=Chopping down trees -Commands.XPGain=[[DARK_GRAY]]XP GAIN: [[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=[[RED]]The XP RATE was modified to {0} -Commands.xprate.over=[[RED]]mcMMO XP Rate Event is OVER!! -Commands.xprate.proper.0=[[RED]]Proper usage to change the XP rate is /xprate -Commands.xprate.proper.1=[[RED]]Proper usage to restore the XP rate to default is /xprate reset -Commands.xprate.proper.2=[[RED]]Please specify true or false to indicate if this is an xp event or not +Commands.XPGain=&8XP GAIN: &f{0} +Commands.xplock.locked=&6Your XP BAR is now locked to {0}! +Commands.xplock.unlocked=&6Your XP BAR is now &aUNLOCKED&6! +Commands.xprate.modified=&cThe XP RATE was modified to {0} +Commands.xprate.over=&cmcMMO XP Rate Event is OVER!! +Commands.xprate.proper.0=&cProper usage to change the XP rate is /xprate +Commands.xprate.proper.1=&cProper usage to restore the XP rate to default is /xprate reset +Commands.xprate.proper.2=&cPlease specify true or false to indicate if this is an xp event or not Commands.NegativeNumberWarn=Don't use negative numbers! -Commands.Event.Start=[[GREEN]]mcMMO[[GOLD]] Event! -Commands.Event.Stop=[[GREEN]]mcMMO[[DARK_AQUA]] Event Over! -Commands.Event.Stop.Subtitle=[[GREEN]]I hope you had fun! -Commands.Event.XP=[[DARK_AQUA]]XP Rate is now [[GOLD]]{0}[[DARK_AQUA]]x -Commands.xprate.started.0=[[GOLD]]XP EVENT FOR mcMMO HAS STARTED! -Commands.xprate.started.1=[[GOLD]]mcMMO XP RATE IS NOW {0}x! +Commands.Event.Start=&amcMMO&6 Event! +Commands.Event.Stop=&amcMMO&3 Event Over! +Commands.Event.Stop.Subtitle=&aI hope you had fun! +Commands.Event.XP=&3XP Rate is now &6{0}&3x +Commands.xprate.started.0=&6XP EVENT FOR mcMMO HAS STARTED! +Commands.xprate.started.1=&6mcMMO XP RATE IS NOW {0}x! # Admin Notifications -Server.ConsoleName=[[YELLOW]][Server] -Notifications.Admin.XPRate.Start.Self=[[GRAY]]You have set the global XP rate multiplier to [[GOLD]]{0}x -Notifications.Admin.XPRate.End.Self=[[GRAY]]You ended the XP rate event. -Notifications.Admin.XPRate.End.Others={0} [[GRAY]]has ended the XP rate event -Notifications.Admin.XPRate.Start.Others={0} [[GRAY]]has started or modified an XP rate event with global multiplier {1}x -Notifications.Admin.Format.Others=[[GOLD]]([[GREEN]]mcMMO [[DARK_AQUA]]Admin[[GOLD]]) [[GRAY]]{0} -Notifications.Admin.Format.Self=[[GOLD]]([[GREEN]]mcMMO[[GOLD]]) [[GRAY]]{0} +Server.ConsoleName=&e[Server] +Notifications.Admin.XPRate.Start.Self=&7You have set the global XP rate multiplier to &6{0}x +Notifications.Admin.XPRate.End.Self=&7You ended the XP rate event. +Notifications.Admin.XPRate.End.Others={0} &7has ended the XP rate event +Notifications.Admin.XPRate.Start.Others={0} &7has started or modified an XP rate event with global multiplier {1}x +Notifications.Admin.Format.Others=&6(&amcMMO &3Admin&6) &7{0} +Notifications.Admin.Format.Self=&6(&amcMMO&6) &7{0} # Event -XPRate.Event=[[GOLD]]mcMMO is currently in an XP rate event! XP rate is {0}x! +XPRate.Event=&6mcMMO is currently in an XP rate event! XP rate is {0}x! #GUIDES -Guides.Available=[[GRAY]]Guide for {0} available - type /{1} ? [page] -Guides.Header=[[GOLD]]-=[[GREEN]]{0} Guide[[GOLD]]=- +Guides.Available=&7Guide for {0} available - type /{1} ? [page] +Guides.Header=&6-=&a{0} Guide&6=- Guides.Page.Invalid=Not a valid page number! Guides.Page.OutOfRange=That page does not exist, there are only {0} total pages. Guides.Usage= Usage is /{0} ? [page] ##Acrobatics -Guides.Acrobatics.Section.0=[[DARK_AQUA]]About Acrobatics:\n[[YELLOW]]Acrobatics is the art of moving Gracefuly in mcMMO.\n[[YELLOW]]It provides combat bonuses and environment damage bonuses.\n\n[[DARK_AQUA]]XP GAIN:\n[[YELLOW]]To gain XP in this skill you need to perform a dodge\n[[YELLOW]]in combat or survive falls from heights that damage you. -Guides.Acrobatics.Section.1=[[DARK_AQUA]]How does Rolling work?\n[[YELLOW]]You have a passive chance when you take fall damage\n[[YELLOW]]to negate the damage done. You can hold the sneak button to\n[[YELLOW]]double your chances during the fall.\n[[YELLOW]]This triggers a Graceful Roll instead of a standard one.\n[[YELLOW]]Graceful Rolls are like regular rolls but are twice as likely to\n[[YELLOW]]occur and provide more damage safety than regular rolls.\n[[YELLOW]]Rolling chance is tied to your skill level -Guides.Acrobatics.Section.2=[[DARK_AQUA]]How does Dodge work?\n[[YELLOW]]Dodge is a passive chance when you are\n[[YELLOW]]injured in combat to halve the damage taken.\n[[YELLOW]]It is tied to your skill level. +Guides.Acrobatics.Section.0=&3About Acrobatics:\n&eAcrobatics is the art of moving Gracefuly in mcMMO.\n&eIt provides combat bonuses and environment damage bonuses.\n\n&3XP GAIN:\n&eTo gain XP in this skill you need to perform a dodge\n&ein combat or survive falls from heights that damage you. +Guides.Acrobatics.Section.1=&3How does Rolling work?\n&eYou have a passive chance when you take fall damage\n&eto negate the damage done. You can hold the sneak button to\n&edouble your chances during the fall.\n&eThis triggers a Graceful Roll instead of a standard one.\n&eGraceful Rolls are like regular rolls but are twice as likely to\n&eoccur and provide more damage safety than regular rolls.\n&eRolling chance is tied to your skill level +Guides.Acrobatics.Section.2=&3How does Dodge work?\n&eDodge is a passive chance when you are\n&einjured in combat to halve the damage taken.\n&eIt is tied to your skill level. ##Alchemy Guides.Alchemy.Section.0=[[DARK_AQUA]]About Alchemy:\n[[YELLOW]]Alchemy is about brewing potions.\n[[YELLOW]]It provides a speed increase in the potion brew time, as well\n[[YELLOW]]as the addition of new (previously) unobtainable potions.\n\n\n[[DARK_AQUA]]XP GAIN:\n[[YELLOW]]To gain XP in this skill you need to brew potions. Guides.Alchemy.Section.1=[[DARK_AQUA]]How does Catalysis work?\n[[YELLOW]]Catalysis speeds of the brewing process, with a\n[[YELLOW]]max speed of 4x at level 1000.\n[[YELLOW]]This ability is unlocked at level 100 by default. Guides.Alchemy.Section.2=[[DARK_AQUA]]How does Concoctions work?\n[[YELLOW]]Concoctions allows brewing of more potions with custom ingredients.\n[[YELLOW]]Which special ingredients are unlocked is determined\n[[YELLOW]]by your Rank. There are 8 ranks to unlock. Guides.Alchemy.Section.3=[[DARK_AQUA]]Concoctions tier 1 ingredients:\n[[YELLOW]]Blaze Powder, Fermented Spider Eye, Ghast Tear, Redstone,\n[[YELLOW]]Glowstone Dust, Sugar, Glistering Melon, Golden Carrot,\n[[YELLOW]]Magma Cream, Nether Wart, Spider Eye, Suplhur, Water Lily,\n[[YELLOW]]Pufferfish\n[[YELLOW]](Vanilla Potions) -Guides.Alchemy.Section.4=[[DARK_AQUA]]Concoctions tier 2 ingredients:\n[[YELLOW]]Carrot (Potion of Haste)\n[[YELLOW]]Slimeball (Potion of Dullness)\n\n[[DARK_AQUA]]Concoctions tier 3 ingredients:\n[[YELLOW]]Quartz (Potion of Absorption)\n[[YELLOW]]Red Mushroom (Potion of Leaping) +Guides.Alchemy.Section.4=[[DARK_AQUA]]Concoctions tier 2 ingredients:\n[[YELLOW]]Carrot (Potion of Haste)\n[[YELLOW]]Slimeball (Potion of Dullness)\n\n[[DARK_AQUA]]Concoctions tier 3 ingredients:\n[[YELLOW]]Quartz (Potion of Absorption)\n[[YELLOW]]Rabbit's Foot (Potion of Leaping) Guides.Alchemy.Section.5=[[DARK_AQUA]]Concoctions tier 4 ingredients:\n[[YELLOW]]Apple (Potion of Health Boost)\n[[YELLOW]]Rotten Flesh (Potion of Hunger)\n\n[[DARK_AQUA]]Concoctions tier 5 ingredients:\n[[YELLOW]]Brown Mushroom (Potion of Nausea)\n[[YELLOW]]Ink Sack (Potion of Blindness) Guides.Alchemy.Section.6=[[DARK_AQUA]]Concoctions tier 6 ingredients:\n[[YELLOW]]Fern (Potion of Saturation)\n\n[[DARK_AQUA]]Concoctions tier 7 ingredients:\n[[YELLOW]]Poisonous Potato (Potion of Decay)\n\n[[DARK_AQUA]]Concoctions tier 8 ingredients:\n[[YELLOW]]Regular Golden Apple (Potion of Resistance) + ##Archery -Guides.Archery.Section.0=[[DARK_AQUA]]About Archery:\n[[YELLOW]]Archery is about shooting with your bow and arrow.\n[[YELLOW]]It provides various combat bonuses, such as a damage boost\n[[YELLOW]]that scales with your level and the ability to daze your\n[[YELLOW]]opponents in PvP. In addition to this, you can retrieve\n[[YELLOW]]some of your spent arrows from the corpses of your foes.\n\n\n[[DARK_AQUA]]XP GAIN:\n[[YELLOW]]To gain XP in this skill you need to shoot mobs or\n[[YELLOW]]other players. -Guides.Archery.Section.1=[[DARK_AQUA]]How does Skill Shot work?\n[[YELLOW]]Skill Shot provides additional damage to your shots.\n[[YELLOW]]The bonus damage from Skill Shot increases as you\n[[YELLOW]]level in Archery.\n[[YELLOW]]With the default settings, your archery damage increases 10%\n[[YELLOW]]every 50 levels, to a maximum of 200% bonus damage. -Guides.Archery.Section.2=[[DARK_AQUA]]How does Daze work?\n[[YELLOW]]You have a passive chance to daze other players when\n[[YELLOW]]you shoot them. When Daze triggers it forces your opponents\n[[YELLOW]]to look straight up for a short duration.\n[[YELLOW]]A Daze shot also deals an additional 4 damage (2 hearts). -Guides.Archery.Section.3=[[DARK_AQUA]]How does Arrow Retrieval work?\n[[YELLOW]]You have a passive chance to retrieve some of your arrows\n[[YELLOW]]when you kill a mob with your bow.\n[[YELLOW]]This chance increases as you level in Archery.\n[[YELLOW]]By default, this ability increases by 0.1% per level, up to 100%\n[[YELLOW]]at level 1000. +Guides.Archery.Section.0=&3About Archery:\n&eArchery is about shooting with your bow and arrow.\n&eIt provides various combat bonuses, such as a damage boost\nðat scales with your level and the ability to daze your\n&eopponents in PvP. In addition to this, you can retrieve\n&esome of your spent arrows from the corpses of your foes.\n\n\n&3XP GAIN:\n&eTo gain XP in this skill you need to shoot mobs or\n&eother players. +Guides.Archery.Section.1=&3How does Skill Shot work?\n&eSkill Shot provides additional damage to your shots.\n&eThe bonus damage from Skill Shot increases as you\n&elevel in Archery.\n&eWith the default settings, your archery damage increases 10%\n&eevery 50 levels, to a maximum of 200% bonus damage. +Guides.Archery.Section.2=&3How does Daze work?\n&eYou have a passive chance to daze other players when\n&eyou shoot them. When Daze triggers it forces your opponents\n&eto look straight up for a short duration.\n&eA Daze shot also deals an additional 4 damage (2 hearts). +Guides.Archery.Section.3=&3How does Arrow Retrieval work?\n&eYou have a passive chance to retrieve some of your arrows\n&ewhen you kill a mob with your bow.\n&eThis chance increases as you level in Archery.\n&eBy default, this ability increases by 0.1% per level, up to 100%\n&eat level 1000. ##Axes -Guides.Axes.Section.0=[[DARK_AQUA]]About Axes:\n[[YELLOW]]With the Axes skill you can use your axe for much more then\n[[YELLOW]]just deforesting! You can hack and chop away at mobs\n[[YELLOW]]and players to gain XP, hitting mobs with the effect of\n[[YELLOW]]knockback and inflicting DEADLY criticals on mobs and players.\n[[YELLOW]]Your axe also becomes a hand-held woodchipper,\n[[YELLOW]]breaking down the enemy's armor with ease as your level\n[[YELLOW]]increases.\n[[DARK_AQUA]]XP GAIN:\n[[YELLOW]]To gain XP in this skill you need hit other mobs or players\n[[YELLOW]]with an Axe. -Guides.Axes.Section.1=[[DARK_AQUA]]How does Skull Splitter work?\n[[YELLOW]]This ability allows you to deal an AoE (Area of Effect) hit.\n[[YELLOW]]This AoE hit will deal half as much damage as you did to the\n[[YELLOW]]main target, so it's great for clearing out large piles of mobs. -Guides.Axes.Section.2=[[DARK_AQUA]]How does Critical Strikes work?\n[[YELLOW]]Critical Strikes is a passive ability which gives players a\n[[YELLOW]]chance to deal additional damage.\n[[YELLOW]]With the default settings, every 2 skill levels in Axes awards a\n[[YELLOW]]0.1% chance to deal a Critical Strike, causing 2.0 times damage\n[[YELLOW]]to mobs or 1.5 times damage against other players. -Guides.Axes.Section.3=[[DARK_AQUA]]How does Axe Mastery work?\n[[YELLOW]]Axe Mastery is a passive ability that will add additional damage\n[[YELLOW]]to your hits when using Axes.\n[[YELLOW]]By default, the bonus damage increases by 1 every 50 levels,\n[[YELLOW]]up to a cap of 4 extra damage at level 200. -Guides.Axes.Section.4=[[DARK_AQUA]]How does Armor Impact work?\n[[YELLOW]]Strike with enough force to shatter armor!\n[[YELLOW]]Armor Impact has a passive chance to damage your\n[[YELLOW]]opponent's armor. This damage increases as you level in Axes. -Guides.Axes.Section.5=[[DARK_AQUA]]How does Greater Impact work?\n[[YELLOW]]You have a passive chance to achieve a greater impact when\n[[YELLOW]]hitting mobs or players with your axe.\n[[YELLOW]]By default this chance is 25%. This passive ability has an\n[[YELLOW]]extreme knockback effect, similar to the Knockback II\n[[YELLOW]]enchantment. In addition, it deals bonus damage to the target. +Guides.Axes.Section.0=&3About Axes:\n&eWith the Axes skill you can use your axe for much more then\n&ejust deforesting! You can hack and chop away at mobs\n&eand players to gain XP, hitting mobs with the effect of\n&eknockback and inflicting DEADLY criticals on mobs and players.\n&eYour axe also becomes a hand-held woodchipper,\n&ebreaking down the enemy's armor with ease as your level\n&eincreases.\n&3XP GAIN:\n&eTo gain XP in this skill you need hit other mobs or players\n&ewith an Axe. +Guides.Axes.Section.1=&3How does Skull Splitter work?\n&eThis ability allows you to deal an AoE (Area of Effect) hit.\n&eThis AoE hit will deal half as much damage as you did to the\n&emain target, so it's great for clearing out large piles of mobs. +Guides.Axes.Section.2=&3How does Critical Strikes work?\n&eCritical Strikes is a passive ability which gives players a\n&echance to deal additional damage.\n&eWith the default settings, every 2 skill levels in Axes awards a\n&e0.1% chance to deal a Critical Strike, causing 2.0 times damage\n&eto mobs or 1.5 times damage against other players. +Guides.Axes.Section.3=&3How does Axe Mastery work?\n&eAxe Mastery is a passive ability that will add additional damage\n&eto your hits when using Axes.\n&eBy default, the bonus damage increases by 1 every 50 levels,\n&eup to a cap of 4 extra damage at level 200. +Guides.Axes.Section.4=&3How does Armor Impact work?\n&eStrike with enough force to shatter armor!\n&eArmor Impact has a passive chance to damage your\n&eopponent's armor. This damage increases as you level in Axes. +Guides.Axes.Section.5=&3How does Greater Impact work?\n&eYou have a passive chance to achieve a greater impact when\n&ehitting mobs or players with your axe.\n&eBy default this chance is 25%. This passive ability has an\n&eextreme knockback effect, similar to the Knockback II\n&eenchantment. In addition, it deals bonus damage to the target. ##Excavation -Guides.Excavation.Section.0=[[DARK_AQUA]]About Excavation:\n[[YELLOW]]Excavation is the act of digging up dirt to find treasures.\n[[YELLOW]]By excavating the land you will find treasures.\n[[YELLOW]]The more you do this the more treasures you can find.\n\n[[DARK_AQUA]]XP GAIN:\n[[YELLOW]]To gain XP in this skill you must dig with a shovel in hand.\n[[YELLOW]]Only certain materials can be dug up for treasures and XP. -Guides.Excavation.Section.1=[[DARK_AQUA]]Compatible Materials:\n[[YELLOW]]Grass, Dirt, Sand, Clay, Gravel, Mycelium, Soul Sand, Snow -Guides.Excavation.Section.2=[[DARK_AQUA]]How to use Giga Drill Breaker:\n[[YELLOW]]With a shovel in hand right click to ready your tool.\n[[YELLOW]]Once in this state you have about 4 seconds to make\n[[YELLOW]]contact with Excavation compatible materials this will\n[[YELLOW]]activate Giga Drill Breaker. -Guides.Excavation.Section.3=[[DARK_AQUA]]What is Giga Drill Breaker?\n[[YELLOW]]Giga Drill Breaker is an ability with a cooldown\n[[YELLOW]]tied to Excavation skill. It triples your chance\n[[YELLOW]]of finding treasures and enables instant break\n[[YELLOW]]on Excavation materials. -Guides.Excavation.Section.4=[[DARK_AQUA]]How does Archaeology work?\n[[YELLOW]]Every possible treasure for Excavation has its own\n[[YELLOW]]skill level requirement for it to drop, as a result it's\n[[YELLOW]]difficult to say how much it is helping you.\n[[YELLOW]]Just keep in mind that the higher your Excavation skill\n[[YELLOW]]is, the more treasures that can be found.\n[[YELLOW]]And also keep in mind that each type of Excavation\n[[YELLOW]]compatible material has its own unique list of treasures.\n[[YELLOW]]In other words you will find different treasures in Dirt\n[[YELLOW]]than you would in Gravel. -Guides.Excavation.Section.5=[[DARK_AQUA]]Notes about Excavation:\n[[YELLOW]]Excavation drops are completely customizeable\n[[YELLOW]]So results vary server to server. +Guides.Excavation.Section.0=&3About Excavation:\n&eExcavation is the act of digging up dirt to find treasures.\n&eBy excavating the land you will find treasures.\n&eThe more you do this the more treasures you can find.\n\n&3XP GAIN:\n&eTo gain XP in this skill you must dig with a shovel in hand.\n&eOnly certain materials can be dug up for treasures and XP. +Guides.Excavation.Section.1=&3Compatible Materials:\n&eGrass, Dirt, Sand, Clay, Gravel, Mycelium, Soul Sand, Snow +Guides.Excavation.Section.2=&3How to use Giga Drill Breaker:\n&eWith a shovel in hand right click to ready your tool.\n&eOnce in this state you have about 4 seconds to make\n&econtact with Excavation compatible materials this will\n&eactivate Giga Drill Breaker. +Guides.Excavation.Section.3=&3What is Giga Drill Breaker?\n&eGiga Drill Breaker is an ability with a cooldown\n&etied to Excavation skill. It triples your chance\n&eof finding treasures and enables instant break\n&eon Excavation materials. +Guides.Excavation.Section.4=&3How does Archaeology work?\n&eEvery possible treasure for Excavation has its own\n&eskill level requirement for it to drop, as a result it's\n&edifficult to say how much it is helping you.\n&eJust keep in mind that the higher your Excavation skill\n&eis, the more treasures that can be found.\n&eAnd also keep in mind that each type of Excavation\n&ecompatible material has its own unique list of treasures.\n&eIn other words you will find different treasures in Dirt\nðan you would in Gravel. +Guides.Excavation.Section.5=&3Notes about Excavation:\n&eExcavation drops are completely customizeable\n&eSo results vary server to server. ##Fishing -Guides.Fishing.Section.0=[[DARK_AQUA]]About Fishing:\n[[YELLOW]]With the Fishing skill, Fishing is exciting again!\n[[YELLOW]]Find hidden treasures, and shake items off mobs.\n\n[[DARK_AQUA]]XP GAIN:\n[[YELLOW]]Catch fish. -Guides.Fishing.Section.1=[[DARK_AQUA]]How does Treasure Hunter work?\n[[YELLOW]]This ability allows you to find treasure from fishing \n[[YELLOW]]with a small chance of the items being enchanted.\n[[YELLOW]]Every possible treasure for Fishing has a chance\n[[YELLOW]]to drop on any level. It depends however\n[[YELLOW]]what the rarity of the item is how often it will drop.\n[[YELLOW]]The higher your Fishing skill is, the better\n[[YELLOW]]your chances are to find better treasures. -Guides.Fishing.Section.2=[[DARK_AQUA]]How does Ice Fishing work?\n[[YELLOW]]This passive skill allows you to fish in ice lakes!\n[[YELLOW]]Cast your fishing rod in an ice lake and the ability will\n[[YELLOW]]create a small hole in the ice to fish in. -Guides.Fishing.Section.3=[[DARK_AQUA]]How does Master Angler work?\n[[YELLOW]]This passive skill increases the bite chance while fishing.\n[[YELLOW]]When you've unlocked this ability, fishing while in\n[[YELLOW]]a boat or when an ocean biome doubles the bite chance. -Guides.Fishing.Section.4=[[DARK_AQUA]]How does Shake work?\n[[YELLOW]]This active ability allows you to shake items loose from mobs\n[[YELLOW]]by hooking them with the fishing rod. \n[[YELLOW]]Mobs will drop items they would normally drop on death.\n[[YELLOW]]It is also possible to acquire mob skulls, which are normally \n[[YELLOW]]unobtainable in survival mode. -Guides.Fishing.Section.5=[[DARK_AQUA]]How does Fisherman's Diet work?\n[[YELLOW]]This passive skill increases the amount of hunger restored \n[[YELLOW]]from eating fish. -Guides.Fishing.Section.6=[[DARK_AQUA]]Notes about Fishing:\n[[YELLOW]]Fishing drops are completely customizable,\n[[YELLOW]]so results vary server to server. +Guides.Fishing.Section.0=&3About Fishing:\n&eWith the Fishing skill, Fishing is exciting again!\n&eFind hidden treasures, and shake items off mobs.\n\n&3XP GAIN:\n&eCatch fish. +Guides.Fishing.Section.1=&3How does Treasure Hunter work?\n&eThis ability allows you to find treasure from fishing \n&ewith a small chance of the items being enchanted.\n&eEvery possible treasure for Fishing has a chance\n&eto drop on any level. It depends however\n&ewhat the rarity of the item is how often it will drop.\n&eThe higher your Fishing skill is, the better\n&eyour chances are to find better treasures. +Guides.Fishing.Section.2=&3How does Ice Fishing work?\n&eThis passive skill allows you to fish in ice lakes!\n&eCast your fishing rod in an ice lake and the ability will\n&ecreate a small hole in the ice to fish in. +Guides.Fishing.Section.3=&3How does Master Angler work?\n&eThis passive skill increases the bite chance while fishing.\n&eWhen you've unlocked this ability, fishing while in\n&ea boat improves odds of catching a fish. +Guides.Fishing.Section.4=&3How does Shake work?\n&eThis active ability allows you to shake items loose from mobs\n&eby hooking them with the fishing rod. \n&eMobs will drop items they would normally drop on death.\n&eIt is also possible to acquire mob skulls, which are normally \n&eunobtainable in survival mode. +Guides.Fishing.Section.5=&3How does Fisherman's Diet work?\n&eThis passive skill increases the amount of hunger restored \n&efrom eating fish. +Guides.Fishing.Section.6=&3Notes about Fishing:\n&eFishing drops are completely customizable,\n&eso results vary server to server. ##Herbalism -Guides.Herbalism.Section.0=[[DARK_AQUA]]About Herbalism:\n[[YELLOW]]Herbalism is about collecting herbs and plants.\n\n\n[[DARK_AQUA]]XP GAIN:\n[[YELLOW]]Collect plants and herbs. -Guides.Herbalism.Section.1=[[DARK_AQUA]]Compatible Blocks\n[[YELLOW]]Wheat, Potatoes, Carrots, Melons, \n[[YELLOW]]Pumpkins, Sugar Canes, Cocoa Beans, Flowers, Cacti, Mushrooms,\n[[YELLOW]]Nether Wart, Lily Pads, and Vines. -Guides.Herbalism.Section.2=[[DARK_AQUA]]How does Green Terra work?\n[[YELLOW]]Green Terra is an active ability, you can right-click\n[[YELLOW]]while holding a hoe to activate Green Terra.\n[[YELLOW]]Green Terra grants players a chance to get 3x drops from\n[[YELLOW]]harvesting plants. It also gives players the ability to\n[[YELLOW]]spread life into blocks and transform them using seeds\n[[YELLOW]]from your inventory. -Guides.Herbalism.Section.3=[[DARK_AQUA]]How does Green Thumb (Crops) work?\n[[YELLOW]]This passive ability will automatically replant crops when\n[[YELLOW]]harvesting.\n[[YELLOW]]Your chance of success depends on your Herbalism skill. -Guides.Herbalism.Section.4=[[DARK_AQUA]]How does Green Thumb (Cobble/Stone Brick/Dirt) work?\n[[YELLOW]]This active ability allows you to turn blocks into their\n[[YELLOW]]"plant-related" counterparts. You can do this by right-clicking\n[[YELLOW]]a block, while holding seeds. This will consume 1 seed. -Guides.Herbalism.Section.5=[[DARK_AQUA]]How does Farmer's Diet work?\n[[YELLOW]]This passive skill increases the amount of hunger restored \n[[YELLOW]]when eating Bread, Cookies, Melons, Mushroom Soup, Carrots,\n[[YELLOW]]and Potatoes. -Guides.Herbalism.Section.6=[[DARK_AQUA]]How does Hylian Luck work?\n[[YELLOW]]This passive ability gives you a chance to find rare items\n[[YELLOW]]when certain blocks are broken with a sword. -Guides.Herbalism.Section.7=[[DARK_AQUA]]How do Double Drops work?\n[[YELLOW]]This passive ability gives players more yield from their\n[[YELLOW]]harvests. +Guides.Herbalism.Section.0=&3About Herbalism:\n&eHerbalism is about collecting herbs and plants.\n\n\n&3XP GAIN:\n&eCollect plants and herbs. +Guides.Herbalism.Section.1=&3Compatible Blocks\n&eWheat, Potatoes, Carrots, Melons, \n&ePumpkins, Sugar Canes, Cocoa Beans, Flowers, Cacti, Mushrooms,\n&eNether Wart, Lily Pads, and Vines. +Guides.Herbalism.Section.2=&3How does Green Terra work?\n&eGreen Terra is an active ability, you can right-click\n&ewhile holding a hoe to activate Green Terra.\n&eGreen Terra grants players a chance to get 3x drops from\n&eharvesting plants. It also gives players the ability to\n&espread life into blocks and transform them using seeds\n&efrom your inventory. +Guides.Herbalism.Section.3=&3How does Green Thumb (Crops) work?\n&eThis passive ability will automatically replant crops when\n&eharvesting.\n&eYour chance of success depends on your Herbalism skill. +Guides.Herbalism.Section.4=&3How does Green Thumb (Cobble/Stone Brick/Dirt) work?\n&eThis active ability allows you to turn blocks into their\n&e"plant-related" counterparts. You can do this by right-clicking\n&ea block, while holding seeds. This will consume 1 seed. +Guides.Herbalism.Section.5=&3How does Farmer's Diet work?\n&eThis passive skill increases the amount of hunger restored \n&ewhen eating Bread, Cookies, Melons, Mushroom Soup, Carrots,\n&eand Potatoes. +Guides.Herbalism.Section.6=&3How does Hylian Luck work?\n&eThis passive ability gives you a chance to find rare items\n&ewhen certain blocks are broken with a sword. +Guides.Herbalism.Section.7=&3How do Double Drops work?\n&eThis passive ability gives players more yield from their\n&eharvests. ##Mining -Guides.Mining.Section.0=[[DARK_AQUA]]About Mining:\n[[YELLOW]]Mining consists of mining stone and ores. It provides bonuses\n[[YELLOW]]to the amount of materials dropped while mining.\n\n[[DARK_AQUA]]XP GAIN:\n[[YELLOW]]To gain XP in this skill, you must mine with a pickaxe in hand.\n[[YELLOW]]Only certain blocks award XP. -Guides.Mining.Section.1=[[DARK_AQUA]]Compatible Materials:\n[[YELLOW]]Stone, Coal Ore, Iron Ore, Gold Ore, Diamond Ore, Redstone Ore,\n[[YELLOW]]Lapis Ore, Obsidian, Mossy Cobblestone, Ender Stone,\n[[YELLOW]]Glowstone, and Netherrack. -Guides.Mining.Section.2=[[DARK_AQUA]]How to use Super Breaker:\n[[YELLOW]]With a pickaxe in your hand, right click to ready your tool.\n[[YELLOW]]Once in this state, you have about 4 seconds to make contact\n[[YELLOW]]with Mining compatible materials, which will activate Super\n[[YELLOW]]Breaker. -Guides.Mining.Section.3=[[DARK_AQUA]]What is Super Breaker?\n[[YELLOW]]Super Breaker is an ability with a cooldown tied to the Mining\n[[YELLOW]]skill. It triples your chance of extra items dropping and\n[[YELLOW]]enables instant break on Mining materials. -Guides.Mining.Section.4=[[DARK_AQUA]]How to use Blast Mining:\n[[YELLOW]]With a pickaxe in hand,\n[[YELLOW]]crouch and right-click on TNT from a distance. This will cause the TNT\n[[YELLOW]]to instantly explode. -Guides.Mining.Section.5=[[DARK_AQUA]]How does Blast Mining work?\n[[YELLOW]]Blast Mining is an ability with a cooldown tied to the Mining\n[[YELLOW]]skill. It gives bonuses when mining with TNT and allows you\n[[YELLOW]]to remote detonate TNT. There are three parts to Blast Mining.\n[[YELLOW]]The first part is Bigger Bombs, which increases blast radius.\n[[YELLOW]]The second is Demolitions Expert, which decreases damage\n[[YELLOW]]from TNT explosions. The third part simply increases the\n[[YELLOW]]amount of ores dropped from TNT and decreases the\n[[YELLOW]]debris dropped. +Guides.Mining.Section.0=&3About Mining:\n&eMining consists of mining stone and ores. It provides bonuses\n&eto the amount of materials dropped while mining.\n\n&3XP GAIN:\n&eTo gain XP in this skill, you must mine with a pickaxe in hand.\n&eOnly certain blocks award XP. +Guides.Mining.Section.1=&3Compatible Materials:\n&eStone, Coal Ore, Iron Ore, Gold Ore, Diamond Ore, Redstone Ore,\n&eLapis Ore, Obsidian, Mossy Cobblestone, Ender Stone,\n&eGlowstone, and Netherrack. +Guides.Mining.Section.2=&3How to use Super Breaker:\n&eWith a pickaxe in your hand, right click to ready your tool.\n&eOnce in this state, you have about 4 seconds to make contact\n&ewith Mining compatible materials, which will activate Super\n&eBreaker. +Guides.Mining.Section.3=&3What is Super Breaker?\n&eSuper Breaker is an ability with a cooldown tied to the Mining\n&eskill. It triples your chance of extra items dropping and\n&eenables instant break on Mining materials. +Guides.Mining.Section.4=&3How to use Blast Mining:\n&eWith a pickaxe in hand,\n&ecrouch and right-click on TNT from a distance. This will cause the TNT\n&eto instantly explode. +Guides.Mining.Section.5=&3How does Blast Mining work?\n&eBlast Mining is an ability with a cooldown tied to the Mining\n&eskill. It gives bonuses when mining with TNT and allows you\n&eto remote detonate TNT. There are three parts to Blast Mining.\n&eThe first part is Bigger Bombs, which increases blast radius.\n&eThe second is Demolitions Expert, which decreases damage\n&efrom TNT explosions. The third part simply increases the\n&eamount of ores dropped from TNT and decreases the\n&edebris dropped. ##Repair -Guides.Repair.Section.0=[[DARK_AQUA]]About Repair:\n[[YELLOW]]Repair allows you to use an iron block to repair armor and\n[[YELLOW]]tools.\n\n[[DARK_AQUA]]XP GAIN:\n[[YELLOW]]Repair tools or armor using the mcMMO Anvil. This is an\n[[YELLOW]]iron block by default and should not be confused with\n[[YELLOW]]the Vanilla Minecraft Anvil. -Guides.Repair.Section.1=[[DARK_AQUA]]How can I use Repair?\n[[YELLOW]]Place down a mcMMO Anvil and right-click to repair the item \n[[YELLOW]]you're currently holding. This consumes 1 item on every use. -Guides.Repair.Section.2=[[DARK_AQUA]]How does Repair Mastery work?\n[[YELLOW]]Repair Mastery increases the repair amount. The extra amount\n[[YELLOW]]repaired is influenced by your Repair skill level. -Guides.Repair.Section.3=[[DARK_AQUA]]How does Super Repair work?\n[[YELLOW]]Super Repair is a passive ability. When repairing an item,\n[[YELLOW]]it grants players a chance to repair an item with\n[[YELLOW]]double effectiveness. -Guides.Repair.Section.4=[[DARK_AQUA]]How does Arcane Forging work?\n[[YELLOW]]This passive ability allows you to repair items with a certain\n[[YELLOW]]chance of maintaining its enchantments. The enchants may be\n[[YELLOW]]kept at their existing levels, downgraded to a lower level,\n[[YELLOW]]or lost entirely. +Guides.Repair.Section.0=&3About Repair:\n&eRepair allows you to use an iron block to repair armor and\n&etools.\n\n&3XP GAIN:\n&eRepair tools or armor using the mcMMO Anvil. This is an\n&eiron block by default and should not be confused with\nðe Vanilla Minecraft Anvil. +Guides.Repair.Section.1=&3How can I use Repair?\n&ePlace down a mcMMO Anvil and right-click to repair the item \n&eyou're currently holding. This consumes 1 item on every use. +Guides.Repair.Section.2=&3How does Repair Mastery work?\n&eRepair Mastery increases the repair amount. The extra amount\n&erepaired is influenced by your Repair skill level. +Guides.Repair.Section.3=&3How does Super Repair work?\n&eSuper Repair is a passive ability. When repairing an item,\n&eit grants players a chance to repair an item with\n&edouble effectiveness. +Guides.Repair.Section.4=&3How does Arcane Forging work?\n&eThis passive ability allows you to repair items with a certain\n&echance of maintaining its enchantments. The enchants may be\n&ekept at their existing levels, downgraded to a lower level,\n&eor lost entirely. ##Salvage -Guides.Salvage.Section.0=[[DARK_AQUA]]About Salvage:\n[[YELLOW]]Salvage allows you to use a gold block to salvage armor and\n[[YELLOW]]tools.\n\n[[DARK_AQUA]]XP GAIN:\n[[YELLOW]]Salvage is a child skill of Repair and Fishing, your Salvage\n[[YELLOW]]skill level is based on your Fishing and Repair skill levels. -Guides.Salvage.Section.1=[[DARK_AQUA]]How can I use Salvage?\n[[YELLOW]]Place down a mcMMO Salvage Anvil and right-click to salvage\n[[YELLOW]]the item you're currently holding. This will break apart the item,\n[[YELLOW]]and give back materials used to craft the item.\n\n[[YELLOW]]For example, salvaging an iron pickaxe will give you iron bars. -Guides.Salvage.Section.2=[[DARK_AQUA]]How does Advanced Salvage work?\n[[YELLOW]]When unlocked, this ability allows you to salvage damaged items.\n[[YELLOW]]The yield percentage increases as you level up. A higher yield\n[[YELLOW]]means that you can get more materials back.\n[[YELLOW]]With advanced salvage you will always get 1 material back,\n[[YELLOW]]unless the item is too damaged. So you don't have to worry\n[[YELLOW]]about destroying items without getting anything in return. -Guides.Salvage.Section.3=[[DARK_AQUA]]To illustrate how this works, here's an example:\n[[YELLOW]]Let's say we salvage a gold pickaxe which is damaged for 20%,\n[[YELLOW]]this means that the maximum amount you could get is only 2\n[[YELLOW]](because the pick is crafted with 3 ingots - each worth\n[[YELLOW]]33,33% durability) which is equal to 66%. If your yield\n[[YELLOW]]percentage is below 66% you are not able to get 2 ingots.\n[[YELLOW]]If it is above this value you are able to gain the "full amount",\n[[YELLOW]]which means that you will get 2 ingots. -Guides.Salvage.Section.4=[[DARK_AQUA]]How does Arcane Salvage work?\n[[YELLOW]]This ability allows you to get enchanted books when salvaging\n[[YELLOW]]enchanted items. Depending on your level the chance of\n[[YELLOW]]successfully extracting a full or partial enchantment varies.\n\n[[YELLOW]]When an enchantment is partially extracted, the enchantment\n[[YELLOW]]book will have a lower level enchantment compared to what\n[[YELLOW]]it was on the item. +Guides.Salvage.Section.0=&3About Salvage:\n&eSalvage allows you to use a gold block to salvage armor and\n&etools.\n\n&3XP GAIN:\n&eSalvage is a child skill of Repair and Fishing, your Salvage\n&eskill level is based on your Fishing and Repair skill levels. +Guides.Salvage.Section.1=&3How can I use Salvage?\n&ePlace down a mcMMO Salvage Anvil and right-click to salvage\nðe item you're currently holding. This will break apart the item,\n&eand give back materials used to craft the item.\n\n&eFor example, salvaging an iron pickaxe will give you iron bars. +Guides.Salvage.Section.2=&3How does Advanced Salvage work?\n&eWhen unlocked, this ability allows you to salvage damaged items.\n&eThe yield percentage increases as you level up. A higher yield\n&emeans that you can get more materials back.\n&eWith advanced salvage you will always get 1 material back,\n&eunless the item is too damaged. So you don't have to worry\n&eabout destroying items without getting anything in return. +Guides.Salvage.Section.3=&3To illustrate how this works, here's an example:\n&eLet's say we salvage a gold pickaxe which is damaged for 20%,\nðis means that the maximum amount you could get is only 2\n&e(because the pick is crafted with 3 ingots - each worth\n&e33,33% durability) which is equal to 66%. If your yield\n&epercentage is below 66% you are not able to get 2 ingots.\n&eIf it is above this value you are able to gain the "full amount",\n&ewhich means that you will get 2 ingots. +Guides.Salvage.Section.4=&3How does Arcane Salvage work?\n&eThis ability allows you to get enchanted books when salvaging\n&eenchanted items. Depending on your level the chance of\n&esuccessfully extracting a full or partial enchantment varies.\n\n&eWhen an enchantment is partially extracted, the enchantment\n&ebook will have a lower level enchantment compared to what\n&eit was on the item. ##Smelting Guides.Smelting.Section.0=Coming soon... ##Swords -Guides.Swords.Section.0=[[DARK_AQUA]]About Swords:\n[[YELLOW]]This skill awards combat bonuses to anyone fighting with a\n[[YELLOW]]sword.\n\n[[DARK_AQUA]]XP GAIN:\n[[YELLOW]]XP is gained based on the amount of damage dealt to mobs or \n[[YELLOW]]other players when wielding a sword. -Guides.Swords.Section.1=[[DARK_AQUA]]How does Serrated Strikes work?\n[[YELLOW]]Serrated Strikes is an active ability, you can activate it by\n[[YELLOW]]right-clicking with a sword. This ability allows you to deal \n[[YELLOW]]an AoE (Area of Effect) hit. This AoE will do a bonus 25%\n[[YELLOW]]damage and will inflict a bleed effect that lasts for 5 ticks. -Guides.Swords.Section.2=[[DARK_AQUA]]How does Counter Attack work?\n[[YELLOW]]Counter Attack is an active ability. When blocking and taking\n[[YELLOW]]hits from mobs, you will have a chance to reflect 50% of \n[[YELLOW]]the damage that was taken. -Guides.Swords.Section.3=[[DARK_AQUA]]How does Rupture work?\n[[YELLOW]]Rupture causes enemies to take damage every two seconds. The \n[[YELLOW]]target will bleed until the effect wears off, or death, \n[[YELLOW]]whichever comes first.\n[[YELLOW]]The duration of the bleed is increased by your sword skill. +Guides.Swords.Section.0=&3About Swords:\n&eThis skill awards combat bonuses to anyone fighting with a\n&esword.\n\n&3XP GAIN:\n&eXP is gained based on the amount of damage dealt to mobs or \n&eother players when wielding a sword. +Guides.Swords.Section.1=&3How does Serrated Strikes work?\n&eSerrated Strikes is an active ability, you can activate it by\n&eright-clicking with a sword. This ability allows you to deal \n&ean AoE (Area of Effect) hit. This AoE will do a bonus 25%\n&edamage and may apply Rupture +Guides.Swords.Section.2=&3How does Counter Attack work?\n&eCounter Attack is an active ability. When blocking and taking\n&ehits from mobs, you will have a chance to reflect 50% of \nðe damage that was taken. +Guides.Swords.Section.3=&3How does Rupture work?\n&eRupture causes enemies to take damage every two seconds. The \n&etarget will bleed until the effect wears off, or death, \n&ewhichever comes first.\n&eThe duration of the bleed is increased by your sword skill. ##Taming -Guides.Taming.Section.0=[[DARK_AQUA]]About Taming:\n[[YELLOW]]Taming will give players various combat bonuses when using\n[[YELLOW]]tamed wolves.\n\n[[DARK_AQUA]]XP GAIN:\n[[YELLOW]]To gain XP in this skill, you need to tame wolves/ocelots or\n[[YELLOW]]get into combat with your wolves. -Guides.Taming.Section.1=[[DARK_AQUA]]How does Call of the Wild work?\n[[YELLOW]]Call of the Wild is an active ability that will allow you to summon\n[[YELLOW]]a wolf or an ocelot by your side. You can do this by\n[[YELLOW]]sneaking + left-clicking while holding bones or fish. -Guides.Taming.Section.2=[[DARK_AQUA]]How does Beast Lore work?\n[[YELLOW]]Beast Lore allows players to inspect pets and to check the\n[[YELLOW]]stats of wolves and ocelots. Left-click a wolf or ocelot to use\n[[YELLOW]]Beast Lore. -Guides.Taming.Section.3=[[DARK_AQUA]]How does Gore work?\n[[YELLOW]]Gore is a passive ability that has a chance of inflicting a\n[[YELLOW]]bleeding effect on your wolves' targets. -Guides.Taming.Section.4=[[DARK_AQUA]]How does Sharpened Claws work?\n[[YELLOW]]Sharpened Claws provides a damage bonus to damage dealt\n[[YELLOW]]by wolves. The damage bonus depends on your Taming level. -Guides.Taming.Section.5=[[DARK_AQUA]]How does Environmentally Aware work?\n[[YELLOW]]This passive ability will allow wolves to teleport to you when\n[[YELLOW]]they get near hazards, such as Cacti/Lava. It will also give\n[[YELLOW]]wolves fall damage immunity. -Guides.Taming.Section.6=[[DARK_AQUA]]How does Thick Fur work?\n[[YELLOW]]This passive ability will reduce damage and make wolves\n[[YELLOW]]fire resistant. -Guides.Taming.Section.7=[[DARK_AQUA]]How does Shock Proof work?\n[[YELLOW]]This passive ability reduces damage done to wolves\n[[YELLOW]]from explosions. -Guides.Taming.Section.8=[[DARK_AQUA]]How does Fast Food Service work?\n[[YELLOW]]This passive ability gives wolves a chance to heal whenever\n[[YELLOW]]they perform an attack. +Guides.Taming.Section.0=&3About Taming:\n&eTaming will give players various combat bonuses when using\n&etamed wolves.\n\n&3XP GAIN:\n&eTo gain XP in this skill, you need to tame wolves/ocelots or\n&eget into combat with your wolves. +Guides.Taming.Section.1=&3How does Call of the Wild work?\n&eCall of the Wild is an active ability that will allow you to summon\n&ea wolf or an ocelot by your side. You can do this by\n&esneaking + left-clicking while holding bones or fish. +Guides.Taming.Section.2=&3How does Beast Lore work?\n&eBeast Lore allows players to inspect pets and to check the\n&estats of wolves and ocelots. Left-click a wolf or ocelot to use\n&eBeast Lore. +Guides.Taming.Section.3=&3How does Gore work?\n&eGore is a passive ability that has a chance of inflicting a\n&ebleeding effect on your wolves' targets. +Guides.Taming.Section.4=&3How does Sharpened Claws work?\n&eSharpened Claws provides a damage bonus to damage dealt\n&eby wolves. The damage bonus depends on your Taming level. +Guides.Taming.Section.5=&3How does Environmentally Aware work?\n&eThis passive ability will allow wolves to teleport to you when\nðey get near hazards, such as Cacti/Lava. It will also give\n&ewolves fall damage immunity. +Guides.Taming.Section.6=&3How does Thick Fur work?\n&eThis passive ability will reduce damage and make wolves\n&efire resistant. +Guides.Taming.Section.7=&3How does Shock Proof work?\n&eThis passive ability reduces damage done to wolves\n&efrom explosions. +Guides.Taming.Section.8=&3How does Fast Food Service work?\n&eThis passive ability gives wolves a chance to heal whenever\nðey perform an attack. ##Unarmed -Guides.Unarmed.Section.0=[[DARK_AQUA]]About Unarmed:\n[[YELLOW]]Unarmed will give players various combat bonuses when using\n[[YELLOW]]your fists as a weapon. \n\n[[DARK_AQUA]]XP GAIN:\n[[YELLOW]]XP is gained based on the amount of damage dealt to mobs \n[[YELLOW]]or other players when unarmed. -Guides.Unarmed.Section.1=[[DARK_AQUA]]How does Berserk work?\n[[YELLOW]]Beserk is an active ability that is activated by\n[[YELLOW]]right-clicking. While in Beserk mode, you deal 50% more\n[[YELLOW]]damage and you can break weak materials instantly, such as\n[[YELLOW]]Dirt and Grass. -Guides.Unarmed.Section.2=[[DARK_AQUA]]How does Iron Arm work?\n[[YELLOW]]Iron Arm increases the damage dealt when hitting mobs or\n[[YELLOW]]players with your fists. -Guides.Unarmed.Section.3=[[DARK_AQUA]]How does Arrow Deflect work?\n[[YELLOW]]Arrow Deflect is a passive ability that gives you a chance\n[[YELLOW]]to deflect arrows shot by Skeletons or other players.\n[[YELLOW]]The arrow will fall harmlessly to the ground. -Guides.Unarmed.Section.4=[[DARK_AQUA]]How does Iron Grip work?\n[[YELLOW]]Iron Grip is a passive ability that counters disarm. As your\n[[YELLOW]]unarmed level increases, the chance of preventing a disarm increases. -Guides.Unarmed.Section.5=[[DARK_AQUA]]How does Disarm work?\n[[YELLOW]]This passive ability allows players to disarm other players,\n[[YELLOW]]causing the target's equipped item to fall to the ground. +Guides.Unarmed.Section.0=&3About Unarmed:\n&eUnarmed will give players various combat bonuses when using\n&eyour fists as a weapon. \n\n&3XP GAIN:\n&eXP is gained based on the amount of damage dealt to mobs \n&eor other players when unarmed. +Guides.Unarmed.Section.1=&3How does Berserk work?\n&eBeserk is an active ability that is activated by\n&eright-clicking. While in Beserk mode, you deal 50% more\n&edamage and you can break weak materials instantly, such as\n&eDirt and Grass. +Guides.Unarmed.Section.2=&3How does Steel Arm Style work?\n&eSteel Arm Style increases the damage dealt when hitting mobs or\n&eplayers with your fists. +Guides.Unarmed.Section.3=&3How does Arrow Deflect work?\n&eArrow Deflect is a passive ability that gives you a chance\n&eto deflect arrows shot by Skeletons or other players.\n&eThe arrow will fall harmlessly to the ground. +Guides.Unarmed.Section.4=&3How does Iron Grip work?\n&eIron Grip is a passive ability that counters disarm. As your\n&eunarmed level increases, the chance of preventing a disarm increases. +Guides.Unarmed.Section.5=&3How does Disarm work?\n&eThis passive ability allows players to disarm other players,\n&ecausing the target's equipped item to fall to the ground. ##Woodcutting -Guides.Woodcutting.Section.0=[[DARK_AQUA]]About Woodcutting:\n[[YELLOW]]Woodcutting is all about chopping down trees.\n\n[[DARK_AQUA]]XP GAIN:\n[[YELLOW]]XP is gained whenever you break log blocks. -Guides.Woodcutting.Section.1=[[DARK_AQUA]]How does Tree Feller work?\n[[YELLOW]]Tree Feller is an active ability, you can right-click\n[[YELLOW]]while holding an ax to activate Tree Feller. This will\n[[YELLOW]]cause the entire tree to break instantly, dropping all\n[[YELLOW]]of its logs at once. -Guides.Woodcutting.Section.2=[[DARK_AQUA]]How does Leaf Blower work?\n[[YELLOW]]Leaf Blower is a passive ability that will cause leaf\n[[YELLOW]]blocks to break instantly when hit with an axe. By default,\n[[YELLOW]]this ability unlocks at level 100. -Guides.Woodcutting.Section.3=[[DARK_AQUA]]How do Double Drops work?\n[[YELLOW]]This passive ability gives you a chance to obtain an extra\n[[YELLOW]]block for every log you chop. +Guides.Woodcutting.Section.0=&3About Woodcutting:\n&eWoodcutting is all about chopping down trees.\n\n&3XP GAIN:\n&eXP is gained whenever you break log blocks. +Guides.Woodcutting.Section.1=&3How does Tree Feller work?\n&eTree Feller is an active ability, you can right-click\n&ewhile holding an ax to activate Tree Feller. This will\n&ecause the entire tree to break instantly, dropping all\n&eof its logs at once. +Guides.Woodcutting.Section.2=&3How does Leaf Blower work?\n&eLeaf Blower is a passive ability that will cause leaf\n&eblocks to break instantly when hit with an axe. By default,\nðis ability unlocks at level 100. +Guides.Woodcutting.Section.3=&3How do Double Drops work?\n&eThis passive ability gives you a chance to obtain an extra\n&eblock for every log you chop. #INSPECT -Inspect.Offline= [[RED]]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.Offline= &cYou do not have permission to inspect offline players! +Inspect.OfflineStats=mcMMO Stats for Offline Player &e{0} +Inspect.Stats=&amcMMO Stats for &e{0} Inspect.TooFar=You are too far away to inspect that player! #ITEMS -Item.ChimaeraWing.Fail=[[RED]]**CHIMAERA WING FAILED!** +Item.ChimaeraWing.Fail=&c**CHIMAERA WING FAILED!** Item.ChimaeraWing.Pass=**CHIMAERA WING** Item.ChimaeraWing.Name=Chimaera Wing -Item.ChimaeraWing.Lore=[[GRAY]]Teleports you to your bed. -Item.ChimaeraWing.NotEnough=You need [[YELLOW]]{0}[[RED]] more [[GOLD]]{1}[[RED]]! -Item.NotEnough=You need [[YELLOW]]{0}[[RED]] more [[GOLD]]{1}[[RED]]! -Item.Generic.Wait=You need to wait before you can use this again! [[YELLOW]]({0}s) -Item.Injured.Wait=You were injured recently and must wait to use this. [[YELLOW]]({0}s) +Item.ChimaeraWing.Lore=&7Teleports you to your bed. +Item.ChimaeraWing.NotEnough=You need &e{0}&c more &6{1}&c! +Item.NotEnough=You need &e{0}&c more &6{1}&c! +Item.Generic.Wait=You need to wait before you can use this again! &e({0}s) +Item.Injured.Wait=You were injured recently and must wait to use this. &e({0}s) Item.FluxPickaxe.Name=Flux Pickaxe -Item.FluxPickaxe.Lore.1=[[GRAY]]Has a chance of instantly smelting ores. -Item.FluxPickaxe.Lore.2=[[GRAY]]Requires Smelting level {0}+ +Item.FluxPickaxe.Lore.1=&7Has a chance of instantly smelting ores. +Item.FluxPickaxe.Lore.2=&7Requires Smelting level {0}+ #TELEPORTATION -Teleport.Commencing=[[GRAY]]Commencing teleport in [[GOLD]]({0}) [[GRAY]]seconds, please stand still... -Teleport.Cancelled=[[DARK_RED]]Teleportation canceled! +Teleport.Commencing=&7Commencing teleport in &6({0}) &7seconds, please stand still... +Teleport.Cancelled=&4Teleportation canceled! #SKILLS -Skills.Child=[[GOLD]](CHILD SKILL) -Skills.Disarmed=[[DARK_RED]]You have been disarmed! -Skills.Header=-----[] [[GREEN]]{0}[[RED]] []----- -Skills.NeedMore=[[DARK_RED]]You need more [[GRAY]]{0} -Skills.NeedMore.Extra=[[DARK_RED]]You need more [[GRAY]]{0}{1} +Skills.Child=&6(CHILD SKILL) +Skills.Disarmed=&4You have been disarmed! +Skills.Header=-----[] &a{0}&c []----- +Skills.NeedMore=&4You need more &7{0} +Skills.NeedMore.Extra=&4You need more &7{0}{1} 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.Stats={0}&a{1}&3 XP(&7{2}&3/&7{3}&3) +Skills.ChildStats={0}&a{1} Skills.MaxXP=Max -Skills.TooTired=You are too tired to use that ability again. [[YELLOW]]({0}s) -Skills.Cancelled=[[GOLD]]{0} [[RED]]cancelled! -Skills.ConfirmOrCancel=[[GREEN]]Right-click again to confirm [[GOLD]]{0}[[GREEN]]. Left-click to cancel. -Skills.AbilityGateRequirementFail=[[GRAY]]You require [[YELLOW]]{0}[[GRAY]] more levels of [[DARK_AQUA]]{1}[[GRAY]] to use this super ability. +Skills.TooTired=You are too tired to use that ability again. &e({0}s) +Skills.TooTired.Named=&7(&6{0}&e {1}s&7) +Skills.TooTired.Extra=&6{0} &eSuper Ability CDs - {1} +Skills.Cancelled=&6{0} &ccancelled! +Skills.ConfirmOrCancel=&aRight-click again to confirm &6{0}&a. Left-click to cancel. +Skills.AbilityGateRequirementFail=&7You require &e{0}&7 more levels of &3{1}&7 to use this super ability. #STATISTICS -Stats.Header.Combat=[[GOLD]]-=COMBAT SKILLS=- -Stats.Header.Gathering=[[GOLD]]-=GATHERING SKILLS=- -Stats.Header.Misc=[[GOLD]]-=MISC SKILLS=- -Stats.Own.Stats=[[GREEN]][mcMMO] Stats +Stats.Header.Combat=&6-=COMBAT SKILLS=- +Stats.Header.Gathering=&6-=GATHERING SKILLS=- +Stats.Header.Misc=&6-=MISC SKILLS=- +Stats.Own.Stats=&a[mcMMO] Stats #PERKS Perks.XP.Name=Experience Perks.XP.Desc=Receive boosted XP in certain skills. 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.Lucky.Bonus=&6 ({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) +Perks.ActivationTime.Bonus=&6 ({0}s with Endurance Perk) #HARDCORE -Hardcore.Mode.Disabled=[[GOLD]][mcMMO] Hardcore mode {0} disabled for {1}. -Hardcore.Mode.Enabled=[[GOLD]][mcMMO] Hardcore mode {0} enabled for {1}. +Hardcore.Mode.Disabled=&6[mcMMO] Hardcore mode {0} disabled for {1}. +Hardcore.Mode.Enabled=&6[mcMMO] Hardcore mode {0} enabled for {1}. Hardcore.DeathStatLoss.Name=Skill Death Penalty -Hardcore.DeathStatLoss.PlayerDeath=[[GOLD]][mcMMO] [[DARK_RED]]You have lost [[BLUE]]{0}[[DARK_RED]] levels from death. -Hardcore.DeathStatLoss.PercentageChanged=[[GOLD]][mcMMO] The stat loss percentage was changed to {0}. +Hardcore.DeathStatLoss.PlayerDeath=&6[mcMMO] &4You have lost &9{0}&4 levels from death. +Hardcore.DeathStatLoss.PercentageChanged=&6[mcMMO] The stat loss percentage was changed to {0}. Hardcore.Vampirism.Name=Vampirism -Hardcore.Vampirism.Killer.Failure=[[GOLD]][mcMMO] [[YELLOW]]{0}[[GRAY]] was too unskilled to grant you any knowledge. -Hardcore.Vampirism.Killer.Success=[[GOLD]][mcMMO] [[DARK_AQUA]]You have stolen [[BLUE]]{0}[[DARK_AQUA]] levels from [[YELLOW]]{1}. -Hardcore.Vampirism.Victim.Failure=[[GOLD]][mcMMO] [[YELLOW]]{0}[[GRAY]] was unable to steal knowledge from you! -Hardcore.Vampirism.Victim.Success=[[GOLD]][mcMMO] [[YELLOW]]{0}[[DARK_RED]] has stolen [[BLUE]]{1}[[DARK_RED]] levels from you! -Hardcore.Vampirism.PercentageChanged=[[GOLD]][mcMMO] The stat leech percentage was changed to {0}. +Hardcore.Vampirism.Killer.Failure=&6[mcMMO] &e{0}&7 was too unskilled to grant you any knowledge. +Hardcore.Vampirism.Killer.Success=&6[mcMMO] &3You have stolen &9{0}&3 levels from &e{1}. +Hardcore.Vampirism.Victim.Failure=&6[mcMMO] &e{0}&7 was unable to steal knowledge from you! +Hardcore.Vampirism.Victim.Success=&6[mcMMO] &e{0}&4 has stolen &9{1}&4 levels from you! +Hardcore.Vampirism.PercentageChanged=&6[mcMMO] The stat leech percentage was changed to {0}. #MOTD -MOTD.Donate=[[DARK_AQUA]]Donation Info: -MOTD.Hardcore.Enabled=[[GOLD]][mcMMO] [[DARK_AQUA]]Hardcore Mode enabled: [[DARK_RED]]{0} -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=[[GOLD]][mcMMO Perks] -MOTD.Version=[[GOLD]][mcMMO] Running version [[DARK_AQUA]]{0} -MOTD.Website=[[GOLD]][mcMMO] [[GREEN]]{0}[[YELLOW]] - mcMMO Website +MOTD.Donate=&3Donation Info: +MOTD.Hardcore.Enabled=&6[mcMMO] &3Hardcore Mode enabled: &4{0} +MOTD.Hardcore.DeathStatLoss.Stats=&6[mcMMO] &3Skill Death Penalty: &4{0}% +MOTD.Hardcore.Vampirism.Stats=&6[mcMMO] &3Vampirism Stat Leech: &4{0}% +MOTD.PerksPrefix=&6[mcMMO Perks] +MOTD.Version=&6[mcMMO] Running version &3{0} +MOTD.Website=&6[mcMMO] &a{0}&e - mcMMO Website #SMELTING Smelting.SubSkill.UnderstandingTheArt.Name=Understanding The Art Smelting.SubSkill.UnderstandingTheArt.Description=Maybe you're spending a bit too much time smelting in the caves.\nPowers up various properties of Smelting. -Smelting.SubSkill.UnderstandingTheArt.Stat=Vanilla XP Multiplier: [[YELLOW]]{0}x +Smelting.SubSkill.UnderstandingTheArt.Stat=Vanilla XP Multiplier: &e{0}x Smelting.Ability.Locked.0=LOCKED UNTIL {0}+ SKILL (VANILLA XP BOOST) Smelting.Ability.Locked.1=LOCKED UNTIL {0}+ SKILL (FLUX MINING) Smelting.SubSkill.FuelEfficiency.Name=Fuel Efficiency Smelting.SubSkill.FuelEfficiency.Description=Increase the burn time of fuel used in furnaces when smelting -Smelting.SubSkill.FuelEfficiency.Stat=Fuel Efficiency Multiplier: [[YELLOW]]{0}x +Smelting.SubSkill.FuelEfficiency.Stat=Fuel Efficiency Multiplier: &e{0}x Smelting.SubSkill.SecondSmelt.Name=Second Smelt Smelting.SubSkill.SecondSmelt.Description=Double the resources gained from smelting Smelting.SubSkill.SecondSmelt.Stat=Second Smelt Chance @@ -1081,30 +1099,49 @@ Commands.Description.xprate=Modify the mcMMO XP rate or start an mcMMO XP event UpdateChecker.Outdated=You are using an outdated version of mcMMO! UpdateChecker.NewAvailable=There is a new version available on Spigot. #SCOREBOARD HEADERS -Scoreboard.Header.PlayerStats=[[YELLOW]]mcMMO Stats -Scoreboard.Header.PlayerCooldowns=[[YELLOW]]mcMMO Cooldowns -Scoreboard.Header.PlayerRank=[[YELLOW]]mcMMO Rankings -Scoreboard.Header.PlayerInspect=[[YELLOW]]mcMMO Stats: {0} -Scoreboard.Header.PowerLevel=[[RED]]Power Level -Scoreboard.Misc.PowerLevel=[[GOLD]]Power Level -Scoreboard.Misc.Level=[[DARK_AQUA]]Level -Scoreboard.Misc.CurrentXP=[[GREEN]]Current XP -Scoreboard.Misc.RemainingXP=[[YELLOW]]Remaining XP -Scoreboard.Misc.Cooldown=[[LIGHT_PURPLE]]Cooldown -Scoreboard.Misc.Overall=[[GOLD]]Overall +Scoreboard.Header.PlayerStats=&emcMMO Stats +Scoreboard.Header.PlayerCooldowns=&emcMMO Cooldowns +Scoreboard.Header.PlayerRank=&emcMMO Rankings +Scoreboard.Header.PlayerInspect=&emcMMO Stats: {0} +Scoreboard.Header.PowerLevel=&cPower Level +Scoreboard.Misc.PowerLevel=&6Power Level +Scoreboard.Misc.Level=&3Level +Scoreboard.Misc.CurrentXP=&aCurrent XP +Scoreboard.Misc.RemainingXP=&eRemaining XP +Scoreboard.Misc.Cooldown=&dCooldown +Scoreboard.Misc.Overall=&6Overall Scoreboard.Misc.Ability=Ability #DATABASE RECOVERY -Profile.PendingLoad=[[RED]]Your mcMMO player data has not yet been loaded. -Profile.Loading.Success=[[GREEN]]Your mcMMO profile has been loaded. -Profile.Loading.FailurePlayer=[[RED]]mcMMO is having trouble loading your data, we have attempted to load it [[GREEN]]{0}[[RED]] times.[[RED]] You may want to contact the server admins about this issue. mcMMO will attempt to load your data until you disconnect, you will not gain XP or be able to use skills while the data is not loaded. -Profile.Loading.FailureNotice=[[DARK_RED]][A][[RED]] mcMMO was unable to load the player data for [[YELLOW]]{0}[[RED]]. [[LIGHT_PURPLE]]Please inspect your database setup. Attempts made so far {1}. +Profile.PendingLoad=&cYour mcMMO player data has not yet been loaded. +Profile.Loading.Success=&aYour mcMMO profile has been loaded. +Profile.Loading.FailurePlayer=&cmcMMO is having trouble loading your data, we have attempted to load it &a{0}&c times.&c You may want to contact the server admins about this issue. mcMMO will attempt to load your data until you disconnect, you will not gain XP or be able to use skills while the data is not loaded. +Profile.Loading.FailureNotice=&4[A]&c mcMMO was unable to load the player data for &e{0}&c. &dPlease inspect your database setup. Attempts made so far {1}. #Holiday -Holiday.AprilFools.Levelup=[[GOLD]]{0} is now level [[GREEN]]{1}[[GOLD]]! -Holiday.Anniversary=[[BLUE]]Happy {0} Year Anniversary!\n[[BLUE]]In honor of all of nossr50's work and all the devs, here's a firework show! +Holiday.AprilFools.Levelup=&6{0} is now level &a{1}&6! +Holiday.Anniversary=&9Happy {0} Year Anniversary!\n&9In honor of all of nossr50's work and all the devs, here's a firework show! #Reminder Messages -Reminder.Squelched=[[GRAY]]Reminder: You are currently not receiving notifications from mcMMO, to enable notifications please run the /mcnotify command again. This is an automated hourly reminder. +Reminder.Squelched=&7Reminder: You are currently not receiving notifications from mcMMO, to enable notifications please run the /mcnotify command again. This is an automated hourly reminder. #Locale -Locale.Reloaded=[[GREEN]]Locale reloaded! +Locale.Reloaded=&aLocale reloaded! #Player Leveling Stuff -LevelCap.PowerLevel=[[GOLD]]([[GREEN]]mcMMO[[GOLD]]) [[YELLOW]]You have reached the power level cap of [[RED]]{0}[[YELLOW]]. You will cease to level in skills from this point on. -LevelCap.Skill=[[GOLD]]([[GREEN]]mcMMO[[GOLD]]) [[YELLOW]]You have reached the level cap of [[RED]]{0}[[YELLOW]] for [[GOLD]]{1}[[YELLOW]]. You will cease to level in this skill from this point on. +LevelCap.PowerLevel=&6(&amcMMO&6) &eYou have reached the power level cap of &c{0}&e. You will cease to level in skills from this point on. +LevelCap.Skill=&6(&amcMMO&6) &eYou have reached the level cap of &c{0}&e for &6{1}&e. You will cease to level in this skill from this point on. +Commands.XPBar.Usage=Proper usage is /mmoxpbar +Commands.Description.mmoxpbar=Player settings for mcMMO XP bars +Commands.Description.mmocompat=Information about mcMMO and whether or not its in compatibility mode or fully functional. +Compatibility.Layer.Unsupported=&6Compatibility for &a{0}&6 is not supported by this version of Minecraft. +Compatibility.Layer.PartialSupport=&6Compatibility for &a{0}&6 is not fully supported by this version of Minecraft, but mcMMO is running a secondary system to emulate some of the missing features. +Commands.XPBar.DisableAll=&6 All mcMMO XP bars are now disabled, use /mmoxpbar reset to restore default settings. +#Modern Chat Settings +Chat.Style.Admin=&b(A) &r{0} &b\u2192 &r{1} +Chat.Style.Party=&a(P) &r{0} &a\u2192 &r{1} +Chat.Style.Party.Leader=&a(P) &r{0} &6\u2192 &r{1} +Chat.Identity.Console=&6* Console * +Chat.Channel.On=&6(&amcMMO-Chat&6) &eYour chat messages will now be automatically delivered to the &a{0}&e chat channel. +Chat.Channel.Off=&6(&amcMMO-Chat&6) &7Your chat messages will no longer be automatically delivered to specific chat channels. +Chat.Spy.Party=&6[&eSPY&6-&a{2}&6] &r{0} &b\u2192 &r{1} +Broadcasts.LevelUpMilestone=&6(&amcMMO&6) {0}&7 has reached level &a{1}&7 in &3{2}&7! +Broadcasts.PowerLevelUpMilestone=&6(&amcMMO&6) {0}&7 has reached a Power level of &a{1}&7! +Scoreboard.Recovery=Attempting to recover mcMMO scoreboard... +Scoreboard.Disabled=The mcMMO scoreboards for this server are disabled, this setting is found in mcMMO/config.yml +Scoreboard.NotSetupYet=Your mcMMO scoreboard has not been setup yet, try again later. \ No newline at end of file diff --git a/src/main/resources/locale/locale_es.properties b/src/main/resources/locale/locale_es.properties index ef38d8b78..331f4c271 100644 --- a/src/main/resources/locale/locale_es.properties +++ b/src/main/resources/locale/locale_es.properties @@ -1,116 +1,115 @@ -Acrobatics.Ability.Proc=[[GREEN]]**Aterrizaje Agraciado** -Acrobatics.Combat.Proc=[[GREEN]]**Esquivado** -Acrobatics.DodgeChance=Probabilidad de Esquivar: [[YELLOW]]{0}% +Acrobatics.Ability.Proc=&a**Aterrizaje Agraciado** +Acrobatics.Combat.Proc=&a**Esquivado** +Acrobatics.DodgeChance=Probabilidad de Esquivar: &e{0}% Acrobatics.SubSkill.Roll.Name=Rodada -Acrobatics.SubSkill.Roll.Description=Reduce o Elimina el da\u00f1o de caida +Acrobatics.SubSkill.Roll.Description=Reduce o Elimina el daño de caida Acrobatics.SubSkill.GracefulRoll.Name=Rodada Majestuosa Acrobatics.SubSkill.GracefulRoll.Description=El doble de efectivo que una rodada normal Acrobatics.SubSkill.Dodge.Name=Esquivar -Acrobatics.SubSkill.Dodge.Description=Reduce el da\u00f1o de ataque a la mitad +Acrobatics.SubSkill.Dodge.Description=Reduce el daño de ataque a la mitad Acrobatics.Listener=Acrobacias: -Acrobatics.SubSkill.Roll.Chance=Probabilidad de Rodar: [[YELLOW]]{0}% -Acrobatics.SubSkill.Roll.GraceChance=Probabilidad de Rodada Majestuosa: [[YELLOW]]{0}% +Acrobatics.SubSkill.Roll.Chance=Probabilidad de Rodar: &e{0}% +Acrobatics.SubSkill.Roll.GraceChance=Probabilidad de Rodada Majestuosa: &e{0}% Acrobatics.Roll.Text=**Rodado** Acrobatics.SkillName=ACROBACIAS Acrobatics.Skillup=Habilidad de Acrobacias incrementada en {0}. Total ({1}) -Archery.Combat.DazeChance=Probabilidad de Aturdimiento: [[YELLOW]]{0}% -Archery.Combat.RetrieveChance=Probabilidad de Recuperar Flechas: [[YELLOW]]{0} -Archery.Combat.SkillshotBonus=Da\u00f1o bonus por Habilidad de Tiro: [[YELLOW]]{0} +Archery.Combat.DazeChance=Probabilidad de Aturdimiento: &e{0}% +Archery.Combat.RetrieveChance=Probabilidad de Recuperar Flechas: &e{0} +Archery.Combat.SkillshotBonus=Daño bonus por Habilidad de Tiro: &e{0} Archery.SubSkill.SkillShot.Name=Habilidad de Tiro -Archery.SubSkill.SkillShot.Description=Incrementar da\u00f1o hecho con arcos +Archery.SubSkill.SkillShot.Description=Incrementar daño hecho con arcos Archery.SubSkill.Daze.Name=Aturdir (Jugadores) Archery.SubSkill.Daze.Description=Desorienta a los enemigos y inflige {0} DMG -Archery.SubSkill.ArrowRetrieval.Name=Recuperaci\u00f3n de Flecha +Archery.SubSkill.ArrowRetrieval.Name=Recuperación de Flecha Archery.SubSkill.ArrowRetrieval.Description=Probabilidad de recuperar flechas de los cadaveres -Archery.Listener=Arquer\u00eda: -Archery.SkillName=ARQUER\u00cdA -Archery.Skillup=Habilidad de Arquer\u00eda incrementada en {0}. Total ({1}) +Archery.Listener=Arquería: +Archery.SkillName=ARQUERÍA +Archery.Skillup=Habilidad de Arquería incrementada en {0}. Total ({1}) Axes.Ability.Bonus.0=Dominio del Hacha -Axes.Ability.Bonus.1={0} de Da\u00f1o Bonus +Axes.Ability.Bonus.1={0} de Daño Bonus Axes.Ability.Bonus.2=Impacto -Axes.Ability.Bonus.3=Aplicar un bonus de {0} de da\u00f1o a la armadura +Axes.Ability.Bonus.3=Aplicar un bonus de {0} de daño a la armadura Axes.Ability.Bonus.4=Gran Impacto -Axes.Ability.Bonus.5=Hacer {0} de da\u00f1o bonus a los enemigos sin armadura -Axes.Ability.Lower=[[GRAY]]**BAJAS TU HACHA** -Axes.Ability.Ready=[[GREEN]]**PREPARAS TU HACHA** -Axes.Combat.CritStruck=[[DARK_RED]]\u00a1Fuiste golpeado CR\u00cdTICAMENTE! -Axes.Combat.CritChance=Probabilidad de golpe cr\u00edtico: [[YELLOW]]{0}% -Axes.Combat.CriticalHit=\u00a1GOLPE CR\u00cdTICO! -Axes.Combat.GI.Proc=[[GREEN]]**GOLPEADO CON GRAN FUERZA** +Axes.Ability.Bonus.5=Hacer {0} de daño bonus a los enemigos sin armadura +Axes.Ability.Lower=&7**BAJAS TU HACHA** +Axes.Ability.Ready=&a**PREPARAS TU HACHA** +Axes.Combat.CritStruck=&4¡Fuiste golpeado CRÍTICAMENTE! +Axes.Combat.CritChance=Probabilidad de golpe crítico: &e{0}% +Axes.Combat.CriticalHit=¡GOLPE CRÍTICO! +Axes.Combat.GI.Proc=&a**GOLPEADO CON GRAN FUERZA** Axes.Combat.GI.Struck=**GOLPEADO POR IMPACTO MAYOR** -Axes.Combat.SS.Struck=[[DARK_RED]]Golpeado mediante DIVISOR DE CRANEOS! -Axes.Combat.SS.Length=Duraci\u00f3n de Parte Cr\u00e1neos: [[YELLOW]]{0}seg -Axes.SubSkill.SkullSplitter.Name=Parte Cr\u00e1neos (HABILIDAD) -Axes.SubSkill.SkullSplitter.Description=Distribuir Da\u00f1o en el \u00c1rea de Cobertura -Axes.SubSkill.CriticalStrikes.Name=Golpes Cr\u00edticos -Axes.SubSkill.CriticalStrikes.Description=Da\u00f1o Doble +Axes.Combat.SS.Struck=&4Golpeado mediante DIVISOR DE CRANEOS! +Axes.Combat.SS.Length=Duración de Parte Cráneos: &e{0}seg +Axes.SubSkill.SkullSplitter.Name=Parte Cráneos (HABILIDAD) +Axes.SubSkill.SkullSplitter.Description=Distribuir Daño en el Área de Cobertura +Axes.SubSkill.CriticalStrikes.Name=Golpes Críticos +Axes.SubSkill.CriticalStrikes.Description=Daño Doble Axes.SubSkill.AxeMastery.Name=Dominio del Hacha -Axes.SubSkill.AxeMastery.Description=Agrega da\u00f1o bonus +Axes.SubSkill.AxeMastery.Description=Agrega daño bonus Axes.SubSkill.ArmorImpact.Name=Impacto Axes.SubSkill.ArmorImpact.Description=Golpear con fuerza como para destruir armaduras Axes.SubSkill.GreaterImpact.Name=Gran Impacto -Axes.SubSkill.GreaterImpact.Description=Hacer da\u00f1o bonus a los enemigos sin armadura +Axes.SubSkill.GreaterImpact.Description=Hacer daño bonus a los enemigos sin armadura Axes.Listener=Hachas: Axes.SkillName=HACHAS -Axes.Skills.SS.Off=**Parte Cr\u00e1neos ha expirado** -Axes.Skills.SS.On=[[GREEN]]**PARTE CR\u00c1NEOS ACTIVADO** -Axes.Skills.SS.Refresh=[[GREEN]]\u00a1Tu habilidad [[YELLOW]]Parte Cr\u00e1neos [[GREEN]]est\u00e1 refrescada! -Axes.Skills.SS.Other.Off=Parte Cr\u00e1neos[[GREEN]] le ha expirado a [[YELLOW]]{0} -Axes.Skills.SS.Other.On=[[GREEN]]\u00a1{0}[[DARK_GREEN]] us\u00f3 [[RED]]Parte Cr\u00e1neos! +Axes.Skills.SS.Off=**Parte Cráneos ha expirado** +Axes.Skills.SS.On=&a**PARTE CRÁNEOS ACTIVADO** +Axes.Skills.SS.Refresh=&a¡Tu habilidad &eParte Cráneos &aestá refrescada! +Axes.Skills.SS.Other.Off=Parte Cráneos&a le ha expirado a &e{0} +Axes.Skills.SS.Other.On=&a¡{0}&2 usó &cParte Cráneos! Axes.Skillup=Habilidad de Hacha incrementada en {0}. Total ({1}) -Excavation.Ability.Lower=[[GRAY]]**BAJAS TU PALA** -Excavation.Ability.Ready=[[GREEN]]**PREPARAS TU PALA** +Excavation.Ability.Lower=&7**BAJAS TU PALA** +Excavation.Ability.Ready=&a**PREPARAS TU PALA** Excavation.SubSkill.GigaDrillBreaker.Name=Ultra Taladro Destructor (HABILIDAD) -Excavation.SubSkill.GigaDrillBreaker.Description=Triple Drop, Tripe EXP, M\u00e1s Velocidad +Excavation.SubSkill.GigaDrillBreaker.Description=Triple Drop, Tripe EXP, Más Velocidad Excavation.SubSkill.TreasureHunter.Name=Cazador de Tesoros Excavation.SubSkill.TreasureHunter.Description=Habilidad para cavar por tesoros -Excavation.Effect.Length=Duraci\u00f3n de Ultra Taladro Destructor: [[YELLOW]]{0}seg -Excavation.Listener=Excavaci\u00f3n: -Excavation.SkillName=EXCAVACI\u00d3N +Excavation.Effect.Length=Duración de Ultra Taladro Destructor: &e{0}seg +Excavation.Listener=Excavación: +Excavation.SkillName=EXCAVACIÓN Excavation.Skills.GigaDrillBreaker.Off=**Ultra Taladro Destructor ha expirado** -Excavation.Skills.GigaDrillBreaker.On=[[GREEN]]**GIGA DRILL BREAKER ACTIVADO** -Excavation.Skills.GigaDrillBreaker.Refresh=[[GREEN]]\u00a1Tu habilidad de [[YELLOW]]Ultra Taladro Destructor [[GREEN]]fue refrescada! -Excavation.Skills.GigaDrillBreaker.Other.Off=Ultra Taladro Destructor[[GREEN]] le ha expirado a [[YELLOW]]{0} -Excavation.Skills.GigaDrillBreaker.Other.On=[[GREEN]]\u00a1{0}[[DARK_GREEN]] us\u00f3 [[RED]]Ultra Taladro Destructor! -Excavation.Skillup=Habilidad de Excavaci\u00f3n incrementada en {0}. Total ({1}) -Fishing.Ability.Chance=Probabilidad de mordisco: [[YELLOW]]{0} -Fishing.Ability.Info=Cazador M\u00e1gico: [[GRAY]] **Mejora con Rango de Buscador de Tesoros** +Excavation.Skills.GigaDrillBreaker.On=&a**GIGA DRILL BREAKER ACTIVADO** +Excavation.Skills.GigaDrillBreaker.Refresh=&a¡Tu habilidad de &eUltra Taladro Destructor &afue refrescada! +Excavation.Skills.GigaDrillBreaker.Other.Off=Ultra Taladro Destructor&a le ha expirado a &e{0} +Excavation.Skills.GigaDrillBreaker.Other.On=&a¡{0}&2 usó &cUltra Taladro Destructor! +Excavation.Skillup=Habilidad de Excavación incrementada en {0}. Total ({1}) +Fishing.Ability.Chance=Probabilidad de mordisco: &e{0} +Fishing.Ability.Info=Cazador Mágico: &7 **Mejora con Rango de Buscador de Tesoros** Fishing.Ability.Locked.0=Bloqueado hasta {0}+ habilidad (sacudir) Fishing.Ability.Locked.1=Bloqueado hasta {0}+ HABILIDAD (PESCA DE HIELO) -Fishing.Ability.Rank=Cazador de Tesoros: [[YELLOW]]Rango {0}/5 -Fishing.Ability.TH.MagicRate=Probabilidad de Cazador M\u00e1gico: [[YELLOW]]{0} -Fishing.Ability.Shake=Probabilidad de esquivar: [[YELLOW]]{0} +Fishing.Ability.Rank=Cazador de Tesoros: &eRango {0}/5 +Fishing.Ability.TH.MagicRate=Probabilidad de Cazador Mágico: &e{0} +Fishing.Ability.Shake=Probabilidad de esquivar: &e{0} Fishing.Ability.IceFishing=Pesca de hielo: ve a pescar en el hielo -Fishing.Ability.FD=Dieta del pescador: [[YELLOW]]Rank {0} +Fishing.Ability.FD=Dieta del pescador: &eRank {0} Fishing.SubSkill.TreasureHunter.Name=Cazador de Tesoros (Pasivo) -Fishing.SubSkill.TreasureHunter.Description=Pescar objetos miscel\u00e1neos -Fishing.SubSkill.MagicHunter.Name=Cazador M\u00e1gico +Fishing.SubSkill.TreasureHunter.Description=Pescar objetos misceláneos +Fishing.SubSkill.MagicHunter.Name=Cazador Mágico Fishing.SubSkill.MagicHunter.Description=Encuentra Objetos Encantados Fishing.SubSkill.Shake.Name=Sacudir (contra Entidades) -Fishing.SubSkill.Shake.Description=Sacudir los items fuera de los monstruos con la ca\u00f1a de pescar +Fishing.SubSkill.Shake.Description=Sacudir los items fuera de los monstruos con la caña de pescar Fishing.SubSkill.FishermansDiet.Name=Dieta del pescador Fishing.SubSkill.FishermansDiet.Description=Mejora el hambre restaurada a partir de alimentos pescados Fishing.SubSkill.MasterAngler.Name=Maestro pescador -Fishing.SubSkill.MasterAngler.Description=Aumenta la probabilidad de ser mordido mientras se pesca Fishing.SubSkill.IceFishing.Name=Pesca de hielo Fishing.SubSkill.IceFishing.Description=Te permite pescar en biomas de hielo -Fishing.Chance.Raining=[[BLUE]] Lluvia de Bonus +Fishing.Chance.Raining=&9 Lluvia de Bonus Fishing.Listener=Pescador: -Fishing.Ability.TH.MagicFound=[[GRAY]]Sientes un toque de magia con esta pesca... +Fishing.Ability.TH.MagicFound=&7Sientes un toque de magia con esta pesca... Fishing.SkillName=PESCADOR Fishing.Skillup=Habilidad de Pescador incrementada en {0}. Total ({1}) -Herbalism.Ability.DoubleDropChance=Probabilidad de Doble Drop: [[YELLOW]]{0} -Herbalism.Ability.FD=Dieta del granjero: [[YELLOW]]Rank {0} -Herbalism.Ability.GTe.Length=Duraci\u00f3n de Tierra Verde: [[YELLOW]]{0}seg +Herbalism.Ability.DoubleDropChance=Probabilidad de Doble Drop: &e{0} +Herbalism.Ability.FD=Dieta del granjero: &eRank {0} +Herbalism.Ability.GTe.Length=Duración de Tierra Verde: &e{0}seg Herbalism.Ability.GTe.NeedMore=Necesitas mas semillas para esparcir tierra verde -Herbalism.Ability.GTh.Chance=Probabilidad de Pulgar Verde: [[YELLOW]]{0} -Herbalism.Ability.GTh.Fail=**PULGAR VERDE FALL\u00d3** -Herbalism.Ability.GTh.Stage=Etapa de pulgar verde: [[YELLOW]] Los cultivos crecen en la etapa {0} -Herbalism.Ability.GTh=[[GREEN]]**PULGAR VERDE** -Herbalism.Ability.HylianLuck=Probabilidad de Suerte de Hylian: [[YELLOW]]{0} -Herbalism.Ability.Lower=[[GRAY]]**BAJAS TU AZADA** -Herbalism.Ability.Ready=[[GREEN]]**PREPARASTE TU AZADA** -Herbalism.Ability.ShroomThumb.Chance=Probabilidad de Pulgar Hongo: [[YELLOW]]{0} +Herbalism.Ability.GTh.Chance=Probabilidad de Pulgar Verde: &e{0} +Herbalism.Ability.GTh.Fail=**PULGAR VERDE FALLÓ** +Herbalism.Ability.GTh.Stage=Etapa de pulgar verde: &e Los cultivos crecen en la etapa {0} +Herbalism.Ability.GTh=&a**PULGAR VERDE** +Herbalism.Ability.HylianLuck=Probabilidad de Suerte de Hylian: &e{0} +Herbalism.Ability.Lower=&7**BAJAS TU AZADA** +Herbalism.Ability.Ready=&a**PREPARASTE TU AZADA** +Herbalism.Ability.ShroomThumb.Chance=Probabilidad de Pulgar Hongo: &e{0} Herbalism.Ability.ShroomThumb.Fail=**PULGAR HONGO FALLIDO** Herbalism.SubSkill.GreenTerra.Name=Tierra Verde (HABILIDAD) Herbalism.SubSkill.GreenTerra.Description=Arar la Tierra, Triple Drops @@ -121,52 +120,52 @@ Herbalism.SubSkill.GreenThumb.Description.2=Haces ladrillos mohosos o hacer crec Herbalism.SubSkill.FarmersDiet.Name=Dieta del Granjero Herbalism.SubSkill.FarmersDiet.Description=Aumenta el hambre restaurada por la comida cultivada Herbalism.SubSkill.DoubleDrops.Name=Doble Drops (Todas las Hierbas) -Herbalism.SubSkill.DoubleDrops.Description=El doble del bot\u00edn normal +Herbalism.SubSkill.DoubleDrops.Description=El doble del botín normal Herbalism.SubSkill.HylianLuck.Name=Suerte de Hylian -Herbalism.SubSkill.HylianLuck.Description=Da una peque\u00f1a posibilidad de encontrar objetos raros +Herbalism.SubSkill.HylianLuck.Description=Da una pequeña posibilidad de encontrar objetos raros Herbalism.SubSkill.ShroomThumb.Name=Pulgar Hongo Herbalism.SubSkill.ShroomThumb.Description=Esparcir micelio a tierra e hierva. -Herbalism.HylianLuck=[[GREEN]]La suerte de Hyrule esta contigo hoy! +Herbalism.HylianLuck=&aLa suerte de Hyrule esta contigo hoy! Herbalism.Listener=Herbalismo: Herbalism.SkillName=HERBALISMO -Herbalism.Skills.GTe.On=[[GREEN]]**TIERRA VERDE ACTIVADO** -Herbalism.Skills.GTe.Refresh=[[GREEN]]\u00a1Tu habilidad [[YELLOW]]Tierra Verde [[GREEN]]est\u00e1 refrescada! -Herbalism.Skills.GTe.Other.Off=Tierra Verde[[GREEN]] le ha expirado a [[YELLOW]]{0} -Herbalism.Skills.GTe.Other.On=[[GREEN]]\u00a1{0}[[DARK_GREEN]] us\u00f3 [[RED]]Tierra Verde! +Herbalism.Skills.GTe.On=&a**TIERRA VERDE ACTIVADO** +Herbalism.Skills.GTe.Refresh=&a¡Tu habilidad &eTierra Verde &aestá refrescada! +Herbalism.Skills.GTe.Other.Off=Tierra Verde&a le ha expirado a &e{0} +Herbalism.Skills.GTe.Other.On=&a¡{0}&2 usó &cTierra Verde! Herbalism.Skillup=Habilidad de Herbalismo incrementada en {0}. Total ({1}) -Mining.Ability.Length=Duraci\u00f3n de Super Destructor: [[YELLOW]]{0}seg +Mining.Ability.Length=Duración de Super Destructor: &e{0}seg Mining.Ability.Locked.0=Bloqueado hasta {0} + HABILIDAD (MINERIA EXPLOSIVA) Mining.Ability.Locked.1=Bloqueado hasta {0} + HABILIDAD (MAYORES BOMBAS) Mining.Ability.Locked.2=Bloqueado hasta {0} + HABILIDAD (EXPERTO EN DEMOLICIONES) -Mining.Ability.Lower=[[GRAY]]**BAJASTE TU PICO** -Mining.Ability.Ready=[[GREEN]]**PREPARAS TU PICO** -Mining.SubSkill.SuperBreaker.Name=S\u00faper Destructor (HABILIDAD) +Mining.Ability.Lower=&7**BAJASTE TU PICO** +Mining.Ability.Ready=&a**PREPARAS TU PICO** +Mining.SubSkill.SuperBreaker.Name=Súper Destructor (HABILIDAD) Mining.SubSkill.SuperBreaker.Description=Aumento de Velocidad, Probabilidad de Triple Drop Mining.SubSkill.DoubleDrops.Name=Doble Drops -Mining.SubSkill.DoubleDrops.Description=El doble del bot\u00edn normal -Mining.SubSkill.BlastMining.Name=Miner\u00eda Explosiva -Mining.SubSkill.BlastMining.Description=Bonuses a la miner\u00eda con TNT +Mining.SubSkill.DoubleDrops.Description=El doble del botín normal +Mining.SubSkill.BlastMining.Name=Minería Explosiva +Mining.SubSkill.BlastMining.Description=Bonuses a la minería con TNT Mining.SubSkill.BiggerBombs.Name=Mayores Bombas -Mining.SubSkill.BiggerBombs.Description=Incrementa el radio de la explosi\u00f3n de TNT +Mining.SubSkill.BiggerBombs.Description=Incrementa el radio de la explosión de TNT Mining.SubSkill.DemolitionsExpertise.Name=Experto en Demoliciones -Mining.SubSkill.DemolitionsExpertise.Description=Reduce el da\u00f1o de las explosiones de TNT -Mining.Effect.Decrease=Da\u00f1o de Experto en Demolici\u00f3n Decrementado: [[YELLOW]]{0} -Mining.Effect.DropChance=Probabilidad de Doble Drop: [[YELLOW]]{0} -Mining.Listener=Miner\u00eda: -Mining.SkillName=MINER\u00cdA -Mining.Skills.SuperBreaker.Off=**S\u00faper Destructor ha expirado** -Mining.Skills.SuperBreaker.On=[[GREEN]]**S\u00daPER DESTRUCTOR ACTIVADO** -Mining.Skills.SuperBreaker.Other.Off=S\u00faper Destructor[[GREEN]] le ha expirado a [[YELLOW]]{0} -Mining.Skills.SuperBreaker.Other.On=[[GREEN]]\u00a1{0}[[DARK_GREEN]] us\u00f3 [[RED]]Super Destructor! -Mining.Skills.SuperBreaker.Refresh=[[GREEN]]\u00a1Tu habilidad de [[YELLOW]]S\u00faper Destructor [[GREEN]]est\u00e1 refrescada! -Mining.Skillup=Habilidad de Miner\u00eda incrementada en {0}. Total ({1}) -Mining.Blast.Boom=[[GRAY]]**BOOM** +Mining.SubSkill.DemolitionsExpertise.Description=Reduce el daño de las explosiones de TNT +Mining.Effect.Decrease=Daño de Experto en Demolición Decrementado: &e{0} +Mining.Effect.DropChance=Probabilidad de Doble Drop: &e{0} +Mining.Listener=Minería: +Mining.SkillName=MINERÍA +Mining.Skills.SuperBreaker.Off=**Súper Destructor ha expirado** +Mining.Skills.SuperBreaker.On=&a**SÚPER DESTRUCTOR ACTIVADO** +Mining.Skills.SuperBreaker.Other.Off=Súper Destructor&a le ha expirado a &e{0} +Mining.Skills.SuperBreaker.Other.On=&a¡{0}&2 usó &cSuper Destructor! +Mining.Skills.SuperBreaker.Refresh=&a¡Tu habilidad de &eSúper Destructor &aestá refrescada! +Mining.Skillup=Habilidad de Minería incrementada en {0}. Total ({1}) +Mining.Blast.Boom=&7**BOOM** Mining.Blast.Effect=+ {0} mineral de rendimiento, {1} x drops -Mining.Blast.Radius.Increase=Incrementado Radio de Explosi\u00f3n: [[YELLOW]]+{0} -Mining.Blast.Rank=Miner\u00eda Explosiva: [[YELLOW]] Rango {0}/8 [[GRAY]]({1}) -Mining.Blast.Other.On=[[GREEN]]\u00a1{0}[[DARK_GREEN]] us\u00f3 [[RED]]Miner\u00eda Explosiva! -Mining.Blast.Refresh=[[GREEN]]\u00a1Tu habilidad de [[YELLOW]]Miner\u00eda Explosiva [[GREEN]]est\u00e1 refrescada! -Repair.SubSkill.Repair.Name=Reparaci\u00f3n +Mining.Blast.Radius.Increase=Incrementado Radio de Explosión: &e+{0} +Mining.Blast.Rank=Minería Explosiva: &e Rango {0}/8 &7({1}) +Mining.Blast.Other.On=&a¡{0}&2 usó &cMinería Explosiva! +Mining.Blast.Refresh=&a¡Tu habilidad de &eMinería Explosiva &aestá refrescada! +Repair.SubSkill.Repair.Name=Reparación Repair.SubSkill.Repair.Description=Reparar Herramientas y Armaduras Repair.SubSkill.GoldRepair.Name=Reparar Oro (HABILIDAD {0}+) Repair.SubSkill.GoldRepair.Description=Reparar Herramientas y Armaduras de Oro @@ -174,137 +173,137 @@ Repair.SubSkill.IronRepair.Name=Reparar Metal (HABILIDAD {0}+) Repair.SubSkill.IronRepair.Description=Reparar Herramientas y Armaduras de Metal Repair.SubSkill.StoneRepair.Name=Reparar Piedra (HABILIDAD {0}+) Repair.SubSkill.StoneRepair.Description=Reparar Herramientas de Piedra -Repair.SubSkill.RepairMastery.Name=Maestr\u00eda de la Reparaci\u00f3n -Repair.SubSkill.RepairMastery.Description=Cantidad de reparaci\u00f3n Incrementada -Repair.SubSkill.SuperRepair.Name=S\u00faper Reparaci\u00f3n +Repair.SubSkill.RepairMastery.Name=Maestría de la Reparación +Repair.SubSkill.RepairMastery.Description=Cantidad de reparación Incrementada +Repair.SubSkill.SuperRepair.Name=Súper Reparación Repair.SubSkill.SuperRepair.Description=Doble Efectividad -Repair.SubSkill.DiamondRepair.Name=Reparaci\u00f3n de Diamante ({0}+ SKILL) +Repair.SubSkill.DiamondRepair.Name=Reparación de Diamante ({0}+ SKILL) Repair.SubSkill.DiamondRepair.Description=Reparar Herramientas y Armaduras de Diamante Repair.SubSkill.ArcaneForging.Name=Forjado Arcano -Repair.SubSkill.ArcaneForging.Description=Reparar objetos m\u00e1gicos +Repair.SubSkill.ArcaneForging.Description=Reparar objetos mágicos Repair.SubSkill.Salvage.Name=Rescatado ({0}+ HABILIDAD) -Repair.SubSkill.Salvage.Description=[[DARK_RED]]Haz colocado un yunque, utiliza esto para reparar herramientas y armaduras. -Repair.Error=[[DARK_RED]]mcMMO encontro un error al intentar reparar este objeto! -Repair.Listener.Anvil=[[DARK_RED]]Has colocado un yunque y estos pueden usarse para reparar herramientas y armaduras. -Repair.Listener.Anvil2=[[DARK_RED]]Tu colocaste un yunque de reparaci\u00f3n, utiliza esto para arreglar herramientas y armaduras. -Repair.Listener=Reparaci\u00f3n: -Repair.SkillName=REPARACI\u00d3N -Repair.Skills.AdeptSalvage=[[DARK_RED]]No tienes la habilidad suficiente para salvar objetos. -Repair.Skills.AdeptDiamond=[[DARK_RED]]No tienes la suficiente habilidad para reparar Diamante. -Repair.Skills.AdeptGold=[[DARK_RED]]No tienes la suficiente habilidad para reparar Oro. -Repair.Skills.AdeptIron=[[DARK_RED]]No tienes la suficiente habilidad para reparar Hierro. -Repair.Skills.AdeptStone=[[DARK_RED]]No tienes la suficiente habilidad para reparar Piedra. -Repair.Skills.Adept=Debes ser nivel [[YELLOW]]{0}[[RED]] para reparar [[YELLOW]]{1} -Repair.Skills.FeltEasy=[[GRAY]]Eso ha sido f\u00e1cil. -Repair.Skills.FullDurability=[[GRAY]]Esto est\u00e1 nuevo. -Repair.Skills.SalvageSuccess=[[GRAY]]Objeto recuperado! -Repair.Skills.NotFullDurability=[[DARK_RED]] No se puede rescatar los elementos da\u00f1ados. -Repair.Skills.Mastery=Maestr\u00eda de la Reparaci\u00f3n: [[YELLOW]]{0} de durabilidad adicional restaurada -Repair.Skills.StackedItems=[[DARK_RED]]No puedes reparar items apilados. -Repair.Skills.Super.Chance=Probabilidad de Super Reparaci\u00f3n: [[YELLOW]]{0} -Repair.Skillup=Habilidad de Reparaci\u00f3n incrementada en {0}. Total ({1}) +Repair.SubSkill.Salvage.Description=&4Haz colocado un yunque, utiliza esto para reparar herramientas y armaduras. +Repair.Error=&4mcMMO encontro un error al intentar reparar este objeto! +Repair.Listener.Anvil=&4Has colocado un yunque y estos pueden usarse para reparar herramientas y armaduras. +Repair.Listener.Anvil2=&4Tu colocaste un yunque de reparación, utiliza esto para arreglar herramientas y armaduras. +Repair.Listener=Reparación: +Repair.SkillName=REPARACIÓN +Repair.Skills.AdeptSalvage=&4No tienes la habilidad suficiente para salvar objetos. +Repair.Skills.AdeptDiamond=&4No tienes la suficiente habilidad para reparar Diamante. +Repair.Skills.AdeptGold=&4No tienes la suficiente habilidad para reparar Oro. +Repair.Skills.AdeptIron=&4No tienes la suficiente habilidad para reparar Hierro. +Repair.Skills.AdeptStone=&4No tienes la suficiente habilidad para reparar Piedra. +Repair.Skills.Adept=Debes ser nivel &e{0}&c para reparar &e{1} +Repair.Skills.FeltEasy=&7Eso ha sido fácil. +Repair.Skills.FullDurability=&7Esto está nuevo. +Repair.Skills.SalvageSuccess=&7Objeto recuperado! +Repair.Skills.NotFullDurability=&4 No se puede rescatar los elementos dañados. +Repair.Skills.Mastery=Maestría de la Reparación: &e{0} de durabilidad adicional restaurada +Repair.Skills.StackedItems=&4No puedes reparar items apilados. +Repair.Skills.Super.Chance=Probabilidad de Super Reparación: &e{0} +Repair.Skillup=Habilidad de Reparación incrementada en {0}. Total ({1}) Repair.Pretty.Name=Reparar Salvage.Pretty.Name=Objetos salvados -Repair.Arcane.Chance.Downgrade=[[GRAY]]Probabilidad de Degradaci\u00f3n en FA: [[YELLOW]]{0}% -Repair.Arcane.Chance.Success=[[GRAY]]Tasa de \u00c9xito de FA: [[YELLOW]]{0}% -Repair.Arcane.Downgrade=El poder Arcano de este objeto ha disminu\u00eddo. +Repair.Arcane.Chance.Downgrade=&7Probabilidad de Degradación en FA: &e{0}% +Repair.Arcane.Chance.Success=&7Tasa de Éxito de FA: &e{0}% +Repair.Arcane.Downgrade=El poder Arcano de este objeto ha disminuído. Repair.Arcane.Fail=El objeto ha perdido permanentemente sus poderes Arcanos -Repair.Arcane.Lost=No tienes habilidad suficiente para mantener ning\u00fan tipo de encantamientos. -Repair.Arcane.Perfect=[[GREEN]]Has logrado mantener las energ\u00edas Arcanas de este objeto. -Repair.Arcane.Rank=Forja Arcana: [[YELLOW]]Rango {0}/4 -Swords.Ability.Lower=[[GRAY]]**BAJAS TU ESPADA** -Swords.Ability.Ready=[[GREEN]]**PREPARASTE TU ESPADA** -Swords.Combat.Bleed.Chance=Probabilidad de Sangramiento: [[YELLOW]]{0} -Swords.Combat.Bleed.Length=Duraci\u00f3n del Sangrado: [[YELLOW]]{0} ticks -Swords.Combat.Bleed.Note=[[GRAY]]NOTA: [[YELLOW]]1 Tick sucede cada 2 segundos -Swords.Combat.Bleeding.Started=[[GREEN]]**ENEMIGO SANGRANDO** -Swords.Combat.Bleeding.Stopped=[[GRAY]]\u00a1El sangrado ha [[GREEN]]parado[[GRAY]]! -Swords.Combat.Bleeding=[[GREEN]]**ENEMIGO SANGRANDO** -Swords.Combat.Counter.Chance=Probabilidad de Contra Ataque: [[YELLOW]]{0} -Swords.Combat.Counter.Hit=[[DARK_RED]]\u00a1Alcanzado por un contra ataque! -Swords.Combat.Countered=[[GREEN]]**CONTRA-ATACADO** -Swords.Combat.SS.Struck=[[DARK_RED]]\u00a1Golpeado por ATAQUE DENTADO! +Repair.Arcane.Lost=No tienes habilidad suficiente para mantener ningún tipo de encantamientos. +Repair.Arcane.Perfect=&aHas logrado mantener las energías Arcanas de este objeto. +Repair.Arcane.Rank=Forja Arcana: &eRango {0}/4 +Swords.Ability.Lower=&7**BAJAS TU ESPADA** +Swords.Ability.Ready=&a**PREPARASTE TU ESPADA** +Swords.Combat.Bleed.Chance=Probabilidad de Sangramiento: &e{0} +Swords.Combat.Bleed.Length=Duración del Sangrado: &e{0} ticks +Swords.Combat.Bleed.Note=&7NOTA: &e1 Tick sucede cada 2 segundos +Swords.Combat.Bleeding.Started=&a**ENEMIGO SANGRANDO** +Swords.Combat.Bleeding.Stopped=&7¡El sangrado ha &aparado&7! +Swords.Combat.Bleeding=&a**ENEMIGO SANGRANDO** +Swords.Combat.Counter.Chance=Probabilidad de Contra Ataque: &e{0} +Swords.Combat.Counter.Hit=&4¡Alcanzado por un contra ataque! +Swords.Combat.Countered=&a**CONTRA-ATACADO** +Swords.Combat.SS.Struck=&4¡Golpeado por ATAQUE DENTADO! Swords.SubSkill.CounterAttack.Name=Contra Ataque -Swords.SubSkill.CounterAttack.Description=Refleja {0} del da\u00f1o tomando mientras se bloquea +Swords.SubSkill.CounterAttack.Description=Refleja {0} del daño tomando mientras se bloquea Swords.SubSkill.SerratedStrikes.Name=Ataque Dentado (HABILIDAD) Swords.SubSkill.SerratedStrikes.Description={0} DMG AoE, Sangrado + AoE Swords.Effect.4=Ataque Dentado Sangriento+ Swords.Effect.5={0} marca de sangrado Swords.SubSkill.Bleed.Name=Sangrado -Swords.SubSkill.Bleed.Description=Aplicar sangrado que da\u00f1a con el tiempo +Swords.SubSkill.Bleed.Description=Aplicar sangrado que daña con el tiempo Swords.Listener=Espadas: Swords.SkillName=ESPADAS Swords.Skills.SS.Off=**Ataque Dentado ha expirado** -Swords.Skills.SS.On=[[GREEN]]**ATAQUE DENTADO ACTIVADO** -Swords.Skills.SS.Refresh=[[GREEN]]\u00a1Tu habilidad de [[YELLOW]]Golpe Dentado [[GREEN]]fue refrescada! -Swords.Skills.SS.Other.Off=Ataque Dentado[[GREEN]] le ha expirado a [[YELLOW]]{0} -Swords.Skills.SS.Other.On=[[GREEN]]\u00a1{0}[[DARK_GREEN]] us\u00f3 [[RED]]Ataque Dentado! +Swords.Skills.SS.On=&a**ATAQUE DENTADO ACTIVADO** +Swords.Skills.SS.Refresh=&a¡Tu habilidad de &eGolpe Dentado &afue refrescada! +Swords.Skills.SS.Other.Off=Ataque Dentado&a le ha expirado a &e{0} +Swords.Skills.SS.Other.On=&a¡{0}&2 usó &cAtaque Dentado! Swords.Skillup=Skill de espada se incremento en {0}. Total ({1}) -Swords.SS.Length=Duraci\u00f3n del Ataque Dentado: [[YELLOW]]{0}s +Swords.SS.Length=Duración del Ataque Dentado: &e{0}s Taming.Ability.Bonus.0=Consciente del Entorno Taming.Ability.Bonus.1=Lobos evitan peligros Taming.Ability.Bonus.2=Piel Gruesa -Taming.Ability.Bonus.3=1/{0}Da\u00f1o, Resistencia al fuego +Taming.Ability.Bonus.3=1/{0}Daño, Resistencia al fuego Taming.Ability.Bonus.4=A Prueba de Golpes -Taming.Ability.Bonus.5=Los explosivos hacen un 1/{0} de da\u00f1o normal. +Taming.Ability.Bonus.5=Los explosivos hacen un 1/{0} de daño normal. Taming.Ability.Bonus.6=Garras Afiladas -Taming.Ability.Bonus.7=+{0} Da\u00f1o -Taming.Ability.Bonus.8=Servicio de Comida R\u00e1pida +Taming.Ability.Bonus.7=+{0} Daño +Taming.Ability.Bonus.8=Servicio de Comida Rápida Taming.Ability.Bonus.9={0} Posibilidad de curarse durante el ataque Taming.Ability.Bonus.10=Sabueso divino -Taming.Ability.Bonus.11=Recuperar vida cuando eres da\u00f1ado por magia o veneno +Taming.Ability.Bonus.11=Recuperar vida cuando eres dañado por magia o veneno Taming.Ability.Locked.0=Bloqueado hasta {0} + HABILIDAD (CONCIENCIADO CON EL MEDIOAMBIENTE) Taming.Ability.Locked.1=Bloqueado hasta {0} + HABILIDAD (PIEL GRUESA) Taming.Ability.Locked.2=Bloqueado hasta {0} + HABILIDAD (A PRUEBA DE GOLPES) Taming.Ability.Locked.3=Bloqueado hasta {0} + HABILIDAD (GARRAS AFILADAS) Taming.Ability.Locked.4=Bloqueado hasta {0} + HABILIDAD (SERVICIO DE COMIDA RAPIDA) Taming.Ability.Locked.5=Bloqueado hasta {0}+ HABILIDAD (SABUESO DIVINO) -Taming.Combat.Chance.Gore=Probabilidad de Gore: [[YELLOW]]{0} +Taming.Combat.Chance.Gore=Probabilidad de Gore: &e{0} Taming.SubSkill.BeastLore.Name=Conocimiento de la Bestia Taming.SubSkill.BeastLore.Description=Golpear con un hueso para inspeccionar los lobos y ocelotes Taming.SubSkill.ShockProof.Name=A Prueba de Golpes -Taming.SubSkill.ShockProof.Description=Reducci\u00f3n de Da\u00f1o por Explosiones +Taming.SubSkill.ShockProof.Description=Reducción de Daño por Explosiones Taming.SubSkill.CallOfTheWild.Name=Llamado a la Naturaleza Taming.SubSkill.CallOfTheWild.Description=Convocar a un animal a tu lado -Taming.SubSkill.CallOfTheWild.Description.2=[[GRAY]]TIP (Ocelote): Agacharse y hacer click izquierdo con {0} pescados en la mano -Taming.Effect.15=[[GRAY]]TIP (Lobo): Agacharse y hacer click izquierdo con {0} huesos en la mano -Taming.SubSkill.Gore.Name0=[[GRAY]] COTW (caballo): Agachate y haz clic con {0} manzanas en la mano -Taming.SubSkill.FastFoodService.Name=Servicio de Comida R\u00e1pida +Taming.SubSkill.CallOfTheWild.Description.2=&7TIP (Ocelote): Agacharse y hacer click izquierdo con {0} pescados en la mano +Taming.Effect.15=&7TIP (Lobo): Agacharse y hacer click izquierdo con {0} huesos en la mano +Taming.SubSkill.Gore.Name0=&7 COTW (caballo): Agachate y haz clic con {0} manzanas en la mano +Taming.SubSkill.FastFoodService.Name=Servicio de Comida Rápida Taming.SubSkill.FastFoodService.Description=Probabilidad de que los lobos se curen en ataque Taming.SubSkill.HolyHound.Name=Sabueso divino Taming.SubSkill.HolyHound.Description=Curado por magia y veneno Taming.SubSkill.Gore.Name=Mordisco -Taming.SubSkill.Gore.Description=Golpe Cr\u00edtico que aplica Sangrado +Taming.SubSkill.Gore.Description=Golpe Crítico que aplica Sangrado Taming.SubSkill.SharpenedClaws.Name=Garras Afiladas -Taming.SubSkill.SharpenedClaws.Description=Da\u00f1o Bonus +Taming.SubSkill.SharpenedClaws.Description=Daño Bonus Taming.SubSkill.EnvironmentallyAware.Name=Consciente del Entorno -Taming.SubSkill.EnvironmentallyAware.Description=Fobia al Cactus y a la Lava, Inmune al Da\u00f1o por Ca\u00eddas +Taming.SubSkill.EnvironmentallyAware.Description=Fobia al Cactus y a la Lava, Inmune al Daño por Caídas Taming.SubSkill.ThickFur.Name=Piel Gruesa -Taming.SubSkill.ThickFur.Description=Da\u00f1o Reducido, Resistencia al Fuego -Taming.Listener.Wolf=[[DARK_GRAY]]T\u00fa lobo se escabulle hacia t\u00ed... +Taming.SubSkill.ThickFur.Description=Daño Reducido, Resistencia al Fuego +Taming.Listener.Wolf=&8Tú lobo se escabulle hacia tí... Taming.Listener=Domador: Taming.SkillName=DOMADOR Taming.Skillup=Habilidad de Domador incrementada en {0}. Total ({1}) -Taming.Summon.Complete=[[GREEN]]Invocaci\u00f3n completada -Taming.Summon.Fail.Ocelot=Tienes demasiados ocelotes cerca como para convocar m\u00e1s. -Taming.Summon.Fail.Wolf=Tienes demasiados lobos cerca como para convocar m\u00e1s. +Taming.Summon.Complete=&aInvocación completada +Taming.Summon.Fail.Ocelot=Tienes demasiados ocelotes cerca como para convocar más. +Taming.Summon.Fail.Wolf=Tienes demasiados lobos cerca como para convocar más. Taming.Summon.Fail.Horse=Tienes cerca demasiados caballos para poder invocar a uno. Taming.Summon.Name.Format={0}s {1} -Unarmed.Ability.Berserk.Length=Duraci\u00f3n de Enloquecido: [[YELLOW]]{0}seg -Unarmed.Ability.Bonus.0=Estilo del Pu\u00f1o de Hierro -Unarmed.Ability.Bonus.1=+{0} Mejora de DA\u00d1O -Unarmed.Ability.Chance.ArrowDeflect=Probabilidad de Desviar Flechas: [[YELLOW]]{0}% -Unarmed.Ability.Chance.Disarm=Probabilidad de Desarmar: [[YELLOW]]{0} -Unarmed.Ability.Chance.IronGrip=Probabilidad de agarre de hierro: [[YELLOW]]{0} +Unarmed.Ability.Berserk.Length=Duración de Enloquecido: &e{0}seg +Unarmed.Ability.Bonus.0=Estilo del Puño de Hierro +Unarmed.Ability.Bonus.1=+{0} Mejora de DAÑO +Unarmed.Ability.Chance.ArrowDeflect=Probabilidad de Desviar Flechas: &e{0}% +Unarmed.Ability.Chance.Disarm=Probabilidad de Desarmar: &e{0} +Unarmed.Ability.Chance.IronGrip=Probabilidad de agarre de hierro: &e{0} Unarmed.Ability.IronGrip.Attacker= Tu oponente tiene agarre de hierro! -Unarmed.Ability.IronGrip.Defender=[[GREEN]]Tu agarre de hierro te salvo de ser desarmado! -Unarmed.Ability.Lower=[[GRAY]]**BAJAS TUS PU\u00d1OS** -Unarmed.Ability.Ready=[[GREEN]]**LEVANTASTE LA GUARDIA** +Unarmed.Ability.IronGrip.Defender=&aTu agarre de hierro te salvo de ser desarmado! +Unarmed.Ability.Lower=&7**BAJAS TUS PUÑOS** +Unarmed.Ability.Ready=&a**LEVANTASTE LA GUARDIA** Unarmed.SubSkill.Berserk.Name=Enloquecido (HABILIDAD) -Unarmed.SubSkill.Berserk.Description=+50% de Da\u00f1o, Rompe materiales d\u00e9biles +Unarmed.SubSkill.Berserk.Description=+50% de Daño, Rompe materiales débiles Unarmed.SubSkill.Disarm.Name=Desarmar (Jugadores) Unarmed.SubSkill.Disarm.Description=Hace soltar el item que un enemigo lleva en la mano -Unarmed.SubSkill.IronArmStyle.Name=Estilo del Pu\u00f1o de Hierro +Unarmed.SubSkill.IronArmStyle.Name=Estilo del Puño de Hierro Unarmed.SubSkill.IronArmStyle.Description=Endurece su brazo con el tiempo Unarmed.SubSkill.ArrowDeflect.Name=Flecha Desviada Unarmed.SubSkill.ArrowDeflect.Description=Desviar flechas @@ -313,146 +312,146 @@ Unarmed.SubSkill.IronGrip.Description=Te previene de ser desarmado Unarmed.Listener=Desarmado: Unarmed.SkillName=DESARMADO Unarmed.Skills.Berserk.Off=**Enloquecido ha expirado** -Unarmed.Skills.Berserk.On=[[GREEN]]**ENLOQUECIDO ACTIVADO** -Unarmed.Skills.Berserk.Other.Off=Enloquecido[[GREEN]] le ha expirado a [[YELLOW]]{0} -Unarmed.Skills.Berserk.Other.On=[[GREEN]]\u00a1{0}[[DARK_GREEN]] us\u00f3 [[RED]]Enloquecido! -Unarmed.Skills.Berserk.Refresh=[[GREEN]]\u00a1T\u00fa habilidad [[YELLOW]]Enloquecido [[GREEN]]est\u00e1 refrescada! +Unarmed.Skills.Berserk.On=&a**ENLOQUECIDO ACTIVADO** +Unarmed.Skills.Berserk.Other.Off=Enloquecido&a le ha expirado a &e{0} +Unarmed.Skills.Berserk.Other.On=&a¡{0}&2 usó &cEnloquecido! +Unarmed.Skills.Berserk.Refresh=&a¡Tú habilidad &eEnloquecido &aestá refrescada! Unarmed.Skillup=Habilidad de Desarmado incrementada en {0}. Total ({1}) Woodcutting.Ability.0=Soplador de Hojas Woodcutting.Ability.1=Remover hojas -Woodcutting.Ability.Chance.DDrop=Probabilidad de Doble Drop: [[YELLOW]]{0} -Woodcutting.Ability.Length=Duraci\u00f3n de Ca\u00edda de \u00c1rbol: [[YELLOW]]{0}seg +Woodcutting.Ability.Chance.DDrop=Probabilidad de Doble Drop: &e{0} +Woodcutting.Ability.Length=Duración de Caída de Árbol: &e{0}seg Woodcutting.Ability.Locked.0=Bloqueado hasta {0} + HABILIDAD (soplador de hojas) -Woodcutting.SubSkill.TreeFeller.Name=Ca\u00edda de \u00c1rbol (HABILIDAD) -Woodcutting.SubSkill.TreeFeller.Description=Hace que el \u00e1rbol explote +Woodcutting.SubSkill.TreeFeller.Name=Caída de Árbol (HABILIDAD) +Woodcutting.SubSkill.TreeFeller.Description=Hace que el árbol explote Woodcutting.SubSkill.LeafBlower.Name=Soplador de Hojas Woodcutting.SubSkill.LeafBlower.Description=Remover Hojas Woodcutting.SubSkill.HarvestLumber.Name=Doble Drops -Woodcutting.SubSkill.HarvestLumber.Description=El doble del bot\u00edn normal -Woodcutting.Listener=Le\u00f1ador: -Woodcutting.SkillName=LE\u00d1ADOR -Woodcutting.Skills.TreeFeller.Off=**Caida de \u00c1rbol ha expirado** -Woodcutting.Skills.TreeFeller.On=[[GREEN]]**CA\u00cdDA DE \u00c1RBOL ACTIVADA** -Woodcutting.Skills.TreeFeller.Refresh=[[GREEN]]\u00a1Tu habilidad [[YELLOW]]Ca\u00edda de \u00c1rbol [[GREEN]]est\u00e1 refrescada! -Woodcutting.Skills.TreeFeller.Other.Off=Ca\u00edda de \u00c1rbol[[GREEN]] le ha expirado a [[YELLOW]]{0} -Woodcutting.Skills.TreeFeller.Other.On=[[GREEN]]\u00a1{0}[[DARK_GREEN]] us\u00f3 [[RED]]Ca\u00edda de \u00c1rbol! -Woodcutting.Skills.TreeFeller.Splinter=\u00a1TU HACHA EXPLOT\u00d3 EN MILES DE PEDAZOS! -Woodcutting.Skills.TreeFeller.Threshold=\u00a1Ese \u00e1rbol es demasiado grande! -Woodcutting.Skillup=Habilidad de Le\u00f1ador incrementada en {0}. Total ({1}) -Ability.Generic.Refresh=[[GREEN]]**\u00a1HABILIDADES REFRESCADAS!** -Ability.Generic.Template.Lock=[[GRAY]]{0} -Ability.Generic.Template=[[GOLD]]{0}: [[DARK_AQUA]]{1} -Combat.ArrowDeflect=[[WHITE]]**FLECHA DESVIADA** -Combat.BeastLore=[[GREEN]]**CONOCIMIENTO DE LA BESTIA** -Combat.BeastLoreHealth=[[DARK_AQUA]]Salud ([[GREEN]]{0}[[DARK_AQUA]]/{1}) -Combat.BeastLoreOwner=[[DARK_AQUA]]Due\u00f1o ([[RED]]{0}[[DARK_AQUA]]) -Combat.Gore=[[GREEN]]**MORDISCO** +Woodcutting.SubSkill.HarvestLumber.Description=El doble del botín normal +Woodcutting.Listener=Leñador: +Woodcutting.SkillName=LEÑADOR +Woodcutting.Skills.TreeFeller.Off=**Caida de Árbol ha expirado** +Woodcutting.Skills.TreeFeller.On=&a**CAÍDA DE ÁRBOL ACTIVADA** +Woodcutting.Skills.TreeFeller.Refresh=&a¡Tu habilidad &eCaída de Árbol &aestá refrescada! +Woodcutting.Skills.TreeFeller.Other.Off=Caída de Árbol&a le ha expirado a &e{0} +Woodcutting.Skills.TreeFeller.Other.On=&a¡{0}&2 usó &cCaída de Árbol! +Woodcutting.Skills.TreeFeller.Splinter=¡TU HACHA EXPLOTÓ EN MILES DE PEDAZOS! +Woodcutting.Skills.TreeFeller.Threshold=¡Ese árbol es demasiado grande! +Woodcutting.Skillup=Habilidad de Leñador incrementada en {0}. Total ({1}) +Ability.Generic.Refresh=&a**¡HABILIDADES REFRESCADAS!** +Ability.Generic.Template.Lock=&7{0} +Ability.Generic.Template=&6{0}: &3{1} +Combat.ArrowDeflect=&f**FLECHA DESVIADA** +Combat.BeastLore=&a**CONOCIMIENTO DE LA BESTIA** +Combat.BeastLoreHealth=&3Salud (&a{0}&3/{1}) +Combat.BeastLoreOwner=&3Dueño (&c{0}&3) +Combat.Gore=&a**MORDISCO** Combat.StruckByGore=**FUISTE MORDISQUEADO** -Combat.TargetDazed=El objetivo fue [[DARK_RED]]aturdido -Combat.TouchedFuzzy=[[DARK_RED]]Est\u00e1s confuso. Te sientes mareado. -mcMMO.Description=[[DARK_AQUA]]Sobre el proyecto[[YELLOW]]mcMMO[[DARK_AQUA]]:,[[GOLD]]mcMMO es un mod RPG de[[RED]codigo abierto[[GOLD]] creado en Febrero de 2011, [[GOLD]]por [[BLUE]]nossr50[[GOLD]]. La meta es proveer una experiencia igual a la de los RPG.,[[DARK_AQUA]]Consejos:,[[GOLD]] - [[GREEN]]Usa [[RED]]/mcmmo help[[GREEN]] para ver los comandos,[[GOLD]] - [[GREEN]]Teclea [[RED]]/SKILLNAME[[GREEN]]para ver informacion detalada de las habilidades,[[DARK_AQUA]]Desarrolladores:,[[GOLD]] - [[GREEN]]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]] Reporte de fallos,[[GOLD]] - [[GREEN]]#mcmmo @ irc.esper.net[[GOLD]] IRC Chat, -Commands.addlevels.AwardAll.1=[[GREEN]]Fuistes recompensado con {0} niveles en todas las habilidades! +Combat.TargetDazed=El objetivo fue &4aturdido +Combat.TouchedFuzzy=&4Estás confuso. Te sientes mareado. +mcMMO.Description=&3Sobre el proyecto&emcMMO&3:,&6mcMMO es un mod RPG de&ccodigo abierto&6 creado en Febrero de 2011, &6por &9nossr50&6. La meta es proveer una experiencia igual a la de los RPG.,&3Consejos:,&6 - &aUsa &c/mcmmo help&a para ver los comandos,&6 - &aTeclea &c/SKILLNAME&apara ver informacion detalada de las habilidades,&3Desarrolladores:,&6 - &anossr50 &9(Founder & Project Lead),&6 - &aGJ &9(Former Project Lead),&6 - &aNuclearW &9(Developer),&6 - &abm01 &9(Developer),&6 - &aTfT_02 &9(Developer),&6 - &aGlitchfinder &9(Developer),&6 - &at00thpick1 &9(Developer),&3Useful Links:,&6 - &ahttps://github.com/mcMMO-Dev/mcMMO/issues&6 Reporte de fallos,&6 - &a#mcmmo @ irc.esper.net&6 IRC Chat, +Commands.addlevels.AwardAll.1=&aFuistes recompensado con {0} niveles en todas las habilidades! Commands.addlevels.AwardAll.2=Todas las Skins han sido mofificadas por {0}. -Commands.addlevels.AwardSkill.1=[[GREEN]]Fuistes recompensado con {0} niveles en {1}! +Commands.addlevels.AwardSkill.1=&aFuistes recompensado con {0} niveles en {1}! Commands.addlevels.AwardSkill.2={0} ha sido modificado por {1}. -Commands.addxp.AwardAll=[[GREEN]]Fuistes recompensado con {0} experiencia en todas las habilidades! -Commands.addxp.AwardSkill=[[GREEN]]Fuistes recompensado con {0} experiencia en {1}! -Commands.Ability.Off=Habilidades [[RED]]desactivadas -Commands.Ability.On=Habilidades [[GREEN]]activadas -Commands.AdminChat.Off=Chat s\u00f3lo para Admins [[RED]]desactivado -Commands.AdminChat.On=Chat s\u00f3lo para Admins [[GREEN]]activado +Commands.addxp.AwardAll=&aFuistes recompensado con {0} experiencia en todas las habilidades! +Commands.addxp.AwardSkill=&aFuistes recompensado con {0} experiencia en {1}! +Commands.Ability.Off=Habilidades &cdesactivadas +Commands.Ability.On=Habilidades &aactivadas +Commands.AdminChat.Off=Chat sólo para Admins &cdesactivado +Commands.AdminChat.On=Chat sólo para Admins &aactivado Commands.AdminToggle=- Alternar chat de admin Commands.Chat.Console=*Consola* -Commands.Disabled=Este comando est\u00e1 deshabilitado. -Commands.DoesNotExist=\u00a1El jugador no existe en la base de datos! +Commands.Disabled=Este comando está deshabilitado. +Commands.DoesNotExist=¡El jugador no existe en la base de datos! Commands.GodMode.Disabled=mcMMO Modo Dios Desactivado Commands.GodMode.Enabled=mcMMO Modo Dios Activado Commands.GodMode.Forbidden=[mcMMO] No se permite Modo Dios en este mundo (Ver permisos) -Commands.Inspect= [[RED]]-Ver informaci\u00f3n detallada del jugador -Commands.Party.Invite.Accepted=[[GREEN]]Invitaci\u00f3n Aceptada. Te uniste al grupo {0} -Commands.Invite.Success=[[GREEN]]Invitaci\u00f3n enviada satisfactoriamente -Commands.Leaderboards= [[RED]]- Tabla de posiciones -Commands.mcc.Header=---[][[YELLOW]]Comandos mcMMO[[RED]][]--- +Commands.Inspect= &c-Ver información detallada del jugador +Commands.Party.Invite.Accepted=&aInvitación Aceptada. Te uniste al grupo {0} +Commands.Invite.Success=&aInvitación enviada satisfactoriamente +Commands.Leaderboards= &c- Tabla de posiciones +Commands.mcc.Header=---[]&eComandos mcMMO&c[]--- Commands.mcgod=- Alternar Modo Dios Commands.mchud.Invalid=Ese no es un tipo valido de HUD. -Commands.mcpurge.Success=[[GREEN]]La base de datos fue purgada exitosamente! -Commands.mcrank.Heading=[[GOLD]]-=CLASIFICACION PERSONAL=- -Commands.mcrank.Overall=Conjunto[[GREEN]] - [[GOLD]]Clasificacion [[WHITE]]#[[GREEN]]{0} -Commands.mcrank.Player=OBJETIVO: [[WHITE]]{0} -Commands.mcrank.Skill={0}[[GREEN]] - [[GOLD]]Clasificacion [[WHITE]]#[[GREEN]]{1} -Commands.mcrank.Unranked=[[WHITE]]Sin clasificar +Commands.mcpurge.Success=&aLa base de datos fue purgada exitosamente! +Commands.mcrank.Heading=&6-=CLASIFICACION PERSONAL=- +Commands.mcrank.Overall=Conjunto&a - &6Clasificacion &f#&a{0} +Commands.mcrank.Player=OBJETIVO: &f{0} +Commands.mcrank.Skill={0}&a - &6Clasificacion &f#&a{1} +Commands.mcrank.Unranked=&fSin clasificar Commands.mcrefresh.Success={0}\'\'s del tiempo de reutilizacion ha sido renovado. -Commands.mcremove.Success=[[GREEN]]{0} fue eliminado de la base de datos exitosamente!! -Commands.mctop.Tip=[[GOLD]]Tip: Usa [[RED]]/mcrank[[GOLD]] para ver todas tus estadisticas! -Commands.mmoedit=[jugador] [[RED]] - Modificar habilidad -Commands.mmoedit.AllSkills.1=[[GREEN]]tu nivel en todas las habilidades fue cambiado a {0}! -Commands.mmoedit.Modified.1=[[GREEN]]Tu nivel en {0} fue modificado a {1}! +Commands.mcremove.Success=&a{0} fue eliminado de la base de datos exitosamente!! +Commands.mctop.Tip=&6Tip: Usa &c/mcrank&6 para ver todas tus estadisticas! +Commands.mmoedit=[jugador] &c - Modificar habilidad +Commands.mmoedit.AllSkills.1=&atu nivel en todas las habilidades fue cambiado a {0}! +Commands.mmoedit.Modified.1=&aTu nivel en {0} fue modificado a {1}! Commands.mmoedit.Modified.2={0} ha sido modificado por {1}. Commands.mcconvert.Database.Same=Ya estas usando la base de datos {0} Commands.mcconvert.Database.InvalidType={0} no en un tipo de base de datos valido. -Commands.mcconvert.Database.Start=[[GRAY]]Comenzando conversion de {0} a {1}... -Commands.mcconvert.Database.Finish=[[GRAY]]Migracion de la base de datos completada; La base datos {1} ahora tiene todos los datos de la base de datos {0}. -Commands.mmoshowdb=La base de datos usada actualmente es [[GREEN]]{0} -Commands.mcconvert.Experience.Invalid=Tipo de formula desconocidaa Los tipos validos son: [[GREEN]]LINEAR [[RED]]y [[GREEN]]EXPONENTIAL. +Commands.mcconvert.Database.Start=&7Comenzando conversion de {0} a {1}... +Commands.mcconvert.Database.Finish=&7Migracion de la base de datos completada; La base datos {1} ahora tiene todos los datos de la base de datos {0}. +Commands.mmoshowdb=La base de datos usada actualmente es &a{0} +Commands.mcconvert.Experience.Invalid=Tipo de formula desconocidaa Los tipos validos son: &aLINEAR &cy &aEXPONENTIAL. Commands.mcconvert.Experience.Same=Ya esta usando el tipo de formula {0} -Commands.mcconvert.Experience.Start=[[GRAY]]Comenznado converso de la curva {0} a {1} -Commands.mcconvert.Experience.Finish=[[GRAY]]Formula de conversion completa; ahora usando la curva XP {0}. -Commands.ModDescription=- Lea la descripci\u00f3n breve del mod +Commands.mcconvert.Experience.Start=&7Comenznado converso de la curva {0} a {1} +Commands.mcconvert.Experience.Finish=&7Formula de conversion completa; ahora usando la curva XP {0}. +Commands.ModDescription=- Lea la descripción breve del mod Commands.NoConsole=Este comando no es soportado desde la consola. -Commands.Notifications.Off=Notificaciones de habilidad [[RED]]desactivadas -Commands.Notifications.On=Notificaciones de habilidad [[GREEN]]activadas +Commands.Notifications.Off=Notificaciones de habilidad &cdesactivadas +Commands.Notifications.On=Notificaciones de habilidad &aactivadas Commands.Offline=Este comando no sirve para jugadores desconectados -Commands.Other=[[GREEN]]--OTROS COMANDOS-- -Commands.Party.Header=-----[][[GREEN]]GRUPO[[RED]][]----- -Commands.Party.Status=[[DARK_GRAY]]NOMBRE: [[WHITE]]{0} {1} -Commands.Party.ShareMode=[[DARK_GRAY]]MODO COMPARTIR: -Commands.Party.ItemShare=[[GRAY]]OBJETO [[DARK_AQUA]]({0}) -Commands.Party.ExpShare=[[GRAY]]EXP [[DARK_AQUA]]({0}) -Commands.Party.ItemShareCategories=[[DARK_GRAY]]Compartiendo objetos: [[GRAY]][[ITALIC]]{0} -Commands.Party.MembersNear=[[DARK_GRAY]]CERCA DE TI [[DARK_AQUA]]{0}[[DARK_GRAY]]/[[DARK_AQUA]]{1} -Commands.Party.Accept=- Aceptar invitaci\u00f3n al grupo -Commands.Party.Chat.Off=S\u00f3lo chat de grupo [[RED]]desactivado -Commands.Party.Chat.On=S\u00f3lo chat de grupo [[RED]]activado -Commands.Party.Commands=[[GREEN]]--COMANDOS DEL GRUPO-- -Commands.Party.Invite.0=ATENCI\u00d3N: [[GREEN]]Fuiste invitado al grupo {0} por {1} -Commands.Party.Invite.1=Teclea [[GREEN]]/party accept[[YELLOW]] para aceptar la invitacion al grupo -Commands.Party.Invite=[RED]]- Invitacion de grupo enviada -Commands.Party.Join=[[GRAY]]Unido al grupo: {0} -Commands.Party.Create=[[GRAY]]Grupo creado: {0} -Commands.Party.Rename=[[GRAY]]el nombre del grupo ha cambiado a: [[WHITE]]{0} -Commands.Party.SetSharing=[[GRAY]]Grupo {0} compartir establecido a: [[DARK_AQUA]]{1} -Commands.Party.ToggleShareCategory=[[GRAY]]Objetos de grupo compartiendo por[[GOLD]]{0} [[GRAY]]ha sido [[DARK_AQUA]]{1} -Commands.Party.AlreadyExists=[[DARK_RED]]El grupo {0} ya existe! -Commands.Party.Kick=\u00a1Fuiste expulsado del grupo {0}! +Commands.Other=&a--OTROS COMANDOS-- +Commands.Party.Header=-----[]&aGRUPO&c[]----- +Commands.Party.Status=&8NOMBRE: &f{0} {1} +Commands.Party.ShareMode=&8MODO COMPARTIR: +Commands.Party.ItemShare=&7OBJETO &3({0}) +Commands.Party.ExpShare=&7EXP &3({0}) +Commands.Party.ItemShareCategories=&8Compartiendo objetos: &7&o{0} +Commands.Party.MembersNear=&8CERCA DE TI &3{0}&8/&3{1} +Commands.Party.Accept=- Aceptar invitación al grupo +Commands.Party.Chat.Off=Sólo chat de grupo &cdesactivado +Commands.Party.Chat.On=Sólo chat de grupo &cactivado +Commands.Party.Commands=&a--COMANDOS DEL GRUPO-- +Commands.Party.Invite.0=ATENCIÓN: &aFuiste invitado al grupo {0} por {1} +Commands.Party.Invite.1=Teclea &a/party accept&e para aceptar la invitacion al grupo +Commands.Party.Invite=&c- Invitacion de grupo enviada +Commands.Party.Join=&7Unido al grupo: {0} +Commands.Party.Create=&7Grupo creado: {0} +Commands.Party.Rename=&7el nombre del grupo ha cambiado a: &f{0} +Commands.Party.SetSharing=&7Grupo {0} compartir establecido a: &3{1} +Commands.Party.ToggleShareCategory=&7Objetos de grupo compartiendo por&6{0} &7ha sido &3{1} +Commands.Party.AlreadyExists=&4El grupo {0} ya existe! +Commands.Party.Kick=¡Fuiste expulsado del grupo {0}! Commands.Party.Leave=Abandonaste el grupo -Commands.Party.Members.Header=-----[][[GREEN]]MIEMBROS[[RED]][]----- -Commands.Party.None=No est\u00e1s en un grupo. +Commands.Party.Members.Header=-----[]&aMIEMBROS&c[]----- +Commands.Party.None=No estás en un grupo. Commands.Party.Quit=- Abandona tu grupo actual -Commands.Party.Teleport= [[RED]]- Teletransportarse al miembro del grupo +Commands.Party.Teleport= &c- Teletransportarse al miembro del grupo Commands.Party.Toggle=- Alternar chat de grupo Commands.Party.1=- Nuevo grupo creado -Commands.Party.2=[RED]]- Unete a un grupo de jugadores -Commands.ptp.Enabled=Teletransportacion de grupo [[GREEN]]activada -Commands.ptp.Disabled=Teletransportacion de grupo [[RED]]desactivada +Commands.Party.2=&c- Unete a un grupo de jugadores +Commands.ptp.Enabled=Teletransportacion de grupo &aactivada +Commands.ptp.Disabled=Teletransportacion de grupo &cdesactivada Commands.ptp.NoRequests=No tienes ninguna peticion de teletransporte ahora mismo Commands.ptp.NoWorldPermissions=[mcMMO] No tienes permiso para teletransportarte al mundo {0}. -Commands.ptp.Request1={0} [[GREEN]]ha pedido teletransportarse a tu posicion. -Commands.ptp.Request2=[[GREEN]]Para teletransportarse, teclea [[YELLOW]]/ptp accept. [[GREEN]]La peticion expira en [[RED]]{0} [[GREEN]]segundos. -Commands.ptp.AcceptAny.Enabled=Confirmacion de la peticion de teletransportacion del grupo [[GREEN]]habilitada -Commands.ptp.AcceptAny.Disabled=Confirmacion de la peticion de teletransportacion del grupo [[GREEN]]deshabilitada +Commands.ptp.Request1={0} &aha pedido teletransportarse a tu posicion. +Commands.ptp.Request2=&aPara teletransportarse, teclea &e/ptp accept. &aLa peticion expira en &c{0} &asegundos. +Commands.ptp.AcceptAny.Enabled=Confirmacion de la peticion de teletransportacion del grupo &ahabilitada +Commands.ptp.AcceptAny.Disabled=Confirmacion de la peticion de teletransportacion del grupo &adeshabilitada Commands.ptp.RequestExpired=La peticion de teletransporte del grupo ha expirado! -Commands.PowerLevel.Leaderboard=--mcMMO-- Tabla de L\u00edderes: [[BLUE]]Nivel de Poder -Commands.PowerLevel.Capped=[[DARK_RED]]NIVEL DE PODER: [[GREEN]]{0} [[DARK_RED]]MAXIMO PODER: [[YELLOW]]{1} -Commands.PowerLevel=[[DARK_RED]]NIVEL DE PODER: [[GREEN]]{0} -Commands.Reset.All=[[GREEN]]Todos los niveles de tus habilidades se resetearon correctamente -Commands.Reset.Single=[GREEN]]Tu {0} nivel de skill se reseteo correctamente. +Commands.PowerLevel.Leaderboard=--mcMMO-- Tabla de Líderes: &9Nivel de Poder +Commands.PowerLevel.Capped=&4NIVEL DE PODER: &a{0} &4MAXIMO PODER: &e{1} +Commands.PowerLevel=&4NIVEL DE PODER: &a{0} +Commands.Reset.All=&aTodos los niveles de tus habilidades se resetearon correctamente +Commands.Reset.Single=&aTu {0} nivel de skill se reseteo correctamente. Commands.Reset=Resetea el nivel de una habilidad a 0 -Commands.Skill.Invalid=\u00a1Esa no es una habilidad v\u00e1lida! -Commands.Skill.Leaderboard=--mcMMO-- Tabla de L\u00edderes: [[BLUE]]{0} +Commands.Skill.Invalid=¡Esa no es una habilidad válida! +Commands.Skill.Leaderboard=--mcMMO-- Tabla de Líderes: &9{0} Commands.SkillInfo=- Ver informacion detallada sobre habilidades -Commands.Stats.Self=TUS ESTAD\u00cdSTICAS -Commands.Stats=- Ver tus estad\u00edsticas de mcMMO -Commands.ToggleAbility=- Alternar activaci\u00f3n de habilidades con click derecho +Commands.Stats.Self=TUS ESTADÍSTICAS +Commands.Stats=- Ver tus estadísticas de mcMMO +Commands.ToggleAbility=- Alternar activación de habilidades con click derecho Commands.Usage.0=El uso correcto es /{0} Commands.Usage.1=El uso adecuado es /{0} {1} Commands.Usage.2=El uso correcto es /{0} {1} {2} @@ -462,60 +461,60 @@ Commands.Usage.Level=Nivel Commands.Usage.Message=mensaje Commands.Usage.Page=pagina Commands.Usage.PartyName=nombre -Commands.Usage.Password=Contrase\u00f1a +Commands.Usage.Password=Contraseña Commands.Usage.Player=Jugador Commands.Usage.Rate=Velocidad Commands.Usage.Skill=Habilidad Commands.Usage.XP=XP mcMMO.NoInvites=No tienes invitaciones en este momento -mcMMO.NoPermission=[[DARK_RED]]Permisos insuficientes. -mcMMO.NoSkillNote=[[DARK_GRAY]]Si no tienes acceso a una habilidad no ser\u00e1 mostrada aqu\u00ed. +mcMMO.NoPermission=&4Permisos insuficientes. +mcMMO.NoSkillNote=&8Si no tienes acceso a una habilidad no será mostrada aquí. Party.Forbidden=[mcMMO] No se permiten grupos en este mundo (Ver permisos) -Party.Help.0=El uso adecuado es[[DARK_AQUA]]{0} [password]. -Party.Help.1=Para crear un grupo, usa [[DARK_AQUA]]{0} [password]. -Party.Help.2=Consulta [[DARK_AQUA]]{0} [[RED]]para mas informacion -Party.Help.3=Usa [[DARK_AQUA]]{0} [password] [[RED]]para entrar o [[DARK_AQUA]]{1} [[RED]]salir -Party.Help.4=Para bloquear o desbloquear tu grupo, usa [[DARK_AQUA]]{0} -Party.Help.5=Para proteger el grupo con contrase\u00f1a, usa [[DARK_AQUA]]{0} -Party.Help.6=Para echar a un jugador del grupo usa, use [[DARK_AQUA]]{0} -Party.Help.7=Para pasar el lider a otro, usa [[DARK_AQUA]]{0} -Party.Help.8=Para eliminar tu grupo, usa [[DARK_AQUA]]{0} -Party.Help.9=Usa [[DARK_AQUA]]{0} [[RED]]para compartir objetos con los miembros del grupo -Party.Help.10=Usa [[DARK_AQUA]]{0} [[RED]]para activar la XP compartida con los miembros del grupo. -Party.InformedOnJoin={0} [[GREEN]]ha entrado en tu grupo -Party.InformedOnQuit={0} [[GREEN]]ha salido de tu grupo -Party.InformedOnNameChange=[[GOLD]]{0} [[GREEN]]ha cambiado el nombre del grupo a [[WHITE]]{1} -Party.InvalidName=[[DARK_RED]]Ese no es un nombre de grupo v\u00e1lido. +Party.Help.0=El uso adecuado es&3{0} [password]. +Party.Help.1=Para crear un grupo, usa &3{0} [password]. +Party.Help.2=Consulta &3{0} &cpara mas informacion +Party.Help.3=Usa &3{0} [password] &cpara entrar o &3{1} &csalir +Party.Help.4=Para bloquear o desbloquear tu grupo, usa &3{0} +Party.Help.5=Para proteger el grupo con contraseña, usa &3{0} +Party.Help.6=Para echar a un jugador del grupo usa, use &3{0} +Party.Help.7=Para pasar el lider a otro, usa &3{0} +Party.Help.8=Para eliminar tu grupo, usa &3{0} +Party.Help.9=Usa &3{0} &cpara compartir objetos con los miembros del grupo +Party.Help.10=Usa &3{0} &cpara activar la XP compartida con los miembros del grupo. +Party.InformedOnJoin={0} &aha entrado en tu grupo +Party.InformedOnQuit={0} &aha salido de tu grupo +Party.InformedOnNameChange=&6{0} &aha cambiado el nombre del grupo a &f{1} +Party.InvalidName=&4Ese no es un nombre de grupo válido. Party.Invite.Self=No puedes invitarte a ti mismo! -Party.IsLocked=\u00a1Este grupo ya est\u00e1 bloqueado! -Party.IsntLocked=\u00a1Este grupo no est\u00e1 bloqueado! -Party.Locked=El grupo est\u00e1 bloqueado, solo el l\u00edder puede invitarte -Party.NotInYourParty=[[DARK_RED]]{0} no esta en tu fiesta -Party.NotOwner=[[DARK_RED]]No eres el lider del grupo -Party.Owner.New=[[GREEN]]{0} es el nuevo lider del grupo. -Party.Owner.NotLeader=[[DARK_RED]]Ya no eres el lider del grupo. -Party.Owner.Player=[[GREEN]]Ahora eres el lider del grupo -Party.Password.None=Este grupo esta protegido por contrase\u00f1a. Escribala para poder entrar. -Party.Password.Incorrect=La contrase\u00f1a del grupo es incorrecta -Party.Password.Set=[[GREEN]]Contrase\u00f1a del grupo establecida: [[RED]]{0} -Party.Password.Removed=[[GREEN]]La contrase\u00f1a del grupo ha sido eliminada. -Party.Player.Invalid=Ese no es un jugador v\u00e1lido. -Party.NotOnline=[[DARK_RED]]{0} no esta conectado! +Party.IsLocked=¡Este grupo ya está bloqueado! +Party.IsntLocked=¡Este grupo no está bloqueado! +Party.Locked=El grupo está bloqueado, solo el líder puede invitarte +Party.NotInYourParty=&4{0} no esta en tu fiesta +Party.NotOwner=&4No eres el lider del grupo +Party.Owner.New=&a{0} es el nuevo lider del grupo. +Party.Owner.NotLeader=&4Ya no eres el lider del grupo. +Party.Owner.Player=&aAhora eres el lider del grupo +Party.Password.None=Este grupo esta protegido por contraseña. Escribala para poder entrar. +Party.Password.Incorrect=La contraseña del grupo es incorrecta +Party.Password.Set=&aContraseña del grupo establecida: &c{0} +Party.Password.Removed=&aLa contraseña del grupo ha sido eliminada. +Party.Player.Invalid=Ese no es un jugador válido. +Party.NotOnline=&4{0} no esta conectado! Party.Player.InSameParty={0} ya esta en tu grupo! -Party.PlayerNotInParty=[[DARK_RED]]{0} no esta en un grupo +Party.PlayerNotInParty=&4{0} no esta en un grupo Party.Specify=Debes especificar un grupo Party.Teleport.Dead=No te puedes teletransportar a un jugador muerto. Party.Teleport.Hurt=Has sido herido en los ultimos {0} segundos y no te puedes teletransportar. -Party.Teleport.Player=[[GREEN]]Te teletransportaste a {0}. +Party.Teleport.Player=&aTe teletransportaste a {0}. Party.Teleport.Self=No puedes teletransportarte a ti mismo! -Party.Teleport.Target=[[GREEN]]{0} se teletransport\u00f3 a ti. +Party.Teleport.Target=&a{0} se teletransportó a ti. Party.Teleport.Disabled={0} no permite teletransportacion de grupo. Party.Rename.Same=Ese es ya el nombre de tu grupo! Party.Join.Self=No puedes te puedes unir a ti mismo! -Party.Unlocked=[[GRAY]]El grupo est\u00e1 desbloqueado -Party.Disband=[[GRAY]]El grupo ha sido eliminado -Party.Status.Locked=[[DARK_RED]](Solo para invitados) -Party.Status.Unlocked=[[DARK_GREEN]](Abierto) +Party.Unlocked=&7El grupo está desbloqueado +Party.Disband=&7El grupo ha sido eliminado +Party.Status.Locked=&4(Solo para invitados) +Party.Status.Unlocked=&2(Abierto) Party.ShareType.Xp=EXP Party.ShareType.Item=OBJETO Party.ShareMode.None=NINGUNO @@ -533,7 +532,7 @@ Commands.XPGain.Archery=Atacando a Monstruos Commands.XPGain.Axes=Atacando a Monstruos Commands.XPGain.Child=Niveles obtenidos de las habilidades padre Commands.XPGain.Excavation=Excavar y encontrar tesoros -Commands.XPGain.Fishing=Pesca (\u00a1Imag\u00ednate!) +Commands.XPGain.Fishing=Pesca (¡Imagínate!) Commands.XPGain.Herbalism=Recolectando hierbas Commands.XPGain.Mining=Minando Piedra y Minerales Commands.XPGain.Repair=Reparando @@ -541,88 +540,88 @@ Commands.XPGain.Swords=Atacando a Monstruos Commands.XPGain.Taming=Domando animales, o combatiendo con tus lobos Commands.XPGain.Unarmed=Atacando a Monstruos Commands.XPGain.Woodcutting=Tala de arboles -Commands.XPGain=[[DARK_GRAY]]OBTENCI\u00d3N DE EXPERIENCIA: [[WHITE]]{0} -Commands.xplock.locked=[[GOLD]]Tu BARRA DE EXP esta bloqueada a {0}! -Commands.xplock.unlocked=[[GOLD]]Tu BARRA DE EXP esta ahora [[GREEN]]DESBLOQUEADA[[GOLD]]! +Commands.XPGain=&8OBTENCIÓN DE EXPERIENCIA: &f{0} +Commands.xplock.locked=&6Tu BARRA DE EXP esta bloqueada a {0}! +Commands.xplock.unlocked=&6Tu BARRA DE EXP esta ahora &aDESBLOQUEADA&6! Commands.xprate.modified=La probabilidad de XP fue modificada a {0} Commands.xprate.over=mcMMO EXP Rate Event TERMINO!! -Commands.xprate.proper.0=[[DARK_AQUA]]El uso correcto es /xprate +Commands.xprate.proper.0=&3El uso correcto es /xprate Commands.xprate.proper.1=Uso correcto para restaurar el ratio de EXP por defecto es /xprate reset Commands.xprate.proper.2=Por favor especifique true o false para indicar si este es un evento de experiencia o no -Commands.xprate.started.0=[[GOLD]]\u00a1EL EVENTO DE EXP DE mcMMO HA COMENZADO! -Commands.xprate.started.1=[[GOLD]]\u00a1mcMMO est\u00e1 ahora en un evento de EXP! \u00a1El ratio de EXP es x{0}! -XPRate.Event=[[GOLD]]\u00a1mcMMO est\u00e1 ahora en un evento de rate de EXP! \u00a1El rate de EXP es {0}x! +Commands.xprate.started.0=&6¡EL EVENTO DE EXP DE mcMMO HA COMENZADO! +Commands.xprate.started.1=&6¡mcMMO está ahora en un evento de EXP! ¡El ratio de EXP es x{0}! +XPRate.Event=&6¡mcMMO está ahora en un evento de rate de EXP! ¡El rate de EXP es {0}x! Effects.Effects=EFECTOS -Effects.Child=[[DARK_GRAY]]NIVEL: [[GREEN]]{0} -Effects.Level=[[DARK_GRAY]]Nivel: [[GREEN]]{0} [[DARK_AQUA]]EXP[[YELLOW]]([[GOLD]]{1}[[YELLOW]]/[[GOLD]]{2}[[YELLOW]]) -Effects.Parent=[[GOLD]]{0} - -Effects.Template=[[DARK_AQUA]]{0}: [[GREEN]]{1} -Guides.Available=[[GRAY]]Guia para {0} disponible - tipo /{1} ? [page] -Guides.Header=[[GOLD]]-=[[GREEN]]{0} Guia[[GOLD]]=- +Effects.Child=&8NIVEL: &a{0} +Effects.Level=&8Nivel: &a{0} &3EXP&e(&6{1}&e/&6{2}&e) +Effects.Parent=&6{0} - +Effects.Template=&3{0}: &a{1} +Guides.Available=&7Guia para {0} disponible - tipo /{1} ? [page] +Guides.Header=&6-=&a{0} Guia&6=- Guides.Page.Invalid=Numero de pagina no disponible Guides.Page.OutOfRange=La pagina no existe, solo hay {0} paginas en total Guides.Usage= El uso es /{0} ? [page] Guides.Smelting.Section.0=Muy pronto... -Inspect.Offline=\u00a1No tienen permiso para inspeccionar jugadores fuera de linea! -Inspect.OfflineStats=Estad\u00edsticas de mcMMO para el Jugador Desconectado [[YELLOW]]{0} -Inspect.Stats=[[GREEN]]Estad\u00edsticas de mcMMO para [[YELLOW]]{0} -Inspect.TooFar=\u00a1Est\u00e1s demasiado lejos como para inspeccionar a ese jugador! -Item.ChimaeraWing.Fail=**\u00a1LAS ALAS DE QUIMERA FALLARON!** -Item.ChimaeraWing.Pass=**\u00a1ALAS DE QUIMERA!** +Inspect.Offline=¡No tienen permiso para inspeccionar jugadores fuera de linea! +Inspect.OfflineStats=Estadísticas de mcMMO para el Jugador Desconectado &e{0} +Inspect.Stats=&aEstadísticas de mcMMO para &e{0} +Inspect.TooFar=¡Estás demasiado lejos como para inspeccionar a ese jugador! +Item.ChimaeraWing.Fail=**¡LAS ALAS DE QUIMERA FALLARON!** +Item.ChimaeraWing.Pass=**¡ALAS DE QUIMERA!** Item.ChimaeraWing.Name=Ala de quimera -Item.ChimaeraWing.Lore=[[GRAY]]Teletransportate a tu cama. -Item.Generic.Wait=Tienes que esperar hasta que puedas usar esto de nuevo! [[YELLOW]]({0}s) -Item.Injured.Wait=Te lesionaste recientemente y ten\u00e9s que esperar para usar esto. [[YELLOW]]({0}seg) -Teleport.Commencing=[[GRAY]]Comenzando el teletransporte en [[GOLD]]({0}) [[GRAY]]segundos, por favor mantente hasta... -Teleport.Cancelled=[[DARK_RED]]Teletransportacion cancelada! -Skills.Child=[[GOLD]](HABILIDAD HIJA) -Skills.Disarmed=[[DARK_RED]]\u00a1Has sido desarmado! -Skills.Header=-----[][[GREEN]]{0}[[RED]][]----- -Skills.NeedMore=[[DARK_RED]]Necesitas m\u00e1s +Item.ChimaeraWing.Lore=&7Teletransportate a tu cama. +Item.Generic.Wait=Tienes que esperar hasta que puedas usar esto de nuevo! &e({0}s) +Item.Injured.Wait=Te lesionaste recientemente y tenés que esperar para usar esto. &e({0}seg) +Teleport.Commencing=&7Comenzando el teletransporte en &6({0}) &7segundos, por favor mantente hasta... +Teleport.Cancelled=&4Teletransportacion cancelada! +Skills.Child=&6(HABILIDAD HIJA) +Skills.Disarmed=&4¡Has sido desarmado! +Skills.Header=-----[]&a{0}&c[]----- +Skills.NeedMore=&4Necesitas más Skills.Parents=PADRES -Skills.Stats={0}[[GREEN]]{1}[[DARK_AQUA]] EXP([[GRAY]]{2}[[DARK_AQUA]]/[[GRAY]]{3}[[DARK_AQUA]]) -Skills.TooTired=Est\u00e1s demasiado cansado como para utilizar esa habilidad de nuevo. +Skills.Stats={0}&a{1}&3 EXP(&7{2}&3/&7{3}&3) +Skills.TooTired=Estás demasiado cansado como para utilizar esa habilidad de nuevo. Skills.Cancelled={0} cancelado! -Skills.ConfirmOrCancel=[[GREEN]]Click derecho otra vez para confirmar [[GOLD]]{0}[[GREEN]]. Click izquierdo para cancelar. -Stats.Header.Combat=[[GOLD]]-=HABILIDADES DE COMBATE=- -Stats.Header.Gathering=[[GOLD]]-=HABILIDADES DE RECOLECCI\u00d3N=- -Stats.Header.Misc=[[GOLD]]-=HABILIDADES VARIAS=- -Stats.Own.Stats=[[GREEN]][mcMMO] Estad\u00edsticas +Skills.ConfirmOrCancel=&aClick derecho otra vez para confirmar &6{0}&a. Click izquierdo para cancelar. +Stats.Header.Combat=&6-=HABILIDADES DE COMBATE=- +Stats.Header.Gathering=&6-=HABILIDADES DE RECOLECCIÓN=- +Stats.Header.Misc=&6-=HABILIDADES VARIAS=- +Stats.Own.Stats=&a[mcMMO] Estadísticas Perks.XP.Name=Experiencia Perks.XP.Desc=Recibes un impulso de XP en ciertas habilidades. Perks.Lucky.Name=Suerte -Perks.Lucky.Desc=Da {0} destrezas y habilidades de un 33,3% m\u00e1s posibilidades de activar. -Perks.Lucky.Desc.Login=Da ciertas destrezas y habilidades de un 33,3% m\u00e1s posibilidades de activar. -Perks.Lucky.Bonus=[[GOLD]] ({0} con suerte de beneficios adicionales) -Perks.Cooldowns.Name=Recuperaci\u00f3n rapida -Perks.Cooldowns.Desc=Acorta la duraci\u00f3n de tiempo de reutilizaci\u00f3n {0} +Perks.Lucky.Desc=Da {0} destrezas y habilidades de un 33,3% más posibilidades de activar. +Perks.Lucky.Desc.Login=Da ciertas destrezas y habilidades de un 33,3% más posibilidades de activar. +Perks.Lucky.Bonus=&6 ({0} con suerte de beneficios adicionales) +Perks.Cooldowns.Name=Recuperación rapida +Perks.Cooldowns.Desc=Acorta la duración de tiempo de reutilización {0} Perks.ActivationTime.Name=Resistencia -Perks.ActivationTime.Desc=Aumenta el tiempo de activaci\u00f3n de la capacidad por {0} segundos. -Perks.ActivationTime.Bonus=[[GOLD]] ({0}s con beneficio de resistencia) -Hardcore.Mode.Disabled=[[GOLD]][mcMMO] Modo hardcore {0} desactivado. {1} -Hardcore.Mode.Enabled=[[GOLD]][mcMMO] Modo dhrdcore {0} activado. {1} +Perks.ActivationTime.Desc=Aumenta el tiempo de activación de la capacidad por {0} segundos. +Perks.ActivationTime.Bonus=&6 ({0}s con beneficio de resistencia) +Hardcore.Mode.Disabled=&6[mcMMO] Modo hardcore {0} desactivado. {1} +Hardcore.Mode.Enabled=&6[mcMMO] Modo dhrdcore {0} activado. {1} Hardcore.DeathStatLoss.Name=Bonus de pena de muerte. -Hardcore.DeathStatLoss.PlayerDeath=[[GOLD]][mcMMO] [[DARK_RED]]Has perdido [[BLUE]]{0}[[DARK_RED]] de la muerte. -Hardcore.DeathStatLoss.PercentageChanged=[[GOLD]][mcMMO] El porcentaje de perdida de stats fue cambiado a {0}. +Hardcore.DeathStatLoss.PlayerDeath=&6[mcMMO] &4Has perdido &9{0}&4 de la muerte. +Hardcore.DeathStatLoss.PercentageChanged=&6[mcMMO] El porcentaje de perdida de stats fue cambiado a {0}. Hardcore.Vampirism.Name=Vampirismo -Hardcore.Vampirism.Killer.Failure=[GOLD]][mcMMO] [[YELLOW]]{0}[[GRAY]] era demasiado inexperto para concederte algo de sabiduria. -Hardcore.Vampirism.Killer.Success=[[GOLD]][mcMMO] [[DARK_AQUA]]Has robado [[BLUE]]{0}[[DARK_AQUA]] niveles de [[YELLOW]]{1}. -Hardcore.Vampirism.Victim.Failure=[[GOLD]][mcMMO] [[YELLOW]]{0}[[GRAY]] fue incapaz de robarte sabiduria! -Hardcore.Vampirism.Victim.Success=[[GOLD]][mcMMO] [[YELLOW]]{0}[[DARK_RED]] te ha robado [[BLUE]]{1}[[DARK_RED]] niveles! -Hardcore.Vampirism.PercentageChanged=[[GOLD]][mcMMO] El porcentaje de sanguijuela fue cambiado a {0}. -MOTD.Donate=[[DARK_AQUA]]Informacion de la donacion: -MOTD.Hardcore.Enabled=[[GOLD]][mcMMO] [[DARK_AQUA]]Modo hardcore activado: [[DARK_RED]]{0} -MOTD.Hardcore.DeathStatLoss.Stats=[[GOLD]][mcMMO] [[DARK_AQUA]]Penalizacion de habilidad por muerte: [[DARK_RED]]{0}% -MOTD.Hardcore.Vampirism.Stats=[[GOLD]][mcMMO] [[DARK_AQUA]]Estadisticas de sanguijuela vampirica: [[DARK_RED]]{0}% +Hardcore.Vampirism.Killer.Failure=&6[mcMMO] &e{0}&7 era demasiado inexperto para concederte algo de sabiduria. +Hardcore.Vampirism.Killer.Success=&6[mcMMO] &3Has robado &9{0}&3 niveles de &e{1}. +Hardcore.Vampirism.Victim.Failure=&6[mcMMO] &e{0}&7 fue incapaz de robarte sabiduria! +Hardcore.Vampirism.Victim.Success=&6[mcMMO] &e{0}&4 te ha robado &9{1}&4 niveles! +Hardcore.Vampirism.PercentageChanged=&6[mcMMO] El porcentaje de sanguijuela fue cambiado a {0}. +MOTD.Donate=&3Informacion de la donacion: +MOTD.Hardcore.Enabled=&6[mcMMO] &3Modo hardcore activado: &4{0} +MOTD.Hardcore.DeathStatLoss.Stats=&6[mcMMO] &3Penalizacion de habilidad por muerte: &4{0}% +MOTD.Hardcore.Vampirism.Stats=&6[mcMMO] &3Estadisticas de sanguijuela vampirica: &4{0}% MOTD.PerksPrefix=[mcMMO Beneficios] -MOTD.Version=[[GOLD]][mcMMO] Utilizando la version [[DARK_AQUA]]{0} -MOTD.Website=[[GOLD]][mcMMO] [[GREEN]]{0}[[YELLOW]] - Pagina web de mcMMO -Smelting.Ability.FluxMining=Probabilidad de mineria fluida: [[YELLOW]]{0} -Smelting.Ability.FuelEfficiency=Multiplicador de eficiencia del combustible: [[YELLOW]]{0}x +MOTD.Version=&6[mcMMO] Utilizando la version &3{0} +MOTD.Website=&6[mcMMO] &a{0}&e - Pagina web de mcMMO +Smelting.Ability.FluxMining=Probabilidad de mineria fluida: &e{0} +Smelting.Ability.FuelEfficiency=Multiplicador de eficiencia del combustible: &e{0}x Smelting.Ability.Locked.0=Bloqueado hasta {0}+ HABILIDAD (IMPULSO DE XP VANILLA) Smelting.Ability.Locked.1=Bloqueado hasta {0}+ HABILIDAD (MINERIA FLUIDA) -Smelting.Ability.SecondSmelt=Probabilidad de segundo fundido: [[YELLOW]]{0} -Smelting.Ability.VanillaXPBoost=Multiplicador de XP Vanilla: [[YELLOW]]{0}x +Smelting.Ability.SecondSmelt=Probabilidad de segundo fundido: &e{0} +Smelting.Ability.VanillaXPBoost=Multiplicador de XP Vanilla: &e{0}x Smelting.SubSkill.FuelEfficiency.Name=Eficiencia del combustible Smelting.SubSkill.FuelEfficiency.Description=Aumente el tiempo de quemado de combustible utilizado en los hornos mientras se funde. Smelting.SubSkill.SecondSmelt.Name=Seunda fusion @@ -631,25 +630,25 @@ Smelting.Effect.4=Impulso de XP Vamilla Smelting.Effect.5=Aumento de la XP VANILLA obtenida mientras de funde Smelting.SubSkill.FluxMining.Name=Mineria fluida Smelting.SubSkill.FluxMining.Description=Probabilidad de que los minerales sean automaticamente fundidos mientras se mina (toque de seda) -Smelting.FluxMining.Success=[[GREEN]]Ese mineral se fundio por si solo! +Smelting.FluxMining.Success=&aEse mineral se fundio por si solo! Smelting.Listener=Fusion Smelting.SkillName=FUNDIENDO -Commands.Description.addlevels=A\u00f1adir niveles mcMMO a un usuario -Commands.Description.adminchat=Activa/Desactiva el chat de administarcion mcMMO o envia mensajes de chat de administraci\u00f3n -Commands.Description.addxp=A\u00f1adir XP mcMMO a un usuario +Commands.Description.addlevels=Añadir niveles mcMMO a un usuario +Commands.Description.adminchat=Activa/Desactiva el chat de administarcion mcMMO o envia mensajes de chat de administración +Commands.Description.addxp=Añadir XP mcMMO a un usuario Commands.Description.hardcore=Modifica el porcentaje de mcMMO Hardcore o Activa/Desactiva el modo hardcore Commands.Description.inspect=Ver informacion mcMMO detallada de un jugador Commands.Description.mcability=Activar/Desactivar habilidades mcMMO en boton derecho del raton Commands.Description.mcgod=Activa/Desactiva modo dios mcMMO Commands.Description.mchud=Cambiar el estilo de mcMMO HUD -Commands.Description.mcmmo=Mostrar una breve descripci\u00f3n de mcMMO +Commands.Description.mcmmo=Mostrar una breve descripción de mcMMO Commands.Description.mcnotify=Activa/Desactiva las notificaciones de habilidad Commands.Description.mcpurge=Purgar usuarios con ningun nivel mcMMO y usuarios que no se han conectado en {0} meses de la base de datos Commands.Description.mcrank=Mostrar las estadisticas mcMMO de un jugador -Commands.Description.mcrefresh=Actualizar todos los tiempos de reutilizaci\u00f3n para mcMMO +Commands.Description.mcrefresh=Actualizar todos los tiempos de reutilización para mcMMO Commands.Description.mcremove=Elimina a un usuario de la base de datos de mcMMO Commands.Description.mcstats=Muestra tu nivel y XP mcMMO -Commands.Description.mctop=Mostrar tablas de clasificaci\u00f3n mcMMO +Commands.Description.mctop=Mostrar tablas de clasificación mcMMO Commands.Description.mmoedit=Editar niveles mcMMO de un usuario Commands.Description.mmoupdate=Migrar la base de datos mcMMO de una base de datos antigua a una nueva actual Commands.Description.mcconvert=Convierte tipos de basa de datos o tipos de formulas de experiencia. @@ -673,3 +672,6 @@ Scoreboard.Misc.Level=Nivel Scoreboard.Misc.CurrentXP=XP actual Scoreboard.Misc.RemainingXP=XP restante Scoreboard.Misc.Overall=Total +Commands.XPBar.Usage=Proper usage is /mmoxpbar +Commands.Description.mmoxpbar=Player settings for mcMMO XP bars +Commands.Description.mmocompat=Information about mcMMO and whether or not its in compatibility mode or fully functional. diff --git a/src/main/resources/locale/locale_fi.properties b/src/main/resources/locale/locale_fi.properties index 16ced7dab..fc5039a01 100644 --- a/src/main/resources/locale/locale_fi.properties +++ b/src/main/resources/locale/locale_fi.properties @@ -1,199 +1,202 @@ -Acrobatics.Ability.Proc=[[GREEN]]**Sulava Laskeutuminen** -Acrobatics.Combat.Proc=[[GREEN]]**V\u00e4ist\u00f6liike** +Acrobatics.Ability.Proc=&a**Sulava Laskeutuminen** +Acrobatics.Combat.Proc=&a**Väistöliike** Acrobatics.Listener=Akrobatia: Acrobatics.SkillName=AKROBATIA -Acrobatics.Skillup=Akrobatian taito nousi {0} tasolla. Kokonaism\u00e4\u00e4r\u00e4 ({1}) +Acrobatics.Skillup=Akrobatian taito nousi {0} tasolla. Kokonaismäärä ({1}) Archery.SubSkill.SkillShot.Name=Taitolaukaus Archery.SubSkill.SkillShot.Description=Parantaa jousien aiheuttamaa vahinkoa Archery.SubSkill.ArrowRetrieval.Description=Mahdollisuus saada nuolia takaisin ruumiilta Archery.Skillup=Jousiammuntataito kehittyi {0} tasoa. Kokonaistaso: ({1}) -Axes.Ability.Lower=[[GRAY]]**LASKET KIRVEESI ALAS** -Axes.Ability.Ready=[[GREEN]]**KOHOTAT KIRVEESI** -Axes.Combat.CritStruck=[[DARK_RED]]Sinuun iskettiin KRITIKAALISESTI! +Axes.Ability.Lower=&7**LASKET KIRVEESI ALAS** +Axes.Ability.Ready=&a**KOHOTAT KIRVEESI** +Axes.Combat.CritStruck=&4Sinuun iskettiin KRITIKAALISESTI! Axes.Combat.CriticalHit=KRIITTINEN OSUMA! -Axes.Combat.GI.Proc=[[GREEN]]**OSUI SUURELLA VOIMALLA** +Axes.Combat.GI.Proc=&a**OSUI SUURELLA VOIMALLA** Axes.Combat.GI.Struck=**OSUNUT SUUREMMALLA VOIMALLA** -Axes.Combat.SS.Length=Kallon Halkaisun Pituus: [[YELLOW]]{0}s +Axes.Combat.SS.Length=Kallon Halkaisun Pituus: &e{0}s Axes.SubSkill.SkullSplitter.Name=Kallonhalkaisija (Kyky) Axes.SubSkill.CriticalStrikes.Name=Kriittiset Iskut Axes.SubSkill.CriticalStrikes.Description=Kaksinkertainen Vahinko -Axes.SubSkill.AxeMastery.Description=Lis\u00e4\u00e4 vahinkoa -Axes.SubSkill.ArmorImpact.Description=Ly\u00f6 panssarin rikkovalla voimalla +Axes.SubSkill.AxeMastery.Description=Lisää vahinkoa +Axes.SubSkill.ArmorImpact.Description=Lyö panssarin rikkovalla voimalla Axes.SubSkill.GreaterImpact.Name=Suurempi osumisvoima -Axes.SubSkill.GreaterImpact.Description=Tee enemm\u00e4n vahinkoa panssaroimattomiin vihollisiin +Axes.SubSkill.GreaterImpact.Description=Tee enemmän vahinkoa panssaroimattomiin vihollisiin Axes.Listener=Kirveet: Axes.SkillName=KIRVEET -Axes.Skills.SS.On=[[GREEN]]**Kallonhalkaisija AKTIVOITU** -Axes.Skills.SS.Refresh=[[GREEN]]Sinun[[YELLOW]]Kallonhalkaisu [[GREEN]]taito on latautunut! -Axes.Skills.SS.Other.On=[[GREEN]]{0}[[DARK_GREEN]] on k\u00e4ytt\u00e4nyt [[RED]] Kallonhalkaisijaa! -Axes.Skillup=Akrobatian taito nousi {0} tasolla. Kokonaism\u00e4\u00e4r\u00e4 ({1}) -Excavation.Ability.Lower=[[GRAY]]**LASKET LAPIOSI ALAS** -Excavation.Ability.Ready=[[GREEN]]**KOHOTAT LAPIOSI** -Excavation.SubSkill.TreasureHunter.Name=Aarteenmets\u00e4st\u00e4j\u00e4 +Axes.Skills.SS.On=&a**Kallonhalkaisija AKTIVOITU** +Axes.Skills.SS.Refresh=&aSinun&eKallonhalkaisu &ataito on latautunut! +Axes.Skills.SS.Other.On=&a{0}&2 on käyttänyt &c Kallonhalkaisijaa! +Axes.Skillup=Akrobatian taito nousi {0} tasolla. Kokonaismäärä ({1}) +Excavation.Ability.Lower=&7**LASKET LAPIOSI ALAS** +Excavation.Ability.Ready=&a**KOHOTAT LAPIOSI** +Excavation.SubSkill.TreasureHunter.Name=Aarteenmetsästäjä Excavation.Listener=Kaivuu: Excavation.SkillName=KAIVANTO -Excavation.Skills.GigaDrillBreaker.On=[[GREEN]]**TEHO PORA HAJOITUS AKTIVOITU** -Excavation.Skillup=Kaivuu taito nousi {0} tasolla. Kokonaism\u00e4\u00e4r\u00e4 ({1}) -Fishing.SubSkill.TreasureHunter.Name=Aarteenmets\u00e4st\u00e4j\u00e4 (Passiivinen) +Excavation.Skills.GigaDrillBreaker.On=&a**TEHO PORA HAJOITUS AKTIVOITU** +Excavation.Skillup=Kaivuu taito nousi {0} tasolla. Kokonaismäärä ({1}) +Fishing.SubSkill.TreasureHunter.Name=Aarteenmetsästäjä (Passiivinen) Fishing.Listener=Kalastus: -Fishing.Ability.TH.MagicFound=[[GRAY]]You feel a touch of magic with this catch... +Fishing.Ability.TH.MagicFound=&7You feel a touch of magic with this catch... Fishing.SkillName=KALASTUS -Fishing.Skillup=Kalastustaito nousi {0} tasolla. Kokonaism\u00e4\u00e4r\u00e4 ({1}) -Herbalism.Ability.GTh.Fail=**VIHERPEUKALO EP\u00c4ONNISTUI** -Herbalism.Ability.GTh=[[GREEN]]**VIHERPEUKALO** -Herbalism.Ability.Lower=[[GRAY]]**LASKET KUOKKASI ALAS** -Herbalism.Ability.Ready=[[GREEN]]**KOHOTAT KUOKKASI** +Fishing.Skillup=Kalastustaito nousi {0} tasolla. Kokonaismäärä ({1}) +Herbalism.Ability.GTh.Fail=**VIHERPEUKALO EPÄONNISTUI** +Herbalism.Ability.GTh=&a**VIHERPEUKALO** +Herbalism.Ability.Lower=&7**LASKET KUOKKASI ALAS** +Herbalism.Ability.Ready=&a**KOHOTAT KUOKKASI** Herbalism.Listener=Yrttitietous: -Herbalism.Skills.GTe.Refresh=[[GREEN]]Sinun [[YELLOW]]Viherpeukalo [[GREEN]]taito on latautunut! -Herbalism.Skills.GTe.Other.Off=Viherpaukalo taito[[GREEN]] kului loppuun ajaksi [[YELLOW]]{0} -Mining.Ability.Length=Teho Hajoituksen Pituus: [[YELLOW]]{0}s -Mining.Ability.Lower=[[GRAY]]**LASKIT HAKKUSI** -Mining.Ability.Ready=[[GREEN]]**VALMISTAUDUT ISKEM\u00c4\u00c4N HAKULLASI** +Herbalism.Skills.GTe.Refresh=&aSinun &eViherpeukalo &ataito on latautunut! +Herbalism.Skills.GTe.Other.Off=Viherpaukalo taito&a kului loppuun ajaksi &e{0} +Mining.Ability.Length=Teho Hajoituksen Pituus: &e{0}s +Mining.Ability.Lower=&7**LASKIT HAKKUSI** +Mining.Ability.Ready=&a**VALMISTAUDUT ISKEMÄÄN HAKULLASI** Mining.Listener=Louhinta: Mining.SkillName=LOUHINTA -Mining.Skills.SuperBreaker.Other.Off=Tehostettu hajoitus[[GREEN]] kului loppuun ajaksi [[YELLOW]]{0} -Mining.Skills.SuperBreaker.Refresh=[[GREEN]]Sinun [[YELLOW]Superrikkomis [[GREEN]]-taito on uudelleenlatautunut! -Mining.Skillup=Louhimistaito kasvoi {0} tasolla. Kokonaism\u00e4\u00e4r\u00e4 ({1}) -Mining.Blast.Boom=[[GRAY]]**BOOM** -Mining.Blast.Radius.Increase=R\u00e4j\u00e4ytys Et\u00e4isyys Nousi: [[YELLOW]]+{0} -Mining.Blast.Refresh=[[GREEN]]Sinun [[YELLOW] R\u00e4j\u00e4ht\u00e4v\u00e4 Kaivuu [[GREEN]]-kyky on uudelleenlatautunut! +Mining.Skills.SuperBreaker.Other.Off=Tehostettu hajoitus&a kului loppuun ajaksi &e{0} +Mining.Skills.SuperBreaker.Refresh=&aSinun &eSuperrikkomis &a-taito on uudelleenlatautunut! +Mining.Skillup=Louhimistaito kasvoi {0} tasolla. Kokonaismäärä ({1}) +Mining.Blast.Boom=&7**BOOM** +Mining.Blast.Radius.Increase=Räjäytys Etäisyys Nousi: &e+{0} +Mining.Blast.Refresh=&aSinun &e Räjähtävä Kaivuu &a-kyky on uudelleenlatautunut! Repair.SubSkill.Repair.Name=Korjaus Repair.SubSkill.RepairMastery.Name=Korjaus Mestaruus Repair.SubSkill.RepairMastery.Description=Korotettu korjaus taso Repair.SubSkill.SuperRepair.Name=Tehostettu Korjaus Repair.SubSkill.SuperRepair.Description=Kaksinkertainen tehokkuus Repair.SubSkill.DiamondRepair.Name=Timantti Korjaus ({0}+ TAITO) -Repair.SubSkill.DiamondRepair.Description=Korjaa Timantti ty\u00f6kaluja & haarniskoita +Repair.SubSkill.DiamondRepair.Description=Korjaa Timantti työkaluja & haarniskoita Repair.SubSkill.ArcaneForging.Name=Mystinen Korjaus -Repair.SubSkill.ArcaneForging.Description=Korjaa lumottuja esineit\u00e4 -Repair.Listener.Anvil=[[DARK_RED]]Olet asettanut alasimen paikalleen, voit korjata ty\u00f6kalusi ja haarniskasi sill\u00e4. +Repair.SubSkill.ArcaneForging.Description=Korjaa lumottuja esineitä +Repair.Listener.Anvil=&4Olet asettanut alasimen paikalleen, voit korjata työkalusi ja haarniskasi sillä. Repair.Listener=Korjaus: Repair.SkillName=KORJAA -Repair.Skills.AdeptDiamond=[[DARK_RED]]Et ole tarpeeksi taitava korjataksesi timanttia. -Repair.Skills.AdeptGold=[[DARK_RED]]Et ole tarpeeksi taitava korjataksesi kultaa. -Repair.Skills.AdeptIron=[[DARK_RED]]Et ole tarpeeksi taitava korjataksesi rautaa. -Repair.Skills.AdeptStone=Et ole tarpeeksi taitava korjataksesi kive\u00e4. -Repair.Skills.FeltEasy=[[GRAY]]Seh\u00e4n tuntui helpolta. -Repair.Skills.StackedItems=[[DARK_RED]]Et voi korjata p\u00e4\u00e4llekk\u00e4isi\u00e4 tavaroita. -Repair.Skillup=Korjaustaito kasvoi {0} tasolla. Kokonaism\u00e4\u00e4r\u00e4 ({1}) -Repair.Arcane.Chance.Downgrade=[[GRAY]]Mystisen Korjauksen huononnus mahdollisuus: [[YELLOW]]{0}% -Repair.Arcane.Chance.Success=[[GRAY]]Mystisen Taonnan Onnistumisprosentti: [[YELLOW]]{0}% -Repair.Arcane.Fail=Taikavoima on h\u00e4ipynyt esineest\u00e4 pysyv\u00e4sti. -Repair.Arcane.Lost=Et ollut tarpeeksi taitava pit\u00e4\u00e4ksesi lumouksia. -Swords.Ability.Lower=[[GRAY]]**LASKIT MIEKKASI** -Swords.Ability.Ready=[[GREEN]]**VALMISTAUDUT ISKEM\u00c4\u00c4N MIEKALLASI** -Swords.Combat.Bleeding.Stopped=[[GRAY]]Verenvuodatus on [[GREEN]]loppunut[[GRAY]]! -Swords.Combat.Bleeding=[[GREEN]]**Vihollinen vuotaa verta** -Swords.Combat.Countered=[[GREEN]]**VASTAISKU** -Swords.Combat.SS.Struck=[[DARK_RED]]Sinua iskettiin SAHALAITA ISKULLA! +Repair.Skills.AdeptDiamond=&4Et ole tarpeeksi taitava korjataksesi timanttia. +Repair.Skills.AdeptGold=&4Et ole tarpeeksi taitava korjataksesi kultaa. +Repair.Skills.AdeptIron=&4Et ole tarpeeksi taitava korjataksesi rautaa. +Repair.Skills.AdeptStone=Et ole tarpeeksi taitava korjataksesi kiveä. +Repair.Skills.FeltEasy=&7Sehän tuntui helpolta. +Repair.Skills.StackedItems=&4Et voi korjata päällekkäisiä tavaroita. +Repair.Skillup=Korjaustaito kasvoi {0} tasolla. Kokonaismäärä ({1}) +Repair.Arcane.Chance.Downgrade=&7Mystisen Korjauksen huononnus mahdollisuus: &e{0}% +Repair.Arcane.Chance.Success=&7Mystisen Taonnan Onnistumisprosentti: &e{0}% +Repair.Arcane.Fail=Taikavoima on häipynyt esineestä pysyvästi. +Repair.Arcane.Lost=Et ollut tarpeeksi taitava pitääksesi lumouksia. +Swords.Ability.Lower=&7**LASKIT MIEKKASI** +Swords.Ability.Ready=&a**VALMISTAUDUT ISKEMÄÄN MIEKALLASI** +Swords.Combat.Bleeding.Stopped=&7Verenvuodatus on &aloppunut&7! +Swords.Combat.Bleeding=&a**Vihollinen vuotaa verta** +Swords.Combat.Countered=&a**VASTAISKU** +Swords.Combat.SS.Struck=&4Sinua iskettiin SAHALAITA ISKULLA! Swords.SubSkill.CounterAttack.Name=Vastaisku Swords.Effect.4=Sahalaitaiset Iskut Verenvuoto+ Swords.Listener=Miekkailu: -Swords.Skills.SS.On=[[GREEN]]**SAHALAITAISET ISKUT AKTIVOITU** -Swords.Skills.SS.Other.Off=Sahalaita Isku[[GREEN]] kului loppuun ajaksi [[YELLOW]]{0} -Swords.Skills.SS.Other.On=[[GREEN]]{0}[[DARK_GREEN]] on k\u00e4ytt\u00e4nyt [[RED]]Sahalaita iskua! -Swords.SS.Length=Sahalaitaisten Iskujen kesto: [[YELLOW]]{0}s -Taming.Ability.Bonus.1=Sudet v\u00e4ltt\u00e4v\u00e4t vaaraa +Swords.Skills.SS.On=&a**SAHALAITAISET ISKUT AKTIVOITU** +Swords.Skills.SS.Other.Off=Sahalaita Isku&a kului loppuun ajaksi &e{0} +Swords.Skills.SS.Other.On=&a{0}&2 on käyttänyt &cSahalaita iskua! +Swords.SS.Length=Sahalaitaisten Iskujen kesto: &e{0}s +Taming.Ability.Bonus.1=Sudet välttävät vaaraa Taming.Ability.Bonus.2=Paksu Turkki Taming.Ability.Bonus.6=Teroitetut Kynnet -Taming.SubSkill.ShockProof.Name=Shokin Kest\u00e4v\u00e4 -Taming.SubSkill.ShockProof.Description=R\u00e4j\u00e4hdysvahingon v\u00e4hent\u00e4minen -Taming.SubSkill.CallOfTheWild.Name=Er\u00e4maan Kutsu -Taming.SubSkill.CallOfTheWild.Description=Kutsu el\u00e4in puolellesi +Taming.SubSkill.ShockProof.Name=Shokin Kestävä +Taming.SubSkill.ShockProof.Description=Räjähdysvahingon vähentäminen +Taming.SubSkill.CallOfTheWild.Name=Erämaan Kutsu +Taming.SubSkill.CallOfTheWild.Description=Kutsu eläin puolellesi Taming.SubSkill.FastFoodService.Name=Pikaruokapalvelu Taming.SubSkill.Gore.Description=Kriittinen Isku joka saa aikaan Verenvuodon. Taming.SubSkill.ThickFur.Name=Paksu Turkki -Taming.Listener.Wolf=[[DARK_GRAY]]Sutesi kipitt\u00e4\u00e4 takaisin luoksesi... -Taming.Listener=Kesytt\u00e4minen: -Taming.SkillName=KESYTT\u00c4MINEN -Taming.Skillup=Kesytys taito nousi {0} tasolla. Kokonaism\u00e4\u00e4r\u00e4 ({1}) -Taming.Summon.Complete=[[GREEN]]Kutsuminen valmis -Unarmed.Ability.Berserk.Length=Sekop\u00e4\u00e4n Pituus: [[YELLOW]]{0}s -Unarmed.Ability.Bonus.0=Rautak\u00e4sityyli +Taming.Listener.Wolf=&8Sutesi kipittää takaisin luoksesi... +Taming.Listener=Kesyttäminen: +Taming.SkillName=KESYTTÄMINEN +Taming.Skillup=Kesytys taito nousi {0} tasolla. Kokonaismäärä ({1}) +Taming.Summon.Complete=&aKutsuminen valmis +Unarmed.Ability.Berserk.Length=Sekopään Pituus: &e{0}s +Unarmed.Ability.Bonus.0=Rautakäsityyli Unarmed.Ability.Bonus.1=+{0} Vahinkoparannus -Unarmed.Ability.Lower=[[GRAY]]**LASKET NYRKKISI ALAS** +Unarmed.Ability.Lower=&7**LASKET NYRKKISI ALAS** Unarmed.Listener=Aseeton: Unarmed.SkillName=ASEETON Unarmed.Skills.Berserk.Off=**Berserkki on deaktivoitunut** -Unarmed.Skills.Berserk.On=[[GREEN]]**BERSERK AKTIVOITU** -Unarmed.Skills.Berserk.Other.Off=Sekop\u00e4\u00e4[[GREEN]] kului loppuun ajaksi [[YELLOW]]{0} -Unarmed.Skills.Berserk.Other.On=[[GREEN]]{0}[[DARK_GREEN]] on k\u00e4ytt\u00e4nyt [[RED]]berserkki\u00e4! +Unarmed.Skills.Berserk.On=&a**BERSERK AKTIVOITU** +Unarmed.Skills.Berserk.Other.Off=Sekopää&a kului loppuun ajaksi &e{0} +Unarmed.Skills.Berserk.Other.On=&a{0}&2 on käyttänyt &cberserkkiä! Woodcutting.Ability.0=Lehtipuhallin -Woodcutting.Ability.1=Puhaltaa lehti\u00e4 pois -Woodcutting.Ability.Length=Puunkaatajan kesto: [[YELLOW]]{0}s +Woodcutting.Ability.1=Puhaltaa lehtiä pois +Woodcutting.Ability.Length=Puunkaatajan kesto: &e{0}s Woodcutting.SubSkill.TreeFeller.Name=Puunkaataja (KYKY) -Woodcutting.SubSkill.TreeFeller.Description=Saa puut r\u00e4j\u00e4ht\u00e4m\u00e4\u00e4n +Woodcutting.SubSkill.TreeFeller.Description=Saa puut räjähtämään Woodcutting.SubSkill.LeafBlower.Name=Lehtien Puhaltaja Woodcutting.Listener=Puunhakkuu: Woodcutting.SkillName=Puunhakkuu -Woodcutting.Skills.TreeFeller.On=[[GREEN]]**PUUNKAATAJA AKTIVOITU** -Woodcutting.Skills.TreeFeller.Refresh=[[GREEN]]Sinun [[YELLOW]]Puunhakkuu [[GREEN]]taito on latautunut! -Woodcutting.Skills.TreeFeller.Other.Off=Puunhakkuu[[GREEN]] kului loppuun ajaksi [[YELLOW]]{0} -Woodcutting.Skills.TreeFeller.Other.On=[[GREEN]]{0}[[DARK_GREEN]] on k\u00e4ytt\u00e4nyt [[RED]]Puunkaatajaa! +Woodcutting.Skills.TreeFeller.On=&a**PUUNKAATAJA AKTIVOITU** +Woodcutting.Skills.TreeFeller.Refresh=&aSinun &ePuunhakkuu &ataito on latautunut! +Woodcutting.Skills.TreeFeller.Other.Off=Puunhakkuu&a kului loppuun ajaksi &e{0} +Woodcutting.Skills.TreeFeller.Other.On=&a{0}&2 on käyttänyt &cPuunkaatajaa! Woodcutting.Skills.TreeFeller.Splinter=SINUN KIRVES HAJOSI TUHANSIIN OSIIN! Woodcutting.Skills.TreeFeller.Threshold=Puu on liian suuri! -Woodcutting.Skillup=Puunhakkuutaso nousi {0} tasolla. Kokonaism\u00e4\u00e4r\u00e4 ({1}) -Combat.ArrowDeflect=[[WHITE]]**NUOLI TORJUTTU** -Combat.BeastLore=[[GREEN]]**BEAST LORE** -Combat.BeastLoreHealth=[[DARK_AQUA]]Health ([[GREEN]]{0}[[DARK_AQUA]]/{1}) -Combat.BeastLoreOwner=[[DARK_AQUA]]Owner ([[RED]]{0}[[DARK_AQUA]]) -Combat.Gore=[[GREEN]]**PISTO** +Woodcutting.Skillup=Puunhakkuutaso nousi {0} tasolla. Kokonaismäärä ({1}) +Combat.ArrowDeflect=&f**NUOLI TORJUTTU** +Combat.BeastLore=&a**BEAST LORE** +Combat.BeastLoreHealth=&3Health (&a{0}&3/{1}) +Combat.BeastLoreOwner=&3Owner (&c{0}&3) +Combat.Gore=&a**PISTO** Combat.StruckByGore=**SINUA ON PISTETTY** -Combat.TargetDazed=Kohde [[DARK_RED]]tyrm\u00e4tty -Combat.TouchedFuzzy=[[DARK_RED]]T\u00f6kk\u00e4sit P\u00f6rr\u00f6\u00e4. Tunsit huimauksen. -Commands.AdminChat.Off=Ainoastaan Yll\u00e4pit\u00e4jien keskustelu [[RED]]pois p\u00e4\u00e4lt\u00e4 -Commands.AdminToggle=Kytke adminchat p\u00e4\u00e4lle/pois -Commands.Disabled=T\u00e4m\u00e4 komento ei ole k\u00e4ytett\u00e4viss\u00e4. +Combat.TargetDazed=Kohde &4tyrmätty +Combat.TouchedFuzzy=&4Tökkäsit Pörröä. Tunsit huimauksen. +Commands.AdminChat.Off=Ainoastaan Ylläpitäjien keskustelu &cpois päältä +Commands.AdminToggle=Kytke adminchat päälle/pois +Commands.Disabled=Tämä komento ei ole käytettävissä. Commands.DoesNotExist=Player does not exist in the database! -Commands.Party.Invite.Accepted=[[GREEN]]Kutsu hyv\u00e4ksytty. Liityit ryhm\u00e4\u00e4n {0} -Commands.Invite.Success=[[GREEN]]Kutsu l\u00e4hetettiin onnistuneesti. -Commands.mmoedit=[player] [[RED]] - Muokkaa kohdetta +Commands.Party.Invite.Accepted=&aKutsu hyväksytty. Liityit ryhmään {0} +Commands.Invite.Success=&aKutsu lähetettiin onnistuneesti. +Commands.mmoedit=[player] &c - Muokkaa kohdetta Commands.NoConsole=This command does not support console usage. -Commands.Other=[[GREEN]]--MUUT KOMENNOT-- -Commands.Party.Accept=- Hyv\u00e4ksy kutsu ryhm\u00e4\u00e4n -Commands.Party.Commands=[[GREEN]]--RYHM\u00c4KOMENNOT-- -Commands.Party.Invite.0=HUOMIO: [[GREEN]]Sait kutsun ryhm\u00e4\u00e4n {0} pelaajalta {1} -Commands.Party.Kick=Sinut on potkittu ryhm\u00e4st\u00e4 {0}! -Commands.Party.Leave=Sin\u00e4 l\u00e4hdit ryhm\u00e4st\u00e4 -Commands.Party.None=Et ole miss\u00e4\u00e4n ryhm\u00e4ss\u00e4. -Commands.Party.Quit=- J\u00e4t\u00e4 nykyinen ryhm\u00e4si -Commands.PowerLevel.Leaderboard=--mcMMO[[BLUE]] Voimataso [[YELLOW]]Leaderboard-- -Commands.PowerLevel=[[DARK_RED]]Voimataso: [[GREEN]]{0} +Commands.Other=&a--MUUT KOMENNOT-- +Commands.Party.Accept=- Hyväksy kutsu ryhmään +Commands.Party.Commands=&a--RYHMÄKOMENNOT-- +Commands.Party.Invite.0=HUOMIO: &aSait kutsun ryhmään {0} pelaajalta {1} +Commands.Party.Kick=Sinut on potkittu ryhmästä {0}! +Commands.Party.Leave=Sinä lähdit ryhmästä +Commands.Party.None=Et ole missään ryhmässä. +Commands.Party.Quit=- Jätä nykyinen ryhmäsi +Commands.PowerLevel.Leaderboard=--mcMMO&9 Voimataso &eLeaderboard-- +Commands.PowerLevel=&4Voimataso: &a{0} Commands.Stats.Self=SINUN TILASTOSI -mcMMO.NoSkillNote=[[DARK_GRAY]]Jos sinulla ei ole oikeutta k\u00e4ytt\u00e4\u00e4 jotain taitoa, sit\u00e4 ei n\u00e4ytet\u00e4 t\u00e4ss\u00e4. +mcMMO.NoSkillNote=&8Jos sinulla ei ole oikeutta käyttää jotain taitoa, sitä ei näytetä tässä. Party.Forbidden=[mcMMO] Parties not permitted on this world (See Permissions) -Party.IsLocked=T\u00e4m\u00e4 ryhm\u00e4 on jo lukittu! -Party.IsntLocked=T\u00e4m\u00e4 ryhm\u00e4 ei ole lukittu! +Party.IsLocked=Tämä ryhmä on jo lukittu! +Party.IsntLocked=Tämä ryhmä ei ole lukittu! Party.Locked=Party is locked, only party leader may invite. -Party.NotInYourParty=[[DARK_RED]]{0} is not in your party -Party.Password.Set=[[GREEN]]Party password set to {0} +Party.NotInYourParty=&4{0} is not in your party +Party.Password.Set=&aParty password set to {0} Party.Player.Invalid=Tuo ei ole kelvollinen pelaaja. Party.Teleport.Dead=Et voi teleportata kuolleeseen pelaajaan. -Party.Teleport.Target=[[GREEN]]{0} teleporttasi luoksesi. -Party.Unlocked=[[GRAY]]Party is unlocked +Party.Teleport.Target=&a{0} teleporttasi luoksesi. +Party.Unlocked=&7Party is unlocked Commands.XPGain.Acrobatics=Tippuminen -Commands.XPGain.Axes=Hy\u00f6kk\u00e4\u00e4v\u00e4t Hirvi\u00f6t -Commands.XPGain.Excavation=Kaivaminen ja aarteidenl\u00f6yt\u00e4minen +Commands.XPGain.Axes=Hyökkäävät Hirviöt +Commands.XPGain.Excavation=Kaivaminen ja aarteidenlöytäminen Commands.XPGain.Fishing=Kalastus Commands.XPGain.Herbalism=Yrttien sadonkorjuu Commands.XPGain.Mining=Kiven ja malmin louhiminen -Commands.XPGain.Swords=Hy\u00f6kk\u00e4\u00e4vi\u00e4 Hirvi\u00f6it\u00e4 -Commands.XPGain.Taming=El\u00e4inten kesytt\u00e4minen tai taisteleminen susiesi kanssa. -Commands.XPGain=[[DARK_GRAY]]XP SAATAVUUS: [[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.XPGain.Swords=Hyökkääviä Hirviöitä +Commands.XPGain.Taming=Eläinten kesyttäminen tai taisteleminen susiesi kanssa. +Commands.XPGain=&8XP SAATAVUUS: &f{0} +Commands.xplock.locked=&6Your XP BAR is now locked to {0}! +Commands.xplock.unlocked=&6Your XP BAR is now &aUNLOCKED&6! Commands.xprate.over=mcMMO XP Rate Event is OVER!! -XPRate.Event=[[GOLD]]mcMMO is currently in an XP rate event! XP rate is {0}x! +XPRate.Event=&6mcMMO is currently in an XP rate event! XP rate is {0}x! Effects.Effects=TEHOSTEET -Effects.Template=[[DARK_AQUA]]{0}: [[GREEN]]{1} -Inspect.OfflineStats=mcMMO Stats for Offline Player [[YELLOW]]{0} -Inspect.Stats=[[GREEN]]mcMMO Stats for [[YELLOW]]{0} +Effects.Template=&3{0}: &a{1} +Inspect.OfflineStats=mcMMO Stats for Offline Player &e{0} +Inspect.Stats=&amcMMO Stats for &e{0} Inspect.TooFar=You are too far away to inspect that player! Item.ChimaeraWing.Pass=**SILLIKUNINGAS SIIPI** -Item.Injured.Wait=Loukkaannuit \u00e4skett\u00e4in ja sinun tulee odottaa hetki. [[YELLOW]]({0}s) -Skills.Disarmed=[[DARK_RED]]Sinut on riisuttu aseista! +Item.Injured.Wait=Loukkaannuit äskettäin ja sinun tulee odottaa hetki. &e({0}s) +Skills.Disarmed=&4Sinut on riisuttu aseista! Skills.TooTired=You are too tired to use that ability again. -Stats.Header.Combat=[[GOLD]]-=TAISTELUTAIDOT=- -Stats.Header.Gathering=[[GOLD]]-=Resurssinkeruutaidot=- -Stats.Header.Misc=[[GOLD]]-=SEKALAISET TAIDOT=- -Stats.Own.Stats=[[GREEN]][mcMMO] Tilastot +Stats.Header.Combat=&6-=TAISTELUTAIDOT=- +Stats.Header.Gathering=&6-=Resurssinkeruutaidot=- +Stats.Header.Misc=&6-=SEKALAISET TAIDOT=- +Stats.Own.Stats=&a[mcMMO] Tilastot +Commands.XPBar.Usage=Proper usage is /mmoxpbar +Commands.Description.mmoxpbar=Player settings for mcMMO XP bars +Commands.Description.mmocompat=Information about mcMMO and whether or not its in compatibility mode or fully functional. diff --git a/src/main/resources/locale/locale_fr.properties b/src/main/resources/locale/locale_fr.properties index 8c6eb9a26..c7df2078c 100644 --- a/src/main/resources/locale/locale_fr.properties +++ b/src/main/resources/locale/locale_fr.properties @@ -1,543 +1,726 @@ -Acrobatics.Ability.Proc=[[GREEN]]**Atterrissage gracieux** -Acrobatics.Combat.Proc=[[GREEN]]**Esquiv\u00e9** -Acrobatics.DodgeChance=Probabilit\u00e9 d\'esquive : [[YELLOW]]{0} + + +#N'UTILISEZ PAS LES CODES COULEURS DANS LES CLES JSON +#LES COULEURS SONT DEFINI DANS advanced.yml SI VOUS VOULEZ LES CHANGER +JSON.Rank=Grade +JSON.DescriptionHeader=Description +JSON.JWrapper.Header=Détails +JSON.Type.Passive=Passive +JSON.Type.Active=Active +JSON.Type.SuperAbility=Super Abilité +JSON.Locked=-=[FERMÉ]=- +JSON.LevelRequirement=Niveau requis +JSON.JWrapper.Target.Type=Type de la cible: +JSON.JWrapper.Target.Block=Bloc +JSON.JWrapper.Target.Player=Joueur +JSON.JWrapper.Perks.Header=&6Lucky Perks +JSON.JWrapper.Perks.Lucky={0}% de chance supplémentaire +JSON.Hover.Tips=Conseils +JSON.Acrobatics=Acrobatie +JSON.Alchemy=Alchemie +JSON.Archery=Archerie +JSON.Axes=Haches +JSON.Excavation=Excavation +JSON.Fishing=Pêche +JSON.Herbalism=Herbalisme +JSON.Mining=Minage +JSON.Repair=Réparation +JSON.Salvage=Récupération +JSON.Swords=Épée +JSON.Taming=Apprivoisement +JSON.Unarmed=Unarmed +JSON.Woodcutting=Coupe de bois +JSON.URL.Website=Le site officiel de mcMMO ! +JSON.URL.Discord=Le discord officiel de mcMMO ! +JSON.URL.Patreon=Soutenez nossr50 et son travail pour mcMMO sur Patreon ! +JSON.URL.Spigot=La page spigot officiel de mcMMO ! +JSON.URL.Translation=Traduit mcMMO dans d\'autres langues ! +JSON.URL.Wiki=Le wiki officiel de mcMMO ! +JSON.SkillUnlockMessage=&6[ mcMMO&e @&3{0} &6Grade &3{1}&6 Débloqué! ] +JSON.Hover.Rank=&e&lGrade:&r &f{0} +JSON.Hover.NextRank=&7&oProchaine amélioration au niveau {0} +# for JSON.Hover.Mystery you can add {0} to insert the level required into the name, I don\'t like how that looks so I'm not doing that atm +JSON.Hover.Mystery=&7??? +JSON.Hover.Mystery2=&e[&8{0}&e]&8???&r +JSON.Hover.SkillName=&3{0}&r +JSON.Hover.SuperAbility=&5{0}&r +JSON.Hover.MaxRankSkillName=&6{0}&r +JSON.Hover.AtSymbolSkills=&e@ +JSON.Hover.AtSymbolURL=&e@ + +#This is the message sent to players when an ability is activated +JSON.Notification.SuperAbility={0} + +#These are the JSON Strings used for SubSkills +JSON.Acrobatics.Roll.Interaction.Activated=Test &cRolled Test +JSON.Acrobatics.SubSkill.Roll.Details.Tips=Si vous êtes accroupi lorsque vous tombez, vous éviterez de prendre des dégâts ! +Anvil.SingleItemStack=&cVous ne pouvas pas récupérer ou réparer un item plus d\'un item à la fois, déstackez le d\'abord. + +#N'UTILISEZ PAS LES CODES COULEURS DANS LES CLES JSON +#LES COULEURS SONT DEFINI DANS advanced.yml SI VOUS VOULEZ LES CHANGER + +mcMMO.Template.Prefix=&6(&amcMMO&6) &7{0} +# BEGIN STYLING +Ability.Generic.Refresh=&a**ABILITÉS RECHARGÉ!** +Ability.Generic.Template.Lock=&7{0} +# Skill Command Styling +Ability.Generic.Template=&3{0}: &a{1} +Ability.Generic.Template.Custom=&3{0} +Skills.Overhaul.Header=&c[]=====[]&a {0} &c[]=====[] +Effects.Effects=EFFECTS +Effects.SubSkills.Overhaul=Sous-capacité +Effects.Child.Overhaul=&3Child Lv.&e {0}&3: {1} +Effects.Child.ParentList=&a{0}&6(&3Lv.&e{1}&6) +Effects.Level.Overhaul=&6LVL: &e{0} &3XP&e(&6{1}&e/&6{2}&e) +Effects.Parent=&6{0} - +Effects.Template=&3{0}: &a{1} +Commands.Stats.Self.Overhaul=Statistiques +Commands.XPGain.Overhaul=&6XP GAIN: &3{0} +MOTD.Version.Overhaul=&6[mcMMO] &3Overhaul Era&6 - &3{0} +Overhaul.mcMMO.Header=&c[]=====[]&a mcMMO - Révisions &c[]=====[] +Overhaul.mcMMO.Url.Wrap.Prefix=&c[| +Overhaul.mcMMO.Url.Wrap.Suffix=&c|] +Overhaul.mcMMO.MmoInfo.Wiki=&e[&fView this skill on the wiki!&e] +# Overhaul.Levelup can take {0} - Skill Name defined in Overhaul.Name {1} - Amount of levels gained {2} - Level in skill +Overhaul.Levelup=&l{0} increased to &r&a&l{2}&r&f. +Overhaul.Name.Acrobatics=Acrobatie +Overhaul.Name.Alchemy=Alchemie +Overhaul.Name.Archery=Archerie +Overhaul.Name.Axes=Haches +Overhaul.Name.Excavation=Fouille +Overhaul.Name.Fishing=Pêche +Overhaul.Name.Herbalism=Herboristerie +Overhaul.Name.Mining=Minage +Overhaul.Name.Repair=Réparation +Overhaul.Name.Salvage=Récupération +Overhaul.Name.Smelting=Fonte +Overhaul.Name.Swords=Épée +Overhaul.Name.Taming=Apprivoisement +Overhaul.Name.Unarmed=Poings +Overhaul.Name.Woodcutting=Bûcheronnage +# style pour les commandes /mcMMO +Commands.mcc.Header=&c---[]&amcMMO Commandes&c[]--- +Commands.Other=&c---[]&aCOMMANDES SPÉCIALES&c[]--- +Commands.Party.Header=&c-----[]&aPARTIE&c[]----- +Commands.Party.Features.Header=&c-----[]&aFONCTIONNALITÉS&c[]----- +# XP BAR accepte les variables -- {0} Niveau de compétence, {1} XP actuelle, {2} XP nécessaire pour le niveau suivant, {3} Niveau de puissance, {4} Pourcentage du niveau +# Soyez sûr d\'avoir activé Experience_Bars.ThisMayCauseLag.AlwaysUpdateTitlesWhenXPIsGained si vous voulez la barre d\'XP à chaque fois que le joueur en gagne ! +XPBar.Template={0} +XPBar.Template.EarlyGameBoost=&6Apprentissage d\'une nouvelle compétence ... +XPBar.Acrobatics=Acrobatiques Lv.&6{0} +XPBar.Alchemy=Alchemie Lv.&6{0} +XPBar.Archery=Archerie Lv.&6{0} +XPBar.Axes=Haches Lv.&6{0} +XPBar.Excavation=Fouille Lv.&6{0} +XPBar.Fishing=Pêche Lv.&6{0} +XPBar.Herbalism=Herboristerie Lv.&6{0} +XPBar.Mining=Minage Lv.&6{0} +XPBar.Repair=Réparation Lv.&6{0} +XPBar.Salvage=Récupération Lv.&6{0} +XPBar.Smelting=Fonte Lv.&6{0} +XPBar.Swords=Épée Lv.&6{0} +XPBar.Taming=Apprivoisement Lv.&6{0} +XPBar.Unarmed=Poings Lv.&6{0} +XPBar.Woodcutting=Bûcheronnage Lv.&6{0} +# Ceci n\'est qu\'un exemple qui peut être utilisé quand l\'option 'ExtraDetails' dans experience.yml est activé (désactivé par défaut), vous pouvez l\'ignoré et juste modifier le message au dessus +XPBar.Complex.Template={0} &3 {4}&f% &3(&f{1}&3/&f{2}&3) +# XP BAR accepte les variables -- {0} Niveau de compétence, {1} XP actuelle, {2} XP nécessaire pour le niveau suivant, {3} Niveau de puissance, {4} Pourcentage du niveau +# Soyez sûr d\'avoir activé Experience_Bars.ThisMayCauseLag.AlwaysUpdateTitlesWhenXPIsGained si vous voulez la barre d\'XP à chaque fois que le joueur en gagne ! +# FIN DE LA CONFIG DU STYLE + +#ACROBATIES +Acrobatics.Ability.Proc=&a**Atterrissage gracieux** +Acrobatics.Combat.Proc=&a**Esquivé** +Acrobatics.SubSkill.Roll.Stats=&6Roll Chance &e{0}%&6 Graceful Roll Chance&e {1}% +Acrobatics.SubSkill.Roll.Stat=Chance d\'une roulade +Acrobatics.SubSkill.Roll.Stat.Extra=Chance d\'une roulade gracieuse Acrobatics.SubSkill.Roll.Name=Roulade -Acrobatics.SubSkill.Roll.Description=R\u00e9duit ou annule les d\u00e9g\u00e2ts de chute +Acrobatics.SubSkill.Roll.Description=Réduit ou annule les dégâts de chute +Acrobatics.SubSkill.Roll.Chance=Chance d\'une roulade: &e{0} +Acrobatics.SubSkill.Roll.GraceChance=Chance d\'une roulade gracieuse: &e{0} +Acrobatics.SubSkill.Roll.Mechanics=&7La roulade est une sous-capacité avec une partie passive.\nLorsque vous prenez des dégâts de chûtes, vous avez une chance de ne rien prendre, en fonction de votre niveau de compétence. Au niveau 50, vous avez &e{0}%&7 de chance de ne pas prendre de dégâts, et &e{1}%&7 si vous activé la roulade gracieuse.\nLa chance pour la réussite est calculé grâce à votre niveau de compétence, avec une courbe linéaire jusqu\'au niveau &e{2}&7 son maximum. Tous les niveaux d\'acrobaties vous donnent &e{3}%&7 de chance de succès.\nEn s'accroupissant, vous pouvez doubler votre chance de ne pas prendre les dégâts de chûte ! En sneakant, vous transformerez une roulade normal en une roulade gracieuse.\nUne roulade empêche jusqu\'à &c{4}&7 dégâts. Une roulade gracieuse en empêche jusqu\'à &a{5}&7. 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.SubSkill.Dodge.Description=Réduit de moitié les dégâts reçus +Acrobatics.SubSkill.Dodge.Stat=Chance d\'esquive 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.Roll.Text=&o**Roulade** Acrobatics.SkillName=ACROBATIE -Acrobatics.Skillup=Le talent Acrobatie augmente de {0}. Total ({1}) +#ALCHEMY Alchemy.SubSkill.Catalysis.Name=Catalyse Alchemy.SubSkill.Catalysis.Description=Augmente la vitesse de confection des potions +Alchemy.SubSkill.Catalysis.Stat=Vitesse de confection 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.SubSkill.Concoctions.Description=Confection des potions avec plus d’ingrédients +Alchemy.SubSkill.Concoctions.Stat=Classement des confectionneurs de potions: &e{0}/{1} +Alchemy.SubSkill.Concoctions.Stat.Extra=Ingrédients [&e{0}&c]: &e{1} +Alchemy.Listener=Alchemie: +Alchemy.Ability.Locked.0=Bloqué jusqu\'à {0}+ niveaux de talent (CATALYSE) 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 + + +#ARCHERIE +Archery.SubSkill.SkillShot.Name=Tir précis +Archery.SubSkill.SkillShot.Description=Augmente les dégâts infligés +Archery.SubSkill.SkillShot.Stat=Bonus de dégâts lors des tirs +Archery.SubSkill.Daze.Name=Désorienter +Archery.SubSkill.Daze.Description=Désoriente les adversaires en leur faisant {0} dommages +Archery.SubSkill.Daze.Stat=Chance de désoriente +Archery.SubSkill.ArrowRetrieval.Name=Récupération de flèche +Archery.SubSkill.ArrowRetrieval.Description=Probabilité de récupérer des flèches sur les corps +Archery.SubSkill.ArrowRetrieval.Stat=Chance de récupération de flèche +Archery.SubSkill.ArcheryLimitBreak.Name=Limitation de dégâts d\'archerie +Archery.SubSkill.ArcheryLimitBreak.Description=Casse les limites. Augmente les dégâts face aux ennemis. Prévu pour le PvP, il peut être configuré pour le PvE. +Archery.SubSkill.ArcheryLimitBreak.Stat=Dégâts maximum 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 +#HACHES +Axes.Ability.Bonus.0=Maîtrise des haches +Axes.Ability.Bonus.1={0} de dégâts en plus +Axes.Ability.Bonus.2=Impact d\'armure +Axes.Ability.Bonus.3=Inflige {0} de dégâts à 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.Ability.Bonus.5=Inflige {0} de dégâts en plus aux ennemis sans armure +Axes.Ability.Lower=&7**VOUS ABAISSEZ VOTRE HACHE** +Axes.Ability.Ready=&a**VOUS LEVEZ VOTRE HACHE** +Axes.Ability.Ready.Extra=&3**VOUS LEVEZ VOTRE HACHE**. &7({0} se recharge pendant {1}s) +Axes.Combat.CritStruck=&4Vous avez reçu un coup critique ! 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.Combat.GI.Proc=&a**FRAPPÉ D\'UNE VIOLENTE INOUÏE** +Axes.Combat.GI.Struck=**TOUCHÉ PAR UN IMPACT PUISSANT** +Axes.Combat.SS.Struck=&4Bloqué par TRANCHE-CRÂNE ! +Axes.SubSkill.SkullSplitter.Name=Tranche-crâne (Compétence) +Axes.SubSkill.SkullSplitter.Description=Inflige des dégâts de zone +Axes.SubSkill.SkullSplitter.Stat=Durée du tranche-crâne 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.CriticalStrikes.Description=Dégâts doublés +Axes.SubSkill.CriticalStrikes.Stat=Chance de coup critique +Axes.SubSkill.AxeMastery.Name=Maîtrise des haches +Axes.SubSkill.AxeMastery.Description=Ajoute des dégâts +Axes.SubSkill.AxesLimitBreak.Name=Limitation de dégâts de la hache +Axes.SubSkill.AxesLimitBreak.Description=Casse les limites. Augmente les dégâts face aux ennemis. Prévu pour le PvP, il peut être configuré pour le PvE. +Axes.SubSkill.AxesLimitBreak.Stat=Dégâts maximum 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.SubSkill.GreaterImpact.Description=Inflige des dégâts 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) +Axes.Skills.SS.Off=**Tranche-crâne est terminé** +Axes.Skills.SS.On=&a**TRANCHE-CRÂNE ACTIVÉ** +Axes.Skills.SS.Refresh=&aVotre compétence &eTranche-crâne &aest prête ! +Axes.Skills.SS.Other.Off=Tranche-crâne&a s\'est terminé pour &e{0} +Axes.Skills.SS.Other.On=&a{0}&2 a utilisé &cTranche-crâne ! +#FOUILLE +Excavation.Ability.Lower=&7**VOUS ABAISSEZ VOTRE PELLE** +Excavation.Ability.Ready=&a**VOUS LEVEZ VOTRE PELLE** +Excavation.SubSkill.GigaDrillBreaker.Name=Foreur (Compétence) 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** +Excavation.SubSkill.GigaDrillBreaker.Stat=Durée du foreur +Excavation.SubSkill.Archaeology.Name=Archéologie +Excavation.SubSkill.Archaeology.Description=Déterrez les secrets du monde ! De haut niveaux de compétences augmente vos chances de trouvez de l\'expérience dans un trésor ! +Excavation.SubSkill.Archaeology.Stat=Chance d\'exp archéologique +Excavation.SubSkill.Archaeology.Stat.Extra=Quantité d\'expérience archéologique +Excavation.Listener=Fouille: +Excavation.SkillName=FOUILLE +Excavation.Skills.GigaDrillBreaker.Off=**Votre compétence Foreur est terminée** +Excavation.Skills.GigaDrillBreaker.On=&a**FOREUR ACTIVÉ** +Excavation.Skills.GigaDrillBreaker.Refresh=&aVotre compétence &eForeur &aest prête ! +Excavation.Skills.GigaDrillBreaker.Other.Off=Foreur&a est terminé pour &e{0} +Excavation.Skills.GigaDrillBreaker.Other.On=&a{0}&2 a utilisé &cForeur ! +#PÊCHE +Fishing.ScarcityTip=&e&oCette zone a souffert d\'une surexploitation ... Utilisez votre canne à pâche autre part, à au moins {0} blocs de distance. +Fishing.Scared=&7&oDes mouvements chaotique effrait les poissons ! +Fishing.Exhausting=&c&oUne mauvaise utilisation de la canne à pêche vous fatigue et use la canne ! +Fishing.LowResourcesTip=&7Vous sentez qu\'il n\'y a plus beaucoup de poisson par ici. Allez essayer {0} blocs plus loin. +Fishing.Ability.Info=Pêche magique : &7 **S\'améliore via Chasseur de trésors** 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.Ability.Locked.1=Bloqué jusqu\'à {0}+ niveaux de talent (PECHEUR SUR GLACE) +Fishing.Ability.Locked.2=Bloqué jusqu\'à {0}+ niveau(x) (Maître Pêcheur) +Fishing.SubSkill.TreasureHunter.Name=Chasseur de trésors Fishing.SubSkill.TreasureHunter.Description=Remonte des objets inhabituels -Fishing.SubSkill.MagicHunter.Name=P\u00eache magique +Fishing.SubSkill.TreasureHunter.Stat=Grade de chasseur de trésor: &a{0}&3/&a{1} +Fishing.SubSkill.TreasureHunter.Stat.Extra=Ratio de drop: &7Commun: &e{0} &aNon-commun: &e{1}\n&9Rare: &e{2} &dEpique: &e{3} &6Legendaire: &e{4} &bMythic: &e{5} +Fishing.SubSkill.MagicHunter.Name=Pêche magique Fishing.SubSkill.MagicHunter.Description=Remonte des objets magiques +Fishing.SubSkill.MagicHunter.Stat=Chance du chasseur de trésor 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) +Fishing.SubSkill.Shake.Description=Fait tomber des objets des monstres avec une canne à pêche +Fishing.SubSkill.Shake.Stat=Chance d\'esquive +Fishing.SubSkill.FishermansDiet.Name=Régime de fermier +Fishing.SubSkill.FishermansDiet.Description=Améliore la nutrition des produits de la ferme +Fishing.SubSkill.FishermansDiet.Stat=Régime de fermier:&a Grade {0} +Fishing.SubSkill.MasterAngler.Name=Maître Pêcheur +Fishing.SubSkill.MasterAngler.Description=Les poissons sont pêchés plus fréquemment, fonctionne mieux lorsque l\'on pêche depuis un bateau. +Fishing.SubSkill.MasterAngler.Stat=Réduction minimum du temps de pêche: &a-{0} secondes +Fishing.SubSkill.MasterAngler.Stat.Extra=Réduction maximum du temps de pêche: &a-{0} secondes +Fishing.SubSkill.IceFishing.Name=Pêche sur Glace +Fishing.SubSkill.IceFishing.Description=Vous permet de pêcher dans les biomes glacés +Fishing.SubSkill.IceFishing.Stat=Pêche sur Glace +Fishing.Chance.Raining=&9 Bonus de pluie +Fishing.Listener=Pêche : +Fishing.Ability.TH.MagicFound=&7Vous ressentez quelque chose de magique dans cette prise... +Fishing.Ability.TH.Boom=&7TEMPS D\'EXPLOSION !!! +Fishing.Ability.TH.Poison=&7Quelque chose n\'a pas bien cuit... +Fishing.SkillName=PÊCHE +#HERBORISTERIE +Herbalism.Ability.GTe.NeedMore=Vous avez besoin de plus de graines pour répandre la terre verte +Herbalism.Ability.GTh.Fail=**MAINS VERTES ÉCHOUÉES** +Herbalism.Ability.GTh=&a**DOIGTS VERTS** +Herbalism.Ability.Lower=&7**VOUS ABAISSEZ VOTRE HOUE** +Herbalism.Ability.Ready=&a**VOUS LEVEZ VOTRE HOUE** +Herbalism.Ability.ShroomThumb.Fail=**DOIGTS VERTS ÉCHOUÉ** +Herbalism.SubSkill.GreenTerra.Name=Main verte (Compétence) Herbalism.SubSkill.GreenTerra.Description=Propage les plantes / triple drops -Herbalism.SubSkill.GreenThumb.Name=Mains Vertes (Bl\u00e9) +Herbalism.SubSkill.GreenTerra.Stat=Durée de la main verte +Herbalism.SubSkill.GreenThumb.Name=Mains Vertes (Blé) Herbalism.SubSkill.GreenThumb.Description=Plantation automatique apres recolte du champ +Herbalism.SubSkill.GreenThumb.Stat=Chance de plantation automatique après récolte +Herbalism.SubSkill.GreenThumb.Stat.Extra=Plantation automatique: &a Graîne pousse au niveau {0} 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.FarmersDiet.Name=Régime de fermier +Herbalism.SubSkill.FarmersDiet.Description=Améliore la nutrition des produits de la ferme +Herbalism.SubSkill.FarmersDiet.Stat=Régime de fermier: &aGrade {0} Herbalism.SubSkill.DoubleDrops.Name=Double drops -Herbalism.SubSkill.DoubleDrops.Description=Double la quantit\u00e9 r\u00e9colt\u00e9e +Herbalism.SubSkill.DoubleDrops.Description=Double la quantité récoltée +Herbalism.SubSkill.DoubleDrops.Stat=Chance de double drop 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.HylianLuck.Description=Donne une petite chance de trouver de rares +Herbalism.SubSkill.HylianLuck.Stat=Chance d\'Hylian +Herbalism.SubSkill.ShroomThumb.Name=Doigts à 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.SubSkill.ShroomThumb.Stat=Chance extension du mycelium +Herbalism.HylianLuck=&ala 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) +Herbalism.Skills.GTe.Off=**Votre compétence Main verte est terminée** +Herbalism.Skills.GTe.On=&a**MAIN VERTE ACTIVÉ** +Herbalism.Skills.GTe.Refresh=&aVotre compétence &eMain verte &aest prête ! +Herbalism.Skills.GTe.Other.Off=Main verte&a est terminé pour &e{0} +Herbalism.Skills.GTe.Other.On=&a{0}&2 a utilisé &cMain verte ! +#MINAGE +Mining.Ability.Locked.0=Bloqué jusqu\'à {0}+ niveaux du talent (MINAGE PAR EXPLOSIONS) +Mining.Ability.Locked.1=Bloqué jusqu\'à {0}+ niveau(x) (Grosses Explosions) +Mining.Ability.Locked.2=Bloqué jusqu\'à {0}+ niveau(x) (Expert en démolition) +Mining.Ability.Lower=&7**VOUS ABAISSEZ VOTRE PIOCHE** +Mining.Ability.Ready=&a**VOUS LEVEZ VOTRE PIOCHE** +Mining.SubSkill.SuperBreaker.Name=Broyeur (Compétence) Mining.SubSkill.SuperBreaker.Description=Plus rapide, chance de triple drops +Mining.SubSkill.SuperBreaker.Stat=Puissance du broyeur Mining.SubSkill.DoubleDrops.Name=Double drops -Mining.SubSkill.DoubleDrops.Description=Double la quantit\u00e9 r\u00e9colt\u00e9e +Mining.SubSkill.DoubleDrops.Description=Double la quantité récoltée +Mining.SubSkill.DoubleDrops.Stat=Chance de double drop Mining.SubSkill.BlastMining.Name=Minage explosif -Mining.SubSkill.BlastMining.Description=Bonus au minage \u00e0 l\'explosif +Mining.SubSkill.BlastMining.Description=Bonus au minage à l\'explosif +Mining.SubSkill.BlastMining.Stat=Minage explosif:&a Grade {0}/{1} &7({2}) +Mining.SubSkill.BlastMining.Stat.Extra=Rayon du minage explosif: &a+{0} 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.SubSkill.DemolitionsExpertise.Name=Expert en démolition +Mining.SubSkill.DemolitionsExpertise.Description=Réduit les dégâts provenant de la TNT +Mining.SubSkill.DemolitionsExpertise.Stat=Baisse des dégâts de destruction + 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}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 +Mining.Skills.SuperBreaker.Off=**Votre compétence Broyeur est terminée** +Mining.Skills.SuperBreaker.On=&a**BROYEUR ACTIVÉ** +Mining.Skills.SuperBreaker.Other.Off=Broyeur&a est terminé pour &e{0} +Mining.Skills.SuperBreaker.Other.On=&a{0}&2 a utilisé &cBroyeur ! +Mining.Skills.SuperBreaker.Refresh=&aVotre compétence &eBroyeur &aest prête ! +# MINAGE EXPLOSIF +Mining.Blast.Boom=&7**BOUM** +Mining.Blast.Cooldown= +Mining.Blast.Effect=+{0} de récolte des minerais, {1}x les récompenses +Mining.Blast.Other.On=&a{0}&2 a utilisé &cMinage explosif ! +Mining.Blast.Refresh=&aVotre capacité &eMinage Explosif&a est prête ! +# RÉPARATION +Repair.SubSkill.Repair.Name=Réparation +Repair.SubSkill.Repair.Description=Réparer Outils & Armures +Repair.SubSkill.GoldRepair.Name=Réparation d\'Or ({0}+ SKILL) +Repair.SubSkill.GoldRepair.Description=Réparer Outils & Armures en Or +Repair.SubSkill.IronRepair.Name=Réparation en Fer ({0}+ SKILL) +Repair.SubSkill.IronRepair.Description=Réparation Outils & Armures en Fer +Repair.SubSkill.StoneRepair.Name=Réparation en Pierre ({0}+ SKILL) +Repair.SubSkill.StoneRepair.Description=Réparer Outils en Pierre +Repair.SubSkill.RepairMastery.Name=Maîtrise de la forge +Repair.SubSkill.RepairMastery.Description=Améliore la réparation +Repair.SubSkill.RepairMastery.Stat=Repair Mastery: &aExtra {0} durability restored +Repair.SubSkill.SuperRepair.Name=Superbe réparation +Repair.SubSkill.SuperRepair.Description=Double l\'efficacité +Repair.SubSkill.SuperRepair.Stat=Super Repair Chance +Repair.SubSkill.DiamondRepair.Name=Réparation du diamant (talent {0}+) +Repair.SubSkill.DiamondRepair.Description=Répare 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 +Repair.SubSkill.ArcaneForging.Description=Répare les objets magiques +Repair.SubSkill.ArcaneForging.Stat=Arcane Forging: &eRank {0}/{1} +Repair.SubSkill.ArcaneForging.Stat.Extra=&3Arcane Forging Odds:&7 Success &a{0}&7%, Failure &c{1}&7% +Repair.Error=&4McMMO a rencontré une erreur en essayant de réparer cet objet ! +Repair.Listener.Anvil=&4Vous venez de poser une enclume, elle peut être utilisée pour réparer votre équipement. +Repair.Listener=Réparation : +Repair.SkillName=RÉPARATION +Repair.Skills.AdeptDiamond=&4Vous n\'êtes pas suffisamment compétent pour réparer le diamant. +Repair.Skills.AdeptGold=&4Vous n\'êtes pas suffisamment compétent pour réparer l\'or. +Repair.Skills.AdeptIron=&4Vous n\'êtes pas suffisamment compétent pour réparer le fer. +Repair.Skills.AdeptStone=&4Vous n\'êtes pas suffisamment compétent pour réparer la pierre. +Repair.Skills.Adept=Vous devez avoir le niveau &e{0}&c pour pouvoir réparer &e{1} +Repair.Skills.FeltEasy=&7Plutôt facile. +Repair.Skills.FullDurability=&7C\'est déjà réparé. +Repair.Skills.StackedItems=&4Vous ne pouvez pas réparer les objets empilés. +Repair.Pretty.Name=Réparation +# Force arcanique +Repair.Arcane.Downgrade=Les énergies arcaniques ont été affaiblies sur cet objet. +Repair.Arcane.Fail=Les énergies arcaniques ont quitté cet objet. +Repair.Arcane.Lost=Vous n\'étiez pas suffisamment compétent pour préserver les enchantements. +Repair.Arcane.Perfect=&aVous avez préservé les énergies arcaniques de cet objet. +# RECYCLAGE 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.SubSkill.UnderstandingTheArt.Name=Compréhension de l\'art +Salvage.SubSkill.UnderstandingTheArt.Description=Vous n\'êtes pas juste en train de miner à travers la poubelle de votre voisin, vous prenez soin de l\'environment.\nRenforce la récupération. +Salvage.SubSkill.ScrapCollector.Name=Collection de fragment +Salvage.SubSkill.ScrapCollector.Description=Récupération de materiel depuis un item, une récupération parfaite en accord avec vos compétences et votre chance. +Salvage.SubSkill.ScrapCollector.Stat=Collection de fragment: &aRécupération de &e{0}&a items. Un peu de chance y est impliqué. +Salvage.SubSkill.ArcaneSalvage.Name=Recyclage Arcanique +Salvage.SubSkill.ArcaneSalvage.Description=Extrait les enchantements des objets +Salvage.SubSkill.ArcaneSalvage.Stat=Recyclage Arcanique: &eGrade {0}/{1} +Salvage.Ability.Bonus.0=Recyclage Avancé +Salvage.Ability.Bonus.1=Rendement maximal {0} objet(s) détruit(s) +Salvage.Arcane.ExtractFull=&7AS Full-Enchant Chance +Salvage.Arcane.ExtractPartial=&7AS Partial-Enchant Chance +Salvage.Skills.Success=&aObjet recyclé ! +Salvage.Skills.Adept.Damaged=&4Vous n\'êtes pas assez talentueux pour recycler des objets endommagés. +Salvage.Skills.Adept.Level=Vous devez être niveau &e{0}&c pour recycler &e{1} +Salvage.Skills.TooDamaged=&4C\'est objet est trop endommagé pour être recyclé. +Salvage.Skills.ArcaneFailed=Vous avez été incapable d\'extraire la connaissance contenue dans cet objet. +Salvage.Skills.ArcanePartial=Vous avez été capable d\'extraire toute la connaissance contenue dans cet objet. +Salvage.Skills.ArcaneSuccess=&aVous avez été capable d\'extraire toute la connaissance contenue dans cet objet. +Salvage.Listener.Anvil=&4Vous avez placé une enclume de réparation, 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 ! +Salvage.Skills.Lottery.Normal=&6Vous êtes capable de récupérer &3{0}&6 matériel de &e{1}&6. +Salvage.Skills.Lottery.Perfect=&a&lParfait !&r&6 Vous avez récupéré &3{1}&6 sans effort et retrouvé &3{0}&6 matériel. +Salvage.Skills.Lottery.Untrained=&7Vous n\'êtes pas assez qualifié dans la récupération. Vous ne pouvez retrouver que &c{0}&7 matériel depuis &a{1}&7. +#Enclume (Partagé entre RECYCLAGE et RÉPARATION) +Anvil.Unbreakable=Cet item est incassable ! +#ÉPÉE +Swords.Ability.Lower=&7**VOUS ABAISSEZ VOTRE ÉPÉE** +Swords.Ability.Ready=&a**VOUS LEVEZ VOTRE ÉPÉE** +Swords.Combat.Rupture.Note=&7NOTE: &e1 Tick correspond à 0.5 seconds! +Swords.Combat.Bleeding.Started=&4 Tu saignes ! +Swords.Combat.Bleeding.Stopped=&7Le saignement s\'est &aarrêté&7 ! +Swords.Combat.Bleeding=&a**L\'ENNEMI SAIGNE** +Swords.Combat.Counter.Hit=&4Touché par une contre-attaque ! +Swords.Combat.Countered=&a**CONTRE-ATTAQUE** +Swords.Combat.SS.Struck=&4Frappé par ATTAQUE DÉCHIRANTE ! 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.CounterAttack.Stat=Chance de contre-attaque +Swords.SubSkill.SerratedStrikes.Name=Attaque Déchirante (Capacité) Swords.SubSkill.SerratedStrikes.Description={0} DMG AoE, Saignement+ AoE -Swords.Effect.4=Saignement d\'Attaque d\u00e9chirante +Swords.SubSkill.SerratedStrikes.Stat=Puissance de l\'attaque déchirante +Swords.SubSkill.Rupture.Name=Hémorragie +Swords.SubSkill.Rupture.Description=Un hémorragie puissant ! +Swords.SubSkill.Stab.Name=Poignarder +Swords.SubSkill.Stab.Description=Ajoute plus de dégâts à vos attaques. +Swords.SubSkill.Stab.Stat=Dégâts du poing suppplémentaire +Swords.SubSkill.SwordsLimitBreak.Name=Limitation des dégâts de l\'épée +Swords.SubSkill.SwordsLimitBreak.Description=Casse les limites. Augmente les dégâts face aux ennemis. Prévu pour le PvP, il peut être configuré pour le PvE. +Swords.SubSkill.SwordsLimitBreak.Stat=Dégâts maximum +Swords.SubSkill.Rupture.Stat=Chance d\'hémorragie +Swords.SubSkill.Rupture.Stat.Extra=Hémorragie: &a{0} ticks [{1} DMG vs Joueur] [{2} DMG vs Monstre] +Swords.Effect.4=Hémorragie d\'Attaque déchirante 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 +Swords.Listener=Épées : +Swords.SkillName=ÉPÉES +Swords.Skills.SS.Off=**Votre compétence Attaque déchirante est terminée** +Swords.Skills.SS.On=&a**ATTAQUE DÉCHIRANTE ACTIVÉE** +Swords.Skills.SS.Refresh=&aVotre compétence &eAttaque déchirante &aest prête ! +Swords.Skills.SS.Other.Off=Attaque déchirante&a s\'est terminé pour &e{0} +Swords.Skills.SS.Other.On=&a{0}&2 a utilisé &cAttaque déchirante ! +#APPRIVOISEMENT +Taming.Ability.Bonus.0=Attentif à l\'environnement +Taming.Ability.Bonus.1=Les loups évitent les dangers +Taming.Ability.Bonus.2=Fourrure épaisse +Taming.Ability.Bonus.3=Réduction de dégât, résistance au feu +Taming.Ability.Bonus.4=Résistance aux chocs +Taming.Ability.Bonus.5=Les explosifs font 1/{0} comparé au dommage normal +Taming.Ability.Bonus.6=Griffes acérées 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.9={0} Chance d\'etre soigné 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.Ability.Bonus.11=Regagne de la vie lorsqu\'endommagé par de la magie ou du poison +Taming.Ability.Locked.0=Attentif à l\'environnement +Taming.Ability.Locked.1=Fourrure épaisse +Taming.Ability.Locked.2=Résistance aux chocs +Taming.Ability.Locked.3=Griffes acérées +Taming.Ability.Locked.4=Bloqué jusqu\'à {0}+ niveau(x) (SERVICE FAST FOOD) +Taming.Ability.Locked.5=Bloqué jusqu\'à {0}+ niveaux du talent (Super chien de chasse) +Taming.Combat.Chance.Gore=Chance Gore +Taming.SubSkill.BeastLore.Name=Connaissances des bêtes 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.ShockProof.Name=Résistance aux chocs +Taming.SubSkill.ShockProof.Description=Réduction des dégâts 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.CallOfTheWild.Description=Appelle un animal à vos côtés +Taming.SubSkill.CallOfTheWild.Description.2=&7COTW: 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.FastFoodService.Description=Probabilité 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.HolyHound.Description=Soigné 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.SubSkill.SharpenedClaws.Name=Griffes acérées +Taming.SubSkill.SharpenedClaws.Description=Bonus aux dégâts +Taming.SubSkill.EnvironmentallyAware.Name=Attentif à l\'environnement +Taming.SubSkill.EnvironmentallyAware.Description=Phobie des cactus et de la lave, immunisé aux chutes +Taming.SubSkill.ThickFur.Name=Fourrure épaisse +Taming.SubSkill.ThickFur.Description=Réduction de dégât, résistance au feu +Taming.SubSkill.Pummel.Name=Frappe +Taming.SubSkill.Pummel.Description=Votre loup a une chance de faire reculer les ennemis +Taming.SubSkill.Pummel.TargetMessage=Vous avez été repoussé par les loups ! +Taming.Listener.Wolf=&8Votre loup se précipite à vos côtés... 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 +Taming.Summon.COTW.Success.WithoutLifespan=&a(Appel de la nature) &7Vous avez invoqué un &6{0}&7 +Taming.Summon.COTW.Success.WithLifespan=&a(Appel de la nature) &7Vous avez invoqué un &6{0}&7 pendant &6{1}&7 secondes. +Taming.Summon.COTW.Limit=&a(Appel de la nature) &7Vous ne pouvez avoir que &c{0} &7{1} invoqués en même temps. +Taming.Summon.COTW.TimeExpired=&a(Appel de la nature) &7Time is up, your &6{0}&7 departs. +Taming.Summon.COTW.Removed=&a(Appel de la nature) &77Vous avez invoqué un &6{0}&7 qui a disparu de ce monde. +Taming.Summon.COTW.BreedingDisallowed=&a(Appel de la nature) &cVous ne pouvez pas reproduire un animal invoqué. +Taming.Summon.COTW.NeedMoreItems=&a(Appel de la nature) &7Vous avez besoin de &e{0} &3{1}&7(s) +Taming.Summon.Name.Format=&6{1} de {0} +#POINGS 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.Bonus.1=+{0} de dégâts 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.Ability.IronGrip.Defender=Votre poigne de fer vous a empêché d\'être désarmé ! +Unarmed.Ability.Lower=&7**VOUS ABAISSEZ VOS POINGS** +Unarmed.Ability.Ready=&a**VOUS LEVEZ VOS POINGS** +Unarmed.SubSkill.Berserk.Name=Berserk (Compétence) +Unarmed.SubSkill.Berserk.Description=+50% de dégâts, casse les matériaux souples +Unarmed.SubSkill.Berserk.Stat=Durée du berserk +Unarmed.SubSkill.Disarm.Name=Désarmement (sur joueurs) Unarmed.SubSkill.Disarm.Description=Fait tomber l\'arme des ennemis +Unarmed.SubSkill.Disarm.Stat=Chance de désarmement +Unarmed.SubSkill.UnarmedLimitBreak.Name=Limitation des dégâts aux poings +Unarmed.SubSkill.UnarmedLimitBreak.Description=Casse les limites. Augmente les dégâts face aux ennemis. Prévu pour le PvP, il peut être configuré pour le PvE. +Unarmed.SubSkill.UnarmedLimitBreak.Stat=Dégâts maximum 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.ArrowDeflect.Name=Déviation de flèche +Unarmed.SubSkill.ArrowDeflect.Description=Dévie les flèches +Unarmed.SubSkill.ArrowDeflect.Stat=Chance de déviation de flèche Unarmed.SubSkill.IronGrip.Name=Poigne de Fer -Unarmed.SubSkill.IronGrip.Description=Vous emp\u00eache d\'\u00eatre d\u00e9sarm\u00e9 +Unarmed.SubSkill.IronGrip.Description=Vous empêche d\'être désarmé +Unarmed.SubSkill.IronGrip.Stat=Chance de la poigne de fer +Unarmed.SubSkill.BlockCracker.Name=Casseur de blocs +Unarmed.SubSkill.BlockCracker.Description=Casse les blocs avec tes poings 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}) +Unarmed.Skills.Berserk.Off=**Votre capacité Furie est terminée** +Unarmed.Skills.Berserk.On=&a**BERSERK ACTIVÉ** +Unarmed.Skills.Berserk.Other.Off=Berserk&a s\'est terminé pour &e{0} +Unarmed.Skills.Berserk.Other.On=&a{0}&2 a utilisé &cFurie ! +Unarmed.Skills.Berserk.Refresh=&aVotre compétence &eBerserk &aest prête ! +#BÛCHERONNAGE 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.Ability.Locked.0=Bloqué jusqu\'à {0}+ niveaux du talent (EXPLOSEUR DE FEUILLES) +Woodcutting.SubSkill.TreeFeller.Name=Abatteur (Compétence) Woodcutting.SubSkill.TreeFeller.Description=Fait exploser les arbres +Woodcutting.SubSkill.TreeFeller.Stat=Durée de l\'abatteur Woodcutting.SubSkill.LeafBlower.Name=Soufflage Woodcutting.SubSkill.LeafBlower.Description=Souffle les feuilles +Woodcutting.SubSkill.KnockOnWood.Name=Touchons du bois +Woodcutting.SubSkill.KnockOnWood.Description=Trouve de nouveau goodies lorsque tu utilise l\'abatteur +Woodcutting.SubSkill.KnockOnWood.Stat=Touchons du bois +Woodcutting.SubSkill.KnockOnWood.Loot.Normal=Butin standard des arbres +Woodcutting.SubSkill.KnockOnWood.Loot.Rank2=Butin standard des arbres et de l\'expérience 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.SubSkill.HarvestLumber.Description=Double la quantité récoltée +Woodcutting.SubSkill.HarvestLumber.Stat=Double Drop Chance +Woodcutting.SubSkill.Splinter.Name=Splinter +Woodcutting.SubSkill.Splinter.Description=Coupe les arbres plus efficacement +Woodcutting.SubSkill.BarkSurgeon.Name=Bark Surgeon +Woodcutting.SubSkill.BarkSurgeon.Description=Extrait les matériaux utiles lors de l\'abattage d\'arbre. +Woodcutting.SubSkill.NaturesBounty.Name=Cadeau de la nature +Woodcutting.SubSkill.NaturesBounty.Description=Gain d\'expérience de la nature +Woodcutting.Listener=Bûcheronnage : +Woodcutting.SkillName=BÛCHERONNAGE +Woodcutting.Skills.TreeFeller.Off=**Votre compétence Abatteur est terminée** +Woodcutting.Skills.TreeFeller.On=&a**ABATTEUR ACTIVÉ** +Woodcutting.Skills.TreeFeller.Refresh=&aVotre compétence &eAbatteur &aest prête ! +Woodcutting.Skills.TreeFeller.Other.Off=Abatteur&a est terminé pour &e{0} +Woodcutting.Skills.TreeFeller.Other.On=&a{0}&2 a utilisé &cAbatteur ! 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]]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]]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 +#ABILITIY + +#COMBAT +Combat.ArrowDeflect=&f**FLÈCHE DEVIÉE** +Combat.BeastLore=&a**CONNAISSANCE DES BÊTES** +Combat.BeastLoreHealth=&3Vie (&a{0}&3/{1}) +Combat.BeastLoreOwner=&3Propriétaire (&c{0}&3) +Combat.BeastLoreHorseSpeed=&3Vitesse des chevaux (&a{0} blocs/s&3) +Combat.BeastLoreHorseJumpStrength=&3Hauteur de saut des chevaux (&aMax {0} blocs&3) +Combat.Gore=&a**SANG** +Combat.StruckByGore=**FRAPPÉ JUSQU\'AU SANG** +Combat.TargetDazed=La cible a été &4Étourdi +Combat.TouchedFuzzy=&4Vous voyez flou. Vous vous sentez étourdi. +#COMMANDES +##generique +mcMMO.Description=&3à propos du projet &emcMMO&3:,&6C'est un mod RPG &copen source&6 créé en février 2011, &6par &9nossr50&6. Le but est de permettre l'expérience d\'un RPG de qualité.,&3Conseils:,&6 - &aUtilisez &c/mcmmo help&a pour voir les commandes,&6 - &aFaites &c/skillname&a pour voir les détails d\'une compétence,&3Développeurs:,&6 - &anossr50 &9(Créateur & Leader du projet),&6 - &aelectronicboy &9(Dev),&6 - &akashike &9(Dev),&6 - &at00thpick1 &9(Mainteneur classique) +mcMMO.Description.FormerDevs=&3Former Devs: &aGJ, NuclearW, bm01, TfT_02, Glitchfinder +Commands.addlevels.AwardAll.1=&aVous avez été récompensé de {0} niveau(x) dans tous les talents ! +Commands.addlevels.AwardAll.2=Tous les talents ont été modifiés pour {0}. +Commands.addlevels.AwardSkill.1=&aVous avez reçu {0} niveau dans {1}! +Commands.addlevels.AwardSkill.2={0} a été modifié pour {1}. +Commands.addxp.AwardAll=&aVous avez été récompensé de {0} experiences dans chaque compétences! +Commands.addxp.AwardSkill=&aVous avez été récompensé de {0} experiences dans {1} ! +Commands.Ability.Off=Utilisation des compétences &cOff +Commands.Ability.On=Utilisation des compétences &aOn +Commands.Ability.Toggle=L\'utilisation des capacités a été modifiée pour &e{0} +Commands.AdminChat.Off=Canal admin &cOff +Commands.AdminChat.On=Canal admin &aOn +Commands.AdminToggle=&a- Active/désactive 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.Cooldowns.Header=&6--= &aTemps d\'attente des capacités McMMO&6 =-- +Commands.Cooldowns.Row.N=\ &c{0}&f - &6{1} secondes restantes +Commands.Cooldowns.Row.Y=\ &b{0}&f - &2 Prêt ! +Commands.Database.CooldownMS=Vous devez attendre {0} millisecondes avant de pouvoir utiliser cette commande de nouveau. 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.Database.Processing=Votre commande précédente est toujours en exécution. Veuillez patienter. +Commands.Disabled=Cette commande est désactivée. +Commands.DoesNotExist=Ce joueur est absent de la base de données ! +Commands.GodMode.Disabled=mcMMO Godmode désactivé +Commands.GodMode.Enabled=mcMMO Godmode activé +Commands.AdminChatSpy.Enabled=[mcMMO] Discussion privée SPY activé +Commands.AdminChatSpy.Disabled=[mcMMO] Discussion privée SPY désactivé +Commands.AdminChatSpy.Toggle=[mcMMO] Discussion basculé pour &e{0} +Commands.AdminChatSpy.Chat=&6[SPY: &a{0}&6] &f{1} 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.GodMode.Toggle=Le mode Dieu a été modifié pour &e{0} +Commands.Healthbars.Changed.HEARTS=[mcMMO] Le type d\'affichage de la barre de vie a été changé en &cCœurs&f. +Commands.Healthbars.Changed.BAR=[mcMMO] Le type d\'affichage de la barre de vie a été changé en &eBoîtes&f. +Commands.Healthbars.Changed.DISABLED=[mcMMO] La barre de vie des entités a été &7désactivée&f. Commands.Healthbars.Invalid=Type de barre de vie invalide ! -Commands.Inspect= [[GREEN]]- Voir les infos d\u00e9taill\u00e9es sur le joueur -Commands.Invite.Success=[[GREEN]]Invitation envoy\u00e9e. -Commands.Leaderboards= [[GREEN]]- Classement -Commands.mcc.Header=---[][[GREEN]]Commandes McMMO[[RED]][]--- -Commands.mcgod=[[GREEN]]- Active/D\u00e9sactive le \"Mode Dieu\" +Commands.Inspect= &a- Voir les infos détaillées sur le joueur +Commands.Invite.Success=&aInvitation envoyée. +Commands.Leaderboards= &a- Classement +Commands.mcgod=&a- Active/Désactive 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] [[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 [[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.mcpurge.Success=&aLa base de données a été purgée avec succès ! +Commands.mcrank.Heading=&6-=CLASSEMENT PERSONNEL=- +Commands.mcrank.Overall=Toutes competences confondues&a - &6Classement &f#&a{0} +Commands.mcrank.Player=CIBLE : &f{0} +Commands.mcrank.Skill={0}&a - &6Classement &f#&a{1} +Commands.mcrank.Unranked=&fNon classé +Commands.mcrefresh.Success=Le temps d\'attente de {0} a été refraîchi. +Commands.mcremove.Success=&a{0} a été enlevé(e) de la base de données avec succès ! +Commands.mctop.Tip=&6Astuce : Utilisez &c/mcrank&6 pour voir vos positions dans les différents classements ! +Commands.mmoedit=[joueur] &a - Modifie la cible +Commands.mmoedit.AllSkills.1=&aLe niveau de tous vos talents a été mis à {0} ! +Commands.mmoedit.Modified.1=&aVotre niveau en {0} a été modifié à {1}! +Commands.mmoedit.Modified.2={0} a été modifié pour {1}. +Commands.mcconvert.Database.Same=Vous utilisez déjà le/la {0} base de données ! +Commands.mcconvert.Database.InvalidType={0} n\'est pas un type de base de données valide. +Commands.mcconvert.Database.Start=&7Commencement de la conversion de {0} à {1}... +Commands.mcconvert.Database.Finish=&7La migration de la base de données a été achevée; la {1} base de données a désormais toutes les données de/du {0} base de données. +Commands.mmoshowdb=La base de données actuellement utilisée est &a{0} +Commands.mcconvert.Experience.Invalid=Type de formule inconnu! Les types valides sont: &aLINEAR &cand &aEXPONENTIAL. +Commands.mcconvert.Experience.Same=Vous utilisez déjà une formule type {0} +Commands.mcconvert.Experience.Start=&7Commencement de la conversion de {0} à {1}... +Commands.mcconvert.Experience.Finish=&7Changement de formule appliqué; utilisation désormais de {0} pour la courbe d\'EXP. +Commands.ModDescription=&a- Lire la brève description du mod +Commands.NoConsole=Cette commande ne peut être utilisée via la console. +Commands.Notifications.Off=Les notifications des capacités ont été &cdésactivées +Commands.Notifications.On=Les notifications des capacités ont été &aactivées +Commands.Offline=Cette commande ne fonctionne pas sur les joueurs non connectés. +Commands.NotLoaded=Le profil du joueur n\'est pas encore chargé. +Commands.Party.Status=&8NOM: &f{0} {1} &8NIVEAU: &3{2} +Commands.Party.Status.Alliance=&8ALLIANCES: &f{0} +Commands.Party.UnlockedFeatures=&8Fonctionnalités Débloquées: &7&o{0} +Commands.Party.ShareMode=&8MODE PARTAGE : +Commands.Party.ItemShare=&7OBJETS &3({0}) +Commands.Party.ExpShare=&7EXP &3({0}) +Commands.Party.ItemShareCategories=&8Partage d\'objets: &7&o{0} +Commands.Party.MembersNear=&8A CÔTÉ DE VOUS &3{0}&8/&3{1} +Commands.Party.Accept=&a- Accepter l\'invitation de la guilde +Commands.Party.Chat.Off=Canal guilde &cdésactivé +Commands.Party.Chat.On=Canal guilde &cactivé +Commands.Party.Commands=---[]&aCOMMANDES DE GUILDE&c[]--- +Commands.Party.Invite.0=ALERT: &aVous avez reçu une invitation de {1} pour rejoindre la guilde {0} +Commands.Party.Invite.1=Tapez &a/party accept&e pour accepter l\'invitation de guilde +Commands.Party.Invite=&a- Envoyer une invitation de groupe. +Commands.Party.Invite.Accepted=&aInvitation acceptée. Vous avez rejoint la guilde {0} +Commands.Party.Join=&7a rejoint la guilde: {0} +Commands.Party.PartyFull=&6{0}&c est complète ! +Commands.Party.PartyFull.Invite=Vous ne pouvez pas inviter &e{0}&c à rejoindre &a{1}&c parce qu\'il y a déjà &3{2}&c joueurs dedans ! +Commands.Party.PartyFull.InviteAccept=Vous ne pouvez pas rejoindre &a{0}&c parce qu\'il y a déjà &3{1}&c joueurs dedans ! +Commands.Party.Create=&7Groupe Créé: {0} +Commands.Party.Rename=&7Le nom de la guilde a été changé en : &f{0} +Commands.Party.SetSharing=&7Le partage des {0} de la guilde a été mis à: &3{1} +Commands.Party.ToggleShareCategory=&7Le partage d\'objets de guilde &6{0} &7a été &3{1} +Commands.Party.AlreadyExists=&4La guilde {0} existe déjà! +Commands.Party.Kick=Vous avez été éjecté du groupe {0} ! +Commands.Party.Leave=Vous avez quitté la guilde. +Commands.Party.Members.Header=-----[]&aMEMBRES&c[]----- +Commands.Party.None=Vous n\'êtes pas dans une guilde. +Commands.Party.Quit=&a- Quitter votre présente guilde +Commands.Party.Teleport=&a- Vous téléporte à un membre de la guilde +Commands.Party.Toggle=&a- Active/désactive le tchat de guilde +Commands.Party1=&a- Créer une nouvelle guilde +Commands.Party2=&a- Rejoindre une guilde +Commands.Party.Alliance.Header=-----[]&aALLIANCE DE LA GUILDE&c[]----- +Commands.Party.Alliance.Ally=&f{0} &8EST ALLIÉ AVEC : &f{1} +Commands.Party.Alliance.Members.Header=-----[]&aMEMBRES DE L\'ALLIANCE&c[]----- +Commands.Party.Alliance.Invite.0=ALERTE: &aVous avez reçu une invitation d\'alliance de guilde de {1} pour {0} +Commands.Party.Alliance.Invite.1=Tapez &a/party alliance accept&e pour accepter l\'invitation +Commands.Party.Alliance.Invite.Accepted=&aInvitation d\'alliance acceptée. +Commands.Party.Alliance.None=Votre groupe n\'a pas d\'allié. +Commands.Party.Alliance.AlreadyAllies=Votre groupe a déjà une alliance. Défaites-la avec &3/party alliance disband +Commands.Party.Alliance.Help.0=Cette guilde n\'a pas formé d\'alliance. Invitez un chef de groupe. +Commands.Party.Alliance.Help.1= à une alliance &3/party alliance invite &c. +Commands.ptp.Enabled=Téléportation de guilde &aactivée +Commands.ptp.Disabled=Téléportation de guilde &cdésactivée +Commands.ptp.NoRequests=Vous n\'avez pas de requêtes de téléportation en ce moment +Commands.ptp.NoWorldPermissions=[mcMMO] Vous n\'avez pas la permission de vous téléporter dans le monde {0}. +Commands.ptp.Request1={0} &a vous a envoyé une requête de téléportation vers vous. +Commands.ptp.Request2=&apour vous téléporter, tapez &e/ptp accept&a. La requête expire dans &c{0} &asecondes. +Commands.ptp.AcceptAny.Enabled=Confirmation de la demande de téléportation de guilde &aactivée +Commands.ptp.AcceptAny.Disabled=Confirmation de la demande de téléportation du guilde &cdésactivée +Commands.ptp.RequestExpired=La requête de téléportation de guilde a expiré! +Commands.PowerLevel.Leaderboard=--Classement mcMMO (&9Niveau Global&e)-- +Commands.PowerLevel.Capped=&4NIVEAU GLOBAL: &a{0} &4NIVEAU MAX ATTEINT: &e{1} +Commands.PowerLevel=&4NIVEAU GLOBAL : &a{0} +Commands.Reset.All=&aToutes vos compétences ont été remises à zero. +Commands.Reset.Single=&aTa compétence {0} a été remise à zero. +Commands.Reset=&a- Remise à 0 d\'un talent +Commands.Scoreboard.Clear=&3Le tableau des scores McMMO a été enlevé. 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.Scoreboard.Keep=&3Le tableau des scores McMMO restera affiché tant que vous n\'utiliserez pas &a/mcscoreboard clear&3. +Commands.Scoreboard.Timer=&3Le tableau des scores mcMMO sera enlevé dans &6{0}&3 secondes à compter de maintenant. +Commands.Scoreboard.Help.0=&6 == &aAide pour &c/mcscoreboard&6 == +Commands.Scoreboard.Help.1=&3/mcscoreboard&b clear &f - enlève le tableau des scores McMMO +Commands.Scoreboard.Help.2=&3/mcscoreboard&b keep &f - Garde le tableau des scores affiché +Commands.Scoreboard.Help.3=&3/mcscoreboard&b time [n] &f - enlève le tableau des scores McMMO après &dn&f secondes +Commands.Scoreboard.Tip.Keep=&6Astuce : Utilisez &c/mcscoreboard keep&6 quand le tableau des scores est affiché pour l\'empêcher de s\'en aller. +Commands.Scoreboard.Tip.Clear=&6Astuce : Utilisez &c/mcscoreboard clear&6 pour de débarrasser du tableau des scores. +Commands.XPBar.Reset=&6Configuration de XP Bar mcMMO réinitialisé. +Commands.XPBar.SettingChanged=&6Configuration de XP Bar pour &a{0}&6 est désormais à &a{1} 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.Skill.Leaderboard=--Classement mcMMO (&9{0}&e)-- +Commands.SkillInfo=&a- Voir des informations détaillées à 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.Stats=&a- Voir vos statistiques McMMO +Commands.ToggleAbility=&a- Active/Désactive la possibilité d\'activation d\'une capacité 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.3.XP=&cL\'utilisation correcte est /{0} {1} {2} {3}&7 (Vous pouvez inclure -s à la fin pour effectuer une commande sans en informer le joueur) Commands.Usage.FullClassName=nom de classe Commands.Usage.Level=niveau Commands.Usage.Message=message @@ -546,320 +729,412 @@ 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.Skill=Compétence +Commands.Usage.SubSkill=Sous-Compétence 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. +Commands.Description.mmoinfo=Lisez les détails à propos des compétences ou des mécaniques. +Commands.MmoInfo.Mystery=&7Vous n'avez pas encore débloqué cette compétence, mais lorsque se sera le cas, vous pourrez lire ses détails ! +Commands.MmoInfo.NoMatch=Cette sous-compétence n'existe pas ! +Commands.MmoInfo.Header=&3-=[]=====[]&6 MMO Info &3[]=====[]=- +Commands.MmoInfo.SubSkillHeader=&6Nom:&e {0} +Commands.MmoInfo.DetailsHeader=&3-=[]=====[]&a Détails &3[]=====[]=- +Commands.MmoInfo.OldSkill=&7Compétence mcMMO ont été converti en un système modulé de compétence, malheureusement celle-ci n'a pas encore été converti et manque de détails. Le nouveau système permettra de plus facilement mettre à jour les compétences mcMMO avec plus de flexibilité pour les compétences existantes. +Commands.MmoInfo.Mechanics=&3-=[]=====[]&6 Mecaniques &3[]=====[]=- +Commands.MmoInfo.Stats=STATS: {0} +Commands.Mmodebug.Toggle=mcMMO mode de debug est désormais &6{0}&7, utilisez cette commande pour le modifier. Avec le mode de débug activé, vous pouvez taper les blocs pour obtenir des informations utilisé pour le support. +mcMMO.NoInvites=Vous n\'avez pas été invité +mcMMO.NoPermission=&4Vous n\'avez pas les droits. +mcMMO.NoSkillNote=&8Si vous n\'avez pas les droits pour une compétence, il n\'apparaîtra pas ici. +##party 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} [mot de passe]. -Party.Help.1=pour cr\u00e9er une guilde, utilisez [[DARK_AQUA]]{0} [mot de passe]. -Party.Help.2=Consultez [[DARK_AQUA]]{0} [[RED]]pour plus d\'informations -Party.Help.3=Utilisez [[DARK_AQUA]]{0} [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} -Party.Help.6=Pour expulser un joueur de la guilde, utilisez [[DARK_AQUA]]{0} -Party.Help.7=Pour transmettre la possession de votre groupe, utilisez [[DARK_AQUA]]{0} -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.Help.0=L\'utilisation correcte est &3{0} [mot de passe]. +Party.Help.1=pour créer une guilde, utilisez &3{0} [mot de passe]. +Party.Help.2=Consultez &3{0} &cpour plus d\'informations +Party.Help.3=Utilisez &3{0} [motdepasse] &cpour rejoindre, ou &3{1} &cpour quitter +Party.Help.4=Pour bloquer ou débloquer votre groupe, utilisez &3{0} +Party.Help.5=Pour protéger votre guilde avec un mot de passe, utilisez &3{0} +Party.Help.6=Pour expulser un joueur de la guilde, utilisez &3{0} +Party.Help.7=Pour transmettre la possession de votre groupe, utilisez &3{0} +Party.Help.8=Pour défaire le groupe, utilisez &3{0} +Party.Help.9=Utilisez &3{0} &cpour partager des objets avec les membres du groupe +Party.Help.10=Utilisez &3{0} &cpour activer le partage d\'EXP entre les membres du groupe. +Party.InformedOnJoin={0} &aa rejoint votre groupe +Party.InformedOnQuit={0} &aa quitté votre groupe +Party.InformedOnNameChange=&6{0} &aa modifié le nom du groupe en &f{1} +Party.InvalidName=&4Ce n\'est pas un nom valide de guilde. +Party.Invite.Self=Vous ne pouvez pas vous inviter vous-même ! +Party.IsLocked=Ce groupe est déjà verrouillé ! +Party.IsntLocked=Cette guilde n\'est pas verrouillée ! +Party.Locked=Le groupe est verrouillé, seul le chef de groupe peut inviter. +Party.NotInYourParty=&4{0} n\'est pas dans votre guilde. +Party.NotOwner=&4Vous n\'êtes pas le chef de cette guilde. +Party.Target.NotOwner=&4{0} n\'est pas le chef de la guilde. +Party.Owner.New=&a{0} est le nouveau chef de la guilde. +Party.Owner.NotLeader=&4Vous n\'êtes désormais plus le chef de la guilde. +Party.Owner.Player=&aVous êtes désormais le chef de la guilde. +Party.Password.None=Cette guilde est protégée par un mot de passe. S\'il vous plaît, 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.Password.Set=&aMot de passe de la guilde réglé à {0} +Party.Password.Removed=&aLe mot de passe du groupe a été enlevé. 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.NotOnline=&4{0} n\'est pas connecté ! +Party.Player.InSameParty={0} est déjà dans votre guilde ! +Party.PlayerNotInParty=&4{0} n\'est pas dans votre guilde +Party.Specify=Vous devez spécifier une guilde. +Party.Teleport.Dead=Vous ne pouvez pas vous téléporter sur un joueur mort. +Party.Teleport.Hurt=Vous avez été blessé dans les dernières {0} secondes et vous ne pouvez par conséquent pas être téléporté. +Party.Teleport.Player=&aVous vous êtes téléporté sur {0}. +Party.Teleport.Self=Vous ne pouvez pas vous téléporter à vous même ! +Party.Teleport.Target=&a{0} s\'est téléporté sur vous. +Party.Teleport.Disabled={0} n\'a pas rendu possible la téléportation. +Party.Rename.Same=C\'est déjà le nom de votre groupe! +Party.Join.Self=Vous ne pouvez pas vous rejoindre vous-même ! +Party.Unlocked=&7Le groupe est déverrouillé. +Party.Disband=&7La guilde a été dissoute +Party.Alliance.Formed=&7Votre groupe est désormais allié avec &a{0} +Party.Alliance.Disband=&7Votre groupe n\'est désormais plus allié avec &c{0} +Party.Status.Locked=&4(INVITATION-SEULEMENT) +Party.Status.Unlocked=&2(OUVERT) +Party.LevelUp=Le niveau de votre guilde a été augmenté de {0}. Total ({1}) Party.Feature.Chat=Tchat de guilde -Party.Feature.Teleport=T\u00e9l\u00e9portation de guilde +Party.Feature.Teleport=Téléportation 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.Feature.Locked.Chat=Bloqué jusqu\'à {0}+ (Tchat de guilde) +Party.Feature.Locked.Teleport=Bloqué jusqu\'à {0}+ (Téléportation de guilde) +Party.Feature.Locked.Alliance=Bloqué jusqu\'à {0}+ (Alliances) +Party.Feature.Locked.ItemShare=Bloqué jusqu\'à {0}+ (Partage d\'objets) +Party.Feature.Locked.XpShare=Bloqué jusqu\'à {0}+ (Partage d\'EXP) +Party.Feature.Disabled.1=Le tchat de guilde n\'est pas débloqué pour le moment. +Party.Feature.Disabled.2=La téléportation de guilde n\'est pas débloquée pour le moment. +Party.Feature.Disabled.3=Les alliances de guilde ne sont pas débloquées pour le moment. +Party.Feature.Disabled.4=Le partage d\'objets avec la guilde n\'est pas débloqué pour le moment. +Party.Feature.Disabled.5=Le partage d\'EXP grâce à la guilde n\'est pas débloqué 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.ShareMode.Random=Aléatoire +Party.ItemShare.Category.Loot=Récompenses Party.ItemShare.Category.Mining=Minage Party.ItemShare.Category.Herbalism=Herboristerie -Party.ItemShare.Category.Woodcutting=B\u00fbcheronnage +Party.ItemShare.Category.Woodcutting=Bûcheronnage Party.ItemShare.Category.Misc=Divers +##xp 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.Excavation=Creuser et découvrir des trésors +Commands.XPGain.Fishing=Pêcher +Commands.XPGain.Herbalism=Cueillette de végétaux Commands.XPGain.Mining=Miner de la Pierre & des Minerais -Commands.XPGain.Repair=R\u00e9paration +Commands.XPGain.Repair=Réparation 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.XPGain=&8Gain d\'expérience: &f{0} +Commands.xplock.locked=&6Votre barre d\'XP est maintenant verrouillée sur {0} ! +Commands.xplock.unlocked=&6Votre barre d\'XP est maintenant &aDÉVERROUILLÉE&6 !! +Commands.xprate.modified=Le TAUX D\'EXP a été passé à {0} +Commands.xprate.over=L’événement de bonus d\'XP mcMMO est TERMINÉ !! Commands.xprate.proper.0=L\'usage correct pour changer le taux d\'XP est /xprate 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 +Commands.xprate.proper.2=Veuillez spécifier true ou false pour indiquer si il s\'agit ou pas d\'un événement temporaire +Commands.NegativeNumberWarn=N'utilisez pas des nombres négatifs ! +Commands.Event.Start=&amcMMO&6 évènement ! +Commands.Event.Stop=&amcMMO&3 évènement terminé ! +Commands.Event.Stop.Subtitle=&aJ'espère que vous vous amesurez ! +Commands.Event.XP=&3Ratio d\'XP est désormais &6{0}&3x +Commands.xprate.started.0=&6L’ÉVÉNEMENT BONUS D\'XP mcMMO VIENT DE COMMENCER ! +Commands.xprate.started.1=&6Le bonus d\'XP mcMMO est maintenant de {0}x ! + +# Admin Notifications +Server.ConsoleName=&e[Serveur] +Notifications.Admin.XPRate.Start.Self=&7Vous avez modifié le ratio d\'XP global à &6{0}x +Notifications.Admin.XPRate.End.Self=&7Vous avez arrêté l'évènement de ratio d\'XP. +Notifications.Admin.XPRate.End.Others={0} &7a arrêté l'évènement de ratio d\'XP. +Notifications.Admin.XPRate.Start.Others={0} &7a commencé ou modifié un évènement de ratio d\'XP global, qui est désormais de {1}x +Notifications.Admin.Format.Others=&6(&amcMMO &3Admin&6) &7{0} +Notifications.Admin.Format.Self=&6(&amcMMO&6) &7{0} + +# Event +XPRate.Event=&6Un événement bonus d\'Expérience est actuellement lancé ! Le bonus est de {0}x ! + +#GUIDES +Guides.Available=&7Guide pour le/la {0} est disponible - écrivez /{1} ? [page] +Guides.Header=&6-=&a{0} Guide&6=- +Guides.Page.Invalid=Le numéro 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. +##Acrobatics +Guides.Acrobatics.Section.0=&3A propos de l\'Acrobatie:\n&eL\'acrobatie est l\'art de bouger gracieusement dans mcMMO.\n&eDonne des bonus au combat et de résistance aux dégâts physiques.\n&3GAIN D\'XP:\n&ePour gagner de l\'expérience, vous devez esquiver des dégâts\n&een combat ou encaisser des dégâts de chute. +Guides.Acrobatics.Section.1=&3Comment fonctionne la Roulade?\n&eVous avez une chance, lorsque vous prenez des dégâts dus à une chute,\n&ed\'esquiver ces dégâts. Maintenez la touche pour s\'accroupir\n&epour doubler les chances d\'esquiver ces dégâts.\n&eCette manipulation activera la Roulade Gracieuse. \n&eLa Roulade Gracieuse fonctionne comme une Roulade classique,\n&emais vous avez deux fois plus de chance d\'échapper aux dégâts.\n&eVotre pourcentage de chance de Roulade dépend du niveau de votre Compétence. +Guides.Acrobatics.Section.2=&3Comment fonctionne l\'esquive?\n&eL\'esquive est une capacité passive qui peut vous permettre de\n&ediminuer les dégâts de moitié lorsque vous êtes blessé au combat.\n&eLes chances d\'esquiver sont fonction de votre niveau de compétence. +##Alchemy +Guides.Alchemy.Section.0=&3A propos de l\'alchimie:\n&eL\'alchimie est l\'art de préparer des potions.\n&eDonne des bonus de vitesse à la préparation des potions mais aussi\n&el\'ajout de nouvelles potions (précèdemment) incraftables.\n&3GAIN D\'XP:\n&ePour gagner de l\'expérience vous devez préparer des potions. +Guides.Alchemy.Section.1=&3Comment fonctionne Catalyse?\n&eCatalyse accèlere le processus de préparation des potions,\n&ejusqu\'à 4x plus vite au niveau 1000.\n&ePar défaut, cette capacité est débloquée au niveau 100. +Guides.Alchemy.Section.2=&3Comment fonctionne Concoction?\n&eConcoction vous permet de préparer plus de potions à l\'aide &ed\'ingrédients spéciaux..\n&eLes ingrédients que vous pouvez utiliser sont déterminés\n&epar votre rang. Il y a 8 rangs à débloquer. +Guides.Alchemy.Section.3=&3Ingrédients pour la confections de niveau 4 :\n&ePoudre d\'Incendiaire, Œil Fermenté d’Araignée, Larme de Ghast, Redstone,\n&ePoudre de Pierre Lumineuse, Sucre, Melon Scintillant, Carotte Dorée,\n&eCrème de Magma, Verrue du Nether, Œil d\'Araignée, Poudre à Canon, Nénuphar,\n&ePoisson-Globe\n&e(Potions de Minecraft Vanilla) +Guides.Alchemy.Section.4=&3Ingrédients pour la confections de niveau 2 :\n&eCarotte (Potion de Hâte)\n&eBoule de Slime (Potion de Lassitude)\n&3Ingrédients pour la confections de niveau 3 :\n&eQuartz (Potion d\'Absorption)\n&eChampignon Rouge (Potion de Saut Boosté) +Guides.Alchemy.Section.5=&3Ingrédients pour la confections de niveau 4 :\n&ePomme (Potion de Boost de Vie)\n&eViande Putréfiée (Potion de Faim)\n&3Ingrédients pour la confections de niveau 5 :\n&eChampignon Brun (Potion de Nausée)\n&ePoche d\'Encre (Potion d\'Aveuglement) +Guides.Alchemy.Section.6=&3Ingrédients pour la confections de niveau 6 :\n&eHerbes Hautes (Potion de Saturation)\n&3Ingrédients pour la confections de niveau 7 :\n&ePatate Empoisonnée (Potion de Wither)\n&3Ingrédients pour la confections de niveau 8 :\n&ePomme d\'or normale (Potion de Résistance) +##Archery +Guides.Archery.Section.0=&3A propos de l\'Archerie:\n&eL\'archerie est l\'art du tir à l\'arc.\n&eCette compétence fournit divers bonus de combat, par exemple une\n&eaugmentation des dégâts proportionelle à votre niveau, la capacité\n&ede rendre confus d\'autres joueurs en PvP,etc. En plus de cela, vous\n&epouvez aussi récupérer quelques flèches des corps de vos ennemis.\n&3GAIN D\'XP:\n&ePour gagner de l\'expérience dans cette discipline vous devez infliger\n&edes dégâts à l\'aide de vos flèches. +Guides.Archery.Section.1=&3Comment fonctionne tir précis?\n&eTir précis augmente les dégâts de vos tirs.\n&eL\'augmentation des dégâts est fonction de\n&evotre niveau en tir à l\'arc..\n&ePar défaut, vos dégâts augmentent de 10% tous les\n&e50 niveaux, jusqu\'à un maximum de 200% de bonus. +Guides.Archery.Section.2=&3Comment fonctionne désorienter?\n&eVous avez une chance de désorienter votre cible lorsque vous lui\n&etirez dessus. Sous l\'effet de désorienter, votre cible regarde droit\n&evers le ciel pendant une courte durée.\n&eUn tir qui désoriente inflige 4 dégâts supplémentaires (2 coeurs). +Guides.Archery.Section.3=&3Comment fonctionne la récupération de flèches?\n&eVous avez une chance de récupérer certaines de vos flèches\n&elorsque vous tuez un mob à l\'arc.\n&eCette chance augmente avec votre niveau en Tir à l\'arc.\n&eCette capacité augmente de 0.1% par niveau, jusqu\'à 100%\n&eau niveau 1000. +##Axes +Guides.Axes.Section.0=&3Concernant les Haches:\n&eAvec la compétence Hache vous pouvez utiliser votre Hache pour bien plus\n&eque de la déforestation! Vous pourrez découper des mobs et des joueurs\n&epour gagner de l\'expérience, attaquer des mobs avec un effet de recul\n&eet infliger des coups critiques MORTELS sur mobs et joueurs.\n&eVotre hache devient aussi un outil redoutable pour perforer\n&el\'armure de vos ennemis au fur et à mesure que votre niveau\n&eaugmente.\n&3Gain d\'expérience:\n&ePour gagner de l\'expérience, il vous faut attaquer un joueur ou un mob\n&eavec une Hache. +Guides.Axes.Section.1=&3Comment fonctionne le Pourfendeur de Crânes?\n&eCette capacité vous permet d\'infliger des dégâts de zone.\n&eCe dégât de zone infligera la moitié de ce que vous avez infligé à votre\n&ecible principale et s\'avère donc utile pour s\'attaquer à des hordes de mobs. +Guides.Axes.Section.2=&3Comment fonctionne le Coup Critique?\n&eLe Coup Critique est une capacité automatique qui donne une chance\n&ed\'infliger des dégâts supplémentaires.\n&ePar défaut, par pallier de 2 niveaux dans la Compétence Hache, vous gagnez\n&e0.1% de chance de porter le Coup Critique, causant 2 fois plus de dégâts aux mobs\n&eou 1.5 fois de dégâts aux joueurs. +Guides.Axes.Section.3=&3Comment fonctionne la Maîtrise de la Hache?\n&e la Maîtrise de la Hache est une capacité automatique qui permet d\'infliger plus de dégâts\n&eà vos cibles en utilisant une Hache.\n&ePar défaut, ce bonus augmente vos dégât infligés de 1 par pallier de 50 niveaux\n&epour atteindre un maximum de 4 au niveau 200. +Guides.Axes.Section.4=&3Comment fonctionne l\'Impact d\'Armure?\n&eFrappez avez suffisamment de force pour briser une armure!\n&eCette capacité a une chance passive de détériorer l\'armure de votre ennemi.\n&e de votre ennemi. Ces dégâts augmentent avec votre niveau de la Compétence Haches. +Guides.Axes.Section.5=&3Comment fonctionne l\'Impact Amélioré?\n&eVous avez une chance, automatique, pour obtenir un impact plus important\n&elorsque vous attaquez avec votre hache.\n&ePar défaut cette chance est de 25%. Cette capacité a\n&eun effet de recul considérable, similaire à l’enchantement Frappe II.\n&eEn plus, les dégâts sont augmentés avec cette capacité. +##Excavation +Guides.Excavation.Section.0=&3A propos de l\'Excavation :\n&eL\'Excavation est l\'action de creuser la terre pour y trouver des trésors.\n&eEn excavant le monde, vous trouverez des trésors.\n&ePlus vous effectuerez ceci, plus vous pourrez trouver de trésors.\n&3Gain d\'expérience:\n&ePour gagner de l\'expérience dans cette compétence vous devez creuser avec une pelle en main.\n&eSeulement certains matériaux peuvent être creusés pour des trésors et de l\'expérience. +Guides.Excavation.Section.1=&3Matériaux compatibles:\n&eHerbe, Terre, Sable, Argile, Gravier, Mycelium, Sable des âmes +Guides.Excavation.Section.2=&3Comment utiliser le Giga Broyeur:\n&eAvec une pioche dans votre main, faites clic droit pour préparer votre outil.\n&eUne fois cela fait, vous avez jusqu\'à 4 secondes pour commencer à miner\n&edes matériaux compatibles, ce qui activera le Broyeur. +Guides.Excavation.Section.3=&3Comment fonctionne Foreur?\n&eForeur est une capacité avec temps de recharge, liée\n&eà votre compétence d\'excavation. Cela triple les chances\n&ede trouver des trésors et détruis instantanément les\n&eblocs excavables. +Guides.Excavation.Section.4=&3Comment fonctionne Chasseur de Trésors?\n&eLes trésors récupérables requièrent d\'avoir un certain niveau\n&een excavation pour avoir une chance de les faire tomber, en &econséquence de quoi il est difficile d\'estimer son utilité.\n&eMais gardez à l\'esprit que plus votre niveau est élevé,\n&eplus vous pourrez trouver de trésors différents.\n&eRappelez vous aussi que chaque type de bloc excavable\n&econtient sa propre liste de trésors uniques.\n&eEn d\'autres termes, vous trouverez des trésors différents en creusant\n&edu sable plutôt que du gravier (par exemple). +Guides.Excavation.Section.5=&3Notes sur l\'Excavation:\n&eLes loots de l\'excavation sont entièrement modifiables\n&edonc les résultats varient selon les serveurs. +##Fishing +Guides.Fishing.Section.0=&3Concernant la Pêche:\n&eLa Compétence Pêche rend la Pêche intéressante!\n&eTrouvez des trésors cachés, et dérobez des objets aux mobs!\n&3Gain d\'Expérience:\n&ePêchez des poissons! +Guides.Fishing.Section.1=&3Comment fonctionne le Chasseur de Trésors?\n&eCette capacité vous permet de trouver des trésors en pêchant\n&eavec une petite chance de trouver des objets enchantés.\n&eTous les trésors possibles sont trouvables à n\'importe\n&equel niveau de la Compétence Pêche. Trouver un objet\n&edépend néanmoins de la rareté de ce dernier.\n&ePlus votre Compétence Pêche est élevée, plus\n&evous aurez de chances de trouver de meilleurs trésors! +Guides.Fishing.Section.2=&3Comment fonctionne la Pêche sur Glace?\n&eCette capacité passive vous permet de pêcher sur des lacs gelés!\n&eLancez votre cane à pêche dans un lac gelé et cette capacité\n&ecréera un trou dans la glace pour pêcher. +Guides.Fishing.Section.3=&3Comment fonctionne Maître Pêcheur?\n&eCette capacité passive augmente la chance d\'une touche sur votre ligne de pêche.\n&eLorsque vous avez débloqué cette capacité, en pêchant dans un bateau\n&eou lorsque vous êtes dans un biome océan, la chance d\'une touche est doublée. +Guides.Fishing.Section.4=&3Comment fonctionne la Secousse?\n&eCette capacité active vous permet de récupérer des objets sur les mobs\n&een les crochetant avec une cane à pêche.\n&eLes mobs feront alors tomber au sol ce qu\'ils laisseraient normalement à leur mort.\n&eIl est aussi possible de récupérer des crânes de mobs, qui sont normalement\n&enon récupérables. +Guides.Fishing.Section.5=&3Comment fonctionne le Repas du Pêcheur?\n&eCette capacité passive vous permet d\'augmenter la vie récupérée\n&een mangeant du poisson. +Guides.Fishing.Section.6=&3Notes sur la Pêche:\n&eLes loots de la Pêche sont entièrement modifiables\n&edonc les résultats varient selon les serveurs. +##Herbalism +Guides.Herbalism.Section.0=&3A propos de l\'herboristerie:\n&eL\'herboristerie concerne la culture et la récolte de plantes et d\'herbes.\n&3GAIN D\'XP:\n&eRécolte de plantes et d\'herbes. +Guides.Herbalism.Section.1=&3Blocs compatibles\n&eBlé, Potatoes, Carrotes, Melons, \n&eCitrouilles, Canne à sucre, Fèves de Cacao, Fleurs, Cactus, Champignons,\n&eVerrues du Nether, Nénuphars, et Lianes. +Guides.Herbalism.Section.2=&3Comment fonctionne Main Verte?\n&eMain Verte est une capacité activée, grâce à un clic-droit\n&elorsque vous tenez une houe.\n&eMain Verte donne au joueur une chance de récupérer 3x ce que\n&edonnerai la plante récoltée. Vous pouvez également utiliser des\n&egraines pour insufler la vie à certains blocs \n&eafin de les transformer. +Guides.Herbalism.Section.3=&3Comment Mains Vertes (Plantations) fonctionne ?\n&eCette capacité passive va automatiquement replanter les \n&eplantations lorsque celles-ci ont été récoltées.\n&eLes chances de succèes dépendent de votre talent Herborisme. +Guides.Herbalism.Section.4=&3Comment Mains Vertes (Pierre/Briques de Pierre/Terre) fonctionent-elles ?\n&eCette cpacité active vous permet de transformer les blocs dans leur\n&eforme homologue (Pierre Moussue/Brique de Pierre Moussue/Herbe).\n&eVous pouvez faire ceci en effectuant un clic droit\n&esur le bloc, en tenant des graines. une graine sera alors consommée. +Guides.Herbalism.Section.5=&3Comment fonctionne régime fermier?\n&eCette capacité passive augmente le montant d\'énergie rendue \n&elorsque vous mangez du pain, cookies, pastèque, soupe \n&ede champignons, carottes et patates. +Guides.Herbalism.Section.6=&3Comment fonctione Chance d\'Hyrule?\n&eCette capacité passive vous donne une chance de trouver des\n&eobjets rares lorsque vous cassez certains blocs avec une épée. +Guides.Herbalism.Section.7=&3Comment fonctionne Double Drops?\n&eCette capacité passive donne au joueur\n&eplus d\'objets lors de ses récoltes. +##Mining +Guides.Mining.Section.0=&3A propos du Minage:\n&eLe Minage consiste à miner de la pierre et des minerais.\n&eIl occtroie des bonus sur le nombre de minerais obtenus lors du minage.\n&3Gain d\'expérience:\n&ePour gagner de l\'expérience dans cette compétence, vous devez simplement miner avec une pioche.\n&eSeulement certains blocs rapportent de l\'expérience. +Guides.Mining.Section.1=&3Matériaux compatibles:\n&ePierre lisse, Minerais de Charbon, Minerais de Fer, Minerais d\'Or, Minerais de Diamant, Minerais de Redstone,\n&eMinerais de Lapis, Obsidienne, Pierre Moussue, Pierre de l\'End,\n&ePierre Lumineuse, et Netherrack. +Guides.Mining.Section.2=&3Comment utiliser le Broyeur:\n&eAvec une pioche dans votre main, faites clic droit pour préparer votre outil.\n&eUne fois cela fait, vous avez jusqu\'à 4 secondes pour commencer à miner\n&edes matériaux compatibles, ce qui activera le Broyeur. +Guides.Mining.Section.3=&3Qu\'est-ce que le Super Briseur?\n&eLe Super Briseur est une capacité avec un temps de récupération lié à la Compétence\n&eminage. Il triple vos chances de récupérer des objets et\n&epermet la casse instantanée sur des minerais. +Guides.Mining.Section.4=&3Comment utiliser le Minage Explosif:\n&eAvec un détonateur en main, à savoir un briquet par défaut,\n&es\'accroupir et faire un clic droit sur de la TNT à distance. Ceci fera\n&eexploser instantanément la TNT. +Guides.Mining.Section.5=&3Comment fonctionne le Minage par Explosions?\n&eLe Minage par Explosions est une capacité avec un temps de recharge lié au talent\n&ede Minage. Il donne des bonus lors de l\'utilisation nde TNT pour le minage et vous permet\n&ede contrôler l\'explosion de TNT. Il y a 3 parties du Minage par Explosions.\n&eLa première est les Grosses Bombes. Elle vous permet d\'augmenter le rayon d\'explosion.\n&eLa seconde est la Demolition Experte, qui diminue les dégâts provenants des explosions de TNT\n&eLa troisième augmente le nombre de minerais obtenus par la TNT et diminue les pertes. +##Repair +Guides.Repair.Section.0=&3A propos de la Réparation :\n&eLa réparation vous permet d\'utiliser un bloc de fer pour réparer\n&edes armures et des outils.\n&3Gain d\'expérience:\n&eRéparer des outils ou des armures en utilisant l\'enclume de mcMMO.\n&eC\'est un bloc de fer par défaut et il ne doit pas être confondu avec\n&el\'enclume de Minecraft Vanilla. +Guides.Repair.Section.1=&3Comment utiliser Réparation?\n&ePlacez une enclume mcMMO et faites un clic droit pour réparer l\'objet\n&eque vous avez en main. Ceci consomme 1 objet à chaque utilisation. +Guides.Repair.Section.2=&3Comment fonctionne Maîtrise de la Forge?\n&eMaîtrise de la Forge augmente la quantité de réparations effectuées.\n&eLa quantité de durabilité supplémentaire attribuée est fonction de \n&evotre niveau en Réparation. +Guides.Repair.Section.3=&3Comment fonctionne la Super Réparation?\n&eLa Super Réparation est une capacité passive . Lors de la réparation d\'un élément ,\n&eelle accorde aux joueurs une chance de réparer un élément avec\n&eune double efficacité. +Guides.Repair.Section.4=&3Comment fonctionne Forge arcanique?\n&eCette capacité passive vous permet de réparer des objets avec une\n&ecertaine chance de conserver les enchantements. Ces derniers\n&epourrons être conservé à leur niveau, rendus à un niveau inférieur\n&eou complètement perdus. +##Salvage +Guides.Salvage.Section.0=&3A propos du Recyclage:\n&eLe Recyclage vous permet d\'utiliser un bloc d\'or pour récupérer des matières premières\n&esur de l\'armure ou des outils.\n&3Gain d\'Expérience:\n&eLe Recyclage est une Compétence enfant des compétences Réparation et Pêche, votre niveau\n&ede Recyclage est donc basé sur les niveaux des compétences Réparation et Pêche. +Guides.Salvage.Section.1=&3Comment utiliser le Recyclage?\n&ePlacez une Enclume de Recyclage mcMMO et faites un clic-droit pour recycler \n&el\'objet que vous avez en main. Ceci cassera votre objet\n&eet vous rendra les matériaux qui composent l\'objet.\n&ePar exemple, recycler une pioche en fer vous rendra des barres de fer. +Guides.Salvage.Section.2=&3Comment fonctionne le Recyclage Avancé?\n&eLorsque débloquée, cette capacité vous permet de recycler des objets détériorés.\n&eVotre pourcentage de récupération de matériaux augmente avec votre niveau. Un pourcentage\n&eplus élevé signifie que vous pouvez récupérer davantage de matériaux.\n&eAvec le Recyclage Avancé vous récupérerez toujours un matériaux \n&esauf si l\'objet est trop endommagé. Vous n\'aurez donc pas à vous\n&esoucier de casser des objets sans avoir rien récupéré. +Guides.Salvage.Section.3=&3Voici une illustration pour expliquer comment cela fonctionne:\n&eDisons que nous recyclons une pioche en or endommagée à 20%,\n&ece qui veux dire que le montant maximum que vous pouvez récupérer est 2 (66%).\n&e(parce que la pioche est constituée de 3 lingots, valant chacun\n&e33,33% de durabilité). Si votre pourcentage de récupération de matériaux\n&eest en dessous de 66% vous ne pourrez pas récupérer 2 lingots.\n&eSi ce pourcentage est au dessus de 66% vous pourrez récupérer le\n&e\"montant maximum\", donc 2 lingots. +Guides.Salvage.Section.4=&3Comment fonctionne le Recyclage Arcanique?\n&eCette capacité vous permet de récupérer des livres enchantés lors que vous recyclez\n&edes objets enchantés. En fonction de votre niveau, la chance de récupérer avec succès\n&edes enchantements entiers ou partiels varie.\n&eLorsqu\'un enchantement est partiellement récupéré, le livre enchanté\n&eaura un niveau d\'enchantement plus bas comparé à l\'enchantement\n&ede l\'objet que recyclez. +##Smelting +Guides.Smelting.Section.0=Prochainement... +##Swords +Guides.Swords.Section.0=&3A propos du combat à l\'épée::\n&eCette compétence octroie un bonus si vous combattez avec\n&eune épée.\n&3XP GAIN:\n&eLe gain d\'XP est basé sur le montant des dégats infligés aux mobs \n&eet autres joueurs avec une épée. +Guides.Swords.Section.1=&3Comment fonctionne coups déchirants?\n&eCoups déchirants est une capacité acitvée, vous pouvez l\'activer\n&eavec un clic droit, une épée à la main. Cette capacité vous permet \n&ed\'infliger des dégâts de zone (AoE). Cette AoE inflige un bonus de 25%\n&ede dommage et fais saigner la cilbe pendant 5 ticks. +Guides.Swords.Section.2=&3Comment fonctionne la Contre-Attaque?\n&eLa Contre-Attaque est une capacité active. En bloquant les attaques\n&edes mobs, vous avez une chance de repousser 50% des\n&edégâts qui vous sont infligés. +Guides.Swords.Section.3=&3Comment fonctionne le Saignement?\n&eLe Saignement fait saigner vos ennemis, perdant de la vie toutes les deux secondes.\n&eLa cible saignera jusqu\'à ce que l\'effet s\'estompe, ou qu\'il meure,\n&een fonction de ce qui arrive en premier!\n&eLa durabilité du Saignement est augmenté avec votre Compétence Épée. +##Taming +Guides.Taming.Section.0=&3A propos de l\'Apprivoisement:\n&eL\'apprivoisement confère au joueur divers bonus de combat\n&elorsqu\'il utilise un animal (loup/ocelot).\n&3GAIN D\'XP:\n&ePour gagner de l\'expérience, vous devez apprivoiser des loups ou des\n&eocelots +Guides.Taming.Section.1=&3Comment fonctionne l\'Appel de la Nature?\n&eAppel de la Nature est une capacité active qui vous permet de faire appel\n&eà un loup ou un ocelot. Vous pouvez faire ceci en faisant\n&eun clic gauche en tenant des os ou du poisson. +Guides.Taming.Section.2=&3Comment fonctionne connaissance des bêtes?\n&eConnaissance des bêtes permet au joueur d\'inspecter les stats\n&ede ses animaux. Cliquez gauche un loup ou un ocelot pour\n&eutiliser Connaissance des bêtes. +Guides.Taming.Section.3=&3Comment fonctione Gore?\n&eGore est une capacité passive qui a une chance d\'infliger un effet\n&ede saignement sur la cible de votre loup. +Guides.Taming.Section.4=&3Comment fonctionne Griffes aiguisées?\n&eGriffes aiguisées ajoute un bonus de dégâts infligés par votre loup.\n&eLe bonus de dégâts dépend de votre niveau en Apprivoisement. +Guides.Taming.Section.5=&3Comment fonctionne Attentif à l\'environnement?\n&eCette capacité passive permet à votre loup de se téléporter sur vous\n&elorsqu\'il se rapproche de dangers (cactus, lave, etc). Cela lui donne\n&eégalemment l\'immunité contre les dégâts de chute. +Guides.Taming.Section.6=&3Comment fonctionne Poil Épais?\n&eCette capacité passive rend vos loups moins vulnérables\n&eet résistants au feu. +Guides.Taming.Section.7=&3Comment fonctionne résistance aux chocs?\n&eCette capacité passive réduit les dégâts infligés à vos loups\n&epar les explosions. +Guides.Taming.Section.8=&3Comment fonctionne Service Fast Food?\n&eCette capacité passive donne à vos loups une chance de\n&ese soigner lorsqu\'ils effectuent une attaque. +##Unarmed +Guides.Unarmed.Section.0=&3A propos des Poings:\n&eUtiliser ses Poings pour se battre donnera des bonus divers lorsque\n&evous combattez.\n&3Gain d\'Expérience:\n&eVous gagnez de l\'expérience en fonction des dégâts infligés aux mobs\n&eou aux autres joueurs lors d\'un combat avec vos Poings. +Guides.Unarmed.Section.1=&3Comment fonctionne la Furie?\n&eFurie est une capacité active qui est activée en faisant un clic-droit,\n&een n\'ayant rien à la main. En mode Furie, vous infligerez 50% plus\n&ede dégâts et vous pourrez casser des matériaux faibles instantanément,\n&ecomme l\'Herbe et la Terre. +Guides.Unarmed.Section.2=&3Comment fonctionne le Bras de Fer?\n&eBras de Fer augmente les dégâts infligés lorsque vous attaquez des mobs ou\n&edes joueurs avec les Poings. +Guides.Unarmed.Section.3=&3Comment fonctionne la Déviation de Flèche?\n&eLa Déviation de Flèche est une capacité \n&equi permet de dévier une flèche tirée par un Squelette ou un joueur.\n&eCette flèche tombera alors au sol, inoffensive. +Guides.Unarmed.Section.4=&3Comment fonctionne la Poigne de Fer?\n&ePoigne de Fer est une capacité passive qui contre le désarmement. En améliorant\n&evotre compétence Poings, la chance de parer un désarmement augmente. +Guides.Unarmed.Section.5=&3Comment fonctionne désarmement?\n&eCette capacité passive permet le joueur de désarmer d\'autres joueurs,\n&eprovoquant la chute au sol de ses objets équipés. +##Woodcutting +Guides.Woodcutting.Section.0=&3A propos de bûcheronnage:\n&eLe bûcheronnage concerne l\'abattement d\'arbres.\n&3Gain d\'Expérience:\n&eVous gagniez de l\'expérience pour chaque bloc de bois cassé. +Guides.Woodcutting.Section.1=&3Comment fonctionne le Fendeur d\'Arbres?\n&eLe Fendage d\'Arbres est une capacité active, en faisant un clic-droit\n&eavec une hache à la main, vous activerez cette capacité. Ceci vous\n&epermettra d\'abattre un arbre intégralement, en récupérant\n&etoutes les bûches d\'un coup. +Guides.Woodcutting.Section.2=&3Comment fonctionne le Souffleur de Feuilles?\n&eSouffleur de Feuilles est une capacité passive qui permet de casser un\n&ebloc de feuilles instantanément quand vous les cassez avec un hache. Par défaut,\n&ecette capacité est disponible au niveau 100 de la Compétence Bûcheronnage. +Guides.Woodcutting.Section.3=&3Comment fonctionne Double Bois?\n&eCette capacité passive vous donne une chance\n&ede récupérer une bûche supplémentaire par bloc de bois cassé. +#INSPECT 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) +Inspect.OfflineStats=mcMMO Stats for Offline Player &e{0} +Inspect.Stats=&amcMMO Stats for &e{0} +Inspect.TooFar=Vous êtes trop éloigné de ce joueur pour l\'inspecter ! +#ITEMS +Item.ChimaeraWing.Fail=**ÉCHEC D\'AILE DE CHIMÈRE !** +Item.ChimaeraWing.Pass=**AILE DE CHIMÈRE** +Item.ChimaeraWing.Name=Aile de Chimère +Item.ChimaeraWing.Lore=&7Vous téléporte à votre lit. +Item.ChimaeraWing.NotEnough=Vous avez besoin de &e{0}&c &6{1}&c en plus! +Item.NotEnough=Vous avez besoin de &e{0}&c &6{1}&c en plus! +Item.Generic.Wait=Vous devez attendre avant de pouvoir utiliser cela de nouveau ! &e({0}s) +Item.Injured.Wait=Vous avez été blessé récemment et devez attendre pour utiliser cela. &e({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 +Item.FluxPickaxe.Lore.1=&7A une chance de fondre des minerais instantanément. +Item.FluxPickaxe.Lore.2=&7Requière niveau de Forge {0}+ +#TELEPORTATION +Teleport.Commencing=&7La téléportation commence dans &6({0}) &7secondes, prière de ne pas bouger... +Teleport.Cancelled=&4Téléportation annulée ! +#COMPETENCES +Skills.Child=&6(TALENT ENFANT) +Skills.Disarmed=&4Vous avez été désarmé ! +Skills.Header=-----[]&a{0}&c[]----- +Skills.NeedMore=&4Vous devez en avoir plus +Skills.NeedMore.Extra=&4Vous avez besoin de &7{0}{1} 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. +Skills.Stats={0}&a{1}&3 XP (&7{2}&3/&7{3}&3) +Skills.ChildStats={0}&a{1} +Skills.MaxXP=Max +Skills.TooTired=Vous êtes trop fatigué pour réutiliser cette compétence maintenant. +Skills.TooTired.Named=&7(&6{0}&e {1}s&7) +Skills.TooTired.Extra=&6{0} &eSuper abilité - {1} +Skills.Cancelled={0} annulé(e) ! +Skills.ConfirmOrCancel=&aFaîtes de nouveau un clic droit pour confirmer &6{0}&a. Clic gauche pour annuler. +Skills.AbilityGateRequirementFail=&7Vous devez avoir &e{0}&7 niveaux supplémentaires en &3{1}&7 pour utilisez cette super abilité. +#STATISTIQUES +Stats.Header.Combat=&6-=COMPÉTENCES DE COMBAT=- +Stats.Header.Gathering=&6-=COMPÉTENCES DE RÉCOLTE=- +Stats.Header.Misc=&6-=AUTRES TALENTS=- +Stats.Own.Stats=&a[mcMMO] Statistiques +#PERKS +Perks.XP.Name=Expérience +Perks.XP.Desc=Gain d\'EXP boosté 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.Lucky.Desc=Donnes {0} compétences et abiletés 33.3% de chance d\'être activées. +Perks.Lucky.Desc.Login=Donne à certaines compétences 33.3% de chance d\'être activées. +Perks.Lucky.Bonus=&6 ({0} avec votre avantage de chance) +Perks.Cooldowns.Name=Regénération rapide +Perks.Cooldowns.Desc=Temps d\'attente réduits 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}. +Perks.ActivationTime.Desc=Augmente la durée de l\'abilété de {0} secondes. +Perks.ActivationTime.Bonus=&6 ({0}s avec votre avantage d\'endurance) +#HARDCORE +Hardcore.Mode.Disabled=&6[mcMMO] Le mode Hardcore {0} a été désactivé pour {1}. +Hardcore.Mode.Enabled=&6[mcMMO] Le mode Hardcore {0} a été activé pour {1}. +Hardcore.DeathStatLoss.Name=Pénalités sur les talents lors de la mort +Hardcore.DeathStatLoss.PlayerDeath=&6[mcMMO] &4Vous avez perdu &9{0}&4 niveau(x) dans votre mort. +Hardcore.DeathStatLoss.PercentageChanged=&6[mcMMO] Le pourcentage de perte de statistiques a été changé à {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 +Hardcore.Vampirism.Killer.Failure=&6[mcMMO] &e{0}&7 était trop maladroit pour améliorer votre connaissance. +Hardcore.Vampirism.Killer.Success=&6[mcMMO] &3Vous avez volé &9{0}&3 niveau(x) de &e{1}. +Hardcore.Vampirism.Victim.Failure=&6[mcMMO] &e{0}&7 Il n\'a pas été capable de vous voler votre connaissance ! +Hardcore.Vampirism.Victim.Success=&6[mcMMO] &e{0}&4 a volé &9{1}&4 de vos niveaux ! +Hardcore.Vampirism.PercentageChanged=&6[mcMMO] Le pourcentage de perte de statistiques a été changé à {0}. +#MOTD +MOTD.Donate=&3Donation Info: +MOTD.Hardcore.Enabled=&6[mcMMO] &3Mode Hardcore activé : &4{0} +MOTD.Hardcore.DeathStatLoss.Stats=&6[mcMMO] &3Pénalités sur les talents lors de la mort : &4{0}% +MOTD.Hardcore.Vampirism.Stats=&6[mcMMO] &3Pourcentage de perte de statistiques de Vampirisme: &4{0}% +MOTD.PerksPrefix=[mcMMO Compétences] +MOTD.Version=&6[mcMMO] Version &3{0} +MOTD.Website=&6[mcMMO] &a{0}&e - Site de mcMMO +#SMELTING +Smelting.Ability.FluxMining=Chance de Minage en Flux : &e{0} +Smelting.Ability.FuelEfficiency=Multiplicateur d\'efficacité des Combustibles: &e{0}x +Smelting.Ability.Locked.0=Bloqué jusqu\'à {0}+ niveaux de talent (BOOST D\'EXPERIENCE VANILLA) +Smelting.Ability.Locked.1=Bloqué jusqu\'à {0}+ niveaux du talent (MINAGE PAR EXPLOSIONS) +Smelting.Ability.SecondSmelt=Chance de seconde cuisson: &e{0} +Smelting.Ability.VanillaXPBoost=Multiplicateur d\'EXP Vanilla: &e{0}x +Smelting.SubSkill.FuelEfficiency.Name=Efficacité du combustible +Smelting.SubSkill.FuelEfficiency.Description=Augmente la durée de vie du combustible utilisé dans les fours lors des cuissons +Smelting.SubSkill.FuelEfficiency.Stat=Multiplicateur d\'efficacité du combustible: &e{0}x Smelting.SubSkill.SecondSmelt.Name=Seconde Cuisson Smelting.SubSkill.SecondSmelt.Description=Double les ressources obtenues par cuisson +Smelting.SubSkill.SecondSmelt.Stat=Chance d\'une seconde 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.SubSkill.FluxMining.Description=Chance pour que les minerais soient instantanément cuits lors de leur minage Smelting.Listener=Cuisson: Smelting.SkillName=FONTE +#DESCRIPTIONS DES COMMANDES 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.adminchat=Modifie le tchat McMMO admin en activé/désactivé ou envoie des messages dans le tchat admin +Commands.Description.addxp=Ajoute de l\'EXP McMMO à un utilisateur +Commands.Description.hardcore=Modifier le pourcentage de difficulté de mcMMO ou activer ou non le mode hardcore +Commands.Description.inspect=Voir les infos détaillées d\'un autre joueur +Commands.Description.mcability=Modifie la possibilité que les capacités McMMO soient prêtes par un clic droit en activé/désactivé +Commands.Description.mccooldown=Voir tous les temps d\'attentes des capacités McMMO +Commands.Description.mcchatspy=Mettre le chat mcMMO privée sur on/off +Commands.Description.mcgod=Modifie le mode Dieu de McMMO en activé/désactivé 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.mcmmo=Montre une brève description de McMMO +Commands.Description.mcnotify=Modifie l\'affichage des notifications dans le tchat des capacités mcMMO en activé/désactivé +Commands.Description.mcpurge=Purge les utilisateurs avec aucun niveaux McMMO et les utilisateurs qui ne se sont pas connectés dans les {0} derniers mois de la base de données 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.mcrefresh=Rafraîchi tous les temps d\'attente McMMO +Commands.Description.mcremove=Enlève un utilisateur de la base de données 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 +Commands.Description.mmodebug=Activer/Désactiver le mode de debug pour voir des informations utiles lorsque vous tapez un blocs +Commands.Description.mmoupdate=Migration de la base de données mcMMO à partir d\'une ancienne vers l\'actuelle. +Commands.Description.mcconvert=Convertie les types de base de données ou les types de formule d\'experience +Commands.Description.mmoshowdb=Montre le nom de la base de données actuellement utilisée (vous pouvez obtenir la dernière avec /mmoupdate) +Commands.Description.party=Contrôle les divers réglages des guildes McMMO +Commands.Description.partychat=Modifie le tchat McMMO de la guilde en activé/désactivé ou envoie des messages dans le tchat de la guilde. +Commands.Description.ptp=Vous téléporte à un membre de votre groupe mcMMO +Commands.Description.Skill=Affiche des infos détaillées du talent McMMO {0} +Commands.Description.skillreset=Remet à 0 tous les niveaux McMMO pour un utilisateur +Commands.Description.vampirism=Modifie le mode Dieu de McMMO en activé/désactivé +Commands.Description.xplock=Bloque votre barre d\'EXP McMMO pour un talent spécifique +Commands.Description.xprate=Modifie le taux d\'EXP McMMO ou débute un event XP McMMO +#UPDATE CHECKER UpdateChecker.Outdated=Vous utilisez une ancienne version de McMMO ! UpdateChecker.NewAvailable=Une nouvelle version est disponible sur BukkitDev. +#SCOREBOARD HEADERS 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.PowerLevel=&6Niveau de puissance +Scoreboard.Misc.Level=&3Niveau +Scoreboard.Misc.CurrentXP=&aEXP 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. +Scoreboard.Misc.Cooldown=&dTemps d\'attente +Scoreboard.Misc.Overall=&6Global +Scoreboard.Misc.Ability=Capacité +#DATABASE RECOVERY +Profile.PendingLoad=&cGénial! Vos données McMMO ont été chargées. +Profile.Loading.Success=&aVotre profil mcMMO a été chargé. +Profile.Loading.FailurePlayer=&cmcMMO a des problèmes pour le chargement des données, nous avons essayé de les charger &a{0}&c fois.&c Vous devez contacter l'administrateur du serveur à ce propos. mcMMO essayera de charger les données jusqu\'à votre déconnection, vous ne gagnerez pas d\'XP ou ne pourrez pas utiliser vos compétences tant que les données ne sont pas chargés. +Profile.Loading.FailureNotice=&4[A]&c mcMMO ne peut pas charger les données pour &e{0}&c. &dMerci de vérifier la configuration de la base de données. Essaie fait {1}x. +#Holiday +Holiday.AprilFools.Levelup=&6{0} est désormais au niveau &a{1}&6! +Holiday.Anniversary=&9Joyeux {0} anniversaire !\n&9En honneur à tout le travail de nossr50 et à tout les développeurs, voici un spectacle de feu d\'artifice ! +#Messages de rappels +Reminder.Squelched=&7Rappel: Vous ne recevez pas les notifications de mcMMO, pour les activez, faites /mcnotify une seconde fois. Ceci est un rappel automatique toutes les heures. +#Locale +Locale.Reloaded=&aMessages rechargés ! +#Player Leveling Stuff +LevelCap.PowerLevel=&6(&amcMMO&6) &eVous avez atteint le niveau de power maximum de &c{0}&e. Vous n'allez pas gagner de niveaux pour cette compétence. +LevelCap.Skill=&6(&amcMMO&6) &eVous avez atteint le niveau de power maximum de &c{0}&e pour &6{1}&e. Vous n'allez pas gagner de niveaux pour cette compétence. +Commands.XPBar.Usage=Usage normal est /mmoxpbar +Commands.Description.mmoxpbar=Configuration pour les joueurs des mcMMO XP bars +Commands.Description.mmocompat=Information à propos de mcMMO, des compatibilités or des de ses fonctionnalités +Compatibility.Layer.Unsupported=&6Compatibilités pour &a{0}&6 n'est pas une version de Minecraft supporté. +Compatibility.Layer.PartialSupport=&6Compatibilités pour &a{0}&6 n'est pas une version de Minecraft supporté, mais mcMMO utilise une version qui émule certaines fonctionnalités manquantes. +Commands.XPBar.DisableAll=&6 Toutes les barres d\'XP mcMMO sont désormais désactivés, utilisez /mmoxpbar reset pour remettre la configuration par défaut. +#Options pour le chat moderne +Chat.Style.Admin=&b(A) &r{0} &b→ &r{1} +Chat.Style.Party=&a(P) &r{0} &a→ &r{1} +Chat.Style.Party.Leader=&a(P) &r{0} &6→ &r{1} +Chat.Identity.Console=&6* Console * +Chat.Channel.On=&6(&amcMMO-Chat&6) &eVos messages dans le chat seront désormais automatiquement envoyé dans le salon &a{0}&e. +Chat.Channel.Off=&6(&amcMMO-Chat&6) &7Vos messages dans le chat ne sont plus envoyé dans un salon spécifique. +Chat.Spy.Party=&6[&eSPY&6-&a{2}&6] &r{0} &b→ &r{1} +Broadcasts.LevelUpMilestone=&6(&amcMMO&6) {0}&7 a atteint le niveau &a{1}&7 en &3{2}&7! +Broadcasts.PowerLevelUpMilestone=&6(&amcMMO&6) {0}&7 a atteint le niveau de puissance pour &a{1}&7! diff --git a/src/main/resources/locale/locale_hu_HU.properties b/src/main/resources/locale/locale_hu_HU.properties index fc239ba87..c0d286a7f 100644 --- a/src/main/resources/locale/locale_hu_HU.properties +++ b/src/main/resources/locale/locale_hu_HU.properties @@ -3,712 +3,724 @@ #DO NOT USE COLOR CODES IN THE JSON KEYS #COLORS ARE DEFINED IN advanced.yml IF YOU WISH TO CHANGE THEM JSON.Rank=Szint -JSON.DescriptionHeader=Le\u00EDr\u00E1s -JSON.JWrapper.Header=R\u00E9szletek -JSON.Type.Passive=Passz\u00EDv -JSON.Type.Active=Akt\u00EDv -JSON.Type.SuperAbility=Szuper K\u00E9pess\u00E9g -JSON.Locked=-=[LEZ\u00C1RVA]=- -JSON.LevelRequirement=Sz\u00FCks\u00E9ges Szint -JSON.JWrapper.Target.Type=C\u00E9l T\u00EDpus: +JSON.DescriptionHeader=Leírás +JSON.JWrapper.Header=Részletek +JSON.Type.Passive=Passzív +JSON.Type.Active=Aktív +JSON.Type.SuperAbility=Szuper Képesség +JSON.Locked=-=[LEZÁRVA]=- +JSON.LevelRequirement=Szükséges Szint +JSON.JWrapper.Target.Type=Cél Típus: JSON.JWrapper.Target.Block=Blokk -JSON.JWrapper.Target.Player=J\u00E1t\u00E9kos -JSON.JWrapper.Perks.Header=[[GOLD]]Szerencse Perk-kek -JSON.JWrapper.Perks.Lucky={0}% Jobb Es\u00E9ly +JSON.JWrapper.Target.Player=Játékos +JSON.JWrapper.Perks.Header=&6Szerencse Perk-kek +JSON.JWrapper.Perks.Lucky={0}% Jobb Esély JSON.Hover.Tips=Tippek JSON.Acrobatics=Akrobatika -JSON.Alchemy=Alk\u00EDmia -JSON.Archery=\u00CDj\u00E1szat -JSON.Axes=Balt\u00E1szat -JSON.Excavation=\u00C1s\u00E1s -JSON.Fishing=Horg\u00E1szat -JSON.Herbalism=N\u00F6v\u00E9nytan -JSON.Mining=B\u00E1ny\u00E1szat -JSON.Repair=Jav\u00EDt\u00E1s -JSON.Salvage=\u00DAjrahasznos\u00EDt\u00E1s +JSON.Alchemy=Alkímia +JSON.Archery=Íjászat +JSON.Axes=Baltászat +JSON.Excavation=Ásás +JSON.Fishing=Horgászat +JSON.Herbalism=Növénytan +JSON.Mining=Bányászat +JSON.Repair=Javítás +JSON.Salvage=Újrahasznosítás JSON.Swords=Kardok -JSON.Taming=Szel\u00EDd\u00EDt\u00E9s +JSON.Taming=Szelídítés JSON.Unarmed=Pusztakezek -JSON.Woodcutting=Fav\u00E1g\u00E1s +JSON.Woodcutting=Favágás JSON.URL.Website=A hivatalos mcMMO weboldal! JSON.URL.Discord=A hivatalos mcMMO Discord szerver! -JSON.URL.Patreon=T\u00E1mogat\u00E1s nossr50-nak a munk\u00E1j\u00E1\u00E9rt \u00E9s az mcMMO-nak a Patreon-on! -JSON.URL.Spigot=A hivatalos mcMMO Spigot Forr\u00E1s Oldal! -JSON.URL.Translation=Ford\u00EDtsd le az mcMMO-t m\u00E1s nyelvekre! +JSON.URL.Patreon=Támogatás nossr50-nak a munkájáért és az mcMMO-nak a Patreon-on! +JSON.URL.Spigot=A hivatalos mcMMO Spigot Forrás Oldal! +JSON.URL.Translation=Fordítsd le az mcMMO-t más nyelvekre! JSON.URL.Wiki=A hivatalos mcMMO wiki! -JSON.SkillUnlockMessage=[[GOLD]][ mcMMO[[YELLOW]] @[[DARK_AQUA]]{0} [[GOLD]]Szint [[DARK_AQUA]]{1}[[GOLD]] Feloldva! ] +JSON.SkillUnlockMessage=&6[ mcMMO&e @&3{0} &6Szint &3{1}&6 Feloldva! ] JSON.Hover.Rank=&e&lSzint:&r &f{0} -JSON.Hover.NextRank=&7&oK\u00F6vetkez\u0151 fejleszt\u00E9s a(z) {0} szinten +JSON.Hover.NextRank=&7&oKövetkező fejlesztés a(z) {0} szinten # for JSON.Hover.Mystery you can add {0} to insert the level required into the name, I don't like how that looks so I'm not doing that atm -JSON.Hover.Mystery=[[GRAY]]??? -JSON.Hover.Mystery2=[[YELLOW]][[[DARK_GRAY]]{0}[[YELLOW]]][[DARK_GRAY]]???&r -JSON.Hover.SkillName=[[DARK_AQUA]]{0}&r -JSON.Hover.SuperAbility=[[DARK_PURPLE]]{0}&r -JSON.Hover.MaxRankSkillName=[[GOLD]]{0}&r -JSON.Hover.AtSymbolSkills=[[YELLOW]]@ -JSON.Hover.AtSymbolURL=[[YELLOW]]@ +JSON.Hover.Mystery=&7??? +JSON.Hover.Mystery2=&e[&8{0}&e]&8???&r +JSON.Hover.SkillName=&3{0}&r +JSON.Hover.SuperAbility=&5{0}&r +JSON.Hover.MaxRankSkillName=&6{0}&r +JSON.Hover.AtSymbolSkills=&e@ +JSON.Hover.AtSymbolURL=&e@ #This is the message sent to players when an ability is activated JSON.Notification.SuperAbility={0} #These are the JSON Strings used for SubSkills -JSON.Acrobatics.Roll.Interaction.Activated=Teszt [[RED]]Gurul\u00E1s Teszt -JSON.Acrobatics.SubSkill.Roll.Details.Tips=Ha guggolsz es\u00E9s k\u00F6zben megakad\u00E1lyozhatod, hogy k\u00E9tszer annyi k\u00E1rt szenvedj, amit \u00E1ltal\u00E1ban! -Anvil.SingleItemStack=[[RED]]Nem lehet \u00FAjrahasznos\u00EDtani, vagy jav\u00EDtani \u00F6sszerakott t\u00E1rgyakat, el\u0151sz\u00F6r szed sz\u00E9t az \u00F6sszerakott t\u00E1rgyakat. +JSON.Acrobatics.Roll.Interaction.Activated=Teszt &cGurulás Teszt +JSON.Acrobatics.SubSkill.Roll.Details.Tips=Ha guggolsz esés közben megakadályozhatod, hogy kétszer annyi kárt szenvedj, amit általában! +Anvil.SingleItemStack=&cNem lehet újrahasznosítani, vagy javítani összerakott tárgyakat, először szed szét az összerakott tárgyakat. #DO NOT USE COLOR CODES IN THE JSON KEYS #COLORS ARE DEFINED IN advanced.yml IF YOU WISH TO CHANGE THEM -mcMMO.Template.Prefix=[[GOLD]]([[GREEN]]mcMMO[[GOLD]]) [[GRAY]]{0} +mcMMO.Template.Prefix=&6(&amcMMO&6) &7{0} # BEGIN STYLING -Ability.Generic.Refresh=[[GREEN]]**K\u00C9PESS\u00C9GEK FRISS\u00CDTVE!** -Ability.Generic.Template.Lock=[[GRAY]]{0} +Ability.Generic.Refresh=&a**KÉPESSÉGEK FRISSÍTVE!** +Ability.Generic.Template.Lock=&7{0} # Skill Command Styling -Ability.Generic.Template=[[DARK_AQUA]]{0}: [[GREEN]]{1} -Ability.Generic.Template.Custom=[[DARK_AQUA]]{0} -Skills.Overhaul.Header=[[RED]][]=====[][[GREEN]] {0} [[RED]][]=====[] +Ability.Generic.Template=&3{0}: &a{1} +Ability.Generic.Template.Custom=&3{0} +Skills.Overhaul.Header=&c[]=====[]&a {0} &c[]=====[] Effects.Effects=EFFEKTEK -Effects.SubSkills.Overhaul=Al-K\u00E9pess\u00E9gek -Effects.Child.Overhaul=[[DARK_AQUA]]Al Szint[[YELLOW]] {0}[[DARK_AQUA]]: {1} -Effects.Child.ParentList=[[GREEN]]{0}[[GOLD]]([[DARK_AQUA]]Szint[[YELLOW]]{1}[[GOLD]]) -Effects.Level.Overhaul=[[GOLD]]SZINT: [[YELLOW]]{0} [[DARK_AQUA]]XP[[YELLOW]]([[GOLD]]{1}[[YELLOW]]/[[GOLD]]{2}[[YELLOW]]) -Effects.Parent=[[GOLD]]{0} - -Effects.Template=[[DARK_AQUA]]{0}: [[GREEN]]{1} -Commands.Stats.Self.Overhaul=Statisztik\u00E1k -Commands.XPGain.Overhaul=[[GOLD]]XP NYERES\u00C9G: [[DARK_AQUA]]{0} -MOTD.Version.Overhaul=[[GOLD]][mcMMO] [[DARK_AQUA]]Fel\u00FAj\u00EDt\u00E1s Kora[[GOLD]] - [[DARK_AQUA]]{0} -Overhaul.mcMMO.Header=[[RED]][]=====[][[GREEN]] mcMMO - Fel\u00FAj\u00EDt\u00E1s Kora [[RED]][]=====[] -Overhaul.mcMMO.Url.Wrap.Prefix=[[RED]][| -Overhaul.mcMMO.Url.Wrap.Suffix=[[RED]]|] -Overhaul.mcMMO.MmoInfo.Wiki=[[YELLOW]][[[WHITE]]N\u00E9zd meg a k\u00E9pess\u00E9get a wiki oldalon![[YELLOW]]] +Effects.SubSkills.Overhaul=Al-Képességek +Effects.Child.Overhaul=&3Al Szint&e {0}&3: {1} +Effects.Child.ParentList=&a{0}&6(&3Szint&e{1}&6) +Effects.Level.Overhaul=&6SZINT: &e{0} &3XP&e(&6{1}&e/&6{2}&e) +Effects.Parent=&6{0} - +Effects.Template=&3{0}: &a{1} +Commands.Stats.Self.Overhaul=Statisztikák +Commands.XPGain.Overhaul=&6XP NYERESÉG: &3{0} +MOTD.Version.Overhaul=&6[mcMMO] &3Felújítás Kora&6 - &3{0} +Overhaul.mcMMO.Header=&c[]=====[]&a mcMMO - Felújítás Kora &c[]=====[] +Overhaul.mcMMO.Url.Wrap.Prefix=&c[| +Overhaul.mcMMO.Url.Wrap.Suffix=&c|] +Overhaul.mcMMO.MmoInfo.Wiki=&e[&fNézd meg a képességet a wiki oldalon!&e] # Overhaul.Levelup can take {0} - Skill Name defined in Overhaul.Name {1} - Amount of levels gained {2} - Level in skill -Overhaul.Levelup=[[BOLD]]{0} szint n\u00F6vekedett [[RESET]][[GREEN]][[BOLD]]{2}[[RESET]][[WHITE]]. +Overhaul.Levelup=&l{0} szint növekedett &r&a&l{2}&r&f. Overhaul.Name.Acrobatics=Akrobatika -Overhaul.Name.Alchemy=Alk\u00EDmia -Overhaul.Name.Archery=\u00CDj\u00E1szat -Overhaul.Name.Axes=Balt\u00E1szat -Overhaul.Name.Excavation=\u00C1s\u00E1s -Overhaul.Name.Fishing=Horg\u00E1szat -Overhaul.Name.Herbalism=N\u00F6v\u00E9nytan -Overhaul.Name.Mining=B\u00E1ny\u00E1szat -Overhaul.Name.Repair=Jav\u00EDt\u00E1s -Overhaul.Name.Salvage=\u00DAjrahasznos\u00EDt\u00E1s -Overhaul.Name.Smelting=Olvaszt\u00E1s +Overhaul.Name.Alchemy=Alkímia +Overhaul.Name.Archery=Íjászat +Overhaul.Name.Axes=Baltászat +Overhaul.Name.Excavation=Ásás +Overhaul.Name.Fishing=Horgászat +Overhaul.Name.Herbalism=Növénytan +Overhaul.Name.Mining=Bányászat +Overhaul.Name.Repair=Javítás +Overhaul.Name.Salvage=Újrahasznosítás +Overhaul.Name.Smelting=Olvasztás Overhaul.Name.Swords=Kardok -Overhaul.Name.Taming=Szel\u00EDd\u00EDt\u00E9s +Overhaul.Name.Taming=Szelídítés Overhaul.Name.Unarmed=Pusztakezek -Overhaul.Name.Woodcutting=Fav\u00E1g\u00E1s +Overhaul.Name.Woodcutting=Favágás # /mcMMO Command Style Stuff -Commands.mcc.Header=[[RED]]---[][[GREEN]]mcMMO Parancsok[[RED]][]--- -Commands.Other=[[RED]]---[][[GREEN]]SPECI\u00C1LIS PARANCSOK[[RED]][]--- -Commands.Party.Header=[[RED]]-----[][[GREEN]]PARTY[[RED]][]----- -Commands.Party.Features.Header=[[RED]]-----[][[GREEN]]FUNKCI\u00D3K[[RED]][]----- +Commands.mcc.Header=&c---[]&amcMMO Parancsok&c[]--- +Commands.Other=&c---[]&aSPECIÁLIS PARANCSOK&c[]--- +Commands.Party.Header=&c-----[]&aPARTY&c[]----- +Commands.Party.Features.Header=&c-----[]&aFUNKCIÓK&c[]----- # XP BAR Allows for the following variables -- {0} = Skill Level, {1} Current XP, {2} XP Needed for next level, {3} Power Level, {4} Percentage of Level # Make sure you turn on Experience_Bars.ThisMayCauseLag.AlwaysUpdateTitlesWhenXPIsGained if you want the XP bar title to update every time a player gains XP! XPBar.Template={0} -XPBar.Template.EarlyGameBoost=[[GOLD]]Egy \u00FAj k\u00E9pess\u00E9g tanul\u00E1sa... -XPBar.Acrobatics=Akrobatika [[GOLD]]{0}. [[WHITE]]Szint -XPBar.Alchemy=Alk\u00EDmia [[GOLD]]{0}. [[WHITE]]Szint -XPBar.Archery=\u00CDj\u00E1szat [[GOLD]]{0}. [[WHITE]]Szint -XPBar.Axes=Balt\u00E1szat [[GOLD]]{0}. [[WHITE]]Szint -XPBar.Excavation=\u00C1s\u00E1s [[GOLD]]{0}. [[WHITE]]Szint -XPBar.Fishing=Horg\u00E1szat [[GOLD]]{0}. [[WHITE]]Szint -XPBar.Herbalism=N\u00F6v\u00E9nytan [[GOLD]]{0}. [[WHITE]]Szint -XPBar.Mining=B\u00E1ny\u00E1szat [[GOLD]]{0}. [[WHITE]]Szint -XPBar.Repair=Jav\u00EDt\u00E1s [[GOLD]]{0}. [[WHITE]]Szint -XPBar.Salvage=\u00DAjrahasznos\u00EDt\u00E1s [[GOLD]]{0}. [[WHITE]]Szint -XPBar.Smelting=Olvaszt\u00E1s [[GOLD]]{0}. [[WHITE]]Szint -XPBar.Swords=Kardok [[GOLD]]{0}. [[WHITE]]Szint -XPBar.Taming=Szel\u00EDd\u00EDt\u00E9s [[GOLD]]{0}. [[WHITE]]Szint -XPBar.Unarmed=Pusztakezek [[GOLD]]{0}. [[WHITE]]Szint -XPBar.Woodcutting=Fav\u00E1g\u00E1s [[GOLD]]{0}. [[WHITE]]Szint +XPBar.Template.EarlyGameBoost=&6Egy új képesség tanulása... +XPBar.Acrobatics=Akrobatika &6{0}. &fSzint +XPBar.Alchemy=Alkímia &6{0}. &fSzint +XPBar.Archery=Íjászat &6{0}. &fSzint +XPBar.Axes=Baltászat &6{0}. &fSzint +XPBar.Excavation=Ásás &6{0}. &fSzint +XPBar.Fishing=Horgászat &6{0}. &fSzint +XPBar.Herbalism=Növénytan &6{0}. &fSzint +XPBar.Mining=Bányászat &6{0}. &fSzint +XPBar.Repair=Javítás &6{0}. &fSzint +XPBar.Salvage=Újrahasznosítás &6{0}. &fSzint +XPBar.Smelting=Olvasztás &6{0}. &fSzint +XPBar.Swords=Kardok &6{0}. &fSzint +XPBar.Taming=Szelídítés &6{0}. &fSzint +XPBar.Unarmed=Pusztakezek &6{0}. &fSzint +XPBar.Woodcutting=Favágás &6{0}. &fSzint #This is just a preset template that gets used if the 'ExtraDetails' setting is turned on in experience.yml (off by default), you can ignore this template and just edit the strings above -XPBar.Complex.Template={0} [[DARK_AQUA]] {4}[[WHITE]]% [[DARK_AQUA]]([[WHITE]]{1}[[DARK_AQUA]]/[[WHITE]]{2}[[DARK_AQUA]]) +XPBar.Complex.Template={0} &3 {4}&f% &3(&f{1}&3/&f{2}&3) # XP BAR Allows for the following variables -- {0} = Skill Level, {1} Current XP, {2} XP Needed for next level, {3} Power Level, {4} Percentage of Level # Make sure you turn on Experience_Bars.ThisMayCauseLag.AlwaysUpdateTitlesWhenXPIsGained if you want the XP bar title to update every time a player gains XP! # END STYLING #ACROBATICS -Acrobatics.Ability.Proc=[[GREEN]]**Kecses Landol\u00E1s** -Acrobatics.Combat.Proc=[[GREEN]]**Kit\u00E9r\u00EDtve** -Acrobatics.SubSkill.Roll.Stats=[[GOLD]]Es\u00E9ly Gurul\u00E1sra [[YELLOW]]{0}%[[GOLD]] Es\u00E9ly Kecses Gurul\u00E1sra[[YELLOW]] {1}% -Acrobatics.SubSkill.Roll.Stat=Es\u00E9ly Gurul\u00E1sra -Acrobatics.SubSkill.Roll.Stat.Extra=Es\u00E9ly Kecses Gurul\u00E1sra -Acrobatics.SubSkill.Roll.Name=Gurul\u00E1s -Acrobatics.SubSkill.Roll.Description=Es\u00E9s strat\u00E9gi\u00E1val cs\u00F6kkenti a sebz\u00E9st. -Acrobatics.SubSkill.Roll.Chance=Es\u00E9ly Gurul\u00E1sra: [[YELLOW]]{0} -Acrobatics.SubSkill.Roll.GraceChance=Es\u00E9ly Kecses Gurul\u00E1sra: [[YELLOW]]{0} -Acrobatics.SubSkill.Roll.Mechanics=[[GRAY]]A Gurul\u00E1s egy akt\u00EDv alk\u00E9pess\u00E9g passz\u00EDv komponenssel\nHa es\u00E9sk\u00E1rosod\u00E1s \u00E9r, akkor lehet\u0151s\u00E9ged van arra, hogy teljesen elutas\u00EDtsd a szakk\u00E9pzetts\u00E9gi szinteden alapul\u00F3 s\u00E9r\u00FCl\u00E9sed, az 50-es szintt\u0151l [[YELLOW]]{0}%[[GRAY]] es\u00E9lyed van a s\u00E9r\u00FCl\u00E9sek megel\u0151z\u00E9s\u00E9re, \u00E9s [[YELLOW]]{1}%[[GRAY]] ha aktiv\u00E1lod a Kecses Gurul\u00E1st.\nA siker es\u00E9lye egy line\u00E1ris g\u00F6rbe, ami a szintedhez igazodik eddig a szintig [[YELLOW]]{2}[[GRAY]], ahol az Akrobatika minden szintje add neked [[YELLOW]]{3}%[[GRAY]] es\u00E9lyt a sikerre.\nA guggol\u00E1s billenty\u0171 megnyom\u00E1s\u00E1val megdupl\u00E1zhatod az es\u00E9lyeid, hogy elker\u00FCld az es\u00E9s s\u00E9r\u00FCl\u00E9st, \u00E9s elker\u00FCld az es\u00E9s s\u00E9r\u00FCl\u00E9s k\u00E9tszeres\u00E9t! A guggol\u00E1s megtart\u00E1sa a norm\u00E1l gurul\u00E1st Kecses Gurul\u00E1ss\u00E1 alak\u00EDtja.\nA Gurul\u00E1s megakad\u00E1lyoz [[RED]]{4}[[GRAY]] s\u00E9r\u00FCl\u00E9st. A Kecses Gurul\u00E1s megakad\u00E1lyoz [[GREEN]]{5}[[GRAY]] s\u00E9r\u00FCl\u00E9st. -Acrobatics.SubSkill.GracefulRoll.Name=Kecses Gurul\u00E1s -Acrobatics.SubSkill.GracefulRoll.Description=K\u00E9tszer olyan effekt\u00EDv, mint egy egyszer\u0171 Gurul\u00E1s -Acrobatics.SubSkill.Dodge.Name=Kit\u00E9r\u00E9s -Acrobatics.SubSkill.Dodge.Stat=Es\u00E9ly Kit\u00E9r\u00E9sre -Acrobatics.SubSkill.Dodge.Description=A fel\u00E9re cs\u00F6kkenti a t\u00E1mad\u00E1si sebz\u00E9st +Acrobatics.Ability.Proc=&a**Kecses Landolás** +Acrobatics.Combat.Proc=&a**Kitérítve** +Acrobatics.SubSkill.Roll.Stats=&6Esély Gurulásra &e{0}%&6 Esély Kecses Gurulásra&e {1}% +Acrobatics.SubSkill.Roll.Stat=Esély Gurulásra +Acrobatics.SubSkill.Roll.Stat.Extra=Esély Kecses Gurulásra +Acrobatics.SubSkill.Roll.Name=Gurulás +Acrobatics.SubSkill.Roll.Description=Esés stratégiával csökkenti a sebzést. +Acrobatics.SubSkill.Roll.Chance=Esély Gurulásra: &e{0} +Acrobatics.SubSkill.Roll.GraceChance=Esély Kecses Gurulásra: &e{0} +Acrobatics.SubSkill.Roll.Mechanics=&7A Gurulás egy aktív alképesség passzív komponenssel\nHa eséskárosodás ér, akkor lehetőséged van arra, hogy teljesen elutasítsd a szakképzettségi szinteden alapuló sérülésed, az &e{6}%&7. szinttől &e{0}%&7 esélyed van a sérülések megelőzésére, és &e{1}%&7 ha aktiválod a Kecses Gurulást.\nA siker esélye egy lineáris görbe, ami a szintedhez igazodik eddig a szintig &e{2}&7, ahol az Akrobatika minden szintje add neked &e{3}%&7 esélyt a sikerre.\nA guggolás billentyű megnyomásával megduplázhatod az esélyeid, hogy elkerüld az esés sérülést, és elkerüld az esés sérülés kétszeresét! A guggolás megtartása a normál gurulást Kecses Gurulássá alakítja.\nA Gurulás megakadályoz &c{4}&7 sérülést. A Kecses Gurulás megakadályoz &a{5}&7 sérülést. +Acrobatics.SubSkill.GracefulRoll.Name=Kecses Gurulás +Acrobatics.SubSkill.GracefulRoll.Description=Kétszer olyan effektív, mint egy egyszerű Gurulás +Acrobatics.SubSkill.Dodge.Name=Kitérés +Acrobatics.SubSkill.Dodge.Stat=Esély Kitérésre +Acrobatics.SubSkill.Dodge.Description=A felére csökkenti a támadási sebzést Acrobatics.Listener=Akrobatika: -Acrobatics.Roll.Text=[[ITALIC]]**Gurulva** +Acrobatics.Roll.Text=&o**Gurulva** Acrobatics.SkillName=AKROBATIKA #ALCHEMY -Alchemy.SubSkill.Catalysis.Name=Katal\u00EDzis -Alchemy.SubSkill.Catalysis.Description=N\u00F6veli a b\u00E1jitalok f\u0151z\u00E9si sebess\u00E9g\u00E9t -Alchemy.SubSkill.Catalysis.Stat=F\u0151z\u00E9si Sebess\u00E9g -Alchemy.SubSkill.Concoctions.Name=F\u0151zetek -Alchemy.SubSkill.Concoctions.Description=B\u00E1jitalok f\u0151z\u00E9se t\u00F6bb hozz\u00E1val\u00F3val -Alchemy.SubSkill.Concoctions.Stat=F\u0151zet Szint: [[GREEN]]{0}[[DARK_AQUA]]/[[GREEN]]{1} -Alchemy.SubSkill.Concoctions.Stat.Extra=Hozz\u00E1val\u00F3k [[[GREEN]]{0}[[DARK_AQUA]]]: [[GREEN]]{1} -Alchemy.Listener=Alk\u00EDmia: -Alchemy.Ability.Locked.0=LEZ\u00C1RVA {0}+ K\u00C9PESS\u00C9G SZINTIG (KATAL\u00CDZIS) -Alchemy.SkillName=ALK\u00CDMIA +Alchemy.SubSkill.Catalysis.Name=Katalízis +Alchemy.SubSkill.Catalysis.Description=Növeli a bájitalok főzési sebességét +Alchemy.SubSkill.Catalysis.Stat=Főzési Sebesség +Alchemy.SubSkill.Concoctions.Name=Főzetek +Alchemy.SubSkill.Concoctions.Description=Bájitalok főzése több hozzávalóval +Alchemy.SubSkill.Concoctions.Stat=Főzet Szint: &a{0}&3/&a{1} +Alchemy.SubSkill.Concoctions.Stat.Extra=Hozzávalók [&a{0}&3]: &a{1} +Alchemy.Listener=Alkímia: +Alchemy.Ability.Locked.0=LEZÁRVA {0}+ KÉPESSÉG SZINTIG (KATALÍZIS) +Alchemy.SkillName=ALKÍMIA #ARCHERY -Archery.SubSkill.SkillShot.Name=L\u00F6v\u00E9s K\u00E9pess\u00E9g -Archery.SubSkill.SkillShot.Description=N\u00F6veli az \u00EDjakkal okozott sebz\u00E9st -Archery.SubSkill.SkillShot.Stat=K\u00E9pess\u00E9gi L\u00F6v\u00E9s B\u00F3nusz Sebz\u00E9s -Archery.SubSkill.Daze.Name=K\u00E1b\u00EDt\u00E1s -Archery.SubSkill.Daze.Stat=Es\u00E9ly K\u00E1b\u00EDt\u00E1sra -Archery.SubSkill.Daze.Description=\u00D6sszezavarja az ellenfeleket \u00E9s extra sebz\u00E9st okoz -Archery.SubSkill.ArrowRetrieval.Name=Nyilak Visszaszerz\u00E9se -Archery.SubSkill.ArrowRetrieval.Description=Es\u00E9ly a nyilak visszaszerz\u00E9sre a hull\u00E1kb\u00F3l -Archery.SubSkill.ArrowRetrieval.Stat=Ny\u00EDl helyre\u00E1ll\u00EDt\u00E1si es\u00E9ly -Archery.SubSkill.ArcheryLimitBreak.Name=\u00CDj\u00E1szat Korl\u00E1t \u00C1tl\u00E9p\u00E9s -Archery.SubSkill.ArcheryLimitBreak.Description=L\u00E9pj t\u00FAl a korl\u00E1taidon. Megn\u00F6vekedett sebz\u00E9s a kem\u00E9ny ellenfelek ellen. A PVP-hez tervezt\u00E9k att\u00F3l f\u00FCggetlen\u00FCl, hogy a szerver be\u00E1ll\u00EDt\u00E1si n\u00F6velik-e, vagy sem a PVE sebz\u00E9st. -Archery.SubSkill.ArcheryLimitBreak.Stat=Max Sebz\u00E9s Korl\u00E1t \u00C1tl\u00E9p\u00E9ssel -Archery.Listener=\u00CDj\u00E1szat: -Archery.SkillName=\u00CDJ\u00C1SZAT +Archery.SubSkill.SkillShot.Name=Lövés Képesség +Archery.SubSkill.SkillShot.Description=Növeli az íjakkal okozott sebzést +Archery.SubSkill.SkillShot.Stat=Képességi Lövés Bónusz Sebzés +Archery.SubSkill.Daze.Name=Kábítás +Archery.SubSkill.Daze.Description=Összezavarja az ellenfeleket és extra sebzést okoz +Archery.SubSkill.Daze.Stat=Esély Kábításra +Archery.SubSkill.ArrowRetrieval.Name=Nyilak Visszaszerzése +Archery.SubSkill.ArrowRetrieval.Description=Esély a nyilak visszaszerzésre a hullákból +Archery.SubSkill.ArrowRetrieval.Stat=Nyíl helyreállítási esély +Archery.SubSkill.ArcheryLimitBreak.Name=Íjászat Korlát Átlépés +Archery.SubSkill.ArcheryLimitBreak.Description=Lépj túl a korlátaidon. Megnövekedett sebzés a kemény ellenfelek ellen. A PVP-hez tervezték attól függetlenül, hogy a szerver beállítási növelik-e, vagy sem a PVE sebzést. +Archery.SubSkill.ArcheryLimitBreak.Stat=Max Sebzés Korlát Átlépéssel +Archery.Listener=Íjászat: +Archery.SkillName=ÍJÁSZAT #AXES -Axes.Ability.Bonus.0=Balta Mesters\u00E9g -Axes.Ability.Bonus.1={0} B\u00F3nusz sebz\u00E9s -Axes.Ability.Bonus.2=P\u00E1nc\u00E9l \u00DCt\u00E9s -Axes.Ability.Bonus.3={0} B\u00F3nusz sebz\u00E9s p\u00E1nc\u00E9l ellen -Axes.Ability.Bonus.4=Er\u0151s \u00DCt\u00E9s -Axes.Ability.Bonus.5={0} B\u00F3nusz sebz\u00E9s felfegyverzetlen ellenfelek ellen -Axes.Ability.Lower=[[GRAY]]Leengeded a balt\u00E1d -Axes.Ability.Ready=[[GOLD]]Felemeled[[DARK_AQUA]] a balt\u00E1d -Axes.Combat.CritStruck=[[DARK_RED]]KRITIKUS sebz\u00E9st kapt\u00E1l! -Axes.Combat.CriticalHit=KRITIKUS SEBZ\u00C9S! -Axes.Combat.GI.Proc=[[GREEN]]**ER\u0150S \u00DCT\u00C9SSEL CSAPT\u00C1L** -Axes.Combat.GI.Struck=**ER\u0150S \u00DCT\u00C9SSEL CSAPTAK MEG** -Axes.Combat.SS.Struck=[[DARK_RED]]KOPONYA T\u00D6R\u00C9SSEL csaptak le r\u00E1d! -Axes.SubSkill.SkullSplitter.Name=Koponya T\u00F6r\u00E9s -Axes.SubSkill.SkullSplitter.Description=Ter\u00FCleti Sebz\u00E9st Okoz -Axes.SubSkill.SkullSplitter.Stat=Koponya T\u00F6r\u00E9s Hossza -Axes.SubSkill.CriticalStrikes.Name=Kritikus Csap\u00E1s -Axes.SubSkill.CriticalStrikes.Description=Dupla Sebz\u00E9s -Axes.SubSkill.CriticalStrikes.Stat=Es\u00E9ly Kritikus Csap\u00E1sra -Axes.SubSkill.AxeMastery.Name=Balta Mesters\u00E9g -Axes.SubSkill.AxeMastery.Description=B\u00F3nusz sebz\u00E9st ad -Axes.SubSkill.AxesLimitBreak.Name=Balt\u00E1szat Korl\u00E1t \u00C1tl\u00E9p\u00E9s -Axes.SubSkill.AxesLimitBreak.Description=L\u00E9pj t\u00FAl a korl\u00E1taidon. Megn\u00F6vekedett sebz\u00E9s a kem\u00E9ny ellenfelek ellen. A PVP-hez tervezt\u00E9k att\u00F3l f\u00FCggetlen\u00FCl, hogy a szerver be\u00E1ll\u00EDt\u00E1si n\u00F6velik-e, vagy sem a PVE sebz\u00E9st. -Axes.SubSkill.AxesLimitBreak.Stat=Max Sebz\u00E9s Korl\u00E1t \u00C1tl\u00E9p\u00E9ssel -Axes.SubSkill.ArmorImpact.Name=P\u00E1nc\u00E9l \u00DCt\u00E9s -Axes.SubSkill.ArmorImpact.Description=El\u00E9g er\u0151vel csap le ahhoz, hogy p\u00E1nc\u00E9lt t\u00F6rj\u00F6n -Axes.SubSkill.GreaterImpact.Name=Er\u0151s \u00DCt\u00E9s -Axes.SubSkill.GreaterImpact.Description=B\u00F3nusz sebz\u00E9st okoz felfegyverzetlen ellenfelek ellen -Axes.Listener=Balt\u00E1szat: -Axes.SkillName=BALT\u00C1SZAT -Axes.Skills.SS.Off=**Koponya T\u00F6r\u00E9s v\u00E9get \u00E9rt** -Axes.Skills.SS.On=[[GREEN]]**Koponya T\u00F6r\u00E9s AKTIV\u00C1LVA** -Axes.Skills.SS.Refresh=[[GREEN]]A [[YELLOW]]Koponya T\u00F6r\u00E9s [[GREEN]]k\u00E9pess\u00E9ged ism\u00E9t el\u00E9rhet\u0151! -Axes.Skills.SS.Other.Off=Koponya T\u00F6r\u00E9s[[GREEN]] kikapcsolva: [[YELLOW]]{0} -Axes.Skills.SS.Other.On=[[GREEN]]{0}[[DARK_GREEN]] haszn\u00E1lta a [[RED]]Koponya T\u00F6r\u00E9s [[DARK_GREEN]]k\u00E9pess\u00E9get! +Axes.Ability.Bonus.0=Balta Mesterség +Axes.Ability.Bonus.1={0} Bónusz sebzés +Axes.Ability.Bonus.2=Páncél Ütés +Axes.Ability.Bonus.3={0} Bónusz sebzés páncél ellen +Axes.Ability.Bonus.4=Erős Ütés +Axes.Ability.Bonus.5={0} Bónusz sebzés felfegyverzetlen ellenfelek ellen +Axes.Ability.Lower=&7Leengeded a baltád. +Axes.Ability.Ready=&6Felemeled&3 a baltád. +Axes.Ability.Ready.Extra=&6Felemeled&3 a baltád. [[GRAY]]({0} a várakozási idő ehhez {1}s) +Axes.Combat.CritStruck=&4KRITIKUS sebzést kaptál! +Axes.Combat.CriticalHit=KRITIKUS SEBZÉS! +Axes.Combat.GI.Proc=&a**ERŐS ÜTÉSSEL CSAPTÁL** +Axes.Combat.GI.Struck=**ERŐS ÜTÉSSEL CSAPTAK MEG** +Axes.Combat.SS.Struck=&4KOPONYA TÖRÉSSEL csaptak le rád! +Axes.SubSkill.SkullSplitter.Name=Koponya Törés +Axes.SubSkill.SkullSplitter.Description=Területi Sebzést Okoz +Axes.SubSkill.SkullSplitter.Stat=Koponya Törés Hossza +Axes.SubSkill.CriticalStrikes.Name=Kritikus Csapás +Axes.SubSkill.CriticalStrikes.Description=Dupla Sebzés +Axes.SubSkill.CriticalStrikes.Stat=Esély Kritikus Csapásra +Axes.SubSkill.AxeMastery.Name=Balta Mesterség +Axes.SubSkill.AxeMastery.Description=Bónusz sebzést ad +Axes.SubSkill.AxesLimitBreak.Name=Baltászat Korlát Átlépés +Axes.SubSkill.AxesLimitBreak.Description=Lépj túl a korlátaidon. Megnövekedett sebzés a kemény ellenfelek ellen. A PVP-hez tervezték attól függetlenül, hogy a szerver beállítási növelik-e, vagy sem a PVE sebzést. +Axes.SubSkill.AxesLimitBreak.Stat=Max Sebzés Korlát Átlépéssel +Axes.SubSkill.ArmorImpact.Name=Páncél Ütés +Axes.SubSkill.ArmorImpact.Description=Elég erővel csap le ahhoz, hogy páncélt törjön +Axes.SubSkill.GreaterImpact.Name=Erős Ütés +Axes.SubSkill.GreaterImpact.Description=Bónusz sebzést okoz felfegyverzetlen ellenfelek ellen +Axes.Listener=Baltászat: +Axes.SkillName=BALTÁSZAT +Axes.Skills.SS.Off=**Koponya Törés véget ért** +Axes.Skills.SS.On=&a**Koponya Törés AKTIVÁLVA** +Axes.Skills.SS.Refresh=&aA &eKoponya Törés &aképességed ismét elérhető! +Axes.Skills.SS.Other.Off=Koponya Törés&a kikapcsolva: &e{0} +Axes.Skills.SS.Other.On=&a{0}&2 használta a &cKoponya Törés &2képességet! #EXCAVATION -Excavation.Ability.Lower=[[GRAY]]Leengeded az \u00E1s\u00F3d. -Excavation.Ability.Ready=[[GOLD]]El\u0151k\u00E9sz\u00EDted[[DARK_AQUA]] az \u00E1s\u00F3d. -Excavation.SubSkill.GigaDrillBreaker.Name=Giga F\u00FAr\u00F3-T\u00F6r\u0151 -Excavation.SubSkill.GigaDrillBreaker.Description=3x T\u00E1rgy Es\u00E9si Es\u00E9ly, 3x XP, +Sebess\u00E9g -Excavation.SubSkill.GigaDrillBreaker.Stat=Giga F\u00FAr\u00F3-T\u00F6r\u0151 Id\u0151tartam -Excavation.SubSkill.Archaeology.Name=R\u00E9g\u00E9szet -Excavation.SubSkill.Archaeology.Description=Fedezd fel a f\u00F6ld titkait! A magas k\u00E9pess\u00E9g szint n\u00F6veli az es\u00E9ly\u00E9t, hogy tapasztalatpontot tal\u00E1lj, amikor kincset tal\u00E1lsz! -Excavation.SubSkill.Archaeology.Stat=R\u00E9g\u00E9szet Tapasztalatpont Es\u00E9ly -Excavation.SubSkill.Archaeology.Stat.Extra=R\u00E9g\u00E9szet Tapasztalatpont Mennyis\u00E9g -Excavation.Listener=\u00C1s\u00E1s: -Excavation.SkillName=\u00C1S\u00C1S -Excavation.Skills.GigaDrillBreaker.Off=*Giga F\u00FAr\u00F3-T\u00F6r\u0151 v\u00E9get \u00E9rt** -Excavation.Skills.GigaDrillBreaker.On=[[GREEN]]**GIGA F\u00DAR\u00D3-T\u00D6R\u0150 AKTIV\u00C1LVA** -Excavation.Skills.GigaDrillBreaker.Refresh=[[GREEN]]A [[YELLOW]]Giga F\u00FAr\u00F3-T\u00F6r\u0151 [[GREEN]]k\u00E9pess\u00E9ged ism\u00E9t el\u00E9rhet\u0151! -Excavation.Skills.GigaDrillBreaker.Other.Off=Giga F\u00FAr\u00F3-T\u00F6r\u0151[[GREEN]] kikapcsolva: [[YELLOW]]{0} -Excavation.Skills.GigaDrillBreaker.Other.On=[[GREEN]]{0}[[DARK_GREEN]] haszn\u00E1lta a [[RED]]Giga F\u00FAr\u00F3-T\u00F6r\u0151 [[DARK_GREEN]]k\u00E9pess\u00E9get! +Excavation.Ability.Lower=&7Leengeded az ásód. +Excavation.Ability.Ready=&6Előkészíted&3 az ásód. +Excavation.SubSkill.GigaDrillBreaker.Name=Giga Fúró-Törő +Excavation.SubSkill.GigaDrillBreaker.Description=3x Tárgy Esési Esély, 3x XP, +Sebesség +Excavation.SubSkill.GigaDrillBreaker.Stat=Giga Fúró-Törő Időtartam +Excavation.SubSkill.Archaeology.Name=Régészet +Excavation.SubSkill.Archaeology.Description=Fedezd fel a föld titkait! A magas képesség szint növeli az esélyét, hogy tapasztalatpontot találj, amikor kincset találsz! +Excavation.SubSkill.Archaeology.Stat=Régészet Tapasztalatpont Esély +Excavation.SubSkill.Archaeology.Stat.Extra=Régészet Tapasztalatpont Mennyiség +Excavation.Listener=Ásás: +Excavation.SkillName=ÁSÁS +Excavation.Skills.GigaDrillBreaker.Off=**Giga Fúró-Törő véget ért** +Excavation.Skills.GigaDrillBreaker.On=&a**GIGA FÚRÓ-TÖRŐ AKTIVÁLVA** +Excavation.Skills.GigaDrillBreaker.Refresh=&aA &eGiga Fúró-Törő &aképességed ismét elérhető! +Excavation.Skills.GigaDrillBreaker.Other.Off=Giga Fúró-Törő&a kikapcsolva: &e{0} +Excavation.Skills.GigaDrillBreaker.Other.On=&a{0}&2 használta a &cGiga Fúró-Törő &2képességet! #FISHING -Fishing.ScarcityTip=[[YELLOW]]&oEz a ter\u00FClet t\u00FAlhal\u00E1szott. Horg\u00E1ssz egy m\u00E1sik helyen, ha t\u00F6bb halat szeretn\u00E9l. Legal\u00E1bb {0} blokknyira. -Fishing.Scared=[[GRAY]]&oA Zavaros mozg\u00E1sok megijesztik a halakat! -Fishing.Exhausting=[[RED]]&oA horg\u00E1szbot helytelen haszn\u00E1lata f\u00E1radts\u00E1got okoz, \u00E9s elhaszn\u00E1l\u00F3dik a r\u00FAd! -Fishing.LowResourcesTip=[[GRAY]]\u00DAgy \u00E9rzem nem sok hal maradt ezen a ter\u00FCleten. Pr\u00F3b\u00E1lj meg horg\u00E1szni legal\u00E1bb {0} blokknyira. -Fishing.Ability.Info=M\u00E1gikus Vad\u00E1sz: [[GRAY]] **A Kincsvad\u00E1sz Szinttel Egy\u00FCtt Fejl\u0151dik** -Fishing.Ability.Locked.0=LEZ\u00C1RVA {0}+ K\u00C9PESS\u00C9G SZINTIG (R\u00C1Z\u00C1S) -Fishing.Ability.Locked.1=LEZ\u00C1RVA {0}+ K\u00C9PESS\u00C9G SZINTIG (J\u00C9G HORG\u00C1SZAT) -Fishing.Ability.Locked.2=LEZ\u00C1RVA {0}+ K\u00C9PESS\u00C9G SZINTIG (MESTER HORG\u00C1SZ) -Fishing.SubSkill.TreasureHunter.Name=Kincsvad\u00E1sz -Fishing.SubSkill.TreasureHunter.Description=Furcsa t\u00E1rgyak kihal\u00E1sz\u00E1sa -Fishing.SubSkill.TreasureHunter.Stat=Kincsvad\u00E1sz Szint: [[GREEN]]{0}[[DARK_AQUA]]/[[GREEN]]{1} -Fishing.SubSkill.TreasureHunter.Stat.Extra=T\u00E1rgy Es\u00E9si Es\u00E9ly: [[GRAY]]\u00C1tlagos: [[YELLOW]]{0} [[GREEN]]Rendk\u00EDv\u00FCli: [[YELLOW]]{1}\n[[BLUE]]Ritka: [[YELLOW]]{2} [[LIGHT_PURPLE]]Epikus: [[YELLOW]]{3} [[GOLD]]Legend\u00E1s: [[YELLOW]]{4} [[AQUA]]Rekord: [[YELLOW]]{5} -Fishing.SubSkill.MagicHunter.Name=M\u00E1gikus Vad\u00E1sz -Fishing.SubSkill.MagicHunter.Description=Elvar\u00E1zsolt T\u00E1rgyak Megtal\u00E1l\u00E1sa -Fishing.SubSkill.MagicHunter.Stat=Es\u00E9ly M\u00E1gikus Vad\u00E1szra -Fishing.SubSkill.Shake.Name=R\u00E1z\u00E1s -Fishing.SubSkill.Shake.Description=T\u00E1rgy ler\u00E1z\u00E1sa \u00E9l\u0151l\u00E9nyekr\u0151l vagy j\u00E1t\u00E9kosokr\u00F3l egy horg\u00E1szbottal -Fishing.SubSkill.Shake.Stat=Es\u00E9ly R\u00E1z\u00E1sra -Fishing.SubSkill.FishermansDiet.Name=Horg\u00E1szok Di\u00E9t\u00E1ja -Fishing.SubSkill.FishermansDiet.Description=N\u00F6veli a kihal\u00E1szott \u00E9telek t\u00E1p\u00E9rt\u00E9k\u00E9t -Fishing.SubSkill.FishermansDiet.Stat=Horg\u00E1szok Di\u00E9t\u00E1ja:[[GREEN]] Szint {0} -Fishing.SubSkill.MasterAngler.Name=Mester Horg\u00E1sz -Fishing.SubSkill.MasterAngler.Description=N\u00F6veli a Kap\u00E1s es\u00E9ly\u00E9t horg\u00E1szat k\u00F6zben -Fishing.SubSkill.MasterAngler.Stat=Hozz\u00E1adott Nagyobb Harap\u00E1si es\u00E9ly a jelenlegi helyen: [[GREEN]]+{0} -Fishing.SubSkill.IceFishing.Name=J\u00E9g Horg\u00E1szat -Fishing.SubSkill.IceFishing.Description=Lehet\u0151v\u00E9 teszi sz\u00E1modra, hogy fagyos t\u00E1jakon is horg\u00E1szhass -Fishing.SubSkill.IceFishing.Stat=J\u00E9g Horg\u00E1szat -Fishing.Chance.Raining=[[BLUE]] Es\u0151 B\u00F3nusz -Fishing.Listener=Horg\u00E1szat: -Fishing.Ability.TH.MagicFound=[[GRAY]]Valami m\u00E1gikusat \u00E9rzel ezzel a kap\u00E1ssal kapcsolatban... -Fishing.Ability.TH.Boom=[[GRAY]]BUMM!!! -Fishing.Ability.TH.Poison=[[GRAY]]Valami nincs rendben... -Fishing.SkillName=HORG\u00C1SZAT +Fishing.ScarcityTip=&e&oEz a terület túlhalászott. Horgássz egy másik helyen, ha több halat szeretnél. Legalább {0} blokknyira. +Fishing.Scared=&7&oA Zavaros mozgások megijesztik a halakat! +Fishing.Exhausting=&c&oA horgászbot helytelen használata fáradtságot okoz, és elhasználódik a rúd! +Fishing.LowResourcesTip=&7Úgy érzem nem sok hal maradt ezen a területen. Próbálj meg horgászni legalább {0} blokknyira. +Fishing.Ability.Info=Mágikus Vadász: &7 **A Kincsvadász Szinttel Együtt Fejlődik** +Fishing.Ability.Locked.0=LEZÁRVA {0}+ KÉPESSÉG SZINTIG (RÁZÁS) +Fishing.Ability.Locked.1=LEZÁRVA {0}+ KÉPESSÉG SZINTIG (JÉG HORGÁSZAT) +Fishing.Ability.Locked.2=LEZÁRVA {0}+ KÉPESSÉG SZINTIG (MESTER HORGÁSZ) +Fishing.SubSkill.TreasureHunter.Name=Kincsvadász +Fishing.SubSkill.TreasureHunter.Description=Furcsa tárgyak kihalászása +Fishing.SubSkill.TreasureHunter.Stat=Kincsvadász Szint: &a{0}&3/&a{1} +Fishing.SubSkill.TreasureHunter.Stat.Extra=Tárgy Esési Esély: &7Átlagos: &e{0} &aRendkívüli: &e{1}\n&9Ritka: &e{2} &dEpikus: &e{3} &6Legendás: &e{4} &bMítikus: &e{5} +Fishing.SubSkill.MagicHunter.Name=Mágikus Vadász +Fishing.SubSkill.MagicHunter.Description=Elvarázsolt Tárgyak Megtalálása +Fishing.SubSkill.MagicHunter.Stat=Esély Mágikus Vadászra +Fishing.SubSkill.Shake.Name=Rázás +Fishing.SubSkill.Shake.Description=Tárgy lerázása élőlényekről vagy játékosokról egy horgászbottal +Fishing.SubSkill.Shake.Stat=Esély Rázásra +Fishing.SubSkill.FishermansDiet.Name=Horgászok Diétája +Fishing.SubSkill.FishermansDiet.Description=Növeli a kihalászott ételek tápértékét +Fishing.SubSkill.FishermansDiet.Stat=Horgászok Diétája:&a Szint {0} +Fishing.SubSkill.MasterAngler.Name=Mester Horgász +Fishing.SubSkill.MasterAngler.Description=A halak gyakrabban foghatóak, jobban működik ha egy csónakból horgászol. +Fishing.SubSkill.MasterAngler.Stat=A horgászat minimum várakozási idejének csökkentése: &a-{0} másodperc +Fishing.SubSkill.MasterAngler.Stat.Extra=A horgászat maximum várakozási idejének csökkentése: &a-{0} másodperc +Fishing.SubSkill.IceFishing.Name=Jég Horgászat +Fishing.SubSkill.IceFishing.Description=Lehetővé teszi számodra, hogy fagyos tájakon is horgászhass +Fishing.SubSkill.IceFishing.Stat=Jég Horgászat +Fishing.Chance.Raining=&9 Eső Bónusz +Fishing.Listener=Horgászat: +Fishing.Ability.TH.MagicFound=&7Valami mágikusat érzel ezzel a kapással kapcsolatban... +Fishing.Ability.TH.Boom=&7BUMM!!! +Fishing.Ability.TH.Poison=&7Valami nincs rendben... +Fishing.SkillName=HORGÁSZAT #HERBALISM -Herbalism.Ability.GTe.NeedMore=T\u00F6bb magra van sz\u00FCks\u00E9ged a Z\u00F6ld F\u00F6ld terjeszt\u00E9s\u00E9hez. -Herbalism.Ability.GTh.Fail=*Z\u00D6LD H\u00DCVELYK MEGHI\u00DASULT** -Herbalism.Ability.GTh=[[GREEN]]**Z\u00D6LD H\u00DCVELYK** -Herbalism.Ability.Lower=[[GRAY]]Leengeded a kap\u00E1dat. -Herbalism.Ability.Ready=[[GOLD]]El\u0151k\u00E9sz\u00EDted[[DARK_AQUA]] a kap\u00E1dat. -Herbalism.Ability.ShroomThumb.Fail=**GOMB\u00C1S H\u00DCVELYK MEGHI\u00DASULT** -Herbalism.SubSkill.GreenTerra.Name=Z\u00F6ld F\u00F6ld -Herbalism.SubSkill.GreenTerra.Description=Terjeszd a F\u00F6ldet, 3x T\u00E1rgy Es\u00E9s -Herbalism.SubSkill.GreenTerra.Stat=Z\u00F6ld H\u00FCvelyk Id\u0151tartam -Herbalism.SubSkill.GreenThumb.Name=Z\u00F6ld H\u00FCvelyk -Herbalism.SubSkill.GreenThumb.Description=Automatikusan el\u00FCltet egy magot betakar\u00EDt\u00E1sn\u00E1l -Herbalism.SubSkill.GreenThumb.Stat=Es\u00E9ly Z\u00F6ld H\u00FCvelykre -Herbalism.SubSkill.GreenThumb.Stat.Extra=Z\u00F6ld H\u00FCvelyk \u00C1llapota: [[GREEN]] A n\u00F6v\u00E9nyek a(z) {0} \u00E1llapotban n\u0151nek. -Herbalism.Effect.4=Z\u00F6ld H\u00FCvelyk (Blokkok) -Herbalism.SubSkill.GreenThumb.Description.2=T\u00E9gl\u00E1k moh\u00E1ss\u00E1 t\u00E9tele, ill. f\u0171 n\u00F6veszt\u00E9se -Herbalism.SubSkill.FarmersDiet.Name=Farmerek Di\u00E9t\u00E1ja -Herbalism.SubSkill.FarmersDiet.Description=N\u00F6veli a n\u00F6v\u00E9nyi \u00E9telek t\u00E1p\u00E9rt\u00E9k\u00E9t -Herbalism.SubSkill.FarmersDiet.Stat=Farmerek Di\u00E9t\u00E1ja: [[GREEN]]Szint {0} -Herbalism.SubSkill.DoubleDrops.Name=Dupla T\u00E1rgy Es\u00E9s -Herbalism.SubSkill.DoubleDrops.Description=Dupla Zs\u00E1km\u00E1ny -Herbalism.SubSkill.DoubleDrops.Stat=Es\u00E9ly Dupla T\u00E1rgyakra -Herbalism.SubSkill.HylianLuck.Name=Hili\u00E1n Szerencse -Herbalism.SubSkill.HylianLuck.Description=Es\u00E9lyt ad Ritka t\u00E1rgyak tal\u00E1l\u00E1s\u00E1ra -Herbalism.SubSkill.HylianLuck.Stat=Es\u00E9ly Hili\u00E1n Szerencs\u00E9re -Herbalism.SubSkill.ShroomThumb.Name=Gomb\u00E1s H\u00FCvelyk -Herbalism.SubSkill.ShroomThumb.Description=Gombafon\u00E1l terjeszt\u00E9se f\u0171re & f\u00F6ldre -Herbalism.SubSkill.ShroomThumb.Stat=Es\u00E9ly Gomb\u00E1s H\u00FCvelykre -Herbalism.HylianLuck=[[GREEN]]Hyrule szerencs\u00E9je veled van a mai napon -Herbalism.Listener=N\u00F6v\u00E9nytan: -Herbalism.SkillName=N\u00D6V\u00C9NYTAN -Herbalism.Skills.GTe.Off=**Z\u00F6ld F\u00F6ld v\u00E9get \u00E9rt** -Herbalism.Skills.GTe.On=[[GREEN]]**Z\u00D6LD F\u00D6LD AKTIV\u00C1LVA** -Herbalism.Skills.GTe.Refresh=[[GREEN]]A [[YELLOW]]Z\u00F6ld F\u00F6ld [[GREEN]]k\u00E9pess\u00E9ged ism\u00E9t el\u00E9rhet\u0151! -Herbalism.Skills.GTe.Other.Off=Z\u00F6ld F\u00F6ld[[GREEN]] kikapcsolva: [[YELLOW]]{0} -Herbalism.Skills.GTe.Other.On=[[GREEN]]{0}[[DARK_GREEN]] haszn\u00E1lta a [[RED]]Z\u00F6ld F\u00F6ld [[DARK_GREEN]]k\u00E9pess\u00E9get! +Herbalism.Ability.GTe.NeedMore=Több magra van szükséged a Zöld Föld terjesztéséhez. +Herbalism.Ability.GTh.Fail=*ZÖLD HÜVELYK MEGHIÚSULT** +Herbalism.Ability.GTh=&a**ZÖLD HÜVELYK** +Herbalism.Ability.Lower=&7Leengeded a kapádat. +Herbalism.Ability.Ready=&6Előkészíted&3 a kapádat. +Herbalism.Ability.ShroomThumb.Fail=**GOMBÁS HÜVELYK MEGHIÚSULT** +Herbalism.SubSkill.GreenTerra.Name=Zöld Föld +Herbalism.SubSkill.GreenTerra.Description=Terjeszd a Földet, 3x Tárgy Esés +Herbalism.SubSkill.GreenTerra.Stat=Zöld Hüvelyk Időtartam +Herbalism.SubSkill.GreenThumb.Name=Zöld Hüvelyk +Herbalism.SubSkill.GreenThumb.Description=Automatikusan elültet egy magot kapával történő betakarításnál +Herbalism.SubSkill.GreenThumb.Stat=Esély Zöld Hüvelykre +Herbalism.SubSkill.GreenThumb.Stat.Extra=Zöld Hüvelyk Állapota: &a A növények a(z) {0} állapotban nőnek. +Herbalism.Effect.4=Zöld Hüvelyk (Blokkok) +Herbalism.SubSkill.GreenThumb.Description.2=Téglák mohássá tétele, ill. fű növesztése +Herbalism.SubSkill.FarmersDiet.Name=Farmerek Diétája +Herbalism.SubSkill.FarmersDiet.Description=Növeli a növényi ételek tápértékét +Herbalism.SubSkill.FarmersDiet.Stat=Farmerek Diétája: &aSzint {0} +Herbalism.SubSkill.DoubleDrops.Name=Dupla Tárgy Esés +Herbalism.SubSkill.DoubleDrops.Description=Dupla Zsákmány +Herbalism.SubSkill.DoubleDrops.Stat=Esély Dupla Tárgyakra +Herbalism.SubSkill.HylianLuck.Name=Hilián Szerencse +Herbalism.SubSkill.HylianLuck.Description=Esélyt ad Ritka tárgyak találására +Herbalism.SubSkill.HylianLuck.Stat=Esély Hilián Szerencsére +Herbalism.SubSkill.ShroomThumb.Name=Gombás Hüvelyk +Herbalism.SubSkill.ShroomThumb.Description=Gombafonál terjesztése fűre & földre +Herbalism.SubSkill.ShroomThumb.Stat=Esély Gombás Hüvelykre +Herbalism.HylianLuck=&aHyrule szerencséje veled van a mai napon +Herbalism.Listener=Növénytan: +Herbalism.SkillName=NÖVÉNYTAN +Herbalism.Skills.GTe.Off=**Zöld Föld véget ért** +Herbalism.Skills.GTe.On=&a**ZÖLD FÖLD AKTIVÁLVA** +Herbalism.Skills.GTe.Refresh=&aA &eZöld Föld &aképességed ismét elérhető! +Herbalism.Skills.GTe.Other.Off=Zöld Föld&a kikapcsolva: &e{0} +Herbalism.Skills.GTe.Other.On=&a{0}&2 használta a &cZöld Föld &2képességet! #MINING -Mining.Ability.Locked.0=LEZ\u00C1RVA {0}+ K\u00C9PESS\u00C9G SZINTIG (ROBBANT\u00C1SB\u00C1NY\u00C1SZAT) -Mining.Ability.Locked.1=LEZ\u00C1RVA {0}+ K\u00C9PESS\u00C9G SZINTIG (NAGYOBB BOMBA) -Mining.Ability.Locked.2=LEZ\u00C1RVA {0}+ K\u00C9PESS\u00C9G SZINTIG (ROMBOL\u00C1SI TUD\u00C1S) -Mining.Ability.Lower=[[GRAY]]Leengeded a cs\u00E1k\u00E1nyod. -Mining.Ability.Ready=[[GOLD]]El\u0151k\u00E9sz\u00EDted[[DARK_AQUA]] a cs\u00E1k\u00E1nyod. -Mining.SubSkill.SuperBreaker.Name=Szuper T\u00F6r\u00E9s -Mining.SubSkill.SuperBreaker.Description=Sebess\u00E9g+, 3x T\u00E1rgy Es\u00E9si Es\u00E9ly -Mining.SubSkill.SuperBreaker.Stat=Szuper T\u00F6r\u00E9s Hossz\u00FAs\u00E1g -Mining.SubSkill.DoubleDrops.Name=Dupla Es\u00E9s -Mining.SubSkill.DoubleDrops.Description=Dupl\u00E1zza a Zs\u00E1km\u00E1ny es\u00E9st -Mining.SubSkill.DoubleDrops.Stat=Dupla T\u00E1rgy Es\u00E9si Es\u00E9ly -Mining.SubSkill.BlastMining.Name=Robbant\u00E1sb\u00E1ny\u00E1szat -Mining.SubSkill.BlastMining.Description=TNT-vel val\u00F3 b\u00E1ny\u00E1sz\u00E1si b\u00F3nusz -Mining.SubSkill.BlastMining.Stat=Robbant\u00E1sb\u00E1ny\u00E1szat:[[GREEN]] Szint {0}/{1} [[GRAY]]({2}) -Mining.SubSkill.BlastMining.Stat.Extra=Robban\u00E1si Hat\u00F3sug\u00E1r N\u00F6veked\u00E9s: [[GREEN]]+{0} +Mining.Ability.Locked.0=LEZÁRVA {0}+ KÉPESSÉG SZINTIG (ROBBANTÁSBÁNYÁSZAT) +Mining.Ability.Locked.1=LEZÁRVA {0}+ KÉPESSÉG SZINTIG (NAGYOBB BOMBA) +Mining.Ability.Locked.2=LEZÁRVA {0}+ KÉPESSÉG SZINTIG (ROMBOLÁSI TUDÁS) +Mining.Ability.Lower=&7Leengeded a csákányod. +Mining.Ability.Ready=&6Előkészíted&3 a csákányod. +Mining.SubSkill.SuperBreaker.Name=Szuper Törés +Mining.SubSkill.SuperBreaker.Description=Sebesség+, 3x Tárgy Esési Esély +Mining.SubSkill.SuperBreaker.Stat=Szuper Törés Hosszúság +Mining.SubSkill.DoubleDrops.Name=Dupla Esés +Mining.SubSkill.DoubleDrops.Description=Duplázza a Zsákmány esést +Mining.SubSkill.DoubleDrops.Stat=Dupla Tárgy Esési Esély +Mining.SubSkill.BlastMining.Name=Robbantásbányászat +Mining.SubSkill.BlastMining.Description=TNT-vel való bányászási bónusz +Mining.SubSkill.BlastMining.Stat=Robbantásbányászat:&a Szint {0}/{1} &7({2}) +Mining.SubSkill.BlastMining.Stat.Extra=Robbanási Hatósugár Növekedés: &a+{0} Mining.SubSkill.BiggerBombs.Name=Nagyobb Bomba -Mining.SubSkill.BiggerBombs.Description=N\u00F6veli a TNT-k robban\u00E1si erej\u00E9t -Mining.SubSkill.DemolitionsExpertise.Name=Rombol\u00E1si Tud\u00E1s -Mining.SubSkill.DemolitionsExpertise.Description=Cs\u00F6kkentik a TNT-k \u00E1ltal okozott robbant\u00E1sok sebz\u00E9s\u00E9t -Mining.SubSkill.DemolitionsExpertise.Stat=Rombol\u00E1si Tud\u00E1s Sebz\u00E9s Cs\u00F6kkent\u00E9se +Mining.SubSkill.BiggerBombs.Description=Növeli a TNT-k robbanási erejét +Mining.SubSkill.DemolitionsExpertise.Name=Rombolási Tudás +Mining.SubSkill.DemolitionsExpertise.Description=Csökkentik a TNT-k által okozott robbantások sebzését +Mining.SubSkill.DemolitionsExpertise.Stat=Rombolási Tudás Sebzés Csökkentése -Mining.Listener=B\u00E1ny\u00E1szat: -Mining.SkillName=B\u00C1NY\u00C1SZAT -Mining.Skills.SuperBreaker.Off=**Szuper T\u00F6r\u00E9s v\u00E9get \u00E9rt** -Mining.Skills.SuperBreaker.On=[[GREEN]]**SZUPER T\u00D6R\u00C9S AKTIV\u00C1LVA** -Mining.Skills.SuperBreaker.Other.Off=Szuper T\u00F6r\u00E9s[[GREEN]] kikapcsolva: [[YELLOW]]{0} -Mining.Skills.SuperBreaker.Other.On=[[GREEN]]{0}[[DARK_GREEN]] haszn\u00E1lta a [[RED]]Szuper T\u00F6r\u00E9s [[DARK_GREEN]]k\u00E9pess\u00E9get! -Mining.Skills.SuperBreaker.Refresh=[[GREEN]]A [[YELLOW]]Szuper T\u00F6r\u00E9s [[GREEN]]k\u00E9pess\u00E9ged ism\u00E9t el\u00E9rhet\u0151! +Mining.Listener=Bányászat: +Mining.SkillName=BÁNYÁSZAT +Mining.Skills.SuperBreaker.Off=**Szuper Törés véget ért** +Mining.Skills.SuperBreaker.On=&a**SZUPER TÖRÉS AKTIVÁLVA** +Mining.Skills.SuperBreaker.Other.Off=Szuper Törés&a kikapcsolva: &e{0} +Mining.Skills.SuperBreaker.Other.On=&a{0}&2 használta a &cSzuper Törés &2képességet! +Mining.Skills.SuperBreaker.Refresh=&aA &eSzuper Törés &aképességed ismét elérhető! #Blast Mining -Mining.Blast.Boom=[[GRAY]]**BUMM** +Mining.Blast.Boom=&7**BUMM** Mining.Blast.Cooldown= -Mining.Blast.Effect=+{0} \u00E9rc hozam, {1}x t\u00E1rgy es\u00E9s -Mining.Blast.Other.On=[[GREEN]]{0}[[DARK_GREEN]] haszn\u00E1lta a [[RED]]Robbant\u00E1sb\u00E1ny\u00E1szat [[DARK_GREEN]]k\u00E9pess\u00E9get! -Mining.Blast.Refresh=[[GREEN]]A [[YELLOW]]Robbant\u00E1sb\u00E1ny\u00E1szat [[GREEN]]k\u00E9pess\u00E9ged ism\u00E9t el\u00E9rhet\u0151! +Mining.Blast.Effect=+{0} érc hozam, {1}x tárgy esés +Mining.Blast.Other.On=&a{0}&2 használta a &cRobbantásbányászat &2képességet! +Mining.Blast.Refresh=&aA &eRobbantásbányászat &aképességed ismét elérhető! #REPAIR -Repair.SubSkill.Repair.Name=Jav\u00EDt\u00E1s -Repair.SubSkill.Repair.Description=Eszk\u00F6z\u00F6k & P\u00E1nc\u00E9lzat jav\u00EDt\u00E1sa -Repair.SubSkill.GoldRepair.Name=Arany Jav\u00EDt\u00E1s ({0}+ K\u00C9PESS\u00C9G SZINT) -Repair.SubSkill.GoldRepair.Description=Arany eszk\u00F6z\u00F6k & p\u00E1nc\u00E9lzat jav\u00EDt\u00E1sa -Repair.SubSkill.IronRepair.Name=Vas Jav\u00EDt\u00E1s ({0}+ K\u00C9PESS\u00C9G SZINT) -Repair.SubSkill.IronRepair.Description=Vas eszk\u00F6z\u00F6k & p\u00E1nc\u00E9lzat jav\u00EDt\u00E1sa -Repair.SubSkill.StoneRepair.Name=K\u0151 Jav\u00EDt\u00E1s ({0}+ K\u00C9PESS\u00C9G SZINT) -Repair.SubSkill.StoneRepair.Description=K\u0151 eszk\u00F6z\u00F6k jav\u00EDt\u00E1sa -Repair.SubSkill.RepairMastery.Name=Jav\u00EDt\u00E1si Mesters\u00E9g -Repair.SubSkill.RepairMastery.Description=N\u00F6veli a jav\u00EDt\u00E1s m\u00E9rt\u00E9k\u00E9t -Repair.SubSkill.RepairMastery.Stat=Jav\u00EDt\u00E1si Mesters\u00E9g: [[GREEN]]Extra {0} tart\u00F3ss\u00E1ga vissza\u00E1ll\u00EDtva -Repair.SubSkill.SuperRepair.Name=Szuper Jav\u00EDt\u00E1s -Repair.SubSkill.SuperRepair.Description=Dupla hat\u00E9konys\u00E1g -Repair.SubSkill.SuperRepair.Stat=Es\u00E9ly Szuper Jav\u00EDt\u00E1sra -Repair.SubSkill.DiamondRepair.Name=Gy\u00E9m\u00E1nt Jav\u00EDt\u00E1s ({0}+ K\u00C9PESS\u00C9G SZINT) -Repair.SubSkill.DiamondRepair.Description=Gy\u00E9m\u00E1nt eszk\u00F6z\u00F6k & p\u00E1nc\u00E9lzat jav\u00EDt\u00E1sa -Repair.SubSkill.ArcaneForging.Name=M\u00E1gikus Kov\u00E1csol\u00E1s -Repair.SubSkill.ArcaneForging.Description=M\u00E1gikus eszk\u00F6z\u00F6k jav\u00EDt\u00E1sa -Repair.SubSkill.ArcaneForging.Stat=M\u00E1gikus Kov\u00E1csol\u00E1s: [[YELLOW]]Szint {0}/{1} -Repair.SubSkill.ArcaneForging.Stat.Extra=[[DARK_AQUA]]M\u00E1gikus Kov\u00E1csol\u00E1s Es\u00E9ly:[[GRAY]] Siker [[GREEN]]{0}[[GRAY]]%, Sikertelen [[RED]]{1}[[GRAY]]% -Repair.Error=[[DARK_RED]]Az mcMMO hib\u00E1t \u00E9szlelt a t\u00E1rgy megjav\u00EDt\u00E1sa k\u00F6zben! -Repair.Listener.Anvil=[[DARK_RED]]Lehelyezt\u00E9l egy \u00FCll\u0151t. Az \u00FCll\u0151kkel eszk\u00F6z\u00F6ket \u00E9s p\u00E1nc\u00E9lzatot lehet jav\u00EDtani -Repair.Listener=Jav\u00EDt\u00E1s: -Repair.SkillName=JAV\u00CDT\u00C1S -Repair.Skills.AdeptDiamond=[[DARK_RED]]Nem vagy el\u00E9g tapasztalt ahhoz, hogy Gy\u00E9m\u00E1nttal jav\u00EDts. -Repair.Skills.AdeptGold=[[DARK_RED]]Nem vagy el\u00E9g tapasztalt ahhoz, hogy Arannyal jav\u00EDts. -Repair.Skills.AdeptIron=[[DARK_RED]]Nem vagy el\u00E9g tapasztalt ahhoz, hogy Vassal jav\u00EDts. -Repair.Skills.AdeptStone=[[DARK_RED]]Nem vagy el\u00E9g tapasztalt ahhoz, hogy K\u0151vel jav\u00EDts. -Repair.Skills.Adept=[[RED]]Sz\u00FCks\u00E9ged van [[YELLOW]]{0}[[RED]] szintre, hogy ezt megjav\u00EDthasd: [[YELLOW]]{1} -Repair.Skills.FeltEasy=[[GRAY]]H\u00E1t ez k\u00F6nny\u0171 volt. -Repair.Skills.FullDurability=[[GRAY]]Ezt nem kell m\u00E9g jav\u00EDtani. -Repair.Skills.StackedItems=[[DARK_RED]]Nem tudsz jav\u00EDtani egybe rakott t\u00E1rgyakat. -Repair.Pretty.Name=Jav\u00EDt\u00E1s +Repair.SubSkill.Repair.Name=Javítás +Repair.SubSkill.Repair.Description=Eszközök & Páncélzat javítása +Repair.SubSkill.GoldRepair.Name=Arany Javítás ({0}+ KÉPESSÉG SZINT) +Repair.SubSkill.GoldRepair.Description=Arany eszközök & páncélzat javítása +Repair.SubSkill.IronRepair.Name=Vas Javítás ({0}+ KÉPESSÉG SZINT) +Repair.SubSkill.IronRepair.Description=Vas eszközök & páncélzat javítása +Repair.SubSkill.StoneRepair.Name=Kő Javítás ({0}+ KÉPESSÉG SZINT) +Repair.SubSkill.StoneRepair.Description=Kő eszközök javítása +Repair.SubSkill.RepairMastery.Name=Javítási Mesterség +Repair.SubSkill.RepairMastery.Description=Növeli a javítás mértékét +Repair.SubSkill.RepairMastery.Stat=Javítási Mesterség: &aExtra {0} tartóssága visszaállítva +Repair.SubSkill.SuperRepair.Name=Szuper Javítás +Repair.SubSkill.SuperRepair.Description=Dupla hatékonyság +Repair.SubSkill.SuperRepair.Stat=Esély Szuper Javításra +Repair.SubSkill.DiamondRepair.Name=Gyémánt Javítás ({0}+ KÉPESSÉG SZINT) +Repair.SubSkill.DiamondRepair.Description=Gyémánt eszközök & páncélzat javítása +Repair.SubSkill.ArcaneForging.Name=Mágikus Kovácsolás +Repair.SubSkill.ArcaneForging.Description=Mágikus eszközök javítása +Repair.SubSkill.ArcaneForging.Stat=Mágikus Kovácsolás: &eSzint {0}/{1} +Repair.SubSkill.ArcaneForging.Stat.Extra=&3Mágikus Kovácsolás Esély:&7 Siker &a{0}&7%, Sikertelen &c{1}&7% +Repair.Error=&4Az mcMMO hibát észlelt a tárgy megjavítása közben! +Repair.Listener.Anvil=&4Lehelyeztél egy üllőt. Az üllőkkel eszközöket és páncélzatot lehet javítani +Repair.Listener=Javítás: +Repair.SkillName=JAVÍTÁS +Repair.Skills.AdeptDiamond=&4Nem vagy elég tapasztalt ahhoz, hogy Gyémánttal javíts. +Repair.Skills.AdeptGold=&4Nem vagy elég tapasztalt ahhoz, hogy Arannyal javíts. +Repair.Skills.AdeptIron=&4Nem vagy elég tapasztalt ahhoz, hogy Vassal javíts. +Repair.Skills.AdeptStone=&4Nem vagy elég tapasztalt ahhoz, hogy Kővel javíts. +Repair.Skills.Adept=&cSzükséged van &e{0}&c szintre, hogy ezt megjavíthasd: &e{1} +Repair.Skills.FeltEasy=&7Hát ez könnyű volt. +Repair.Skills.FullDurability=&7Ezt nem kell még javítani. +Repair.Skills.StackedItems=&4Nem tudsz javítani egybe rakott tárgyakat. +Repair.Pretty.Name=Javítás #Arcane Forging -Repair.Arcane.Downgrade=A m\u00E1gikus er\u0151 cs\u00F6kkent ezen a t\u00E1rgyon. -Repair.Arcane.Fail=A m\u00E1gikus er\u0151 v\u00E9gleg elhagyta ezt a t\u00E1rgyat. -Repair.Arcane.Lost=Nem volt\u00E1l el\u00E9g tapasztalt ahhoz, hogy megtarthass valamilyen var\u00E1zslatot is. -Repair.Arcane.Perfect=[[GREEN]]Sikeresen megtartottad a m\u00E1gikus energi\u00E1kat ebben a t\u00E1rgyban. +Repair.Arcane.Downgrade=A mágikus erő csökkent ezen a tárgyon. +Repair.Arcane.Fail=A mágikus erő végleg elhagyta ezt a tárgyat. +Repair.Arcane.Lost=Nem voltál elég tapasztalt ahhoz, hogy megtarthass valamilyen varázslatot is. +Repair.Arcane.Perfect=&aSikeresen megtartottad a mágikus energiákat ebben a tárgyban. #SALVAGE -Salvage.Pretty.Name=\u00DAjrahasznos\u00EDt\u00E1s -Salvage.SubSkill.UnderstandingTheArt.Name=A M\u0171v\u00E9szet Meg\u00E9rt\u00E9se -Salvage.SubSkill.UnderstandingTheArt.Description=Nem csak a szomsz\u00E9dok szem\u00E9t\u00E9ben kutatsz, hanem gondoskodsz a k\u00F6rnyezetr\u0151l is.\nAz \u00C9rt\u00E9kment\u00E9s k\u00FCl\u00F6nb\u00F6z\u0151 tulajdons\u00E1gait n\u00F6veli. -Salvage.SubSkill.ScrapCollector.Name=Hullad\u00E9kgy\u0171jt\u0151 -Salvage.SubSkill.ScrapCollector.Description=Hasznos\u00EDtsd \u00FAjra az anyagokat egy t\u00E1rgyb\u00F3l, egy sikeres \u00FAjrahasznos\u00EDt\u00E1s a k\u00E9pess\u00E9gen \u00E9s a szerencs\u00E9n m\u00FAlik. -Salvage.SubSkill.ScrapCollector.Stat=Hullad\u00E9kgy\u0171jt\u0151: [[GREEN]]Hullad\u00E9kgy\u0171jt\u0151: [[GREEN]]Hasznos\u00EDts \u00FAjra ak\u00E1r [[YELLOW]]{0}[[GREEN]] t\u00E1rgyat. Egy kis szerencs\u00E9vel. -Salvage.SubSkill.ArcaneSalvage.Name=M\u00E1gikus \u00DAjrahasznos\u00EDt\u00E1s -Salvage.SubSkill.ArcaneSalvage.Description=Var\u00E1zslatok kinyer\u00E9se t\u00E1rgyakb\u00F3l -Salvage.SubSkill.ArcaneSalvage.Stat=M\u00E1gikus \u00DAjrahasznos\u00EDt\u00E1s Szint: [[YELLOW]] {0}/{1} -Salvage.Ability.Bonus.0=Hullad\u00E9kgy\u0171jt\u0151 -Salvage.Ability.Bonus.1=Hasznos\u00EDts \u00FAjra ak\u00E1r [[YELLOW]]{0}[[GREEN]] t\u00E1rgyat. Egy kis szerencs\u00E9vel. -Salvage.Arcane.ExtractFull=[[GRAY]]M\u00C9 Teljes-Var\u00E1zslat Es\u00E9ly -Salvage.Arcane.ExtractPartial=[[GRAY]]M\u00C9 R\u00E9szleges-Var\u00E1zslat Es\u00E9ly -Salvage.Skills.Success=[[GREEN]]T\u00E1rgy \u00DAjrahasznos\u00EDtva! -Salvage.Skills.Adept.Damaged=[[DARK_RED]]Nem vagy el\u00E9g tapasztalt, hogy s\u00E9r\u00FClt t\u00E1rgyakat hasznos\u00EDthass \u00FAjra. -Salvage.Skills.Adept.Level=Sz\u00FCks\u00E9ges szint [[YELLOW]]{1}[[RED]] \u00FAjrahasznos\u00EDt\u00E1shoz: [[YELLOW]]{0} -Salvage.Skills.TooDamaged=[[DARK_RED]]Ez a t\u00E1rgy t\u00FAls\u00E1gosan s\u00E9r\u00FClt az \u00FAjrahasznos\u00EDt\u00E1shoz. -Salvage.Skills.ArcaneFailed=[[RED]]Nem tudtad kinyerni a tud\u00E1st, ami ebben a t\u00E1rgyban lakozik. -Salvage.Skills.ArcanePartial=[[RED]]Csak r\u00E9szleges tud\u00E1st tudt\u00E1l kinyerni ebb\u0151l a t\u00E1rgyb\u00F3l. -Salvage.Skills.ArcaneSuccess=[[GREEN]]Sikeresen kinyert\u00E9l minden tud\u00E1st ebb\u0151l a t\u00E1rgyb\u00F3l! -Salvage.Listener.Anvil=[[DARK_RED]]Lehelyezt\u00E9l egy \u00C9rt\u00E9kment\u0151 \u00DCll\u0151t. Haszn\u00E1ld ezt eszk\u00F6z\u00F6k, \u00E9s p\u00E1nc\u00E9lzatok \u00FAjrahasznos\u00EDt\u00E1shoz. -Salvage.Listener=\u00DAjrahasznos\u00EDt\u00E1s: -Salvage.SkillName=\u00DAJRAHASZNOS\u00CDT\u00C1S -Salvage.Skills.Lottery.Normal=[[GOLD]]\u00DAjrahasznos\u00EDthatsz [[DARK_AQUA]]{0}[[GOLD]] anyagot ebb\u0151l [[YELLOW]]{1}[[GOLD]]. -Salvage.Skills.Lottery.Perfect=[[GREEN]][[BOLD]]T\u00F6k\u00E9letes![[RESET]][[GOLD]] K\u00F6nnyed\u00E9n \u00FAjrahasznos\u00EDtott\u00E1l egy [[DARK_AQUA]]{1}[[GOLD]]-t visszanyerve [[DARK_AQUA]]{0}[[GOLD]] anyagot. -Salvage.Skills.Lottery.Untrained=[[GRAY]]M\u00E9g nem vagy el\u00E9g k\u00E9pezett az \u00FAjrahasznos\u00EDt\u00E1sban. Csak [[RED]]{0}[[GRAY]] anyagot tudt\u00E1l helyre\u00E1ll\u00EDtani ebb\u0151l [[GREEN]]{1}[[GRAY]]. +Salvage.Pretty.Name=Újrahasznosítás +Salvage.SubSkill.UnderstandingTheArt.Name=A Művészet Megértése +Salvage.SubSkill.UnderstandingTheArt.Description=Nem csak a szomszédok szemétében kutatsz, hanem gondoskodsz a környezetről is.\nAz Értékmentés különböző tulajdonságait növeli. +Salvage.SubSkill.ScrapCollector.Name=Hulladékgyűjtő +Salvage.SubSkill.ScrapCollector.Description=Hasznosítsd újra az anyagokat egy tárgyból, egy sikeres újrahasznosítás a képességen és a szerencsén múlik. +Salvage.SubSkill.ScrapCollector.Stat=Hulladékgyűjtő: &aHulladékgyűjtő: &aHasznosíts újra akár &e{0}&a tárgyat. Egy kis szerencsével. +Salvage.SubSkill.ArcaneSalvage.Name=Mágikus Újrahasznosítás +Salvage.SubSkill.ArcaneSalvage.Description=Varázslatok kinyerése tárgyakból +Salvage.SubSkill.ArcaneSalvage.Stat=Mágikus Újrahasznosítás Szint: &e {0}/{1} +Salvage.Ability.Bonus.0=Hulladékgyűjtő +Salvage.Ability.Bonus.1=Hasznosíts újra akár &e{0}&a tárgyat. Egy kis szerencsével. +Salvage.Arcane.ExtractFull=&7MÉ Teljes-Varázslat Esély +Salvage.Arcane.ExtractPartial=&7MÉ Részleges-Varázslat Esély +Salvage.Skills.Success=&aTárgy Újrahasznosítva! +Salvage.Skills.Adept.Damaged=&4Nem vagy elég tapasztalt, hogy sérült tárgyakat hasznosíthass újra. +Salvage.Skills.Adept.Level=Szükséges szint &e{1}&c újrahasznosításhoz: &e{0} +Salvage.Skills.TooDamaged=&4Ez a tárgy túlságosan sérült az újrahasznosításhoz. +Salvage.Skills.ArcaneFailed=&cNem tudtad kinyerni a tudást, ami ebben a tárgyban lakozik. +Salvage.Skills.ArcanePartial=&cCsak részleges tudást tudtál kinyerni ebből a tárgyból. +Salvage.Skills.ArcaneSuccess=&aSikeresen kinyertél minden tudást ebből a tárgyból! +Salvage.Listener.Anvil=&4Lehelyeztél egy Értékmentő Üllőt. Használd ezt eszközök, és páncélzatok újrahasznosításhoz. +Salvage.Listener=Újrahasznosítás: +Salvage.SkillName=ÚJRAHASZNOSÍTÁS +Salvage.Skills.Lottery.Normal=&6Újrahasznosíthatsz &3{0}&6 anyagot ebből &e{1}&6. +Salvage.Skills.Lottery.Perfect=&a&lTökéletes!&r&6 Könnyedén újrahasznosítottál egy &3{1}&6-t visszanyerve &3{0}&6 anyagot. +Salvage.Skills.Lottery.Untrained=&7Még nem vagy elég képezett az újrahasznosításban. Csak &c{0}&7 anyagot tudtál helyreállítani ebből &a{1}&7. #Anvil (Shared between SALVAGE and REPAIR) -Anvil.Unbreakable=Ez a t\u00E1rgy t\u00F6rhetetlen! +Anvil.Unbreakable=Ez a tárgy törhetetlen! #SWORDS -Swords.Ability.Lower=[[GRAY]]Leengeded a kardod. -Swords.Ability.Ready=[[GOLD]]El\u0151k\u00E9sz\u00EDted[[DARK_AQUA]] a kardod. -Swords.Combat.Rupture.Note=[[GRAY]]MEGJ.: [[YELLOW]]1 Tick t\u00F6rt\u00E9nik minden 0,5 m\u00E1sodpercenk\u00E9nt -Swords.Combat.Bleeding.Started=[[DARK_RED]] V\u00E9rzel! -Swords.Combat.Bleeding.Stopped=[[GRAY]]A v\u00E9rz\u00E9s [[GREEN]]el\u00E1llt[[GRAY]]! -Swords.Combat.Bleeding=[[GREEN]]**AZ ELLENS\u00C9G V\u00C9RZIK** -Swords.Combat.Counter.Hit=[[DARK_RED]]Ellent\u00E1mad\u00E1s! -Swords.Combat.Countered=[[GREEN]]**ELLENT\u00C1MADVA!** -Swords.Combat.SS.Struck=[[DARK_RED]]R\u00E1d csaptak FOGAZOTT PENG\u00C9VEL! -Swords.SubSkill.CounterAttack.Name=Ellent\u00E1mad\u00E1s -Swords.SubSkill.CounterAttack.Description=Visszaveri a sebz\u00E9s egy r\u00E9sz\u00E9t, am\u00EDg blokkolod a t\u00E1mad\u00E1sokat -Swords.SubSkill.CounterAttack.Stat=Es\u00E9ly Ellent\u00E1mad\u00E1sra +Swords.Ability.Lower=&7Leengeded a kardod. +Swords.Ability.Ready=&6Előkészíted&3 a kardod. +Swords.Combat.Rupture.Note=&7MEGJ.: &e1 Tick történik minden 0,5 másodpercenként +Swords.Combat.Bleeding.Started=&4 Vérzel! +Swords.Combat.Bleeding.Stopped=&7A vérzés &aelállt&7! +Swords.Combat.Bleeding=&a**AZ ELLENSÉG VÉRZIK** +Swords.Combat.Counter.Hit=&4Ellentámadás! +Swords.Combat.Countered=&a**ELLENTÁMADVA!** +Swords.Combat.SS.Struck=&4Rád csaptak FOGAZOTT PENGÉVEL! +Swords.SubSkill.CounterAttack.Name=Ellentámadás +Swords.SubSkill.CounterAttack.Description=Visszaveri a sebzés egy részét, amíg blokkolod a támadásokat +Swords.SubSkill.CounterAttack.Stat=Esély Ellentámadásra Swords.SubSkill.SerratedStrikes.Name=Fogazott Penge -Swords.SubSkill.SerratedStrikes.Description=Az AOE r\u00E9szleges k\u00E1rosod\u00E1s\u00E1t a T\u00F6r\u00E9s alkalmaz\u00E1s\u00E1val lehet megoldani! +Swords.SubSkill.SerratedStrikes.Description=Az AOE részleges károsodását a Törés alkalmazásával lehet megoldani! Swords.SubSkill.SerratedStrikes.Stat=Fogazott Penge Hossza -Swords.SubSkill.Rupture.Name=T\u00F6r\u00E9s -Swords.SubSkill.Rupture.Description=Alkalmaz egy er\u0151s v\u00E9rz\u00E9s pontot -Swords.SubSkill.Stab.Name=D\u00F6f\u00E9s -Swords.SubSkill.Stab.Description={0} B\u00F3nusz sebz\u00E9st ad a t\u00E1mad\u00E1sokkor. -Swords.SubSkill.Stab.Stat=D\u00F6f\u00E9s Sebz\u00E9s -Swords.SubSkill.SwordsLimitBreak.Name=Kardok Korl\u00E1t \u00C1tl\u00E9p\u00E9s -Swords.SubSkill.SwordsLimitBreak.Description=L\u00E9pj t\u00FAl a korl\u00E1taidon. Megn\u00F6vekedett sebz\u00E9s a kem\u00E9ny ellenfelek ellen. A PVP-hez tervezt\u00E9k att\u00F3l f\u00FCggetlen\u00FCl, hogy a szerver be\u00E1ll\u00EDt\u00E1si n\u00F6velik-e, vagy sem a PVE sebz\u00E9st. -Swords.SubSkill.SwordsLimitBreak.Stat=Max Sebz\u00E9s Korl\u00E1t \u00C1tl\u00E9p\u00E9ssel -Swords.SubSkill.Rupture.Stat=Es\u00E9ly T\u00F6r\u00E9sre -Swords.SubSkill.Rupture.Stat.Extra=T\u00F6r\u00E9s Hossza: [[GREEN]]{0} tick [{1} s\u00E9r\u00FCl\u00E9s j\u00E1t\u00E9kosok ellen] [{2} s\u00E9r\u00FCl\u00E9s \u00E9l\u0151l\u00E9nyek ellen] -Swords.Effect.4=Fogazott Penge T\u00F6r\u00E9s+ -Swords.Effect.5={0} Tick T\u00F6r\u00E9s +Swords.SubSkill.Rupture.Name=Törés +Swords.SubSkill.Rupture.Description=Alkalmaz egy erős vérzés pontot +Swords.SubSkill.Stab.Name=Döfés +Swords.SubSkill.Stab.Description={0} Bónusz sebzést ad a támadásokkor. +Swords.SubSkill.Stab.Stat=Döfés Sebzés +Swords.SubSkill.SwordsLimitBreak.Name=Kardok Korlát Átlépés +Swords.SubSkill.SwordsLimitBreak.Description=Lépj túl a korlátaidon. Megnövekedett sebzés a kemény ellenfelek ellen. A PVP-hez tervezték attól függetlenül, hogy a szerver beállítási növelik-e, vagy sem a PVE sebzést. +Swords.SubSkill.SwordsLimitBreak.Stat=Max Sebzés Korlát Átlépéssel +Swords.SubSkill.Rupture.Stat=Esély Törésre +Swords.SubSkill.Rupture.Stat.Extra=Törés Hossza: &a{0} tick [{1} sérülés játékosok ellen] [{2} sérülés élőlények ellen] +Swords.Effect.4=Fogazott Penge Törés+ +Swords.Effect.5={0} Tick Törés Swords.Listener=Kardok: Swords.SkillName=KARDOK -Swords.Skills.SS.Off=**Fogazott Penge v\u00E9get \u00E9rt** -Swords.Skills.SS.On=[[GREEN]]**FOGAZOTT PENGE AKTIV\u00C1LVA** -Swords.Skills.SS.Refresh=[[GREEN]]A [[YELLOW]]Fogazott Penge [[GREEN]]k\u00E9pess\u00E9ged ism\u00E9t el\u00E9rhet\u0151! -Swords.Skills.SS.Other.Off=Fogazott Penge[[GREEN]] kikapcsolva: [[YELLOW]]{0} -Swords.Skills.SS.Other.On=[[GREEN]]{0}[[DARK_GREEN]] haszn\u00E1lta a [[RED]]Fogazott Penge [[DARK_GREEN]]k\u00E9pess\u00E9get! +Swords.Skills.SS.Off=**Fogazott Penge véget ért** +Swords.Skills.SS.On=&a**FOGAZOTT PENGE AKTIVÁLVA** +Swords.Skills.SS.Refresh=&aA &eFogazott Penge &aképességed ismét elérhető! +Swords.Skills.SS.Other.Off=Fogazott Penge&a kikapcsolva: &e{0} +Swords.Skills.SS.Other.On=&a{0}&2 használta a &cFogazott Penge &2képességet! #TAMING -Taming.Ability.Bonus.0=\u00C9bers\u00E9g -Taming.Ability.Bonus.1=A farkasok elker\u00FClik a vesz\u00E9lyt +Taming.Ability.Bonus.0=Éberség +Taming.Ability.Bonus.1=A farkasok elkerülik a veszélyt Taming.Ability.Bonus.2=Vastag Bunda -Taming.Ability.Bonus.3=1/{0} Sebz\u00E9s, T\u0171z\u00E1ll\u00F3s\u00E1g -Taming.Ability.Bonus.4=Robban\u00E1s\u00E1ll\u00F3s\u00E1g -Taming.Ability.Bonus.5=A robban\u00E1sok a norm\u00E1lis sebz\u00E9s csak egy r\u00E9sz\u00E9t sebzik (1/{0}) -Taming.Ability.Bonus.6=\u00C9les Karmok -Taming.Ability.Bonus.7=+{0} Sebz\u00E9s -Taming.Ability.Bonus.8=Gyors\u00E9ttermi Kiszolg\u00E1l\u00E1s -Taming.Ability.Bonus.9={0} Es\u00E9ly \u00E9let-visszanyer\u00E9sre t\u00E1mad\u00E1sn\u00E1l -Taming.Ability.Bonus.10=Szent V\u00E9reb -Taming.Ability.Bonus.11=\u00C9let-visszanyer\u00E9s amikor m\u00E1gikus, vagy m\u00E9reg sebz\u00E9st szenvedsz -Taming.Ability.Locked.0=LEZ\u00C1RVA {0}+ K\u00C9PESS\u00C9G SZINTIG (\u00C9BERS\u00C9G) -Taming.Ability.Locked.1=LEZ\u00C1RVA {0}+ K\u00C9PESS\u00C9G SZINTIG (VASTAG BUNDA) -Taming.Ability.Locked.2=LEZ\u00C1RVA {0}+ K\u00C9PESS\u00C9G SZINTIG (ROBBAN\u00C1S\u00C1LL\u00D3S\u00C1G) -Taming.Ability.Locked.3=LEZ\u00C1RVA {0}+ K\u00C9PESS\u00C9G SZINTIG (\u00C9LES KARMOK) -Taming.Ability.Locked.4=LEZ\u00C1RVA {0}+ K\u00C9PESS\u00C9G SZINTIG (GYORS\u00C9TTERMI KISZOLG\u00C1L\u00C1S) -Taming.Ability.Locked.5=LEZ\u00C1RVA {0}+ K\u00C9PESS\u00C9G SZINTIG (SZENT V\u00C9REB) -Taming.Combat.Chance.Gore=Es\u00E9ly D\u00F6f\u00E9sre: [[YELLOW]]{0} -Taming.SubSkill.BeastLore.Name=Vad\u00E1llat-tan -Taming.SubSkill.BeastLore.Description=Csontok csapkod\u00E1sa megvizsg\u00E1lja a farkasokat & ocelotokat -Taming.SubSkill.ShockProof.Name=Robban\u00E1s\u00E1ll\u00F3s\u00E1g -Taming.SubSkill.ShockProof.Description=Cs\u00F6kkenti a robban\u00E1sok \u00E1ltal okozott sebz\u00E9st -Taming.SubSkill.CallOfTheWild.Name=A Vadon h\u00EDv\u00E1sa -Taming.SubSkill.CallOfTheWild.Description=Megid\u00E9z mell\u00E9d egy \u00E1llatot -Taming.SubSkill.CallOfTheWild.Description.2=[[GRAY]]GBKE: Guggolj \u00E9s bal-klikk ezzel:\n {0} {1} (Ocelot), {2} {3} (Farkas), {4} {5} (L\u00F3) -Taming.SubSkill.FastFoodService.Name=Gyors\u00E9ttermi Kiszolg\u00E1l\u00E1s -Taming.SubSkill.FastFoodService.Description=Es\u00E9ly farkasok sz\u00E1m\u00E1ra, hogy t\u00E1mad\u00E1skor \u00E9letet nyerjenek vissza -Taming.SubSkill.HolyHound.Name=Szent V\u00E9reb -Taming.SubSkill.HolyHound.Description=A M\u00E1gia & M\u00E9rgek gy\u00F3gy\u00EDtanak -Taming.SubSkill.Gore.Name=D\u00F6f\u00E9s -Taming.SubSkill.Gore.Description=Kritikus csap\u00E1s, melyt\u0151l a c\u00E9lpont T\u00F6r\u00E9st kap -Taming.SubSkill.SharpenedClaws.Name=\u00C9les Karmok -Taming.SubSkill.SharpenedClaws.Description=B\u00F3nusz Sebz\u00E9s -Taming.SubSkill.EnvironmentallyAware.Name=K\u00F6rnyezettudatoss\u00E1g -Taming.SubSkill.EnvironmentallyAware.Description=Kaktusz/L\u00E1va F\u00F3bia, Immunis es\u00E9s \u00E1ltal okozott sebz\u00E9sre +Taming.Ability.Bonus.3=1/{0} Sebzés, Tűzállóság +Taming.Ability.Bonus.4=Robbanásállóság +Taming.Ability.Bonus.5=A robbanások a normális sebzés csak egy részét sebzik (1/{0}) +Taming.Ability.Bonus.6=Éles Karmok +Taming.Ability.Bonus.7=+{0} Sebzés +Taming.Ability.Bonus.8=Gyorséttermi Kiszolgálás +Taming.Ability.Bonus.9={0} Esély élet-visszanyerésre támadásnál +Taming.Ability.Bonus.10=Szent Véreb +Taming.Ability.Bonus.11=Élet-visszanyerés amikor mágikus, vagy méreg sebzést szenvedsz +Taming.Ability.Locked.0=LEZÁRVA {0}+ KÉPESSÉG SZINTIG (ÉBERSÉG) +Taming.Ability.Locked.1=LEZÁRVA {0}+ KÉPESSÉG SZINTIG (VASTAG BUNDA) +Taming.Ability.Locked.2=LEZÁRVA {0}+ KÉPESSÉG SZINTIG (ROBBANÁSÁLLÓSÁG) +Taming.Ability.Locked.3=LEZÁRVA {0}+ KÉPESSÉG SZINTIG (ÉLES KARMOK) +Taming.Ability.Locked.4=LEZÁRVA {0}+ KÉPESSÉG SZINTIG (GYORSÉTTERMI KISZOLGÁLÁS) +Taming.Ability.Locked.5=LEZÁRVA {0}+ KÉPESSÉG SZINTIG (SZENT VÉREB) +Taming.Combat.Chance.Gore=Esély Döfésre: &e{0} +Taming.SubSkill.BeastLore.Name=Vadállat-tan +Taming.SubSkill.BeastLore.Description=Csontok csapkodása megvizsgálja a farkasokat & ocelotokat +Taming.SubSkill.ShockProof.Name=Robbanásállóság +Taming.SubSkill.ShockProof.Description=Csökkenti a robbanások által okozott sebzést +Taming.SubSkill.CallOfTheWild.Name=A Vadon hívása +Taming.SubSkill.CallOfTheWild.Description=Megidéz melléd egy állatot +Taming.SubSkill.CallOfTheWild.Description.2=&7GBKE: Guggolj és bal-klikk ezzel:\n {0} {1} (Ocelot), {2} {3} (Farkas), {4} {5} (Ló) +Taming.SubSkill.FastFoodService.Name=Gyorséttermi Kiszolgálás +Taming.SubSkill.FastFoodService.Description=Esély farkasok számára, hogy támadáskor életet nyerjenek vissza +Taming.SubSkill.HolyHound.Name=Szent Véreb +Taming.SubSkill.HolyHound.Description=A Mágia & Mérgek gyógyítanak +Taming.SubSkill.Gore.Name=Döfés +Taming.SubSkill.Gore.Description=Kritikus csapás, melytől a célpont Törést kap +Taming.SubSkill.SharpenedClaws.Name=Éles Karmok +Taming.SubSkill.SharpenedClaws.Description=Bónusz Sebzés +Taming.SubSkill.EnvironmentallyAware.Name=Környezettudatosság +Taming.SubSkill.EnvironmentallyAware.Description=Kaktusz/Láva Fóbia, Immunis esés által okozott sebzésre Taming.SubSkill.ThickFur.Name=Vastag Bunda -Taming.SubSkill.ThickFur.Description=Cs\u00F6kkentett Sebz\u00E9s, T\u0171z\u00E1ll\u00F3s\u00E1g -Taming.SubSkill.Pummel.Name=P\u00FCf\u00F6l\u00E9s -Taming.SubSkill.Pummel.Description=A farkasaid k\u00E9pesek lesznek az ellens\u00E9g visszal\u00F6k\u00E9s\u00E9re -Taming.SubSkill.Pummel.TargetMessage=H\u00E1tra lett\u00E9l l\u00F6kve egy farkas \u00E1ltal! -Taming.Listener.Wolf=[[DARK_GRAY]]A Farkasod hozz\u00E1d oson... -Taming.Listener=Szel\u00EDd\u00EDt\u00E9s: -Taming.SkillName=SZELID\u00CDT\u00C9S -Taming.Summon.COTW.Success.WithoutLifespan=[[GREEN]](A Vadon Szava) [[GRAY]]Megid\u00E9zt\u00E9l egy [[GOLD]]{0}[[GRAY]] -Taming.Summon.COTW.Success.WithLifespan=[[GREEN]](A Vadon Szava) [[GRAY]]Megid\u00E9zt\u00E9l egy [[GOLD]]{0}[[GRAY]] \u00E9s az id\u0151tartama [[GOLD]]{1}[[GRAY]] m\u00E1sodperc. -Taming.Summon.COTW.Limit=[[GREEN]](A Vadon Szava) [[GRAY]]Egyszerre csak [[RED]]{0} [[GRAY]]megid\u00E9zett [[GRAY]]{1} h\u00E1zi\u00E1llat lehet egyid\u0151ben. -Taming.Summon.COTW.TimeExpired=[[GREEN]](A Vadon Szava) [[GRAY]]Az id\u0151 v\u00E9get \u00E9r, [[GOLD]]{0}[[GRAY]] elt\u00E1vozik. -Taming.Summon.COTW.BreedingDisallowed=[[GREEN]](A Vadon Szava) [[RED]]Nem szapor\u00EDthatsz megid\u00E9zett \u00E1llatot. -Taming.Summon.COTW.NeedMoreItems=[[GREEN]](A Vadon Szava) [[GRAY]]Sz\u00FCks\u00E9g van [[YELLOW]]{0}[[GRAY]] t\u00F6bb [[DARK_AQUA]]{1}[[GRAY]](m) -Taming.Summon.Name.Format=[[GOLD]](COTW) [[WHITE]]{0} \u00E1llata {1} +Taming.SubSkill.ThickFur.Description=Csökkentett Sebzés, Tűzállóság +Taming.SubSkill.Pummel.Name=Püfölés +Taming.SubSkill.Pummel.Description=A farkasaid képesek lesznek az ellenség visszalökésére +Taming.SubSkill.Pummel.TargetMessage=Hátra lettél lökve egy farkas által! +Taming.Listener.Wolf=&8A Farkasod hozzád oson... +Taming.Listener=Szelídítés: +Taming.SkillName=SZELIDÍTÉS +Taming.Summon.COTW.Success.WithoutLifespan=&a(A Vadon Szava) &7Megidéztél egy &6{0}&7 +Taming.Summon.COTW.Success.WithLifespan=&a(A Vadon Szava) &7Megidéztél egy &6{0}&7 és az időtartama &6{1}&7 másodperc. +Taming.Summon.COTW.Limit=&a(A Vadon Szava) &7Egyszerre csak &c{0} &7megidézett &7{1} háziállat lehet egyidőben. +Taming.Summon.COTW.TimeExpired=&a(A Vadon Szava) &7Az idő véget ér, &6{0}&7 eltávozik. +Taming.Summon.COTW.Removed=&a(A Vadon Szava) &7A megidézett &6{0}&7 eltűnt ebből a világból. +Taming.Summon.COTW.BreedingDisallowed=&a(A Vadon Szava) &cNem szaporíthatsz megidézett állatot. +Taming.Summon.COTW.NeedMoreItems=&a(A Vadon Szava) &7Szükség van &e{0}&7 több &3{1}&7(s) +Taming.Summon.Name.Format=&6(COTW) &f{0} állata {1} #UNARMED -Unarmed.Ability.Bonus.0=Vas-\u00D6k\u00F6l St\u00EDlus -Unarmed.Ability.Bonus.1=+{0} Sebz\u00E9s Fejleszt\u00E9s -Unarmed.Ability.IronGrip.Attacker=Az ellenfeled Vas-Markol\u00E1ssal rendelkezik! -Unarmed.Ability.IronGrip.Defender=[[GREEN]]A Vas-Markol\u00E1sodnak h\u00E1la nem lett\u00E9l Lefegyverezve! -Unarmed.Ability.Lower=[[GRAY]]Leengeded az \u00F6kleidet. -Unarmed.Ability.Ready=[[GOLD]]El\u0151k\u00E9sz\u00EDted[[DARK_AQUA]] az \u00F6kleidet. -Unarmed.SubSkill.Berserk.Name=Vadul\u00E1s -Unarmed.SubSkill.Berserk.Description=+50% Sebz\u00E9s, Sz\u00E9tt\u00F6ri a gyenge anyagokat -Unarmed.SubSkill.Berserk.Stat=Vadul\u00E1s Hossza -Unarmed.SubSkill.Disarm.Name=Lefegyverz\u00E9s (J\u00E1t\u00E9kosok) -Unarmed.SubSkill.Disarm.Description=Ellenfeleid elejtik a kez\u00FCkben lev\u0151 t\u00E1rgyakat -Unarmed.SubSkill.Disarm.Stat=Es\u00E9ly Lefegyverz\u00E9sre -Unarmed.SubSkill.UnarmedLimitBreak.Name=Pusztakezek Korl\u00E1t \u00C1tl\u00E9p\u00E9s -Unarmed.SubSkill.UnarmedLimitBreak.Description=L\u00E9pj t\u00FAl a korl\u00E1taidon. Megn\u00F6vekedett sebz\u00E9s a kem\u00E9ny ellenfelek ellen. A PVP-hez tervezt\u00E9k att\u00F3l f\u00FCggetlen\u00FCl, hogy a szerver be\u00E1ll\u00EDt\u00E1si n\u00F6velik-e, vagy sem a PVE sebz\u00E9st. -Unarmed.SubSkill.UnarmedLimitBreak.Stat=Max Sebz\u00E9s Korl\u00E1t \u00C1tl\u00E9p\u00E9ssel -Unarmed.SubSkill.IronArmStyle.Name=Vas-\u00D6k\u00F6l St\u00EDlus -Unarmed.SubSkill.IronArmStyle.Description=Id\u0151vel megkem\u00E9ny\u00EDti az \u00F6kleidet -Unarmed.SubSkill.ArrowDeflect.Name=Nyilak Kit\u00E9r\u00EDt\u00E9se -Unarmed.SubSkill.ArrowDeflect.Description=Nyilak Kit\u00E9r\u00EDt\u00E9se -Unarmed.SubSkill.ArrowDeflect.Stat=Es\u00E9ly Nyilak Kit\u00E9r\u00EDt\u00E9s\u00E9re -Unarmed.SubSkill.IronGrip.Name=Vas-Markol\u00E1s -Unarmed.SubSkill.IronGrip.Description=Megakad\u00E1lyozza, hogy Lefegyverez\u0151dj -Unarmed.SubSkill.IronGrip.Stat=Es\u00E9ly Vas-Markol\u00E1sra -Unarmed.SubSkill.BlockCracker.Name=Blokkt\u00F6r\u0151 -Unarmed.SubSkill.BlockCracker.Description=K\u0151 ki\u00FCt\u00E9se a kezeiddel +Unarmed.Ability.Bonus.0=Acél-Ököl Stílus +Unarmed.Ability.Bonus.1=+{0} Sebzés Fejlesztés +Unarmed.Ability.IronGrip.Attacker=Az ellenfeled Vas-Markolással rendelkezik! +Unarmed.Ability.IronGrip.Defender=&aA Vas-Markolásodnak hála nem lettél Lefegyverezve! +Unarmed.Ability.Lower=&7Leengeded az ökleidet. +Unarmed.Ability.Ready=&6Előkészíted&3 az ökleidet. +Unarmed.SubSkill.Berserk.Name=Vadulás +Unarmed.SubSkill.Berserk.Description=+50% Sebzés, Széttöri a gyenge anyagokat +Unarmed.SubSkill.Berserk.Stat=Vadulás Hossza +Unarmed.SubSkill.Disarm.Name=Lefegyverzés (Játékosok) +Unarmed.SubSkill.Disarm.Description=Ellenfeleid elejtik a kezükben levő tárgyakat +Unarmed.SubSkill.Disarm.Stat=Esély Lefegyverzésre +Unarmed.SubSkill.UnarmedLimitBreak.Name=Pusztakezek Korlát Átlépés +Unarmed.SubSkill.UnarmedLimitBreak.Description=Lépj túl a korlátaidon. Megnövekedett sebzés a kemény ellenfelek ellen. A PVP-hez tervezték attól függetlenül, hogy a szerver beállítási növelik-e, vagy sem a PVE sebzést. +Unarmed.SubSkill.UnarmedLimitBreak.Stat=Max Sebzés Korlát Átlépéssel +Unarmed.SubSkill.SteelArmStyle.Name=Acél-Ököl Stílus +Unarmed.SubSkill.SteelArmStyle.Description=Idővel megkeményíti az ökleidet +Unarmed.SubSkill.ArrowDeflect.Name=Nyilak Kitérítése +Unarmed.SubSkill.ArrowDeflect.Description=Nyilak Kitérítése +Unarmed.SubSkill.ArrowDeflect.Stat=Esély Nyilak Kitérítésére +Unarmed.SubSkill.IronGrip.Name=Vas-Markolás +Unarmed.SubSkill.IronGrip.Description=Megakadályozza, hogy Lefegyvereződj +Unarmed.SubSkill.IronGrip.Stat=Esély Vas-Markolásra +Unarmed.SubSkill.BlockCracker.Name=Blokktörő +Unarmed.SubSkill.BlockCracker.Description=Kő kiütése a kezeiddel Unarmed.Listener=Pusztakezek: Unarmed.SkillName=PUSZTAKEZEK -Unarmed.Skills.Berserk.Off=**Vadul\u00E1s v\u00E9get \u00E9rt** -Unarmed.Skills.Berserk.On=[[GREEN]]**VADUL\u00C1S AKTIV\u00C1LVA** -Unarmed.Skills.Berserk.Other.Off=Vadul\u00E1s[[GREEN]] kikapcsolva: [[YELLOW]]{0} -Unarmed.Skills.Berserk.Other.On=[[GREEN]]{0}[[DARK_GREEN]] haszn\u00E1lta a [[RED]]Vadul\u00E1s [[DARK_GREEN]]k\u00E9pess\u00E9get! -Unarmed.Skills.Berserk.Refresh=[[GREEN]]A [[YELLOW]]Vadul\u00E1s [[GREEN]]k\u00E9pess\u00E9ged ism\u00E9t el\u00E9rhet\u0151! +Unarmed.Skills.Berserk.Off=**Vadulás véget ért** +Unarmed.Skills.Berserk.On=&a**VADULÁS AKTIVÁLVA** +Unarmed.Skills.Berserk.Other.Off=Vadulás&a kikapcsolva: &e{0} +Unarmed.Skills.Berserk.Other.On=&a{0}&2 használta a &cVadulás &2képességet! +Unarmed.Skills.Berserk.Refresh=&aA &eVadulás &aképességed ismét elérhető! #WOODCUTTING -Woodcutting.Ability.0=Lev\u00E9lf\u00FAj\u00F3 -Woodcutting.Ability.1=Elf\u00FAjja a leveleket az \u00FAtb\u00F3l -Woodcutting.Ability.Locked.0=LEZ\u00C1RVA {0}+ K\u00C9PESS\u00C9G SZINTIG (LEV\u00C9LF\u00DAJ\u00D3) -Woodcutting.SubSkill.TreeFeller.Name=Fad\u00F6nt\u00E9s -Woodcutting.SubSkill.TreeFeller.Description=Felrobbantja a f\u00E1kat -Woodcutting.SubSkill.TreeFeller.Stat=Fad\u00F6nt\u00E9s Hossza -Woodcutting.SubSkill.LeafBlower.Name=Lev\u00E9lf\u00FAj\u00F3 -Woodcutting.SubSkill.LeafBlower.Description=Elf\u00FAjja a leveleket az \u00FAtb\u00F3l -Woodcutting.SubSkill.HarvestLumber.Name=Dupla T\u00E1rgyak -Woodcutting.SubSkill.HarvestLumber.Description=Dupla Zs\u00E1km\u00E1ny -Woodcutting.SubSkill.HarvestLumber.Stat=Es\u00E9ly Dupla T\u00E1rgy-es\u00E9sre -Woodcutting.SubSkill.Splinter.Name=Szil\u00E1nk -Woodcutting.SubSkill.Splinter.Description=Fakiv\u00E1g\u00E1s m\u00E9g hat\u00E9konyabban. -Woodcutting.SubSkill.BarkSurgeon.Name=K\u00E9reg Seb\u00E9sz -Woodcutting.SubSkill.BarkSurgeon.Description=Fakiv\u00E1g\u00E1s\u00E9rt hasznos t\u00E1rgyakat kaphatsz. -Woodcutting.SubSkill.NaturesBounty.Name=Term\u00E9szetszeret\u0151 -Woodcutting.SubSkill.NaturesBounty.Description=Gy\u0171jts tapasztalatot a term\u00E9szetb\u0151l. -Woodcutting.Listener=Fav\u00E1g\u00E1s: -Woodcutting.SkillName=FAV\u00C1G\u00C1S -Woodcutting.Skills.TreeFeller.Off=**Fad\u00F6nt\u00E9s v\u00E9get \u00E9rt** -Woodcutting.Skills.TreeFeller.On=[[GREEN]]**FAD\u00D6NT\u00C9S AKTIV\u00C1LVA** -Woodcutting.Skills.TreeFeller.Refresh=[[GREEN]]A [[YELLOW]]Fad\u00F6nt\u00E9s [[GREEN]]k\u00E9pess\u00E9ged ism\u00E9t el\u00E9rhet\u0151! -Woodcutting.Skills.TreeFeller.Other.Off=Fad\u00F6nt\u00E9s[[GREEN]] kikapcsolva: [[YELLOW]]{0} -Woodcutting.Skills.TreeFeller.Other.On=[[GREEN]]{0}[[DARK_GREEN]] haszn\u00E1lta a [[RED]]Fad\u00F6nt\u00E9s [[DARK_GREEN]]k\u00E9pess\u00E9get! -Woodcutting.Skills.TreeFeller.Splinter=A BALT\u00C1D TUCATNYI DARABOKRA ESIK SZ\u00C9T! -Woodcutting.Skills.TreeFeller.Threshold=Ez a fa t\u00FAl nagy! +Woodcutting.Ability.0=Levélfújó +Woodcutting.Ability.1=Elfújja a leveleket az útból +Woodcutting.Ability.Locked.0=LEZÁRVA {0}+ KÉPESSÉG SZINTIG (LEVÉLFÚJÓ) +Woodcutting.SubSkill.TreeFeller.Name=Fadöntés +Woodcutting.SubSkill.TreeFeller.Description=Felrobbantja a fákat +Woodcutting.SubSkill.TreeFeller.Stat=Fadöntés Hossza +Woodcutting.SubSkill.LeafBlower.Name=Levélfújó +Woodcutting.SubSkill.LeafBlower.Description=Elfújja a leveleket az útból +Woodcutting.SubSkill.KnockOnWood.Name=Fa Kopogtatás +Woodcutting.SubSkill.KnockOnWood.Description=Keress további finomságokat a Fadöntés használatakor +Woodcutting.SubSkill.KnockOnWood.Stat=Fa Kopogtatás +Woodcutting.SubSkill.KnockOnWood.Loot.Normal=Standard zsákmány a fáktól +Woodcutting.SubSkill.KnockOnWood.Loot.Rank2=Standard zsákmány és tapasztalat pontok a fáktól +Woodcutting.SubSkill.HarvestLumber.Name=Dupla Tárgyak +Woodcutting.SubSkill.HarvestLumber.Description=Dupla Zsákmány +Woodcutting.SubSkill.HarvestLumber.Stat=Esély Dupla Tárgy-esésre +Woodcutting.SubSkill.Splinter.Name=Szilánk +Woodcutting.SubSkill.Splinter.Description=Fakivágás még hatékonyabban. +Woodcutting.SubSkill.BarkSurgeon.Name=Kéreg Sebész +Woodcutting.SubSkill.BarkSurgeon.Description=Fakivágásért hasznos tárgyakat kaphatsz. +Woodcutting.SubSkill.NaturesBounty.Name=Természetszerető +Woodcutting.SubSkill.NaturesBounty.Description=Gyűjts tapasztalatot a természetből. +Woodcutting.Listener=Favágás: +Woodcutting.SkillName=FAVÁGÁS +Woodcutting.Skills.TreeFeller.Off=**Fadöntés véget ért** +Woodcutting.Skills.TreeFeller.On=&a**FADÖNTÉS AKTIVÁLVA** +Woodcutting.Skills.TreeFeller.Refresh=&aA &eFadöntés &aképességed ismét elérhető! +Woodcutting.Skills.TreeFeller.Other.Off=Fadöntés&a kikapcsolva: &e{0} +Woodcutting.Skills.TreeFeller.Other.On=&a{0}&2 használta a &cFadöntés &2képességet! +Woodcutting.Skills.TreeFeller.Splinter=A BALTÁD TUCATNYI DARABOKRA ESIK SZÉT! +Woodcutting.Skills.TreeFeller.Threshold=Ez a fa túl nagy! #ABILITIY #COMBAT -Combat.ArrowDeflect=[[WHITE]]**NY\u00CDL ELH\u00C1R\u00CDTVA** -Combat.BeastLore=[[GREEN]]**VAD\u00C1LLAT TAN** -Combat.BeastLoreHealth=[[DARK_AQUA]]\u00C9let ([[GREEN]]{0}[[DARK_AQUA]]/{1}) -Combat.BeastLoreOwner=[[DARK_AQUA]]Tulajdonos ([[RED]]{0}[[DARK_AQUA]]) -Combat.BeastLoreHorseSpeed=[[DARK_AQUA]]L\u00F3 Mozg\u00E1si Sebess\u00E9g ([[GREEN]]{0} blokk/m\u00E1sodperc[[DARK_AQUA]]) -Combat.BeastLoreHorseJumpStrength=[[DARK_AQUA]]L\u00F3ugr\u00E1s ereje ([[GREEN]]Max {0} blokk[[DARK_AQUA]]) -Combat.Gore=[[GREEN]]**LED\u00D6FVE** -Combat.StruckByGore=**LED\u00D6FTEK** -Combat.TargetDazed=A c\u00E9lpont [[DARK_RED]]Elk\u00E1bult -Combat.TouchedFuzzy=[[DARK_RED]]Bolyhost \u00E9rintett, K\u00E1bults\u00E1got \u00E9rzett. +Combat.ArrowDeflect=&f**NYÍL ELHÁRÍTVA** +Combat.BeastLore=&a**VADÁLLAT TAN** +Combat.BeastLoreHealth=&3Élet (&a{0}&3/{1}) +Combat.BeastLoreOwner=&3Tulajdonos (&c{0}&3) +Combat.BeastLoreHorseSpeed=&3Ló Mozgási Sebesség (&a{0} blokk/másodperc&3) +Combat.BeastLoreHorseJumpStrength=&3Lóugrás ereje (&aMax {0} blokk&3) +Combat.Gore=&a**LEDÖFVE** +Combat.StruckByGore=**LEDÖFTEK** +Combat.TargetDazed=A célpont &4Elkábult +Combat.TouchedFuzzy=&4Bolyhost érintett, Kábultságot érzett. #COMMANDS ##generic -mcMMO.Description=[[DARK_AQUA]]Az [[YELLOW]]mcMMO[[DARK_AQUA]] Projektr\u0151l:,[[GOLD]]Az mcMMO egy [[RED]]ny\u00EDlt forr\u00E1sk\u00F3d\u00FA[[GOLD]] RPG m\u00F3d, amit 2011 febru\u00E1rj\u00E1ban alap\u00EDtott [[BLUE]]nossr50[[GOLD]]. A c\u00E9l a min\u0151s\u00E9gi RPG \u00E9lm\u00E9ny biztos\u00EDt\u00E1sa.,[[DARK_AQUA]]Tippek:,[[GOLD]] - [[GREEN]]Haszn\u00E1ld a [[RED]]/mcmmo help[[GREEN]] parancsot a parancsok megtekint\u00E9s\u00E9hez,[[GOLD]] - [[GREEN]]\u00CDrd be a [[RED]]/K\u00C9PESS\u00C9GN\u00C9V[[GREEN]] parancsot a r\u00E9szletes k\u00E9pess\u00E9ginform\u00E1ci\u00F3khoz,[[DARK_AQUA]]Fejleszt\u0151k:,[[GOLD]] - [[GREEN]]nossr50 [[BLUE]](Alap\u00EDt\u00F3 & Projektvezet\u0151),[[GOLD]] - [[GREEN]]electronicboy [[BLUE]](Fejleszt\u0151),[[GOLD]] - [[GREEN]]kashike [[BLUE]](Fejleszt\u0151),[[GOLD]] - [[GREEN]]t00thpick1 [[BLUE]](Classic Karbantart\u00F3) -mcMMO.Description.FormerDevs=[[DARK_AQUA]]Kor\u00E1bbi Fejleszt\u0151k: [[GREEN]]GJ, NuclearW, bm01, TfT_02, Glitchfinder -Commands.addlevels.AwardAll.1=[[GREEN]]El\u00E9rt\u00E9l {0} szintet az \u00F6sszes k\u00E9pess\u00E9gben! -Commands.addlevels.AwardAll.2=Minden k\u00E9pess\u00E9gszint \u00E1t lett \u00E1ll\u00EDtva a k\u00F6vetkez\u0151re: {0}. -Commands.addlevels.AwardSkill.1=[[GREEN]]El\u00E9rt\u00E9l {0} szintet a k\u00F6vetkez\u0151ben {1}! -Commands.addlevels.AwardSkill.2={0} \u00E1t\u00E1ll\u00EDtva {1}. -Commands.addxp.AwardAll=[[GREEN]]El\u00E9rt\u00E9l {0} tapasztalatot az \u00F6sszes k\u00E9pess\u00E9gben! -Commands.addxp.AwardSkill=[[GREEN]]El\u00E9rt\u00E9l {0} tapasztalatot a k\u00F6vetkez\u0151ben {1}! -Commands.Ability.Off=K\u00E9pess\u00E9g haszn\u00E1lat [[RED]]kikapcsolva. -Commands.Ability.On=K\u00E9pess\u00E9g haszn\u00E1lat [[GREEN]]bekapcsolva. -Commands.Ability.Toggle=K\u00E9pess\u00E9g haszn\u00E1lat kikapcsolva [[YELLOW]]{0} -Commands.AdminChat.Off=Admin Chat [[RED]] kikapcsolva. -Commands.AdminChat.On=Admin Chat [[GREEN]] bekapcsolva. -Commands.AdminToggle=[[GREEN]]- Admin chat \u00E1ll\u00EDt\u00E1sa. +mcMMO.Description=&3Az &emcMMO&3 Projektről:,&6Az mcMMO egy &cnyílt forráskódú&6 RPG mód, amit 2011 februárjában alapított &9nossr50&6. A cél a minőségi RPG élmény biztosítása.,&3Tippek:,&6 - &aHasználd a &c/mcmmo help&a parancsot a parancsok megtekintéséhez,&6 - &aÍrd be a &c/KÉPESSÉGNÉV&a parancsot a részletes képességinformációkhoz,&3Fejlesztők:,&6 - &anossr50 &9(Alapító & Projektvezető),&6 - &aelectronicboy &9(Fejlesztő),&6 - &akashike &9(Fejlesztő),&6 - &at00thpick1 &9(Classic Karbantartó) +mcMMO.Description.FormerDevs=&3Korábbi Fejlesztők: &aGJ, NuclearW, bm01, TfT_02, Glitchfinder +Commands.addlevels.AwardAll.1=&aElértél {0} szintet az összes képességben! +Commands.addlevels.AwardAll.2=Minden képességszint át lett állítva a következőre: {0}. +Commands.addlevels.AwardSkill.1=&aElértél {0} szintet a következőben {1}! +Commands.addlevels.AwardSkill.2={0} átállítva {1}. +Commands.addxp.AwardAll=&aElértél {0} tapasztalatot az összes képességben! +Commands.addxp.AwardSkill=&aElértél {0} tapasztalatot a következőben {1}! +Commands.Ability.Off=Képesség használat &ckikapcsolva. +Commands.Ability.On=Képesség használat &abekapcsolva. +Commands.Ability.Toggle=Képesség használat kikapcsolva &e{0} +Commands.AdminChat.Off=Admin Chat &c kikapcsolva. +Commands.AdminChat.On=Admin Chat &a bekapcsolva. +Commands.AdminToggle=&a- Admin chat állítása. Commands.Chat.Console=*Konzol* -Commands.Cooldowns.Header=[[GOLD]]--= [[GREEN]]mcMMO K\u00E9pess\u00E9g V\u00E1rakoz\u00E1sok[[GOLD]] =-- -Commands.Cooldowns.Row.N=\ [[RED]]{0}[[WHITE]] - [[GOLD]]{1} m\u00E1sodperc maradt -Commands.Cooldowns.Row.Y=\ [[AQUA]]{0}[[WHITE]] - [[DARK_GREEN]]K\u00E9szen \u00E1ll! -Commands.Database.CooldownMS=V\u00E1rnod kell {0} ezredm\u00E1sodpercet, miel\u0151tt ism\u00E9t haszn\u00E1lod a parancsot. -Commands.Database.Processing=Az el\u0151z\u0151 parancs m\u00E9g feldolgoz\u00E1s alatt \u00E1ll. K\u00E9rlek v\u00E1rj. +Commands.Cooldowns.Header=&6--= &amcMMO Képesség Várakozások&6 =-- +Commands.Cooldowns.Row.N=\ &c{0}&f - &6{1} másodperc maradt +Commands.Cooldowns.Row.Y=\ &b{0}&f - &2Készen áll! +Commands.Database.CooldownMS=Várnod kell {0} ezredmásodpercet, mielőtt ismét használod a parancsot. +Commands.Database.Cooldown=Várnod kell {0} másodpercet, mielőtt ismét használod a parancsot. +Commands.Database.Processing=Az előző parancs még feldolgozás alatt áll. Kérlek várj. Commands.Disabled=Ez a parancs le van tiltva. -Commands.DoesNotExist= [[RED]]A j\u00E1t\u00E9kos nincs az adatb\u00E1zisban! -Commands.GodMode.Disabled=mcMMO Isten m\u00F3d Letiltva. -Commands.GodMode.Enabled=mcMMO Isten m\u00F3d Enged\u00E9lyezve -Commands.AdminChatSpy.Enabled=mcMMO Party Chat Figyel\u00E9s Enged\u00E9lyezve -Commands.AdminChatSpy.Disabled=mcMMO Party Chat Figyel\u00E9s Letiltva -Commands.AdminChatSpy.Toggle=mcMMO Party Chat \u00E1ll\u00EDtva neki [[YELLOW]]{0} -Commands.AdminChatSpy.Chat=[[GOLD]][SPY: [[GREEN]]{0}[[GOLD]]] [[WHITE]]{1} -Commands.GodMode.Forbidden=[mcMMO] Az Isten m\u00F3d nincs enged\u00E9lyezve ebben a vil\u00E1gban (L\u00E1sd jogosults\u00E1gok) -Commands.GodMode.Toggle=Isten m\u00F3d \u00E1t\u00E1ll\u00EDtva [[YELLOW]]{0} -Commands.Healthbars.Changed.HEARTS=[mcMMO] Az \u00E9l\u0151l\u00E9nyek \u00E9leter\u0151cs\u00EDkj\u00E1nak megjelen\u00EDt\u00E9se \u00E1t\u00E1ll\u00EDtva a k\u00F6vetkez\u0151re:[[RED]]Sz\u00EDvek[[WHITE]]. -Commands.Healthbars.Changed.BAR=[mcMMO] Az \u00E9l\u0151l\u00E9nyek \u00E9leter\u0151cs\u00EDkj\u00E1nak megjelen\u00EDt\u00E9se \u00E1t\u00E1ll\u00EDtva a k\u00F6vetkez\u0151re: [[YELLOW]]Dobozok[[WHITE]]. -Commands.Healthbars.Changed.DISABLED=[mcMMO] Az \u00E9l\u0151l\u00E9nyek \u00E9leter\u0151cs\u00EDkja sz\u00E1modra [[GRAY]]kikapcsolva[[WHITE]]. -Commands.Healthbars.Invalid=Nem megfelel\u0151 \u00E9leter\u0151cs\u00EDk t\u00EDpus! -Commands.Inspect= [[GREEN]]- R\u00E9szletesebb inform\u00E1ci\u00F3k a j\u00E1t\u00E9kosr\u00F3l -Commands.Invite.Success=[[GREEN]]A megh\u00EDv\u00E1s sikeresen elk\u00FCldve. -Commands.Leaderboards= [[GREEN]]- Ranglista -Commands.mcgod=[[GREEN]]- Isten m\u00F3d \u00E1ll\u00EDt\u00E1sa -Commands.mchud.Invalid=Ez nem megfelel\u0151 HUD t\u00EDpus. -Commands.mcpurge.Success=[[GREEN]]Az adatb\u00E1zis sikeresen megtiszt\u00EDtva! -Commands.mcrank.Heading=[[GOLD]]-=SZEM\u00C9LYES RANGSOR=- -Commands.mcrank.Overall=\u00D6sszes\u00EDtett[[GREEN]] - [[GOLD]]Szint [[WHITE]]#[[GREEN]]{0} -Commands.mcrank.Player=[[YELLOW]]Helyez\u00E9s [[WHITE]]{0} -Commands.mcrank.Skill=[[YELLOW]]{0}[[GREEN]] - [[GOLD]]Szint [[WHITE]]#[[GREEN]]{1} -Commands.mcrank.Unranked=[[WHITE]]Nincs Rangsorolva -Commands.mcrefresh.Success={0} k\u00E9pess\u00E9ge ism\u00E9t haszn\u00E1lhat\u00F3. -Commands.mcremove.Success=[[GREEN]]{0} sikeresen t\u00F6r\u00F6lve az adatb\u00E1zisb\u00F3l! -Commands.mctop.Tip=[[GOLD]]Tip: Haszn\u00E1ld a [[RED]]/mcrank[[GOLD]] parancsot, hogy megn\u00E9zd a szem\u00E9lyes szintjeid! -Commands.mmoedit=[player] [[GREEN]] - C\u00E9lpont m\u00F3dos\u00EDt\u00E1sa -Commands.mmoedit.AllSkills.1=[[GREEN]]Minden k\u00E9pess\u00E9g szintje {0}-ra/re lett \u00E1ll\u00EDtva! -Commands.mmoedit.Modified.1=[[GREEN]]A szinted a {0}-ban/ben be lett \u00E1ll\u00EDtva {1}-ra/re! -Commands.mmoedit.Modified.2={0} megv\u00E1ltoztatva {1}-ra/re. -Commands.mcconvert.Database.Same=M\u00E1r a(z) {0} adatb\u00E1zist haszn\u00E1lod! -Commands.mcconvert.Database.InvalidType={0} nem egy l\u00E9tez\u0151 adatb\u00E1zis. -Commands.mcconvert.Database.Start=[[GRAY]]Konvert\u00E1l\u00E1s megkezd\u00E9se a {0}-b\u00F3l az {1}-be... -Commands.mcconvert.Database.Finish=[[GRAY]]Adatb\u00E1zis mozgat\u00E1s elk\u00E9sz\u00FClt; az {1} adatb\u00E1zisban most m\u00E1r minden adat szerepel a {0} adatb\u00E1zisb\u00F3l. -Commands.mmoshowdb=A jelenleg haszn\u00E1lt adatb\u00E1zis:[[GREEN]]{0} -Commands.mcconvert.Experience.Invalid=Ismeretlen k\u00E9plet! L\u00E9tez\u0151 k\u00E9pletek t\u00EDpusai: [[GREEN]]LINE\u00C1RIS [[RED]]\u00E9s [[GREEN]]EXPONENCI\u00C1LIS. -Commands.mcconvert.Experience.Same=M\u00E1r a {0} k\u00E9plett\u00EDpust haszn\u00E1lod. -Commands.mcconvert.Experience.Start=[[GRAY]]Konvert\u00E1l\u00E1s megkezd\u00E9se a/az {0} g\u00F6rb\u00E9b\u0151l a/az {1} g\u00F6rb\u00E9be. -Commands.mcconvert.Experience.Finish=[[GRAY]]K\u00E9plet konvert\u00E1l\u00E1s elk\u00E9sz\u00FClt; mostant\u00F3l a/az {0} XP g\u00F6rbe van haszn\u00E1latban. -Commands.ModDescription=[[GREEN]]- R\u00F6vid mod le\u00EDr\u00E1s elolvas\u00E1sa. -Commands.NoConsole=Ez a parancs nem haszn\u00E1lhat\u00F3 konzolb\u00F3l. -Commands.Notifications.Off=K\u00E9pess\u00E9g \u00E9rtes\u00EDt\u00E9s [[RED]]kikapcsolva. -Commands.Notifications.On=K\u00E9pess\u00E9g \u00E9rtes\u00EDt\u00E9s [[GREEN]]bekapcsolva. -Commands.Offline=Ez a parancs nem haszn\u00E1lhat\u00F3 offline j\u00E1t\u00E9kosokon. -Commands.NotLoaded=A profilod m\u00E9g nincs bet\u00F6ltve. -Commands.Party.Status=[[DARK_GRAY]]N\u00C9V: [[WHITE]]{0} {1} [[DARK_GRAY]]SZINT: [[DARK_AQUA]]{2} -Commands.Party.Status.Alliance=[[DARK_GRAY]]SZ\u00D6VETS\u00C9GES: [[WHITE]]{0} -Commands.Party.UnlockedFeatures=[[DARK_GRAY]]Feloldott Funkci\u00F3k: [[GRAY]][[ITALIC]]{0} -Commands.Party.ShareMode=[[DARK_GRAY]]Osztoz\u00E1s m\u00F3d: -Commands.Party.ItemShare=[[GRAY]]T\u00C1RGY [[DARK_AQUA]]({0}) -Commands.Party.ExpShare=[[GRAY]]TAPASZTALAT [[DARK_AQUA]]({0}) -Commands.Party.ItemShareCategories=[[DARK_GRAY]]T\u00E1rgyak Megoszt\u00E1sa: [[GRAY]][[ITALIC]]{0} -Commands.Party.MembersNear=[[DARK_GRAY]]A K\u00D6ZELEDBEN [[DARK_AQUA]]{0}[[DARK_GRAY]]/[[DARK_AQUA]]{1} -Commands.Party.Accept=[[GREEN]]- Party felk\u00E9r\u00E9s elfogad\u00E1sa -Commands.Party.Chat.Off=Csak party Chat [[RED]]kikapcsolva -Commands.Party.Chat.On=Csak party Chat [[GREEN]]bekapcsolva -Commands.Party.Commands=[[RED]]---[][[GREEN]]PARTY PARANCSOK[[RED]][]--- -Commands.Party.Invite.0=[[RED]]FIGYELEM: [[GREEN]]Party felk\u00E9r\u00E9st kapt\u00E1l a(z) {0}-ba/be {1}-t\u00F3l/t\u0151l. -Commands.Party.Invite.1=[[YELLOW]]\u00CDrd be, hogy [[GREEN]]/party accept[[YELLOW]] a megh\u00EDv\u00E1s elfogad\u00E1s\u00E1hoz. -Commands.Party.Invite=[[GREEN]]- Party megh\u00EDv\u00E1s k\u00FCld\u00E9se. -Commands.Party.Invite.Accepted=[[GREEN]]Megh\u00EDv\u00E1s elfogadva. Bel\u00E9pt\u00E9l a(z) {0} partyba. -Commands.Party.Join=[[GRAY]]Bel\u00E9pt\u00E9l a partyba: {0} -Commands.Party.PartyFull=[[GOLD]]{0}[[RED]] tele van! -Commands.Party.PartyFull.Invite=Nem lehet megh\u00EDvni [[YELLOW]]{0}[[RED]]-t ide [[GREEN]]{1}[[RED]] mert m\u00E1r van [[DARK_AQUA]]{2}[[RED]] j\u00E1t\u00E9kos bent! -Commands.Party.PartyFull.InviteAccept=Nem lehet bel\u00E9pni ide [[GREEN]]{0}[[RED]] mert m\u00E1r van [[DARK_AQUA]]{1}[[RED]] j\u00E1t\u00E9kos bent! -Commands.Party.Create=[[GRAY]]Elk\u00E9sz\u00EDtetted: {0} -Commands.Party.Rename=[[GRAY]]Party n\u00E9v megv\u00E1ltoztatva: [[WHITE]]{0}-ra/re. -Commands.Party.SetSharing=[[GRAY]]Party {0} osztoz\u00E1s be\u00E1ll\u00EDtva: [[DARK_AQUA]]{1}-ra/re. -Commands.Party.ToggleShareCategory=[[GRAY]]Party t\u00E1rgy megoszt\u00E1s a [[GOLD]]{0}-ra/re [[GRAY]]be\u00E1ll\u00EDtva [[DARK_AQUA]]{1}-ra/re. -Commands.Party.AlreadyExists=[[DARK_RED]]A {0} party m\u00E1r l\u00E9tezik! -Commands.Party.Kick=[[RED]]Ki lett\u00E9l r\u00FAgva a {0} partyb\u00F3l! -Commands.Party.Leave=[[YELLOW]]Elhagytad a partyt. -Commands.Party.Members.Header=[[RED]]-----[][[GREEN]]TAGOK[[RED]][]----- -Commands.Party.None=[[RED]]Nem vagy tagja egy partynak sem. -Commands.Party.Quit=[[GREEN]]- Jelenlegi party elhagy\u00E1sa. -Commands.Party.Teleport=[[GREEN]]- party taghoz val\u00F3 teleport\u00E1l\u00E1s. -Commands.Party.Toggle=[[GREEN]]- party Chat ki/be kapcsol\u00E1sa -Commands.Party1=[[GREEN]]- \u00DAj party l\u00E9trehoz\u00E1sa. -Commands.Party2=[[GREEN]]- Egy j\u00E1t\u00E9kos partyj\u00E1hoz val\u00F3 csatlakoz\u00E1s. -Commands.Party.Alliance.Header=[[RED]]-----[][[GREEN]]PARTY SZ\u00D6VETS\u00C9G[[RED]][]----- -Commands.Party.Alliance.Ally=[[WHITE]]{0} [[DARK_GRAY]]SZ\u00D6VETS\u00C9GES VELE: [[WHITE]]{1} -Commands.Party.Alliance.Members.Header=[[RED]]-----[][[GREEN]]SZ\u00D6VETS\u00C9G TAGJAI:[[RED]][]----- -Commands.Party.Alliance.Invite.0=FIGYELEM: [[GREEN]]A {0} partyhoz sz\u00F6vets\u00E9g megh\u00EDv\u00E1st kapt\u00E1l {1}-t\u00F3l/t\u0151l. -Commands.Party.Alliance.Invite.1=\u00CDrd be, hogy [[GREEN]]/party alliance accept[[YELLOW]] a megh\u00EDv\u00E1s elfogad\u00E1s\u00E1hoz. -Commands.Party.Alliance.Invite.Accepted=[[GREEN]]Sz\u00F6vets\u00E9g megh\u00EDv\u00E1s elfogadva. -Commands.Party.Alliance.None=[[RED]]A partydnak nincsenek sz\u00F6vets\u00E9gesei. -Commands.Party.Alliance.AlreadyAllies=[[RED]]A partydnak m\u00E1r van egy sz\u00F6vets\u00E9gese. Sz\u00F6vets\u00E9g felbont\u00E1sa: [[DARK_AQUA]]/party alliance disband -Commands.Party.Alliance.Help.0=[[RED]]Ez a party m\u00E9g nem szerzett sz\u00F6vets\u00E9gest. H\u00EDvj meg egy party vezet\u0151t. -Commands.Party.Alliance.Help.1=[[RED]] sz\u00F6vets\u00E9g l\u00E9trehoz\u00E1sa: [[DARK_AQUA]]/party alliance invite [[RED]]. -Commands.ptp.Enabled=Party teleport\u00E1l\u00E1s [[GREEN]]enged\u00E9lyezve. -Commands.ptp.Disabled=Party teleport\u00E1l\u00E1s [[RED]]letiltva. -Commands.ptp.NoRequests=[[RED]]Jelenleg nincs teleport felk\u00E9r\u00E9sed. -Commands.ptp.NoWorldPermissions=[[RED]][mcMMO] Nincs jogod a {0} vil\u00E1gba teleport\u00E1lni. -Commands.ptp.Request1=[[YELLOW]]{0} [[GREEN]]teleport felk\u00E9r\u00E9st k\u00FCld\u00F6tt. -Commands.ptp.Request2=[[GREEN]]Teleport\u00E1l\u00E1shoz \u00EDrd be, hogy [[YELLOW]]/ptp accept[[GREEN]]. A felk\u00E9r\u00E9s lej\u00E1r [[RED]]{0} [[GREEN]] m\u00E1sodperc m\u00FAlva. -Commands.ptp.AcceptAny.Enabled=Party teleport felk\u00E9r\u00E9s meger\u0151s\u00EDt\u00E9se [[GREEN]]enged\u00E9lyezve. -Commands.ptp.AcceptAny.Disabled=Party teleport felk\u00E9r\u00E9s meger\u0151s\u00EDt\u00E9se [[RED]]letiltva. -Commands.ptp.RequestExpired=[[RED]]A party teleport felk\u00E9r\u00E9s lej\u00E1rt. -Commands.PowerLevel.Leaderboard=[[YELLOW]]--mcMMO[[BLUE]] Er\u0151 Szint [[YELLOW]]Toplista-- -Commands.PowerLevel.Capped=[[DARK_RED]]ER\u0150 SZINT: [[GREEN]]{0} [[DARK_RED]]MAX SZINT: [[YELLOW]]{1} -Commands.PowerLevel=[[DARK_RED]]ER\u0150 SZINT: [[GREEN]]{0} -Commands.Reset.All=[[GREEN]]Minden k\u00E9pess\u00E9ged sikeresen null\u00E1zva. -Commands.Reset.Single=[[GREEN]]A {0} k\u00E9pess\u00E9ged szintje sikeresen null\u00E1zva. -Commands.Reset=[[GREEN]]- K\u00E9pess\u00E9g szintj\u00E9nek null\u00E1z\u00E1sa. -Commands.Scoreboard.Clear=[[DARK_AQUA]]mcMMO scoreboard elt\u00FCntetve. -Commands.Scoreboard.NoBoard=[[RED]]Az mcMMO scoreboard nem akt\u00EDv. -Commands.Scoreboard.Keep=[[DARK_AQUA]]Az mcMMO scoreboard l\u00E1that\u00F3 marad, az elt\u00FCntet\u00E9shez haszn\u00E1ld a [[GREEN]]/mcscoreboard clear[[DARK_AQUA]] parancsot. -Commands.Scoreboard.Timer=[[DARK_AQUA]]Az mcMMO scoreboard [[GOLD]]{0}[[DARK_AQUA]] m\u00E1sodperc m\u00FAlva t\u00F6rl\u0151dik. -Commands.Scoreboard.Help.0=[[GOLD]] == [[GREEN]]Seg\u00EDts\u00E9g: [[RED]]/mcscoreboard[[GOLD]] == -Commands.Scoreboard.Help.1=[[DARK_AQUA]]/mcscoreboard[[AQUA]] clear [[WHITE]] - az mcMMO scoreboard elt\u00FCntet\u00E9se. -Commands.Scoreboard.Help.2=[[DARK_AQUA]]/mcscoreboard[[AQUA]] keep [[WHITE]] - az mcMMO scoreboard fenntart\u00E1sa. -Commands.Scoreboard.Help.3=[[DARK_AQUA]]/mcscoreboard[[AQUA]] time [n] [[WHITE]] - az mcMMO scoreboard elt\u00FCntet\u00E9se [[LIGHT_PURPLE]]n[[WHITE]] m\u00E1sodperc m\u00FAlva. -Commands.Scoreboard.Tip.Keep=[[GOLD]]Tipp: Haszn\u00E1ld a [[RED]]/mcscoreboard keep[[GOLD]] parancsot, m\u00EDg l\u00E1that\u00F3 a scoreboard, hogy ne t\u0171nj\u00F6n el. -Commands.Scoreboard.Tip.Clear=[[GOLD]]Tipp: Haszn\u00E1ld a [[RED]]/mcscoreboard clear[[GOLD]] parancsot, hogy elt\u00FCntesd a scoreboard-ot. -Commands.Skill.Invalid=Ez nem l\u00E9tez\u0151 k\u00E9pess\u00E9g n\u00E9v! -Commands.Skill.ChildSkill=Alk\u00E9pess\u00E9gek nem haszn\u00E1lhat\u00F3k ehhez a parancshoz! -Commands.Skill.Leaderboard=--mcMMO [[BLUE]]{0}[[YELLOW]] Toplista-- -Commands.SkillInfo=[[GREEN]]- Egy k\u00E9pess\u00E9g r\u00E9szletes le\u00EDr\u00E1s\u00E1nak megtekint\u00E9se. -Commands.Stats=[[GREEN]]- Az mcMMO statisztik\u00E1k megtekint\u00E9se. -Commands.ToggleAbility=[[GREEN]]- K\u00E9pess\u00E9g kapcsol\u00E1sa jobb kattint\u00E1ssal. -Commands.Usage.0=[[RED]]A helyes haszn\u00E1lat: /{0} -Commands.Usage.1=[[RED]]A helyes haszn\u00E1lat: /{0} {1} -Commands.Usage.2=[[RED]]A helyes haszn\u00E1lat: /{0} {1} {2} -Commands.Usage.3=[[RED]]A helyes haszn\u00E1lat: /{0} {1} {2} {3} +Commands.DoesNotExist= &cA játékos nincs az adatbázisban! +Commands.GodMode.Disabled=mcMMO Isten mód Letiltva. +Commands.GodMode.Enabled=mcMMO Isten mód Engedélyezve +Commands.AdminChatSpy.Enabled=mcMMO Party Chat Figyelés Engedélyezve +Commands.AdminChatSpy.Disabled=mcMMO Party Chat Figyelés Letiltva +Commands.AdminChatSpy.Toggle=mcMMO Party Chat állítva neki &e{0} +Commands.AdminChatSpy.Chat=&6[SPY: &a{0}&6] &f{1} +Commands.GodMode.Forbidden=[mcMMO] Az Isten mód nincs engedélyezve ebben a világban (Lásd jogosultságok) +Commands.GodMode.Toggle=Isten mód átállítva &e{0} +Commands.Healthbars.Changed.HEARTS=[mcMMO] Az élőlények életerőcsíkjának megjelenítése átállítva a következőre:&cSzívek&f. +Commands.Healthbars.Changed.BAR=[mcMMO] Az élőlények életerőcsíkjának megjelenítése átállítva a következőre: &eDobozok&f. +Commands.Healthbars.Changed.DISABLED=[mcMMO] Az élőlények életerőcsíkja számodra &7kikapcsolva&f. +Commands.Healthbars.Invalid=Nem megfelelő életerőcsík típus! +Commands.Inspect= &a- Részletesebb információk a játékosról +Commands.Invite.Success=&aA meghívás sikeresen elküldve. +Commands.Leaderboards= &a- Ranglista +Commands.mcgod=&a- Isten mód állítása +Commands.mchud.Invalid=Ez nem megfelelő HUD típus. +Commands.mcpurge.Success=&aAz adatbázis sikeresen megtisztítva! +Commands.mcrank.Heading=&6-=SZEMÉLYES RANGSOR=- +Commands.mcrank.Overall=Összesített&a - &6Szint &f#&a{0} +Commands.mcrank.Player=&eHelyezés &f{0} +Commands.mcrank.Skill=&e{0}&a - &6Szint &f#&a{1} +Commands.mcrank.Unranked=&fNincs Rangsorolva +Commands.mcrefresh.Success={0} képessége ismét használható. +Commands.mcremove.Success=&a{0} sikeresen törölve az adatbázisból! +Commands.mctop.Tip=&6Tip: Használd a &c/mcrank&6 parancsot, hogy megnézd a személyes szintjeid! +Commands.mmoedit=[player] &a - Célpont módosítása +Commands.mmoedit.AllSkills.1=&aMinden képesség szintje {0}-ra/re lett állítva! +Commands.mmoedit.Modified.1=&aA szinted a {0}-ban/ben be lett állítva {1}-ra/re! +Commands.mmoedit.Modified.2={0} megváltoztatva {1}-ra/re. +Commands.mcconvert.Database.Same=Már a(z) {0} adatbázist használod! +Commands.mcconvert.Database.InvalidType={0} nem egy létező adatbázis. +Commands.mcconvert.Database.Start=&7Konvertálás megkezdése a {0}-ból az {1}-be... +Commands.mcconvert.Database.Finish=&7Adatbázis mozgatás elkészült; az {1} adatbázisban most már minden adat szerepel a {0} adatbázisból. +Commands.mmoshowdb=A jelenleg használt adatbázis:&a{0} +Commands.mcconvert.Experience.Invalid=Ismeretlen képlet! Létező képletek típusai: &aLINEÁRIS &cés &aEXPONENCIÁLIS. +Commands.mcconvert.Experience.Same=Már a {0} képlettípust használod. +Commands.mcconvert.Experience.Start=&7Konvertálás megkezdése a/az {0} görbéből a/az {1} görbébe. +Commands.mcconvert.Experience.Finish=&7Képlet konvertálás elkészült; mostantól a/az {0} XP görbe van használatban. +Commands.ModDescription=&a- Rövid mod leírás elolvasása. +Commands.NoConsole=Ez a parancs nem használható konzolból. +Commands.Notifications.Off=Képesség értesítés &ckikapcsolva. +Commands.Notifications.On=Képesség értesítés &abekapcsolva. +Commands.Offline=Ez a parancs nem használható offline játékosokon. +Commands.NotLoaded=A profilod még nincs betöltve. +Commands.Party.Status=&8NÉV: &f{0} {1} &8SZINT: &3{2} +Commands.Party.Status.Alliance=&8SZÖVETSÉGES: &f{0} +Commands.Party.UnlockedFeatures=&8Feloldott Funkciók: &7&o{0} +Commands.Party.ShareMode=&8Osztozás mód: +Commands.Party.ItemShare=&7TÁRGY &3({0}) +Commands.Party.ExpShare=&7TAPASZTALAT &3({0}) +Commands.Party.ItemShareCategories=&8Tárgyak Megosztása: &7&o{0} +Commands.Party.MembersNear=&8A KÖZELEDBEN &3{0}&8/&3{1} +Commands.Party.Accept=&a- Party felkérés elfogadása +Commands.Party.Chat.Off=Csak party Chat &ckikapcsolva +Commands.Party.Chat.On=Csak party Chat &abekapcsolva +Commands.Party.Commands=&c---[]&aPARTY PARANCSOK&c[]--- +Commands.Party.Invite.0=&cFIGYELEM: &aParty felkérést kaptál a(z) {0}-ba/be {1}-tól/től. +Commands.Party.Invite.1=&eÍrd be, hogy &a/party accept&e a meghívás elfogadásához. +Commands.Party.Invite=&a- Party meghívás küldése. +Commands.Party.Invite.Accepted=&aMeghívás elfogadva. Beléptél a(z) {0} partyba. +Commands.Party.Join=&7Beléptél a partyba: {0} +Commands.Party.PartyFull=&6{0}&c tele van! +Commands.Party.PartyFull.Invite=Nem lehet meghívni &e{0}&c-t ide &a{1}&c mert már van &3{2}&c játékos bent! +Commands.Party.PartyFull.InviteAccept=Nem lehet belépni ide &a{0}&c mert már van &3{1}&c játékos bent! +Commands.Party.Create=&7Elkészítetted: {0} +Commands.Party.Rename=&7Party név megváltoztatva: &f{0}-ra/re. +Commands.Party.SetSharing=&7Party {0} osztozás beállítva: &3{1}-ra/re. +Commands.Party.ToggleShareCategory=&7Party tárgy megosztás a &6{0}-ra/re &7beállítva &3{1}-ra/re. +Commands.Party.AlreadyExists=&4A {0} party már létezik! +Commands.Party.Kick=&cKi lettél rúgva a {0} partyból! +Commands.Party.Leave=&eElhagytad a partyt. +Commands.Party.Members.Header=&c-----[]&aTAGOK&c[]----- +Commands.Party.None=&cNem vagy tagja egy partynak sem. +Commands.Party.Quit=&a- Jelenlegi party elhagyása. +Commands.Party.Teleport=&a- party taghoz való teleportálás. +Commands.Party.Toggle=&a- party Chat ki/be kapcsolása +Commands.Party1=&a- Új party létrehozása. +Commands.Party2=&a- Egy játékos partyjához való csatlakozás. +Commands.Party.Alliance.Header=&c-----[]&aPARTY SZÖVETSÉG&c[]----- +Commands.Party.Alliance.Ally=&f{0} &8SZÖVETSÉGES VELE: &f{1} +Commands.Party.Alliance.Members.Header=&c-----[]&aSZÖVETSÉG TAGJAI:&c[]----- +Commands.Party.Alliance.Invite.0=FIGYELEM: &aA {0} partyhoz szövetség meghívást kaptál {1}-tól/től. +Commands.Party.Alliance.Invite.1=Írd be, hogy &a/party alliance accept&e a meghívás elfogadásához. +Commands.Party.Alliance.Invite.Accepted=&aSzövetség meghívás elfogadva. +Commands.Party.Alliance.None=&cA partydnak nincsenek szövetségesei. +Commands.Party.Alliance.AlreadyAllies=&cA partydnak már van egy szövetségese. Szövetség felbontása: &3/party alliance disband +Commands.Party.Alliance.Help.0=&cEz a party még nem szerzett szövetségest. Hívj meg egy party vezetőt. +Commands.Party.Alliance.Help.1=&c szövetség létrehozása: &3/party alliance invite &c. +Commands.ptp.Enabled=Party teleportálás &aengedélyezve. +Commands.ptp.Disabled=Party teleportálás &cletiltva. +Commands.ptp.NoRequests=&cJelenleg nincs teleport felkérésed. +Commands.ptp.NoWorldPermissions=&c[mcMMO] Nincs jogod a {0} világba teleportálni. +Commands.ptp.Request1=&e{0} &ateleport felkérést küldött. +Commands.ptp.Request2=&aTeleportáláshoz írd be, hogy &e/ptp accept&a. A felkérés lejár &c{0} &a másodperc múlva. +Commands.ptp.AcceptAny.Enabled=Party teleport felkérés megerősítése &aengedélyezve. +Commands.ptp.AcceptAny.Disabled=Party teleport felkérés megerősítése &cletiltva. +Commands.ptp.RequestExpired=&cA party teleport felkérés lejárt. +Commands.PowerLevel.Leaderboard=&e--mcMMO&9 Erő Szint &eToplista-- +Commands.PowerLevel.Capped=&4ERŐ SZINT: &a{0} &4MAX SZINT: &e{1} +Commands.PowerLevel=&4ERŐ SZINT: &a{0} +Commands.Reset.All=&aMinden képességed sikeresen nullázva. +Commands.Reset.Single=&aA {0} képességed szintje sikeresen nullázva. +Commands.Reset=&a- Képesség szintjének nullázása. +Commands.Scoreboard.Clear=&3mcMMO scoreboard eltüntetve. +Commands.Scoreboard.NoBoard=&cAz mcMMO scoreboard nem aktív. +Commands.Scoreboard.Keep=&3Az mcMMO scoreboard látható marad, az eltüntetéshez használd a &a/mcscoreboard clear&3 parancsot. +Commands.Scoreboard.Timer=&3Az mcMMO scoreboard &6{0}&3 másodperc múlva törlődik. +Commands.Scoreboard.Help.0=&6 == &aSegítség: &c/mcscoreboard&6 == +Commands.Scoreboard.Help.1=&3/mcscoreboard&b clear &f - az mcMMO scoreboard eltüntetése. +Commands.Scoreboard.Help.2=&3/mcscoreboard&b keep &f - az mcMMO scoreboard fenntartása. +Commands.Scoreboard.Help.3=&3/mcscoreboard&b time [n] &f - az mcMMO scoreboard eltüntetése &dn&f másodperc múlva. +Commands.Scoreboard.Tip.Keep=&6Tipp: Használd a &c/mcscoreboard keep&6 parancsot, míg látható a scoreboard, hogy ne tűnjön el. +Commands.Scoreboard.Tip.Clear=&6Tipp: Használd a &c/mcscoreboard clear&6 parancsot, hogy eltüntesd a scoreboard-ot. +Commands.XPBar.Reset=&6Az XP sáv beállítások az mcMMO-hoz visszaállítva. +Commands.XPBar.SettingChanged=&6XP sáv beállítások &a{0}&6-nak/nek beállítve erre &a{1} +Commands.Skill.Invalid=Ez nem létező képesség név! +Commands.Skill.ChildSkill=Alképességek nem használhatók ehhez a parancshoz! +Commands.Skill.Leaderboard=--mcMMO &9{0}&e Toplista-- +Commands.SkillInfo=&a- Egy képesség részletes leírásának megtekintése. +Commands.Stats=&a- Az mcMMO statisztikák megtekintése. +Commands.ToggleAbility=&a- Képesség kapcsolása jobb kattintással. +Commands.Usage.0=&cA helyes használat: /{0} +Commands.Usage.1=&cA helyes használat: /{0} {1} +Commands.Usage.2=&cA helyes használat: /{0} {1} {2} +Commands.Usage.3=&cA helyes használat: /{0} {1} {2} {3} +Commands.Usage.3.XP=&cA helyes használat: /{0} {1} {2} {3}&7 (Ha beírod a -s paramétert a parancs végére, akkor a parancs úgy fut le, hogy játékos nem kap róla információt, hatékányan elrejtve ezt) Commands.Usage.FullClassName=classname Commands.Usage.Level=level Commands.Usage.Message=message @@ -720,391 +732,409 @@ Commands.Usage.Rate=rate Commands.Usage.Skill=skill Commands.Usage.SubSkill=subskill Commands.Usage.XP=xp -Commands.Description.mmoinfo=Olvasd el a r\u00E9szleteket a k\u00E9pess\u00E9gekr\u0151l vagy mechanik\u00E1kr\u00F3l. -Commands.MmoInfo.NoMatch=Ez az alk\u00E9pess\u00E9g nem l\u00E9tezik! -Commands.MmoInfo.Mystery=[[GRAY]]M\u00E9g nem oldottad fel ezt a k\u00E9pess\u00E9get, de ha igen, akkor el tudod olvasni a r\u00E9szleteket itt! -Commands.MmoInfo.Header=[[DARK_AQUA]]-=[]=====[][[GOLD]] MMO Inf\u00F3 [[DARK_AQUA]][]=====[]=- -Commands.MmoInfo.SubSkillHeader=[[GOLD]]N\u00E9v:[[YELLOW]] {0} -Commands.MmoInfo.DetailsHeader=[[DARK_AQUA]]-=[]=====[][[GREEN]] R\u00E9szletek [[DARK_AQUA]][]=====[]=- -Commands.MmoInfo.OldSkill=[[GRAY]]Az mcMMO a k\u00E9szs\u00E9geket egy tov\u00E1bbfejlesztett modul\u00E1ris k\u00E9pess\u00E9grendszerr\u00E9 alak\u00EDtj\u00E1k \u00E1t. Sajnos ez a k\u00E9pess\u00E9g m\u00E9g nincs \u00E1tkonvert\u00E1lva, \u00EDgy hi\u00E1nyzik a r\u00E9szletes statisztika. Az \u00FAj rendszer lehet\u0151v\u00E9 teszi az \u00FAj mcMMO k\u00E9szs\u00E9gek gyorsabb kiad\u00E1si idej\u00E9t, \u00E9s a megl\u00E9v\u0151 k\u00E9szs\u00E9gek nagyobb rugalmass\u00E1g\u00E1t. -Commands.MmoInfo.Mechanics=[[DARK_AQUA]]-=[]=====[][[GOLD]] Mechanik\u00E1k [[DARK_AQUA]][]=====[]=- -Commands.MmoInfo.Stats=STATISZTIK\u00C1K: {0} -Commands.Mmodebug.Toggle=Az mcMMO hibakeres\u0151 m\u00F3d most m\u00E1r [[GOLD]]{0}[[GRAY]], haszn\u00E1ld \u00FAjra ezt a parancsot a v\u00E1lt\u00E1shoz. Bekapcsolt hibakeres\u0151 m\u00F3ddal a blokkok meg\u00FCt\u00E9s\u00E9vel hasznos inform\u00E1ci\u00F3kat \u00EDrathatsz ki a blokkokr\u00F3l a kapcsolatfelv\u00E9telhez. -mcMMO.NoInvites=[[RED]]Jelenleg nincsenek megh\u00EDv\u00E1said. -mcMMO.NoPermission=[[DARK_RED]]Nincs enged\u00E9lyed. -mcMMO.NoSkillNote=[[DARK_GRAY]]Ha nincs jogod egy k\u00E9pess\u00E9ghez, akkor az nem fog itt l\u00E1tszani. +Commands.Description.mmoinfo=Olvasd el a részleteket a képességekről vagy mechanikákról. +Commands.MmoInfo.Mystery=&7Még nem oldottad fel ezt a képességet, de ha igen, akkor el tudod olvasni a részleteket itt! +Commands.MmoInfo.NoMatch=Ez az alképesség nem létezik! +Commands.MmoInfo.Header=&3-=[]=====[]&6 MMO Infó &3[]=====[]=- +Commands.MmoInfo.SubSkillHeader=&6Név:&e {0} +Commands.MmoInfo.DetailsHeader=&3-=[]=====[]&a Részletek &3[]=====[]=- +Commands.MmoInfo.OldSkill=&7Az mcMMO a készségeket egy továbbfejlesztett moduláris képességrendszerré alakítják át. Sajnos ez a képesség még nincs átkonvertálva, így hiányzik a részletes statisztika. Az új rendszer lehetővé teszi az új mcMMO készségek gyorsabb kiadási idejét, és a meglévő készségek nagyobb rugalmasságát. +Commands.MmoInfo.Mechanics=&3-=[]=====[]&6 Mechanikák &3[]=====[]=- +Commands.MmoInfo.Stats=STATISZTIKÁK: {0} +Commands.Mmodebug.Toggle=Az mcMMO hibakereső mód most már &6{0}&7, használd újra ezt a parancsot a váltáshoz. Bekapcsolt hibakereső móddal a blokkok megütésével hasznos információkat írathatsz ki a blokkokról a kapcsolatfelvételhez. +mcMMO.NoInvites=&cJelenleg nincsenek meghívásaid. +mcMMO.NoPermission=&4Nincs engedélyed. +mcMMO.NoSkillNote=&8Ha nincs jogod egy képességhez, akkor az nem fog itt látszani. ##party -Party.Forbidden=[mcMMO]A partyk nem enged\u00E9lyezettek ebben a vil\u00E1gban (l\u00E1sd az enged\u00E9lyeket) -Party.Help.0=[[RED]]A megfelel\u0151 haszn\u00E1lat [[DARK_AQUA]]{0} [jelsz\u00F3]. -Party.Help.1=[[RED]]Party l\u00E9trehoz\u00E1s\u00E1\u00E9rt haszn\u00E1ld [[DARK_AQUA]]{0} [jelsz\u00F3]. -Party.Help.2=[[RED]]Haszn\u00E1ld [[DARK_AQUA]]{0} [[RED]] t\u00F6bb inform\u00E1ci\u00F3\u00E9rt. -Party.Help.3=[[RED]]Haszn\u00E1ld [[DARK_AQUA]]{0} [jelsz\u00F3] [[RED]] a csatlakoz\u00E1shoz, vagy [[DARK_AQUA]]{1} [[RED]] a kil\u00E9p\u00E9shez. -Party.Help.4=[[RED]]Haszn\u00E1ld hogy z\u00E1rolhasd/feloldhasd a partyt: [[DARK_AQUA]]{0} -Party.Help.5=[[RED]]Party jelsz\u00F3 megad\u00E1s\u00E1hoz haszn\u00E1ld: [[DARK_AQUA]]{0} -Party.Help.6=[[RED]]Egy j\u00E1t\u00E9kos kir\u00FAg\u00E1s\u00E1hoz haszn\u00E1ld: [[DARK_AQUA]]{0} -Party.Help.7=[[RED]]A party tulajdonjog\u00E1nak \u00E1truh\u00E1z\u00E1s\u00E1hoz haszn\u00E1ld: [[DARK_AQUA]]{0} -Party.Help.8=[[RED]]Hogy feloszlasd a partyt, haszn\u00E1ld: [[DARK_AQUA]]{0} -Party.Help.9=[[RED]]Haszn\u00E1ld [[DARK_AQUA]]{0} [[RED]]hogy enged\u00E9lyezd a t\u00E1rgy megoszt\u00E1s\u00E1t a party tagokkal. -Party.Help.10=[[RED]]Haszn\u00E1ld [[DARK_AQUA]]{0} [[RED]]hogy enged\u00E9lyezd az XP megoszt\u00E1s\u00E1t a party tagokkal. -Party.InformedOnJoin={0} [[GREEN]]Csatlakozott a partyba! -Party.InformedOnQuit={0} [[GREEN]]Kil\u00E9pett a partyb\u00F3l! -Party.InformedOnNameChange=[[GOLD]]{0} [[GREEN]]A party neve sikeresen megv\u00E1ltoztatva erre:[[WHITE]]{1} -Party.InvalidName=[[DARK_RED]]Nincs ilyen party! -Party.Invite.Self=[[RED]]Nem h\u00EDvhatod meg magad! -Party.IsLocked=[[RED]]A party m\u00E1r le van z\u00E1rva! -Party.IsntLocked=[[RED]]Ez a party nincs z\u00E1rva! -Party.Locked=[[RED]]A party z\u00E1rva, csak a vezet\u0151 tud megh\u00EDvni! -Party.NotInYourParty=[[DARK_RED]]{0} nincs a partyban! -Party.NotOwner=[[DARK_RED]]Nem vagy a party vezet\u0151je! -Party.Target.NotOwner=[[DARK_RED]]{0} nem party vezet\u0151. -Party.Owner.New=[[GREEN]]{0} az \u00FAj party vezet\u0151. -Party.Owner.NotLeader=[[DARK_RED]]Mostant\u00F3l nem te vagy a party vezet\u0151je. -Party.Owner.Player =[[GREEN]]Te vagy a party vezet\u0151je. -Party.Password.None=[[RED]]Ez a party jelsz\u00F3val v\u00E9dett. Adj meg jelsz\u00F3t a csatlakoz\u00E1shoz. -Party.Password.Incorrect=[[RED]]Nem egyezik a party jelsz\u00F3! -Party.Password.Set=[[GREEN]]A party jelsz\u00F3 be\u00E1ll\u00EDtva: {0} -Party.Password.Removed=[[GREEN]]party jelsz\u00F3 t\u00F6r\u00F6lve. -Party.Player.Invalid=[[RED]]Nincs ilyen j\u00E1t\u00E9kos! -Party.NotOnline=[[DARK_RED]]{0} nem el\u00E9rhet\u0151! -Party.Player.InSameParty={0} m\u00E1r a partydban van! -Party.PlayerNotInParty=[[DARK_RED]]{0} nincs partyban. -Party.Specify=[[RED]]Meg kell adnod egy partyt. -Party.Teleport.Dead=[[RED]]Nem teleport\u00E1lhatsz halott j\u00E1t\u00E9koshoz! -Party.Teleport.Hurt=[[RED]]Az elm\u00FAlt {0} m\u00E1sodpercben s\u00E9r\u00FClt meg, \u00E9s nem tud teleport\u00E1lni. -Party.Teleport.Player=[[GREEN]]Hozz\u00E1 teleport\u00E1lt\u00E1l: {0}. -Party.Teleport.Self=[[RED]]Nem teleport\u00E1lhatsz magadhoz! -Party.Teleport.Target=[[GREEN]]{0} hozz\u00E1d teleport\u00E1lt. -Party.Teleport.Disabled=[[RED]]{0} nincs enged\u00E9lyezve a party teleport\u00E1l\u00E1s! -Party.Rename.Same=[[RED]]Ez m\u00E1r a partyd neve! -Party.Join.Self=[[RED]]Nem tudsz magadhoz csatlakozni! -Party.Unlocked=[[GRAY]]A party nyitva van. -Party.Disband=[[GRAY]]A party feloszlott. -Party.Alliance.Formed=[[GRAY]]A partyd mostant\u00F3l sz\u00F6vets\u00E9gben van vel\u00FCk: [[GREEN]]{0} -Party.Alliance.Disband=[[GRAY]]A p\u00E1rtod nem sz\u00F6vets\u00E9ges t\u00F6bb\u00E9 vel\u00FCk: [[RED]]{0} -Party.Status.Locked=[[DARK_RED]](MEGH\u00CDV\u00C1S) -Party.Status.Unlocked=[[DARK_GREEN]](NYITVA) -Party.LevelUp=[[YELLOW]]A party szintje n\u0151tt {0} szinttel. \u00D6sszesen: ({1}) -Party.Feature.Chat=Party t\u00E1rsalg\u00F3 -Party.Feature.Teleport=Party teleport\u00E1l\u00E1s -Party.Feature.Alliance=Sz\u00F6vets\u00E9gek -Party.Feature.ItemShare=T\u00E1rgy megoszt\u00E1s -Party.Feature.XpShare=XP megoszt\u00E1s -Party.Feature.Locked.Chat=LEZ\u00C1RVA {0}+ SZINTIG (PARTY T\u00C1RSALG\u00D3) -Party.Feature.Locked.Teleport=LEZ\u00C1RVA {0}+ SZINTIG (PARTY TELEPORT\u00C1L\u00C1S) -Party.Feature.Locked.Alliance=LEZ\u00C1RVA {0}+ SZINTIG (SZ\u00D6VETS\u00C9GESEK) -Party.Feature.Locked.ItemShare=LEZ\u00C1RVA {0}+ SZINTIG (T\u00C1RGY MEGOSZT\u00C1S) -Party.Feature.Locked.XpShare=LEZ\u00C1RVA {0}+ SZINTIG (XP MEGOSZT\u00C1S) -Party.Feature.Disabled.1=[[RED]]A party t\u00E1rsalg\u00F3 m\u00E9g nem nyitott. -Party.Feature.Disabled.2=[[RED]]A party teleport\u00E1l\u00E1s m\u00E9g nem nyitott. -Party.Feature.Disabled.3=[[RED]]A party sz\u00F6vets\u00E9g m\u00E9g nem nyitott. -Party.Feature.Disabled.4=[[RED]]A party t\u00E1rgy megoszt\u00E1s m\u00E9g nem nyitott. -Party.Feature.Disabled.5=[[RED]]A party XP megoszt\u00E1s m\u00E9g nem nyitott. +Party.Forbidden=[mcMMO]A partyk nem engedélyezettek ebben a világban (lásd az engedélyeket) +Party.Help.0=&cA megfelelő használat &3{0} [jelszó]. +Party.Help.1=&cParty létrehozásáért használd &3{0} [jelszó]. +Party.Help.2=&cHasználd &3{0} &c több információért. +Party.Help.3=&cHasználd &3{0} [jelszó] &c a csatlakozáshoz, vagy &3{1} &c a kilépéshez. +Party.Help.4=&cHasználd hogy zárolhasd/feloldhasd a partyt: &3{0} +Party.Help.5=&cParty jelszó megadásához használd: &3{0} +Party.Help.6=&cEgy játékos kirúgásához használd: &3{0} +Party.Help.7=&cA party tulajdonjogának átruházásához használd: &3{0} +Party.Help.8=&cHogy feloszlasd a partyt, használd: &3{0} +Party.Help.9=&cHasználd &3{0} &chogy engedélyezd a tárgy megosztását a party tagokkal. +Party.Help.10=&cHasználd &3{0} &chogy engedélyezd az XP megosztását a party tagokkal. +Party.InformedOnJoin={0} &aCsatlakozott a partyba! +Party.InformedOnQuit={0} &aKilépett a partyból! +Party.InformedOnNameChange=&6{0} &aA party neve sikeresen megváltoztatva erre:&f{1} +Party.InvalidName=&4Nincs ilyen party! +Party.Invite.Self=&cNem hívhatod meg magad! +Party.IsLocked=&cA party már le van zárva! +Party.IsntLocked=&cEz a party nincs zárva! +Party.Locked=&cA party zárva, csak a vezető tud meghívni! +Party.NotInYourParty=&4{0} nincs a partyban! +Party.NotOwner=&4Nem vagy a party vezetője! +Party.Target.NotOwner=&4{0} nem party vezető. +Party.Owner.New=&a{0} az új party vezető. +Party.Owner.NotLeader=&4Mostantól nem te vagy a party vezetője. +Party.Owner.Player =&aTe vagy a party vezetője. +Party.Password.None=&cEz a party jelszóval védett. Adj meg jelszót a csatlakozáshoz. +Party.Password.Incorrect=&cNem egyezik a party jelszó! +Party.Password.Set=&aA party jelszó beállítva: {0} +Party.Password.Removed=&aparty jelszó törölve. +Party.Player.Invalid=&cNincs ilyen játékos! +Party.NotOnline=&4{0} nem elérhető! +Party.Player.InSameParty={0} már a partydban van! +Party.PlayerNotInParty=&4{0} nincs partyban. +Party.Specify=&cMeg kell adnod egy partyt. +Party.Teleport.Dead=&cNem teleportálhatsz halott játékoshoz! +Party.Teleport.Hurt=&cAz elmúlt {0} másodpercben sérült meg, és nem tud teleportálni. +Party.Teleport.Player=&aHozzá teleportáltál: {0}. +Party.Teleport.Self=&cNem teleportálhatsz magadhoz! +Party.Teleport.Target=&a{0} hozzád teleportált. +Party.Teleport.Disabled=&c{0} nincs engedélyezve a party teleportálás! +Party.Rename.Same=&cEz már a partyd neve! +Party.Join.Self=&cNem tudsz magadhoz csatlakozni! +Party.Unlocked=&7A party nyitva van. +Party.Disband=&7A party feloszlott. +Party.Alliance.Formed=&7A partyd mostantól szövetségben van velük: &a{0} +Party.Alliance.Disband=&7A pártod nem szövetséges többé velük: &c{0} +Party.Status.Locked=&4(MEGHÍVÁS) +Party.Status.Unlocked=&2(NYITVA) +Party.LevelUp=&eA party szintje nőtt {0} szinttel. Összesen: ({1}) +Party.Feature.Chat=Party társalgó +Party.Feature.Teleport=Party teleportálás +Party.Feature.Alliance=Szövetségek +Party.Feature.ItemShare=Tárgy megosztás +Party.Feature.XpShare=XP megosztás +Party.Feature.Locked.Chat=LEZÁRVA {0}+ SZINTIG (PARTY TÁRSALGÓ) +Party.Feature.Locked.Teleport=LEZÁRVA {0}+ SZINTIG (PARTY TELEPORTÁLÁS) +Party.Feature.Locked.Alliance=LEZÁRVA {0}+ SZINTIG (SZÖVETSÉGESEK) +Party.Feature.Locked.ItemShare=LEZÁRVA {0}+ SZINTIG (TÁRGY MEGOSZTÁS) +Party.Feature.Locked.XpShare=LEZÁRVA {0}+ SZINTIG (XP MEGOSZTÁS) +Party.Feature.Disabled.1=&cA party társalgó még nem nyitott. +Party.Feature.Disabled.2=&cA party teleportálás még nem nyitott. +Party.Feature.Disabled.3=&cA party szövetség még nem nyitott. +Party.Feature.Disabled.4=&cA party tárgy megosztás még nem nyitott. +Party.Feature.Disabled.5=&cA party XP megosztás még nem nyitott. Party.ShareType.Xp=XP -Party.ShareType.Item=T\u00C1RGY +Party.ShareType.Item=TÁRGY Party.ShareMode.None=EGYIK SEM -Party.ShareMode.Equal=EGYENL\u0150 -Party.ShareMode.Random=V\u00C9LETLENSZER\u0170 -Party.ItemShare.Category.Loot=Zs\u00E1km\u00E1ny -Party.ItemShare.Category.Mining=B\u00E1ny\u00E1sz\u00E1s -Party.ItemShare.Category.Herbalism=Gy\u00F3gyn\u00F6v\u00E9nytan -Party.ItemShare.Category.Woodcutting=Fav\u00E1g\u00E1s -Party.ItemShare.Category.Misc=Egy\u00E9b +Party.ShareMode.Equal=EGYENLŐ +Party.ShareMode.Random=VÉLETLENSZERŰ +Party.ItemShare.Category.Loot=Zsákmány +Party.ItemShare.Category.Mining=Bányászás +Party.ItemShare.Category.Herbalism=Gyógynövénytan +Party.ItemShare.Category.Woodcutting=Favágás +Party.ItemShare.Category.Misc=Egyéb ##xp -Commands.XPGain.Acrobatics=Es\u00E9s -Commands.XPGain.Alchemy=B\u00E1jital F\u0151z\u00E9s -Commands.XPGain.Archery=Sz\u00F6rny \u00CDj\u00E1szat -Commands.XPGain.Axes=Sz\u00F6rny \u00F6l\u00E9s (Balta) -Commands.XPGain.Child=A sz\u00FCl\u0151 k\u00E9pess\u00E9gekb\u0151l szerez szinteket -Commands.XPGain.Excavation=\u00C1s\u00E1s \u00E9s kincs tal\u00E1l\u00E1s -Commands.XPGain.Fishing=Hal\u00E1szat -Commands.XPGain.Herbalism=Gy\u00F3gyn\u00F6v\u00E9ny termeszt\u00E9s -Commands.XPGain.Mining=K\u0151 & \u00E9rc b\u00E1ny\u00E1sz\u00E1s -Commands.XPGain.Repair=Jav\u00EDt\u00E1s -Commands.XPGain.Swords=Sz\u00F6rny \u00F6l\u00E9s (Kard) -Commands.XPGain.Taming=Szel\u00EDd\u00EDt\u00E9s -Commands.XPGain.Unarmed=Sz\u00F6rny \u00F6l\u00E9s (k\u00E9z) -Commands.XPGain.Woodcutting=Fav\u00E1g\u00E1s -Commands.XPGain=[[DARK_GRAY]]XP NYERES\u00C9G: [[WHITE]]{0} -Commands.xplock.locked=[[GOLD]]Az XP s\u00E1v most le van z\u00E1rva {0}! -Commands.xplock.unlocked=[[GOLD]]Az XP s\u00E1v most [[GREEN]]FELOLDVA[[GOLD]]! -Commands.xprate.modified=[[RED]]Az XP AR\u00C1NYA m\u00F3dosult {0} -Commands.xprate.over=[[RED]]mcMMO XP szorz\u00F3 esem\u00E9ny V\u00C9GE! -Commands.xprate.proper.0=[[RED]]Az XP sebess\u00E9g v\u00E1ltoztat\u00E1s\u00E1nak megfelel\u0151 haszn\u00E1lata: /xprate -Commands.xprate.proper.1=[[RED]]Az XP-alap\u00E9rtelmezett \u00E9rt\u00E9k helyes vissza\u00E1ll\u00EDt\u00E1sa: /xprate reset -Commands.xprate.proper.2=[[RED]]Adjon meg igaz vagy hamis jelz\u00E9st, hogy jelezze, hogy ez egy xp esem\u00E9ny vagy sem -Commands.NegativeNumberWarn=Ne haszn\u00E1lj negat\u00EDv sz\u00E1mokat! -Commands.Event.Start=[[GREEN]]mcMMO[[GOLD]] Event! -Commands.Event.Stop=[[GREEN]]mcMMO[[DARK_AQUA]] Event V\u00E9ge! -Commands.Event.Stop.Subtitle=[[GREEN]]Rem\u00E9lem j\u00F3l \u00E9rezted magad! -Commands.Event.XP=[[DARK_AQUA]]Az XP szorz\u00F3 [[GOLD]]{0}[[DARK_AQUA]]x! -Commands.xprate.started.0=[[GOLD]]mcMMO XP szorz\u00F3 esem\u00E9ny kezd\u0151d\u00F6tt! -Commands.xprate.started.1=[[GOLD]]mcMMO XP Ar\u00E1nya most: {0}x! +Commands.XPGain.Acrobatics=Esés +Commands.XPGain.Alchemy=Bájital Főzés +Commands.XPGain.Archery=Szörny Íjászat +Commands.XPGain.Axes=Szörny ölés (Balta) +Commands.XPGain.Child=A szülő képességekből szerez szinteket +Commands.XPGain.Excavation=Ásás és kincs találás +Commands.XPGain.Fishing=Halászat +Commands.XPGain.Herbalism=Gyógynövény termesztés +Commands.XPGain.Mining=Kő & érc bányászás +Commands.XPGain.Repair=Javítás +Commands.XPGain.Swords=Szörny ölés (Kard) +Commands.XPGain.Taming=Szelídítés +Commands.XPGain.Unarmed=Szörny ölés (kéz) +Commands.XPGain.Woodcutting=Favágás +Commands.XPGain=&8XP NYERESÉG: &f{0} +Commands.xplock.locked=&6Az XP sáv most le van zárva {0}! +Commands.xplock.unlocked=&6Az XP sáv most &aFELOLDVA&6! +Commands.xprate.modified=&cAz XP ARÁNYA módosult {0} +Commands.xprate.over=&cmcMMO XP szorzó esemény VÉGE! +Commands.xprate.proper.0=&cAz XP sebesség változtatásának megfelelő használata: /xprate +Commands.xprate.proper.1=&cAz XP-alapértelmezett érték helyes visszaállítása: /xprate reset +Commands.xprate.proper.2=&cAdjon meg igaz vagy hamis jelzést, hogy jelezze, hogy ez egy xp esemény vagy sem +Commands.NegativeNumberWarn=Ne használj negatív számokat! +Commands.Event.Start=&amcMMO&6 Event! +Commands.Event.Stop=&amcMMO&3 Event Vége! +Commands.Event.Stop.Subtitle=&aRemélem jól érezted magad! +Commands.Event.XP=&3Az XP szorzó &6{0}&3x! +Commands.xprate.started.0=&6mcMMO XP szorzó esemény kezdődött! +Commands.xprate.started.1=&6mcMMO XP Aránya most: {0}x! # Admin Notifications -Server.ConsoleName=[[YELLOW]][Szerver] -Notifications.Admin.XPRate.Start.Self=[[GRAY]]Be\u00E1ll\u00EDtottad a glob\u00E1lis XP szorz\u00F3t erre [[GOLD]]{0}x -Notifications.Admin.XPRate.End.Self=[[GRAY]]Megszak\u00EDtottad az XP szorz\u00F3 eventet. -Notifications.Admin.XPRate.End.Others={0} [[GRAY]]megszak\u00EDtotta az XP szorz\u00F3 eventet. -Notifications.Admin.XPRate.Start.Others={0} [[GRAY]]elind\u00EDtotta vagy m\u00F3dos\u00EDtotta az XP szorz\u00F3 eventet glob\u00E1lis {1}x szorz\u00F3val -Notifications.Admin.Format.Others=[[GOLD]]([[GREEN]]mcMMO [[DARK_AQUA]]Admin[[GOLD]]) [[GRAY]]{0} -Notifications.Admin.Format.Self=[[GOLD]]([[GREEN]]mcMMO[[GOLD]]) [[GRAY]]{0} +Server.ConsoleName=&e[Szerver] +Notifications.Admin.XPRate.Start.Self=&7Beállítottad a globális XP szorzót erre &6{0}x +Notifications.Admin.XPRate.End.Self=&7Megszakítottad az XP szorzó eventet. +Notifications.Admin.XPRate.End.Others={0} &7megszakította az XP szorzó eventet. +Notifications.Admin.XPRate.Start.Others={0} &7elindította vagy módosította az XP szorzó eventet globális {1}x szorzóval +Notifications.Admin.Format.Others=&6(&amcMMO &3Admin&6) &7{0} +Notifications.Admin.Format.Self=&6(&amcMMO&6) &7{0} # Event -XPRate.Event= [[GOLD]]mcMMO XP szorz\u00F3 event! Az XP ar\u00E1nya {0}x! +XPRate.Event=&6mcMMO XP szorzó event! Az XP aránya {0}x! #GUIDES -Guides.Available=[[GRAY]]A {0} seg\u00EDts\u00E9g el\u00E9rhet\u0151 - haszn\u00E1lat: /{1} ? [oldal] -Guides.Header=[[GOLD]]-=[[GREEN]]{0} Seg\u00EDts\u00E9g[[GOLD]]=- -Guides.Page.Invalid=Nem egy val\u00F3s oldal! -Guides.Page.OutOfRange=Ez az oldal nem l\u00E9tezik, \u00F6sszesen csak {0} oldal van. -Guides.Usage= Haszn\u00E1lat: /{0} ? [oldal] +Guides.Available=&7A {0} segítség elérhető - használat: /{1} ? [oldal] +Guides.Header=&6-=&a{0} Segítség&6=- +Guides.Page.Invalid=Nem egy valós oldal! +Guides.Page.OutOfRange=Ez az oldal nem létezik, összesen csak {0} oldal van. +Guides.Usage= Használat: /{0} ? [oldal] ##Acrobatics -Guides.Acrobatics.Section.0=[[DARK_AQUA]]Az akrobatik\u00E1r\u00F3l:\n[[YELLOW]]Az akrobatika a kecses mozg\u00E1s m\u0171v\u00E9szete az mcMMO-ban.\n[[YELLOW]]Harci \u00E9s k\u00F6rnyezeti b\u00F3nuszokkal l\u00E1t el.\n\n[[DARK_AQUA]]TAPASZTALAT SZERZ\u00C9S:\n[[YELLOW]]Hogy tapasztalathoz juss ebben a k\u00E9pess\u00E9gben, kit\u00E9r\u00E9st kell v\u00E9grehajtanod \n[[YELLOW]]harcban, vagy olyan es\u00E9seket t\u00FAl\u00E9lned, amelyek sebz\u00E9st okoznak. -Guides.Acrobatics.Section.1=[[DARK_AQUA]]Hogyan m\u0171k\u00F6dik a Gurul\u00E1s?\n[[YELLOW]]Passz\u00EDv es\u00E9lyed van arra, hogy a sz\u00E1modra sebz\u00E9st okoz\u00F3 landol\u00E1sokn\u00E1l, \n[[YELLOW]]neg\u00E1ld a s\u00E9r\u00FCl\u00E9st. A guggol\u00E1s lenyomva tart\u00E1sa es\u00E9s k\u00F6zben \n[[YELLOW]] megdupl\u00E1zza az es\u00E9lyeidet.\n[[YELLOW]]Ilyenkor a sima gurul\u00E1s helyett Kecses Gurul\u00E1st hajthatsz v\u00E9gre.\n[[YELLOW]]A Kecses Gurul\u00E1s nagyban hasonl\u00EDt a sima gurul\u00E1shoz, azzal a k\u00FCl\u00F6nbs\u00E9ggel, \n[[YELLOW]]hogy k\u00E9tszer olyan val\u00F3sz\u00EDn\u0171, \u00E9s nagyobb v\u00E9delmet ny\u00FAjt.\n[[YELLOW]]A gurul\u00E1s es\u00E9lye a k\u00E9pess\u00E9ged szintj\u00E9t\u0151l f\u00FCgg. -Guides.Acrobatics.Section.2=[[DARK_AQUA]]Hogyan m\u0171k\u00F6dik a Kit\u00E9r\u00E9s?\n[[YELLOW]]A kit\u00E9r\u00E9s passz\u00EDv es\u00E9lyt ad arra, \n[[YELLOW]]harcban val\u00F3 s\u00E9r\u00FCl\u00E9s eset\u00E9n csak a sebz\u00E9s fel\u00E9t szenvedd el.\n[[YELLOW]]A k\u00E9pess\u00E9ged szintj\u00E9t\u0151l f\u00FCgg. +Guides.Acrobatics.Section.0=&3Az akrobatikáról:\n&eAz akrobatika a kecses mozgás művészete az mcMMO-ban.\n&eHarci és környezeti bónuszokkal lát el.\n\n&3TAPASZTALAT SZERZÉS:\n&eHogy tapasztalathoz juss ebben a képességben, kitérést kell végrehajtanod \n&eharcban, vagy olyan eséseket túlélned, amelyek sebzést okoznak. +Guides.Acrobatics.Section.1=&3Hogyan működik a Gurulás?\n&ePasszív esélyed van arra, hogy a számodra sebzést okozó landolásoknál, \n&enegáld a sérülést. A guggolás lenyomva tartása esés közben \n&e megduplázza az esélyeidet.\n&eIlyenkor a sima gurulás helyett Kecses Gurulást hajthatsz végre.\n&eA Kecses Gurulás nagyban hasonlít a sima guruláshoz, azzal a különbséggel, \n&ehogy kétszer olyan valószínű, és nagyobb védelmet nyújt.\n&eA gurulás esélye a képességed szintjétől függ. +Guides.Acrobatics.Section.2=&3Hogyan működik a Kitérés?\n&eA kitérés passzív esélyt ad arra, \n&eharcban való sérülés esetén csak a sebzés felét szenvedd el.\n&eA képességed szintjétől függ. ##Alchemy -Guides.Alchemy.Section.0=[[DARK_AQUA]]Az alk\u00EDmi\u00E1r\u00F3l:\n[[YELLOW]]Az alk\u00EDmia alapja a b\u00E1jitalf\u0151z\u00E9s.\n[[YELLOW]]Gyors\u00EDtja a b\u00E1jitalf\u0151z\u00E9s folyamat\u00E1t, tov\u00E1bb\u00E1\n[[YELLOW]]lehet\u0151v\u00E9 teszi \u00FAj (eddig) megszerezhetetlen b\u00E1jitalok f\u0151z\u00E9s\u00E9t is.\n\n\n[[DARK_AQUA]]TAPASZTALAT SZERZ\u00C9S:\n[[YELLOW]]Tapasztalat szerz\u00E9shez nem kell m\u00E1s tenned, csak b\u00E1jitalokat f\u0151zn\u00F6d. -Guides.Alchemy.Section.1=[[DARK_AQUA]]Hogyan m\u0171k\u00F6dik a Katal\u00EDzis?\n[[YELLOW]]A Katal\u00EDzis gyors\u00EDtja a b\u00E1jitalok elk\u00E9sz\u00FCl\u00E9s\u00E9t, maxim\u00E1lis \n[[YELLOW]] 4x-es sebess\u00E9get biztos\u00EDt az 1000-es szint el\u00E9r\u00E9sekor.\n[[YELLOW]]Ez a k\u00E9pess\u00E9g a 100-as szinten old\u00F3dik fel. -Guides.Alchemy.Section.2=[[DARK_AQUA]]Hogyan m\u0171k\u00F6dnek a F\u0151zetek?\n[[YELLOW]]A F\u0151zet lehet\u0151v\u00E9 teszi a b\u00E1jitalf\u0151z\u00E9st egyedi hozz\u00E1val\u00F3kkal.\n[[YELLOW]]A hozz\u00E1val\u00F3k a \n[[YELLOW]]rangod n\u00F6veked\u00E9ssel old\u00F3dnak fel. 8 k\u00FCl\u00F6nb\u00F6z\u0151 rang van. -Guides.Alchemy.Section.3=[[DARK_AQUA]]1-es szint\u0171 F\u0151zet hozz\u00E1val\u00F3k:\n[[YELLOW]]\u0150rl\u00E1ngpor, Erjesztett p\u00F3kszem, Szellemk\u00F6nny, V\u00F6r\u00F6sk\u0151,\n[[YELLOW]]Izz\u00F3k\u0151r por, Cukor, Arany dinnye, Arany r\u00E9pa,\n[[YELLOW]]Magmakr\u00E9m, Alvil\u00E1gi bibircs\u00F3k, P\u00F3kszem, Puskapor, Tavir\u00F3zsa,\n[[YELLOW]]G\u00F6mbhal\n[[YELLOW]](Alap b\u00E1jitalok) -Guides.Alchemy.Section.4=[[DARK_AQUA]]2-es szint\u0171 F\u0151zet hozz\u00E1val\u00F3k:\n[[YELLOW]]R\u00E9pa (Siets\u00E9g b\u00E1jital)\n[[YELLOW]]Ny\u00E1lkagoly\u00F3 (F\u00E1radts\u00E1g b\u00E1jital)\n\n[[DARK_AQUA]]3-as szint\u0171 F\u0151zet hozz\u00E1val\u00F3k:\n[[YELLOW]]Kvarc (Abszorpci\u00F3 b\u00E1jital)\n[[YELLOW]]Piros gomba (Magasugr\u00E1s b\u00E1jital) -Guides.Alchemy.Section.5=[[DARK_AQUA]]4-es szint\u0171 F\u0151zet hozz\u00E1val\u00F3k:\n[[YELLOW]]Alma (\u00C9leter\u0151 n\u00F6vel\u0151 b\u00E1jital)\n[[YELLOW]]Rohadt h\u00FAs (\u00C9hs\u00E9g b\u00E1jital)\n\n[[DARK_AQUA]]5-\u00F6s szint\u0171 F\u0151zet hozz\u00E1val\u00F3k:\n[[YELLOW]]Barna gomba (Sz\u00E9d\u00FCl\u00E9s b\u00E1jital)\n[[YELLOW]]Tintazs\u00E1k (Vaks\u00E1g b\u00E1jitala) -Guides.Alchemy.Section.6=[[DARK_AQUA]]6-os szint\u0171 F\u0151zet hozz\u00E1val\u00F3k:\n[[YELLOW]]P\u00E1fr\u00E1ny (J\u00F3llakotts\u00E1g b\u00E1jital)\n\n[[DARK_AQUA]]7-es szint\u0171 F\u0151zet hozz\u00E1val\u00F3k:\n[[YELLOW]]M\u00E9rgez\u0151 krumpli (Elsorvad\u00E1s b\u00E1jital)\n\n[[DARK_AQUA]]8-as szint\u0171 F\u0151zet hozz\u00E1val\u00F3k:\n[[YELLOW]]Aranyalma (V\u00E9delem b\u00E1jital) +Guides.Alchemy.Section.0=&3Az alkímiáról:\n&eAz alkímia alapja a bájitalfőzés.\n&eGyorsítja a bájitalfőzés folyamatát, továbbá\n&elehetővé teszi új (eddig) megszerezhetetlen bájitalok főzését is.\n\n\n&3TAPASZTALAT SZERZÉS:\n&eTapasztalat szerzéshez nem kell más tenned, csak bájitalokat főznöd. +Guides.Alchemy.Section.1=&3Hogyan működik a Katalízis?\n&eA Katalízis gyorsítja a bájitalok elkészülését, maximális \n&e 4x-es sebességet biztosít az 1000-es szint elérésekor.\n&eEz a képesség a 100-as szinten oldódik fel. +Guides.Alchemy.Section.2=&3Hogyan működnek a Főzetek?\n&eA Főzet lehetővé teszi a bájitalfőzést egyedi hozzávalókkal.\n&eA hozzávalók a \n&erangod növekedéssel oldódnak fel. 8 különböző rang van. +Guides.Alchemy.Section.3=&31-es szintű Főzet hozzávalók:\n&eŐrlángpor, Erjesztett pókszem, Szellemkönny, Vöröskő,\n&eIzzókőr por, Cukor, Arany dinnye, Arany répa,\n&eMagmakrém, Alvilági bibircsók, Pókszem, Puskapor, Tavirózsa,\n&eGömbhal\n&e(Alap bájitalok) +Guides.Alchemy.Section.4=&32-es szintű Főzet hozzávalók:\n&eRépa (Sietség bájital)\n&eNyálkagolyó (Fáradtság bájital)\n\n&33-as szintű Főzet hozzávalók:\n&eKvarc (Abszorpció bájital)\n&ePiros gomba (Magasugrás bájital) +Guides.Alchemy.Section.5=&34-es szintű Főzet hozzávalók:\n&eAlma (Életerő növelő bájital)\n&eRohadt hús (Éhség bájital)\n\n&35-ös szintű Főzet hozzávalók:\n&eBarna gomba (Szédülés bájital)\n&eTintazsák (Vakság bájitala) +Guides.Alchemy.Section.6=&36-os szintű Főzet hozzávalók:\n&ePáfrány (Jóllakottság bájital)\n\n&37-es szintű Főzet hozzávalók:\n&eMérgező krumpli (Elsorvadás bájital)\n\n&38-as szintű Főzet hozzávalók:\n&eAranyalma (Védelem bájital) ##Archery -Guides.Archery.Section.0=[[DARK_AQUA]]Az \u00CDj\u00E1szatr\u00F3l:\n[[YELLOW]]Az \u00CDj\u00E1szat az \u00EDjjal val\u00F3 l\u00F6v\u00E9sr\u0151l sz\u00F3l.\n[[YELLOW]]K\u00FCl\u00F6nb\u00F6z\u0151 harci b\u00F3nuszokkal ruh\u00E1z fel, olyanokkal, mint a sebz\u00E9sn\u00F6vel\u00E9s\n[[YELLOW]], ami a szinteddel n\u00F6vekszik, \u00E9s m\u00E1sik elk\u00E1b\u00EDt\u00E1s\u00E1nak k\u00E9pess\u00E9g\u00E9vel.\n[[YELLOW]]. Tov\u00E1bb\u00E1 visszaszerezheted az elhaszn\u00E1lt \n[[YELLOW]]nyilaid egy r\u00E9sz\u00E9t az ellens\u00E9geid holttest\u00E9b\u0151l.\n\n\n[[DARK_AQUA]]TAPASZTALAT SZERZ\u00C9S:\n[[YELLOW]]A tapasztalat szerz\u00E9shez \u00E9l\u0151l\u00E9nyeket vagy \n[[YELLOW]]j\u00E1t\u00E9kosokat kell l\u0151n\u00F6d \u00EDjjal. -Guides.Archery.Section.1=[[DARK_AQUA]]Hogyan m\u0171k\u00F6dik a Pontos L\u00F6v\u00E9s?\n[[YELLOW]]A Pontos L\u00F6v\u00E9s n\u00F6veli a l\u00F6ved\u00E9keid sebz\u00E9s\u00E9t.\n[[YELLOW]]A b\u00F3nusz sebz\u00E9s az \n[[YELLOW]]\u00CDj\u00E1szat szintedt\u0151l f\u00FCgg.\n[[YELLOW]]Alapvet\u0151en a b\u00F3nusz sebz\u00E9sed 10%-kal n\u00F6vekszik\n[[YELLOW]]minden 50. szinten, ami a maxim\u00E1lis 200%-os b\u00F3nusz sebz\u00E9shez vezet. -Guides.Archery.Section.2=[[DARK_AQUA]]Hogyan m\u0171k\u00F6dik a K\u00E1b\u00EDt\u00E1s?\n[[YELLOW]]Passz\u00EDv es\u00E9lyed van elk\u00E1b\u00EDtani m\u00E1s j\u00E1t\u00E9kosokat, \n[[YELLOW]]mikor eltal\u00E1lod \u0151ket. Amikor a k\u00E1b\u00EDt\u00E1s betal\u00E1l, k\u00E9nyszer\u00EDti az ellenfeledet, hogy\n[[YELLOW]]r\u00F6vid id\u0151re egyenesen felfel\u00E9 n\u00E9zzen.\n[[YELLOW]]Egy K\u00E1b\u00EDt\u00F3l\u00F6ved\u00E9k tov\u00E1bbi 4 sebz\u00E9st okoz. (2 sz\u00EDv). -Guides.Archery.Section.3=[[DARK_AQUA]]Hogyan m\u0171k\u00F6dik a ny\u00EDlvessz\u0151 visszaszerz\u00E9se?\n[[YELLOW]]Passz\u00EDv es\u00E9lyed van visszaszerezni az elhaszn\u00E1lt ny\u00EDlvessz\u0151idet\n[[YELLOW]], amikor meg\u00F6lsz egy \u00E9l\u0151l\u00E9nyt az \u00EDjaddal.\n[[YELLOW]]Ennek az es\u00E9lye az \u00CDj\u00E1szat szinteddel egy\u00FCtt n\u00F6vekszik.\n[[YELLOW]]Alapvet\u0151en 0.1%-kal n\u00F6vekszik szintenk\u00E9nt, ami a maxim\u00E1lis 100%-hoz vezet\n[[YELLOW]] az 1000-es szint el\u00E9r\u00E9sekor. +Guides.Archery.Section.0=&3Az Íjászatról:\n&eAz Íjászat az íjjal való lövésről szól.\n&eKülönböző harci bónuszokkal ruház fel, olyanokkal, mint a sebzésnövelés\n&e, ami a szinteddel növekszik, és másik elkábításának képességével.\n&e. Továbbá visszaszerezheted az elhasznált \n&enyilaid egy részét az ellenségeid holttestéből.\n\n\n&3TAPASZTALAT SZERZÉS:\n&eA tapasztalat szerzéshez élőlényeket vagy \n&ejátékosokat kell lőnöd íjjal. +Guides.Archery.Section.1=&3Hogyan működik a Pontos Lövés?\n&eA Pontos Lövés növeli a lövedékeid sebzését.\n&eA bónusz sebzés az \n&eÍjászat szintedtől függ.\n&eAlapvetően a bónusz sebzésed 10%-kal növekszik\n&eminden 50. szinten, ami a maximális 200%-os bónusz sebzéshez vezet. +Guides.Archery.Section.2=&3Hogyan működik a Kábítás?\n&ePasszív esélyed van elkábítani más játékosokat, \n&emikor eltalálod őket. Amikor a kábítás betalál, kényszeríti az ellenfeledet, hogy\n&erövid időre egyenesen felfelé nézzen.\n&eEgy Kábítólövedék további 4 sebzést okoz. (2 szív). +Guides.Archery.Section.3=&3Hogyan működik a nyílvessző visszaszerzése?\n&ePasszív esélyed van visszaszerezni az elhasznált nyílvesszőidet\n&e, amikor megölsz egy élőlényt az íjaddal.\n&eEnnek az esélye az Íjászat szinteddel együtt növekszik.\n&eAlapvetően 0.1%-kal növekszik szintenként, ami a maximális 100%-hoz vezet\n&e az 1000-es szint elérésekor. ##Axes -Guides.Axes.Section.0=[[DARK_AQUA]]A Balt\u00E1szatr\u00F3l:\n[[YELLOW]]A Balt\u00E1szattal sokkal t\u00F6bb dologra is\n[[YELLOW]]haszn\u00E1lhatod a balt\u00E1dat, mint a fav\u00E1g\u00E1s! Meg\u00FCthetsz j\u00E1t\u00E9kosokat \u00E9s \u00E9l\u0151l\u00E9nyeket, \n[[YELLOW]]hogy tapasztalatot szerezz, az \u00E9l\u0151l\u00E9nyekre a\n[[YELLOW]]h\u00E1tral\u00F6k\u00E9s, m\u00EDg a j\u00E1t\u00E9kosokra egyar\u00E1nt a Hal\u00E1los Kritikus Csap\u00E1s k\u00E9pess\u00E9g\u00E9t haszn\u00E1lhatod.\n[[YELLOW]]A Balt\u00E1d egy k\u00E9zi fa apr\u00EDt\u00F3v\u00E1 v\u00E1lik,\n[[YELLOW]]ami megsemmis\u00EDti ellens\u00E9ged p\u00E1nc\u00E9lzat\u00E1t a szinted n\u00F6veked\u00E9s\u00E9vel. \n[[DARK_AQUA]]TAPASZTALAT SZERZ\u00C9S:\n[[YELLOW]]Tapasztalat szerz\u00E9shez nem kell m\u00E1st tenned, mint j\u00E1t\u00E9kosokat \u00E9s \u00E9l\u0151l\u00E9nyeket \n[[YELLOW]]csapkodnod a Balt\u00E1ddal. -Guides.Axes.Section.1=[[DARK_AQUA]]Hogyan m\u0171k\u00F6dik a Koponya T\u00F6r\u00E9s?\n[[YELLOW]]Ter\u00FCleti hat\u00E1s\u00FA sebz\u00E9st tudsz kiosztani.\n[[YELLOW]]A ter\u00FCleti sebz\u00E9s a f\u0151 c\u00E9lpontodnak okozott sebz\u00E9s\n[[YELLOW]]fel\u00E9vel egyenl\u0151, teh\u00E1t t\u00F6k\u00E9letes nagy sz\u00F6rnyhord\u00E1k kipuszt\u00EDt\u00E1s\u00E1ra. -Guides.Axes.Section.2=[[DARK_AQUA]]Hogyan m\u0171k\u00F6dik a Kritikus Csap\u00E1s?\n[[YELLOW]]A Kritikus Csap\u00E1sok passz\u00EDv es\u00E9lyt biztos\u00EDtanak a \n[[YELLOW]]j\u00E1t\u00E9kosnak b\u00F3nusz sebz\u00E9s kioszt\u00E1s\u00E1ra.\n[[YELLOW]]Alapvet\u0151en minden m\u00E1sodik Balt\u00E1szat szinttel \n[[YELLOW]]0.1%-kal n\u00F6vekszik a Kritikus Csap\u00E1sok es\u00E9lye, Ezzel maxim\u00E1lisan 2x-es sebz\u00E9st okozhatsz \u00E9l\u0151l\u00E9nyeknek,\n[[YELLOW]]vagy 1.5x-es sebz\u00E9st j\u00E1t\u00E9kosoknak. -Guides.Axes.Section.3=[[DARK_AQUA]]Hogyan m\u0171k\u00F6dik a Balta Mesters\u00E9ge?\n[[YELLOW]]A Balt\u00E1szat Mesters\u00E9ge passz\u00EDvan b\u00F3nusz sebz\u00E9st biztos\u00EDt\n[[YELLOW]] a csap\u00E1saidnak Balta haszn\u00E1lata eset\u00E9n.\n[[YELLOW]]Alapvet\u0151en a b\u00F3nusz 1-el n\u00F6vekszik minden 50. szint ut\u00E1n,\n[[YELLOW]]amely a 200-as szinten \u00E9ri el a maximum\u00E1t, a 4 b\u00F3nusz sebz\u00E9st. -Guides.Axes.Section.4=[[DARK_AQUA]]Hogyan m\u0171k\u00F6dik a P\u00E1nc\u00E9lt\u00F6r\u00E9s?\n[[YELLOW]]Olyan er\u0151s \u00FCt\u00E9ssel s\u00FAjtasz le, amely \u00F6sszet\u00F6ri ellenfeleid p\u00E1nc\u00E9lzat\u00E1t!\n[[YELLOW]]A P\u00E1nc\u00E9lt\u00F6r\u00E9s passz\u00EDv es\u00E9lyt ad az ellenfeled p\u00E1nc\u00E9lj\u00E1nak \n[[YELLOW]]megsebz\u00E9s\u00E9hez. Ez a sebz\u00E9s a Balt\u00E1szat szinteddel n\u00F6vekszik. -Guides.Axes.Section.5=[[DARK_AQUA]]Hogyan m\u0171k\u00F6dik az Er\u0151s \u00DCt\u00E9s?\n[[YELLOW]]Passz\u00EDv es\u00E9lyed van Er\u0151s \u00DCt\u00E9ssel lecsapni \n[[YELLOW]]\u00E9l\u0151l\u00E9nyekre \u00E9s j\u00E1t\u00E9kosokra Balta haszn\u00E1lata eset\u00E9n.\n[[YELLOW]]Alapvet\u0151en ez az es\u00E9ly 25%. Ez a k\u00E9pess\u00E9g egy hatalmas\n[[YELLOW]]h\u00E1tral\u00F6k\u00E9s effektussal b\u00EDr, hasonl\u00F3an a H\u00E1tral\u00F6k\u00E9s II \n[[YELLOW]]var\u00E1zslathoz. Tov\u00E1bb\u00E1 b\u00F3nusz sebz\u00E9st okoz a c\u00E9lpontnak. +Guides.Axes.Section.0=&3A Baltászatról:\n&eA Baltászattal sokkal több dologra is\n&ehasználhatod a baltádat, mint a favágás! Megüthetsz játékosokat és élőlényeket, \n&ehogy tapasztalatot szerezz, az élőlényekre a\n&ehátralökés, míg a játékosokra egyaránt a Halálos Kritikus Csapás képességét használhatod.\n&eA Baltád egy kézi fa aprítóvá válik,\n&eami megsemmisíti ellenséged páncélzatát a szinted növekedésével. \n&3TAPASZTALAT SZERZÉS:\n&eTapasztalat szerzéshez nem kell mást tenned, mint játékosokat és élőlényeket \n&ecsapkodnod a Baltáddal. +Guides.Axes.Section.1=&3Hogyan működik a Koponya Törés?\n&eTerületi hatású sebzést tudsz kiosztani.\n&eA területi sebzés a fő célpontodnak okozott sebzés\n&efelével egyenlő, tehát tökéletes nagy szörnyhordák kipusztítására. +Guides.Axes.Section.2=&3Hogyan működik a Kritikus Csapás?\n&eA Kritikus Csapások passzív esélyt biztosítanak a \n&ejátékosnak bónusz sebzés kiosztására.\n&eAlapvetően minden második Baltászat szinttel \n&e0.1%-kal növekszik a Kritikus Csapások esélye, Ezzel maximálisan 2x-es sebzést okozhatsz élőlényeknek,\n&evagy 1.5x-es sebzést játékosoknak. +Guides.Axes.Section.3=&3Hogyan működik a Balta Mestersége?\n&eA Baltászat Mestersége passzívan bónusz sebzést biztosít\n&e a csapásaidnak Balta használata esetén.\n&eAlapvetően a bónusz 1-el növekszik minden 50. szint után,\n&eamely a 200-as szinten éri el a maximumát, a 4 bónusz sebzést. +Guides.Axes.Section.4=&3Hogyan működik a Páncéltörés?\n&eOlyan erős ütéssel sújtasz le, amely összetöri ellenfeleid páncélzatát!\n&eA Páncéltörés passzív esélyt ad az ellenfeled páncéljának \n&emegsebzéséhez. Ez a sebzés a Baltászat szinteddel növekszik. +Guides.Axes.Section.5=&3Hogyan működik az Erős Ütés?\n&ePasszív esélyed van Erős Ütéssel lecsapni \n&eélőlényekre és játékosokra Balta használata esetén.\n&eAlapvetően ez az esély 25%. Ez a képesség egy hatalmas\n&ehátralökés effektussal bír, hasonlóan a Hátralökés II \n&evarázslathoz. Továbbá bónusz sebzést okoz a célpontnak. ##Excavation -Guides.Excavation.Section.0=[[DARK_AQUA]]Az \u00C1s\u00E1sr\u00F3l:\n[[YELLOW]]Az \u00C1s\u00E1ssal kincseket tal\u00E1lhatsz a f\u00F6ldben.\n[[YELLOW]]Min\u00E9l tov\u00E1bb csin\u00E1lod, ann\u00E1l t\u00F6bb kincsre tehetsz szert.\n\n[[DARK_AQUA]]TAPASZTALAT SZERZ\u00C9S:\n[[YELLOW]]Tapasztalat szerz\u00E9shez \u00C1s\u00F3val kell felt\u00E1rnod a f\u00F6ldet.\n[[YELLOW]]Csak bizonyos anyagok ki\u00E1s\u00E1s\u00E9rt kaphatsz kincseket \u00E9s tapasztalatot. -Guides.Excavation.Section.1=[[DARK_AQUA]]Kompatibilis Anyagok:\n[[YELLOW]]F\u00FCves blokk, F\u00F6ld, Homok, Agyag, S\u00F3der, Gombafonal, L\u00E9lekhomok, H\u00F3 -Guides.Excavation.Section.2=[[DARK_AQUA]]Hogyan m\u0171k\u00F6dik a Giga F\u00FAr\u00F3-T\u00F6r\u0151:\n[[YELLOW]]Jobb klikkelj \u00E1s\u00F3val a kezedben, hogy el\u0151k\u00E9sz\u00EDtsd az \u00E1s\u00F3dat.\n[[YELLOW]]Ebben a m\u00F3dban tov\u00E1bb\u00E1 4 m\u00E1sodperc \u00E1ll a rendelkez\u00E9sedre, hogy\n[[YELLOW]]kapcsolatba l\u00E9pj valamely \u00C1s\u00E1ssal kompatibilis anyaggal a\n[[YELLOW]]Giga F\u00FAr\u00F3-T\u00F6r\u0151 aktiv\u00E1l\u00E1s\u00E1hoz. -Guides.Excavation.Section.3=[[DARK_AQUA]]Mi is az a Giga F\u00FAr\u00F3-T\u00F6r\u0151?\n[[YELLOW]]A Giga F\u00FAr\u00F3-T\u00F6r\u0151 egy v\u00E1rakoz\u00E1si id\u0151vel rendelkez\u0151 k\u00E9pess\u00E9g, \n[[YELLOW]]amely az \u00C1s\u00E1shoz kapcsol\u00F3dik. Megtripl\u00E1zza a \n[[YELLOW]]kincs tal\u00E1l\u00E1s es\u00E9ly\u00E9t, \u00E9s instant ki\u00FCti az\n[[YELLOW]]\u00C1s\u00E1ssal kompatibilis anyagokat. -Guides.Excavation.Section.4=[[DARK_AQUA]]Hogyan m\u0171k\u00F6dik a R\u00E9g\u00E9szet?\n[[YELLOW]]Minden lehets\u00E9ges kincsnek van egy \n[[YELLOW]]bizonyos k\u00E9pess\u00E9g szint k\u00F6vetelm\u00E9nye.\n[[YELLOW]]Min\u00E9l nagyobb az \u00C1s\u00E1s szinted, ann\u00E1l\n[[YELLOW]]t\u00F6bb kincset tal\u00E1lhatsz.\n[[YELLOW]]Minden \u00C1s\u00E1ssal kompatibilis anyagnak van egy egyedi\n[[YELLOW]]kincses list\u00E1ja.\n[[YELLOW]]M\u00E1s sz\u00F3val m\u00E1s kincsekre tehetsz szert p\u00E9ld\u00E1ul F\u00F6ld ki\u00E1s\u00E1sn\u00E1l,\n[[YELLOW]]mint a S\u00F3dern\u00E9l. -Guides.Excavation.Section.5=[[DARK_AQUA]]Megjegyz\u00E9sek az \u00C1s\u00E1sr\u00F3l:\n[[YELLOW]]A kincsek teljesen testreszabhat\u00F3ak,\n[[YELLOW]]ez\u00E9rt gyakorlatilag minden szerveren m\u00E1s \u00E9s m\u00E1s a lista. +Guides.Excavation.Section.0=&3Az Ásásról:\n&eAz Ásással kincseket találhatsz a földben.\n&eMinél tovább csinálod, annál több kincsre tehetsz szert.\n\n&3TAPASZTALAT SZERZÉS:\n&eTapasztalat szerzéshez Ásóval kell feltárnod a földet.\n&eCsak bizonyos anyagok kiásásért kaphatsz kincseket és tapasztalatot. +Guides.Excavation.Section.1=&3Kompatibilis Anyagok:\n&eFüves blokk, Föld, Homok, Agyag, Sóder, Gombafonal, Lélekhomok, Hó +Guides.Excavation.Section.2=&3Hogyan működik a Giga Fúró-Törő:\n&eJobb klikkelj ásóval a kezedben, hogy előkészítsd az ásódat.\n&eEbben a módban továbbá 4 másodperc áll a rendelkezésedre, hogy\n&ekapcsolatba lépj valamely Ásással kompatibilis anyaggal a\n&eGiga Fúró-Törő aktiválásához. +Guides.Excavation.Section.3=&3Mi is az a Giga Fúró-Törő?\n&eA Giga Fúró-Törő egy várakozási idővel rendelkező képesség, \n&eamely az Ásáshoz kapcsolódik. Megtriplázza a \n&ekincs találás esélyét, és instant kiüti az\n&eÁsással kompatibilis anyagokat. +Guides.Excavation.Section.4=&3Hogyan működik a Régészet?\n&eMinden lehetséges kincsnek van egy \n&ebizonyos képesség szint követelménye.\n&eMinél nagyobb az Ásás szinted, annál\n&etöbb kincset találhatsz.\n&eMinden Ásással kompatibilis anyagnak van egy egyedi\n&ekincses listája.\n&eMás szóval más kincsekre tehetsz szert például Föld kiásásnál,\n&emint a Sódernél. +Guides.Excavation.Section.5=&3Megjegyzések az Ásásról:\n&eA kincsek teljesen testreszabhatóak,\n&eezért gyakorlatilag minden szerveren más és más a lista. ##Fishing -Guides.Fishing.Section.0=[[DARK_AQUA]]A Horg\u00E1szatr\u00F3l:\n[[YELLOW]]Ezzel a k\u00E9pess\u00E9ggel a horg\u00E1sz\u00E1s ism\u00E9t izgalmas!\n[[YELLOW]]Tal\u00E1lj rejtett kincseket, vagy r\u00E1zz le t\u00E1rgyakat a \u00E9l\u0151l\u00E9nyekr\u0151l.\n\n[[DARK_AQUA]]Tapasztalatszerz\u00E9s:\n[[YELLOW]]Horg\u00E1ssz. -Guides.Fishing.Section.1=[[DARK_AQUA]]Hogyan m\u0171k\u00F6dik a kincsvad\u00E1szat?\n[[YELLOW]]Ez a k\u00E9pess\u00E9g lehet\u0151v\u00E9 teszi, hogy kincset tal\u00E1lj horg\u00E1sz\u00E1s k\u00F6zben, \n[[YELLOW]]alacsony es\u00E9llyel fejlesztett t\u00E1rgyakra.\n[[YELLOW]]Minden lehets\u00E9ges kincs a horg\u00E1sz\u00E1sban szintt\u0151l f\u00FCggetlen\u00FCl kifoghat\u00F3\n[[YELLOW]] Azonban a kifog\u00E1s es\u00E9lye f\u00FCgg att\u00F3l, hogy a t\u00E1rgy milyen ritkas\u00E1g\u00FA.\n[[YELLOW]]Min\u00E9l nagyobb a horg\u00E1sz\u00E1s szinted, ann\u00E1l nagyobb es\u00E9lyed van jobb kincseket tal\u00E1lni. -Guides.Fishing.Section.2=[[DARK_AQUA]]Hogyan m\u0171k\u00F6dik a j\u00E9ghorg\u00E1szat?\n[[YELLOW]]Ez a passz\u00EDv k\u00E9pess\u00E9g lehet\u0151v\u00E9 teszi, hogy befagyott tavakban horg\u00E1ssz!\n[[YELLOW]]Haszn\u00E1ld a horg\u00E1szbotod (2x) a jeges tavon \u00E9s a k\u00E9pess\u00E9g k\u00E9sz\u00EDt egy lyukat a horg\u00E1sz\u00E1shoz. -Guides.Fishing.Section.3=[[DARK_AQUA]]Hogyan m\u0171k\u00F6dik a Mester Horg\u00E1szat?\n[[YELLOW]]Ez a passz\u00EDv k\u00E9pess\u00E9g n\u00F6veli a fog\u00E1s es\u00E9ly\u00E9t horg\u00E1szat k\u00F6zben.\n[[YELLOW]]Miut\u00E1n feloldottad ezt a k\u00E9pess\u00E9get, a kap\u00E1s es\u00E9lyed dupl\u00E1z\u00F3dik, ha cs\u00F3nakban, vagy \u00F3ce\u00E1n \u00E9ghajlaton horg\u00E1szol. -Guides.Fishing.Section.4=[[DARK_AQUA]]Hogyan m\u0171k\u00F6dik a ler\u00E1z\u00E1s?\n[[YELLOW]]Ez az akt\u00EDv k\u00E9pess\u00E9g lehet\u0151v\u00E9 teszi, hogy t\u00E1rgyakat r\u00E1zhass le a \u00E9l\u0151l\u00E9nyekr\u0151l, ha eltal\u00E1lod \u0151ket a horg\u00E1szbotoddal. \n[[YELLOW]]Az \u00E9l\u0151l\u00E9nyek ugyan olyan t\u00E1rgyakat dobnak, mint amit hal\u00E1lukkor.\n[[YELLOW]]Valamint jobb es\u00E9ly van ezzel \u00E9l\u0151l\u00E9ny fejet szerezni, ami alapb\u00F3l nem lehets\u00E9ges t\u00FAl\u00E9l\u0151 m\u00F3dban. -Guides.Fishing.Section.5=[[DARK_AQUA]]Hogyan m\u0171k\u00F6dik a horg\u00E1sz di\u00E9ta?\n[[YELLOW]]Ez a passz\u00EDv k\u00E9pess\u00E9g n\u00F6veli az \u00E9telcs\u00EDk visszat\u00F6lt\u00E9s\u00E9t, ha halat eszel. -Guides.Fishing.Section.6=[[DARK_AQUA]]Tudnival\u00F3 a horg\u00E1szatr\u00F3l:\n[[YELLOW]]A fogott t\u00E1rgyak list\u00E1ja teljesen \u00E1ll\u00EDthat\u00F3, teh\u00E1t szervert\u0151l f\u00FCgg. +Guides.Fishing.Section.0=&3A Horgászatról:\n&eEzzel a képességgel a horgászás ismét izgalmas!\n&eTalálj rejtett kincseket, vagy rázz le tárgyakat a élőlényekről.\n\n&3Tapasztalatszerzés:\n&eHorgássz. +Guides.Fishing.Section.1=&3Hogyan működik a kincsvadászat?\n&eEz a képesség lehetővé teszi, hogy kincset találj horgászás közben, \n&ealacsony eséllyel fejlesztett tárgyakra.\n&eMinden lehetséges kincs a horgászásban szinttől függetlenül kifogható\n&e Azonban a kifogás esélye függ attól, hogy a tárgy milyen ritkaságú.\n&eMinél nagyobb a horgászás szinted, annál nagyobb esélyed van jobb kincseket találni. +Guides.Fishing.Section.2=&3Hogyan működik a jéghorgászat?\n&eEz a passzív képesség lehetővé teszi, hogy befagyott tavakban horgássz!\n&eHasználd a horgászbotod (2x) a jeges tavon és a képesség készít egy lyukat a horgászáshoz. +Guides.Fishing.Section.3=&3Hogyan működik a Mester Horgászat?\n&eEz a passzív képesség növeli a fogás esélyét horgászat közben.\n&eMiután feloldottad ezt a képességet, javítja a halak fogásának esélyét, ha csónakban horgászol. +Guides.Fishing.Section.4=&3Hogyan működik a lerázás?\n&eEz az aktív képesség lehetővé teszi, hogy tárgyakat rázhass le a élőlényekről, ha eltalálod őket a horgászbotoddal. \n&eAz élőlények ugyan olyan tárgyakat dobnak, mint amit halálukkor.\n&eValamint lehetőség van ezzel olyan élőlény fejeket is szerezni, amelyeket általában nem lehetséges túlélő módban. +Guides.Fishing.Section.5=&3Hogyan működik a horgász diéta?\n&eEz a passzív képesség növeli az ételcsík visszatöltését, ha halat eszel. +Guides.Fishing.Section.6=&3Tudnivaló a horgászatról:\n&eA fogott tárgyak listája teljesen állítható, tehát szervertől függ. ##Herbalism -Guides.Herbalism.Section.0=[[DARK_AQUA]]A N\u00F6v\u00E9nytanr\u00F3l:\n[[YELLOW]]A N\u00F6v\u00E9nytan a k\u00FCl\u00F6nf\u00E9le n\u00F6v\u00E9nyek begy\u0171jt\u00E9s\u00E9r\u0151l sz\u00F3l.\n\n\n[[DARK_AQUA]]TAPASZTALAT SZERZ\u00C9S:\n[[YELLOW]]Gy\u0171jts n\u00F6v\u00E9nyeket. -Guides.Herbalism.Section.1=[[DARK_AQUA]]Kompatibilis Anyagok:\n[[YELLOW]]B\u00FAza, Burgonya, R\u00E9pa, Dinnye, \n[[YELLOW]]T\u00F6k, Cukorn\u00E1d, Kaka\u00F3bab, Vir\u00E1gok, Kaktusz, Gomb\u00E1k,\n[[YELLOW]]Alvil\u00E1gi Bibircs\u00F3k, Tavir\u00F3zsa, \u00E9s Inda. -Guides.Herbalism.Section.2=[[DARK_AQUA]]Hogyan m\u0171k\u00F6dik a Z\u00F6ld F\u00F6ld?\n[[YELLOW]]A Z\u00F6ld F\u00F6ld egy aktiv\u00E1lhat\u00F3 k\u00E9pess\u00E9g, az aktiv\u00E1l\u00E1s\u00E1hoz \n[[YELLOW]]jobb klikkelj egy kap\u00E1val a kezedben.\n[[YELLOW]]A Z\u00F6ld F\u00F6ld megtripl\u00E1zza az arat\u00E1s\u00E9rt \n[[YELLOW]]kapott t\u00E1rgyakat. Tov\u00E1bb\u00E1 felruh\u00E1zza a j\u00E1t\u00E9kost azzal a \n[[YELLOW]]k\u00E9pess\u00E9ggel, hogy \u00E9letet leheljenek a blokkokba az eszk\u00F6zt\u00E1rukban l\u00E9v\u0151 magok seg\u00EDts\u00E9g\u00E9vel. -Guides.Herbalism.Section.3=[[DARK_AQUA]]Hogyan m\u0171k\u00F6dik a Z\u00F6ld H\u00FCvelyk (n\u00F6v\u00E9nyek)?\n[[YELLOW]]Ez a passz\u00EDv k\u00E9pess\u00E9g automatikusan vissza\u00FClteti a n\u00F6v\u00E9nyt\n[[YELLOW]]learat\u00E1skor.\n[[YELLOW]]Ennek az es\u00E9lye a N\u00F6v\u00E9nytan szintedt\u0151l f\u00FCgg. -Guides.Herbalism.Section.4=[[DARK_AQUA]]Hogyan m\u0171k\u00F6dik a Z\u00F6ld H\u00FCvelyk (Z\u00FAzottk\u0151/K\u0151t\u00E9gla/F\u00F6ld)?\n[[YELLOW]]Ez az akt\u00EDv k\u00E9pess\u00E9g \u00E1tv\u00E1ltoztatja a blokkokat a \n[[YELLOW]]"z\u00F6ldebb" v\u00E1ltozatukk\u00E1. Ezt jobb klikkel teheted meg, mik\u00F6zben\n[[YELLOW]]magot tartasz a kezedben. 1db magot haszn\u00E1l el blokkonk\u00E9nt. -Guides.Herbalism.Section.5=[[DARK_AQUA]]Hogyan m\u0171k\u00F6dik a Farmer Di\u00E9ta?\n[[YELLOW]]Ez a passz\u00EDv k\u00E9pess\u00E9g n\u00F6veli az \u00E9telcs\u00EDk visszat\u00F6lt\u00E9s\u00E9t \n[[YELLOW]]Keny\u00E9r, S\u00FCtik, Dinnye, Gombaleves, R\u00E9pa,\n[[YELLOW]]\u00E9s Burgonya elfogyaszt\u00E1s\u00E1n\u00E1l. -Guides.Herbalism.Section.6=[[DARK_AQUA]]Hogyan m\u0171k\u00F6dik a Hili\u00E1n Szerencse?\n[[YELLOW]]Ez a passz\u00EDv k\u00E9pess\u00E9g es\u00E9lyt ad ritka t\u00E1rgyak tal\u00E1l\u00E1s\u00E1ra\n[[YELLOW]]bizonyos blokkok karddal val\u00F3 ki\u00FCt\u00E9s\u00E9n\u00E9l. -Guides.Herbalism.Section.7=[[DARK_AQUA]]Hogyan m\u0171k\u00F6dik a Dupla Zs\u00E1km\u00E1ny?\n[[YELLOW]]T\u00F6bb t\u00E1rgyat kapsz az arat\u00E1s\u00E9rt. +Guides.Herbalism.Section.0=&3A Növénytanról:\n&eA Növénytan a különféle növények begyűjtéséről szól.\n\n\n&3TAPASZTALAT SZERZÉS:\n&eGyűjts növényeket. +Guides.Herbalism.Section.1=&3Kompatibilis Anyagok:\n&eBúza, Burgonya, Répa, Dinnye, \n&eTök, Cukornád, Kakaóbab, Virágok, Kaktusz, Gombák,\n&eAlvilági Bibircsók, Tavirózsa, és Inda. +Guides.Herbalism.Section.2=&3Hogyan működik a Zöld Föld?\n&eA Zöld Föld egy aktiválható képesség, az aktiválásához \n&ejobb klikkelj egy kapával a kezedben.\n&eA Zöld Föld megtriplázza az aratásért \n&ekapott tárgyakat. Továbbá felruházza a játékost azzal a \n&eképességgel, hogy életet leheljenek a blokkokba az eszköztárukban lévő magok segítségével. +Guides.Herbalism.Section.3=&3Hogyan működik a Zöld Hüvelyk (növények)?\n&eEz a passzív képesség automatikusan visszaülteti a növényt\n&elearatáskor.\n&eEnnek az esélye a Növénytan szintedtől függ. +Guides.Herbalism.Section.4=&3Hogyan működik a Zöld Hüvelyk (Zúzottkő/Kőtégla/Föld)?\n&eEz az aktív képesség átváltoztatja a blokkokat a \n&e"zöldebb" változatukká. Ezt jobb klikkel teheted meg, miközben\n&emagot tartasz a kezedben. 1db magot használ el blokkonként. +Guides.Herbalism.Section.5=&3Hogyan működik a Farmer Diéta?\n&eEz a passzív képesség növeli az ételcsík visszatöltését \n&eKenyér, Sütik, Dinnye, Gombaleves, Répa,\n&eés Burgonya elfogyasztásánál. +Guides.Herbalism.Section.6=&3Hogyan működik a Hilián Szerencse?\n&eEz a passzív képesség esélyt ad ritka tárgyak találására\n&ebizonyos blokkok karddal való kiütésénél. +Guides.Herbalism.Section.7=&3Hogyan működik a Dupla Zsákmány?\n&eTöbb tárgyat kapsz az aratásért. ##Mining -Guides.Mining.Section.0=[[DARK_AQUA]]A B\u00E1ny\u00E1sz\u00E1sr\u00F3l:\n[[YELLOW]]A b\u00E1ny\u00E1sz\u00E1s k\u00F6vek \u00E9s \u00E9rcek kib\u00E1ny\u00E1sz\u00E1s\u00E1r\u00F3l sz\u00F3l. T\u00F6bb t\u00E1rgyat is kaphatsz\n[[YELLOW]]k\u00FCl\u00F6nb\u00F6z\u0151 anyagok kib\u00E1ny\u00E1sz\u00E1s\u00E1\u00E9rt.\n\n[[DARK_AQUA]]TAPASZTALAT SZERZ\u00C9S:\n[[YELLOW]]B\u00E1ny\u00E1ssz cs\u00E1k\u00E1nnyal a kezedben.\n[[YELLOW]]Csak bizonyos blokkok adnak tapasztalatot. -Guides.Mining.Section.1=[[DARK_AQUA]]Kompatibilis Anyagok:\n[[YELLOW]]K\u0151, Sz\u00E9n\u00E9rc, Vas\u00E9rc, Arany\u00E9rc, Gy\u00E9m\u00E1nt\u00E9rc, V\u00F6r\u00F6sk\u0151\u00E9rc,\n[[YELLOW]]Lazurit\u00E9rc, Obszidi\u00E1n, Moh\u00E1s Z\u00FAzottk\u0151, V\u00E9gk\u0151,\n[[YELLOW]]Izz\u00F3k\u0151, \u00E9s Alvil\u00E1gi K\u0151. -Guides.Mining.Section.2=[[DARK_AQUA]]Hogyan haszn\u00E1ld a Szuper T\u00F6r\u00E9st? \n[[YELLOW]]Jobb klikkelj cs\u00E1k\u00E1nnyal a kezedben, hogy el\u0151k\u00E9sz\u00EDtsd az eszk\u00F6zt.\n[[YELLOW]]Ebben a m\u00F3dban tov\u00E1bb\u00E1 4 m\u00E1sodperc \u00E1ll a rendelkez\u00E9sedre, hogy\n[[YELLOW]]kapcsolatba l\u00E9pj valamely B\u00E1ny\u00E1sz\u00E1ssal kompatibilis anyaggal a\n[[YELLOW]]Szuper T\u00F6r\u0151 aktiv\u00E1l\u00E1s\u00E1hoz. -Guides.Mining.Section.3=[[DARK_AQUA]]Mi az a Szuper T\u00F6r\u0151?\n[[YELLOW]]A Szuper T\u00F6r\u0151 egy v\u00E1rakoz\u00E1si id\u0151vel rendelkez\u0151 k\u00E9pess\u00E9g, \n[[YELLOW]]amely a B\u00E1ny\u00E1sz\u00E1shoz kapcsol\u00F3dik. Megtripl\u00E1zza az \n[[YELLOW]]extra t\u00E1rgyak tal\u00E1l\u00E1s\u00E1nak es\u00E9ly\u00E9t, \u00E9s instant ki\u00FCti a\n[[YELLOW]]B\u00E1ny\u00E1sz\u00E1ssal kompatibilis anyagokat. -Guides.Mining.Section.4=[[DARK_AQUA]]Hogyan haszn\u00E1ld Robbant\u00E1sb\u00E1ny\u00E1szatot:\n[[YELLOW]]Egy cs\u00E1k\u00E1nnyal a kezedben,\n[[YELLOW]]guggolj, \u00E9s jobb klikkelj a TNT-re t\u00E1volr\u00F3l. Ezzel a TNT\n[[YELLOW]]azonnal felrobban. -Guides.Mining.Section.5=[[DARK_AQUA]]Hogyan m\u0171k\u00F6dik a Robbant\u00E1sb\u00E1ny\u00E1szat?\n[[YELLOW]]A Robbant\u00E1sb\u00E1ny\u00E1szat egy olyan k\u00E9pess\u00E9g, ami a b\u00E1ny\u00E1szati\n[[YELLOW]]k\u00E9pess\u00E9ghez k\u00F6t\u0151dik. B\u00F3nuszokat ad, amikor TNT-vel b\u00E1ny\u00E1szol, \u00E9s lehet\u0151s\u00E9ged van\n[[YELLOW]]a t\u00E1voli robbant\u00E1sra is. H\u00E1rom r\u00E9sze van a Robbant\u00E1sb\u00E1ny\u00E1szatnak.\n[[YELLOW]]Az els\u0151 a \u201ENagyobb Robban\u00E1s\u201D, ami a robban\u00E1s hat\u00F3sugar\u00E1t n\u00F6veli.\n[[YELLOW]]A m\u00E1sodik a \u201ERobbant\u00E1si szak\u00E9rt\u0151", ami cs\u00F6kkenti\n[[YELLOW]]a TNT robban\u00E1s okozta k\u00E1rokat. A harmadik egyszer\u0171en csak n\u00F6veli\n[[YELLOW]] a TNT robban\u00E1sb\u00F3l kies\u0151 \u00E9rcek mennyis\u00E9g\u00E9t \n[[YELLOW]]\u00E9s cs\u00F6kkenti a t\u00F6rmel\u00E9kek hull\u00E1s\u00E1t. +Guides.Mining.Section.0=&3A Bányászásról:\n&eA bányászás kövek és ércek kibányászásáról szól. Több tárgyat is kaphatsz\n&ekülönböző anyagok kibányászásáért.\n\n&3TAPASZTALAT SZERZÉS:\n&eBányássz csákánnyal a kezedben.\n&eCsak bizonyos blokkok adnak tapasztalatot. +Guides.Mining.Section.1=&3Kompatibilis Anyagok:\n&eKő, Szénérc, Vasérc, Aranyérc, Gyémántérc, Vöröskőérc,\n&eLazuritérc, Obszidián, Mohás Zúzottkő, Végkő,\n&eIzzókő, és Alvilági Kő. +Guides.Mining.Section.2=&3Hogyan használd a Szuper Törést? \n&eJobb klikkelj csákánnyal a kezedben, hogy előkészítsd az eszközt.\n&eEbben a módban továbbá 4 másodperc áll a rendelkezésedre, hogy\n&ekapcsolatba lépj valamely Bányászással kompatibilis anyaggal a\n&eSzuper Törő aktiválásához. +Guides.Mining.Section.3=&3Mi az a Szuper Törő?\n&eA Szuper Törő egy várakozási idővel rendelkező képesség, \n&eamely a Bányászáshoz kapcsolódik. Megtriplázza az \n&eextra tárgyak találásának esélyét, és instant kiüti a\n&eBányászással kompatibilis anyagokat. +Guides.Mining.Section.4=&3Hogyan használd Robbantásbányászatot:\n&eEgy csákánnyal a kezedben,\n&eguggolj, és jobb klikkelj a TNT-re távolról. Ezzel a TNT\n&eazonnal felrobban. +Guides.Mining.Section.5=&3Hogyan működik a Robbantásbányászat?\n&eA Robbantásbányászat egy olyan képesség, ami a bányászati\n&eképességhez kötődik. Bónuszokat ad, amikor TNT-vel bányászol, és lehetőséged van\n&ea távoli robbantásra is. Három része van a Robbantásbányászatnak.\n&eAz első a „Nagyobb Robbanás”, ami a robbanás hatósugarát növeli.\n&eA második a „Robbantási szakértő", ami csökkenti\n&ea TNT robbanás okozta károkat. A harmadik egyszerűen csak növeli\n&e a TNT robbanásból kieső ércek mennyiségét \n&eés csökkenti a törmelékek hullását. ##Repair -Guides.Repair.Section.0=[[DARK_AQUA]]A Jav\u00EDt\u00E1sr\u00F3l:\n[[YELLOW]]A Jav\u00EDt\u00E1s lehet\u0151v\u00E9 teszi a p\u00E1nc\u00E9l \u00E9s eszk\u00F6z\u00F6k\n[[YELLOW]]Vast\u00F6mb\u00F6n val\u00F3 jav\u00EDt\u00E1s\u00E1t.\n\n[[DARK_AQUA]]TAPASZTALAT SZERZ\u00C9S:\n[[YELLOW]]Jav\u00EDts p\u00E1nc\u00E9lt \u00E9s eszk\u00F6z\u00F6ket mcMMO \u00FCll\u0151 seg\u00EDts\u00E9g\u00E9vel. Alapb\u00F3l ez egy Vast\u00F6mb, nem \u00F6sszekeverend\u0151 a sima \u00FCll\u0151vel. -Guides.Repair.Section.1=[[DARK_AQUA]]Hogyan haszn\u00E1lhatom a Jav\u00EDt\u00E1st?\n[[YELLOW]]Helyezz el egy mcMMO \u00FCll\u0151t, \u00E9s jobb klikkelj r\u00E1 egy t\u00E1rggyal a jav\u00EDt\u00E1shoz.\n[[YELLOW]]Haszn\u00E1latonk\u00E9nt 1 t\u00E1rgyat haszn\u00E1l fel. -Guides.Repair.Section.2=[[DARK_AQUA]]Hogyan m\u0171k\u00F6dik a Jav\u00EDt\u00E1s Mesters\u00E9ge?\n[[YELLOW]]A Jav\u00EDt\u00E1s Mesters\u00E9ge a jav\u00EDt\u00E1s m\u00E9rt\u00E9k\u00E9t n\u00F6veli. Ez az \u00E9rt\u00E9k a \n[[YELLOW]]Jav\u00EDt\u00E1s szintedt\u0151l f\u00FCgg. -Guides.Repair.Section.3=[[DARK_AQUA]]Hogyan m\u0171k\u00F6dik a Szuper Jav\u00EDt\u00E1s?\n[[YELLOW]]A Szuper Jav\u00EDt\u00E1s egy passz\u00EDv k\u00E9pess\u00E9g. T\u00E1rgyak jav\u00EDt\u00E1s\u00E1n\u00E1l,\n[[YELLOW]]es\u00E9lyt ad a j\u00E1t\u00E9kosnak, hogy k\u00E9tszeres \n[[YELLOW]]hat\u00E9konys\u00E1ggal jav\u00EDtson. -Guides.Repair.Section.4=[[DARK_AQUA]]Hogyan m\u0171k\u00F6dik a M\u00E1gikus Kov\u00E1csol\u00E1s?\n[[YELLOW]]Ez a k\u00E9pess\u00E9g lehet\u0151v\u00E9 teszi, hogy \n[[YELLOW]]bizonyos es\u00E9llyel a jav\u00EDtott t\u00E1rgy megtarthassa az fejleszt\u00E9seit. A fejleszt\u00E9sek\n[[YELLOW]]megtarthatj\u00E1k a szintj\u00FCket, visszafejl\u0151dhetnek,\n[[YELLOW]]vagy teljesen elveszhetnek. +Guides.Repair.Section.0=&3A Javításról:\n&eA Javítás lehetővé teszi a páncél és eszközök\n&eVastömbön való javítását.\n\n&3TAPASZTALAT SZERZÉS:\n&eJavíts páncélt és eszközöket mcMMO üllő segítségével. Alapból ez egy Vastömb, nem összekeverendő a sima üllővel. +Guides.Repair.Section.1=&3Hogyan használhatom a Javítást?\n&eHelyezz el egy mcMMO üllőt, és jobb klikkelj rá egy tárggyal a javításhoz.\n&eHasználatonként 1 tárgyat használ fel. +Guides.Repair.Section.2=&3Hogyan működik a Javítás Mestersége?\n&eA Javítás Mestersége a javítás mértékét növeli. Ez az érték a \n&eJavítás szintedtől függ. +Guides.Repair.Section.3=&3Hogyan működik a Szuper Javítás?\n&eA Szuper Javítás egy passzív képesség. Tárgyak javításánál,\n&eesélyt ad a játékosnak, hogy kétszeres \n&ehatékonysággal javítson. +Guides.Repair.Section.4=&3Hogyan működik a Mágikus Kovácsolás?\n&eEz a képesség lehetővé teszi, hogy \n&ebizonyos eséllyel a javított tárgy megtarthassa az fejlesztéseit. A fejlesztések\n&emegtarthatják a szintjüket, visszafejlődhetnek,\n&evagy teljesen elveszhetnek. ##Salvage -Guides.Salvage.Section.0=[[DARK_AQUA]]Az \u00DAjrahasznos\u00EDt\u00E1sr\u00F3l:\n[[YELLOW]]Az \u00FAjrahasznos\u00EDt\u00E1s lehet\u0151v\u00E9 teszi, hogy egy aranyt\u00F6mb\n[[YELLOW]]seg\u00EDts\u00E9g\u00E9vel visszanyerd a t\u00E1rgyaid alapanyagait.\n\n[[DARK_AQUA]]TAPASZTALAT SZERZ\u00C9S:\n[[YELLOW]]A horg\u00E1sz\u00E1si \u00E9s jav\u00EDt\u00E1si szintjeidt\u0151l f\u00FCgg. -Guides.Salvage.Section.1=[[DARK_AQUA]]Hogyan haszn\u00E1lhatom az \u00DAjrahasznos\u00EDt\u00E1st?\n[[YELLOW]]Helyezz le egy \u00DAjrahasznos\u00EDt\u00F3 \u00DCll\u0151t, \u00E9s jobb klikkelj r\u00E1 egy adott t\u00E1rggyal. Ez lebontja a t\u00E1rgyat,\n[[YELLOW]]\u00E9s visszaadja a bark\u00E1csol\u00E1si alapanyagait.\n\n[[YELLOW]]P\u00E9ld\u00E1ul egy Vascs\u00E1k\u00E1ny eset\u00E9ben vasrudakat kapsz vissza. -Guides.Salvage.Section.2=[[DARK_AQUA]]Hogyan m\u0171k\u00F6dik a Fejlesztett \u00DAjrahasznos\u00EDt\u00E1s?\n[[YELLOW]]Miut\u00E1n feloldottad, lehet\u0151v\u00E9 teszi a s\u00E9r\u00FClt t\u00E1rgyak \u00FAjrahasznos\u00EDt\u00E1s\u00E1t is.\n[[YELLOW]]A visszanyert t\u00E1rgyak mennyis\u00E9ge a t\u00E1rgy \u00E1llapot\u00E1t\u00F3l f\u00FCgg. Min\u00E9l jobb \u00E1llapotban van,\n[[YELLOW]]ann\u00E1l t\u00F6bb anyagot nyerhetsz vissza.\n[[YELLOW]]Fejlesztett \u00DAjrahasznos\u00EDt\u00E1ssal legal\u00E1bb 1 t\u00E1rgyat mindig visszakapsz,\n[[YELLOW]]kiv\u00E9ve ha a t\u00E1rgy t\u00FAl s\u00E9r\u00FClt. -Guides.Salvage.Section.3=[[DARK_AQUA]]P\u00E9lda a m\u0171k\u00F6d\u00E9s\u00E9re:\n[[YELLOW]]\u00DAjra akarunk hasznos\u00EDtani egy aranycs\u00E1k\u00E1nyt, amely 20%-ban s\u00E9r\u00FClt,\n[[YELLOW]]ez azt jelenti, hogy maximum 2 t\u00E1rgyat kaphatunk vissza\n[[YELLOW]](mivel a cs\u00E1k\u00E1ny elk\u00E9sz\u00EDt\u00E9s\u00E9hez 3 r\u00FAd kell, ez\u00E9rt egyenk\u00E9nt \n[[YELLOW]]33,33% haszn\u00E1lhat\u00F3s\u00E1got \u00E9rnek) ami egyenl\u0151 66%-kal. Ha a t\u00E1rgy s\u00E9r\u00FClts\u00E9ge\n[[YELLOW]]66% alatt van, akkor nem kaphatsz vissza 2 rudat.\n[[YELLOW]]Ha ef\u00F6l\u00F6tt az \u00E9rt\u00E9k f\u00F6l\u00F6tt van, akkor\n[[YELLOW]]2 rudat kapsz vissza. -Guides.Salvage.Section.4=[[DARK_AQUA]]Hogyan m\u0171k\u00F6dik a M\u00E1gikus \u00DAjrahasznos\u00EDt\u00E1s?\n[[YELLOW]]Bizonyos es\u00E9llyel var\u00E1zsk\u00F6nyveket is kaphatsz \n[[YELLOW]]fejlesztett t\u00E1rgyak \u00FAjhasznos\u00EDt\u00E1s\u00E1\u00E9rt. A szintedt\u0151l f\u00FCgg a \n[[YELLOW]]var\u00E1zslat kinyer\u00E9s\u00E9nek m\u00E9rt\u00E9ke.\n\n[[YELLOW]]R\u00E9szleges kinyer\u00E9sn\u00E9l \n[[YELLOW]]a k\u00F6nyv alacsonyabb szint\u0171 var\u00E1zslattal fog rendelkezni, mint\n[[YELLOW]]ami a t\u00E1rgyon volt. +Guides.Salvage.Section.0=&3Az Újrahasznosításról:\n&eAz újrahasznosítás lehetővé teszi, hogy egy aranytömb\n&esegítségével visszanyerd a tárgyaid alapanyagait.\n\n&3TAPASZTALAT SZERZÉS:\n&eA horgászási és javítási szintjeidtől függ. +Guides.Salvage.Section.1=&3Hogyan használhatom az Újrahasznosítást?\n&eHelyezz le egy Újrahasznosító Üllőt, és jobb klikkelj rá egy adott tárggyal. Ez lebontja a tárgyat,\n&eés visszaadja a barkácsolási alapanyagait.\n\n&ePéldául egy Vascsákány esetében vasrudakat kapsz vissza. +Guides.Salvage.Section.2=&3Hogyan működik a Fejlesztett Újrahasznosítás?\n&eMiután feloldottad, lehetővé teszi a sérült tárgyak újrahasznosítását is.\n&eA visszanyert tárgyak mennyisége a tárgy állapotától függ. Minél jobb állapotban van,\n&eannál több anyagot nyerhetsz vissza.\n&eFejlesztett Újrahasznosítással legalább 1 tárgyat mindig visszakapsz,\n&ekivéve ha a tárgy túl sérült. +Guides.Salvage.Section.3=&3Példa a működésére:\n&eÚjra akarunk hasznosítani egy aranycsákányt, amely 20%-ban sérült,\n&eez azt jelenti, hogy maximum 2 tárgyat kaphatunk vissza\n&e(mivel a csákány elkészítéséhez 3 rúd kell, ezért egyenként \n&e33,33% használhatóságot érnek) ami egyenlő 66%-kal. Ha a tárgy sérültsége\n&e66% alatt van, akkor nem kaphatsz vissza 2 rudat.\n&eHa efölött az érték fölött van, akkor\n&e2 rudat kapsz vissza. +Guides.Salvage.Section.4=&3Hogyan működik a Mágikus Újrahasznosítás?\n&eBizonyos eséllyel varázskönyveket is kaphatsz \n&efejlesztett tárgyak újhasznosításáért. A szintedtől függ a \n&evarázslat kinyerésének mértéke.\n\n&eRészleges kinyerésnél \n&ea könyv alacsonyabb szintű varázslattal fog rendelkezni, mint\n&eami a tárgyon volt. ##Smelting Guides.Smelting.Section.0=Hamarosan... ##Swords -Guides.Swords.Section.0=[[DARK_AQUA]]A Kardokr\u00F3l:\n[[YELLOW]]Ez a k\u00E9pess\u00E9g harci b\u00F3nuszokkal ruh\u00E1z fel \n[[YELLOW]]kardok haszn\u00E1lata eset\u00E9n.\n\n[[DARK_AQUA]]TAPASZTALAT SZERZ\u00C9S:\n[[YELLOW]]Tapasztalatot az \u00E9l\u0151l\u00E9nyeknek vagy m\u00E1s j\u00E1t\u00E9kosoknak karddal\n[[YELLOW]]okozott sebz\u00E9s\u00E9rt kaphatsz. -Guides.Swords.Section.1=[[DARK_AQUA]]Hogyan m\u0171k\u00F6dik a Fogazott Penge?\n[[YELLOW]]A Fogazott Penge egy karddal jobb klikkel\u00E9ssel aktiv\u00E1lhat\u00F3 k\u00E9pess\u00E9g. \n[[YELLOW]]Ez a k\u00E9pess\u00E9g lehet\u0151v\u00E9 teszi a \n[[YELLOW]]ter\u00FCletre hat\u00F3 csap\u00E1sokat. A ter\u00FCletre hat\u00F3 csap\u00E1s 25%-os b\u00F3nusz sebz\u00E9st okoz, \n[[YELLOW]]tov\u00E1bb\u00E1 5 tick-ig v\u00E9rz\u00E9st ad az ellens\u00E9gnek. -Guides.Swords.Section.2=[[DARK_AQUA]]Hogyan m\u0171k\u00F6dik az Ellent\u00E1mad\u00E1s?\n[[YELLOW]]Az Ellent\u00E1mad\u00E1s egy aktiv\u00E1lhat\u00F3 k\u00E9pess\u00E9g. V\u00E9dekez\u00E9sn\u00E9l, \u00E9s mikor \u00E9l\u0151l\u00E9ny\n[[YELLOW]]\u00FCtnek, es\u00E9lyed van visszaford\u00EDtani az elszenvedett sebz\u00E9s \n[[YELLOW]]50%-\u00E1t. -Guides.Swords.Section.3=[[DARK_AQUA]]Hogyan m\u0171k\u00F6dik a T\u00F6r\u00E9s?\n[[YELLOW]]A T\u00F6r\u00E9s k\u00E9t m\u00E1sodpercenk\u00E9nt sebzi az ellens\u00E9geidet. A c\u00E9lpont \n[[YELLOW]]mindaddig v\u00E9rezni fog, m\u00EDg a V\u00E9rz\u00E9s id\u0151tartam le nem j\u00E1r, vagy az \u00E1ldozat meg nem hal. \n[[YELLOW]]A V\u00E9rz\u00E9s id\u0151tartam a Kardok szintedt\u0151l f\u00FCgg. +Guides.Swords.Section.0=&3A Kardokról:\n&eEz a képesség harci bónuszokkal ruház fel \n&ekardok használata esetén.\n\n&3TAPASZTALAT SZERZÉS:\n&eTapasztalatot az élőlényeknek vagy más játékosoknak karddal\n&eokozott sebzésért kaphatsz. +Guides.Swords.Section.1=&3Hogyan működik a Fogazott Penge?\n&eA Fogazott Penge egy karddal jobb klikkeléssel aktiválható képesség. \n&eEz a képesség lehetővé teszi a \n&eterületre ható csapásokat. A területre ható csapás 25%-os bónusz sebzést okoz, \n&etovábbá 5 tick-ig vérzést ad az ellenségnek. +Guides.Swords.Section.2=&3Hogyan működik az Ellentámadás?\n&eAz Ellentámadás egy aktiválható képesség. Védekezésnél, és mikor élőlény\n&eütnek, esélyed van visszafordítani az elszenvedett sebzés \n&e50%-át. +Guides.Swords.Section.3=&3Hogyan működik a Törés?\n&eA Törés két másodpercenként sebzi az ellenségeidet. A célpont \n&emindaddig vérezni fog, míg a Vérzés időtartam le nem jár, vagy az áldozat meg nem hal. \n&eA Vérzés időtartam a Kardok szintedtől függ. ##Taming -Guides.Taming.Section.0=[[DARK_AQUA]]A szelid\u00EDt\u00E9sr\u0151l:\n[[YELLOW]]A Szel\u00EDd\u00EDt\u00E9s k\u00FCl\u00F6nb\u00F6z\u0151 harci b\u00F3nuszokkal l\u00E1tja el a j\u00E1t\u00E9kost, ha \n[[YELLOW]]szel\u00EDd\u00EDtett farkasokkal van.\n\n[[DARK_AQUA]]TAPASZTALAT SZERZ\u00C9S:\n[[YELLOW]]Szel\u00EDd\u00EDts farkasokat/ocelotokat, vagy harcolj \n[[YELLOW]]a farkasaid oldal\u00E1n. -Guides.Taming.Section.1=[[DARK_AQUA]]Hogyan m\u0171k\u00F6dik a Vadon H\u00EDv\u00E1sa?\n[[YELLOW]]A Vadon H\u00EDv\u00E1sa egy aktiv\u00E1lhat\u00F3 k\u00E9pess\u00E9g, amellyel magad mell\u00E9 id\u00E9zhetsz \n[[YELLOW]]egy farkast vagy egy ocelotot. Ezt \n[[YELLOW]]csonttal vagy hallal val\u00F3 guggol\u00E1s k\u00F6zben balkattint\u00E1ssal teheted meg. -Guides.Taming.Section.2=[[DARK_AQUA]]Hogyan m\u0171k\u00F6dik a Vad\u00E1llat-tan?\n[[YELLOW]]A Vad\u00E1llat-tan lehet\u0151v\u00E9 teszi a \n[[YELLOW]]farkasok \u00E9s ocelotok statisztik\u00E1inak megvizsg\u00E1l\u00E1s\u00E1t. Haszn\u00E1lat\u00E1hoz bal klikkelj egy farkasra\n[[YELLOW]]vagy ocelotra. -Guides.Taming.Section.3=[[DARK_AQUA]]Hogyan m\u0171k\u00F6dik a Led\u00F6f\u00E9s?\n[[YELLOW]]A led\u00F6f\u00E9s egy passz\u00EDv k\u00E9pess\u00E9g, amely lehet\u0151v\u00E9 teszi, \n[[YELLOW]]hogy a farkasok c\u00E9lpontja V\u00E9rz\u00E9st kapjon. -Guides.Taming.Section.4=[[DARK_AQUA]]Hogyan m\u0171k\u00F6dnek az \u00C9les Karmok?\n[[YELLOW]]Az \u00C9les Karmok b\u00F3nusz sebz\u00E9st ad a farkasok t\u00E1mad\u00E1sainak. \n[[YELLOW]]Ez a b\u00F3nusz a Szel\u00EDd\u00EDt\u00E9s szintedt\u0151l f\u00FCgg. -Guides.Taming.Section.5=[[DARK_AQUA]]Hogyan m\u0171k\u00F6dik az \u00C9bers\u00E9g?\n[[YELLOW]]Ez a passz\u00EDv k\u00E9pess\u00E9g lehet\u0151v\u00E9 teszi a farkasaid\n[[YELLOW]]sz\u00E1m\u00E1ra, hogy r\u00E1d teleport\u00E1ljanak, ha vesz\u00E9lybe ker\u00FClnek, p\u00E9ld\u00E1ul l\u00E1va, kaktusz. Tov\u00E1bb\u00E1\n[[YELLOW]]immuniss\u00E1 teszi a farkasaidat a zuhan\u00E1si sebz\u0151d\u00E9sre. -Guides.Taming.Section.6=[[DARK_AQUA]]Hogyan m\u0171k\u00F6dik a Vastag Bunda?\n[[YELLOW]]Ez a k\u00E9pess\u00E9g cs\u00F6kkenti a farkasaid \u00E1ltal elszenvedett sebz\u00E9st, \u00E9s \n[[YELLOW]]t\u0171z\u00E1ll\u00F3v\u00E1 teszi \u0151ket. -Guides.Taming.Section.7=[[DARK_AQUA]]Hogyan m\u0171k\u00F6dik a Robban\u00E1s\u00E1ll\u00F3s\u00E1g?\n[[YELLOW]]Ez a k\u00E9pess\u00E9g cs\u00F6kkenti a farkasaid\n[[YELLOW]]robban\u00E1s \u00E1ltal elszenvedett sebz\u0151d\u00E9s\u00E9t. -Guides.Taming.Section.8=[[DARK_AQUA]]Hogyan m\u0171k\u00F6dik a Gyors\u00E9ttermi Kiszolg\u00E1l\u00E1s?\n[[YELLOW]]Ez a k\u00E9pess\u00E9g lehet\u0151v\u00E9 teszi, hogy a farkasaid \u00E9letet t\u00F6ltsenek vissza, \n[[YELLOW]]mikor t\u00E1mad\u00E1st hajtanak v\u00E9gre. +Guides.Taming.Section.0=&3A szelidítésről:\n&eA Szelídítés különböző harci bónuszokkal látja el a játékost, ha \n&eszelídített farkasokkal van.\n\n&3TAPASZTALAT SZERZÉS:\n&eSzelídíts farkasokat/ocelotokat, vagy harcolj \n&ea farkasaid oldalán. +Guides.Taming.Section.1=&3Hogyan működik a Vadon Hívása?\n&eA Vadon Hívása egy aktiválható képesség, amellyel magad mellé idézhetsz \n&eegy farkast vagy egy ocelotot. Ezt \n&ecsonttal vagy hallal való guggolás közben balkattintással teheted meg. +Guides.Taming.Section.2=&3Hogyan működik a Vadállat-tan?\n&eA Vadállat-tan lehetővé teszi a \n&efarkasok és ocelotok statisztikáinak megvizsgálását. Használatához bal klikkelj egy farkasra\n&evagy ocelotra. +Guides.Taming.Section.3=&3Hogyan működik a Ledöfés?\n&eA ledöfés egy passzív képesség, amely lehetővé teszi, \n&ehogy a farkasok célpontja Vérzést kapjon. +Guides.Taming.Section.4=&3Hogyan működnek az Éles Karmok?\n&eAz Éles Karmok bónusz sebzést ad a farkasok támadásainak. \n&eEz a bónusz a Szelídítés szintedtől függ. +Guides.Taming.Section.5=&3Hogyan működik az Éberség?\n&eEz a passzív képesség lehetővé teszi a farkasaid\n&eszámára, hogy rád teleportáljanak, ha veszélybe kerülnek, például láva, kaktusz. Továbbá\n&eimmunissá teszi a farkasaidat a zuhanási sebződésre. +Guides.Taming.Section.6=&3Hogyan működik a Vastag Bunda?\n&eEz a képesség csökkenti a farkasaid által elszenvedett sebzést, és \n&etűzállóvá teszi őket. +Guides.Taming.Section.7=&3Hogyan működik a Robbanásállóság?\n&eEz a képesség csökkenti a farkasaid\n&erobbanás által elszenvedett sebződését. +Guides.Taming.Section.8=&3Hogyan működik a Gyorséttermi Kiszolgálás?\n&eEz a képesség lehetővé teszi, hogy a farkasaid életet töltsenek vissza, \n&emikor támadást hajtanak végre. ##Unarmed -Guides.Unarmed.Section.0=[[DARK_AQUA]]A Felfegyverzetlenr\u0151l:\n[[YELLOW]]A Felfegyverzetlen k\u00FCl\u00F6nb\u00F6z\u0151 harci b\u00F3nuszokkal l\u00E1t el, ha\n[[YELLOW]]az \u00F6kleidet haszn\u00E1lod fegyverk\u00E9nt. \n\n[[DARK_AQUA]]TAPASZTALAT SZERZ\u00C9S:\n[[YELLOW]]Harcolj \u00E9l\u0151l\u00E9nyekkel vagy j\u00E1t\u00E9kosokkal pusztak\u00E9zzel. -Guides.Unarmed.Section.1=[[DARK_AQUA]]Hogyan m\u0171k\u00F6dik a Vadul\u00E1s?\n[[YELLOW]]A Vadul\u00E1s egy jobb klikkel\u00E9ssel aktiv\u00E1lhat\u00F3 k\u00E9pess\u00E9g. \n[[YELLOW]]Ebben a m\u00F3dban 50%-kal t\u00F6bb sebz\u00E9st okozol, \u00E9s \n[[YELLOW]]a gyenge anyagokat, mint a f\u00F6ld \u00E9s f\u00FCves blokk, instant ki\u00FCtheted. -Guides.Unarmed.Section.2=[[DARK_AQUA]]Hogyan m\u0171k\u00F6dik a Vas-\u00D6k\u00F6l St\u00EDlus?\n[[YELLOW]]A Vas-\u00D6k\u00F6l St\u00EDlus b\u00F3nusz sebz\u00E9st biztos\u00EDt \u00E9l\u0151l\u00E9nyek \u00E9s j\u00E1t\u00E9kosok ellen\n[[YELLOW]]ha csak az \u00F6kleidet haszn\u00E1lod. -Guides.Unarmed.Section.3=[[DARK_AQUA]]Hogyan m\u0171k\u00F6dik a Nyilak Kit\u00E9r\u00EDt\u00E9se?\n[[YELLOW]]A Nyilak Kit\u00E9r\u00EDt\u00E9se egy passz\u00EDv k\u00E9pess\u00E9g, amely lehet\u0151v\u00E9 teszi, \n[[YELLOW]]hogy elh\u00E1r\u00EDtsd a fel\u00E9d \u00E9rkez\u0151 nyilakat.\n[[YELLOW]]A nyilak leesnek a f\u00F6ldre. -Guides.Unarmed.Section.4=[[DARK_AQUA]]Hogyan m\u0171k\u00F6dik a Vas-Markol\u00E1s?\n[[YELLOW]]A Vas-Markol\u00E1s a Lefegyverz\u00E9st akad\u00E1lyozza meg. Min\u00E9l nagyobb a \n[[YELLOW]]Felfegyverzetlen szinted, ann\u00E1l nagyobb es\u00E9llyel \u00E1llsz ellen a Lefegyverz\u00E9snek. -Guides.Unarmed.Section.5=[[DARK_AQUA]]Hogyan m\u0171k\u00F6dik a Lefegyverz\u00E9s?\n[[YELLOW]]A Lefegyverz\u00E9s lehet\u0151v\u00E9 teszi, hogy lefegyverezd az ellens\u00E9ged,\n[[YELLOW]]ez\u00E1ltal az kidobja a fegyver\u00E9t a f\u00F6ldre. +Guides.Unarmed.Section.0=&3A Felfegyverzetlenről:\n&eA Felfegyverzetlen különböző harci bónuszokkal lát el, ha\n&eaz ökleidet használod fegyverként. \n\n&3TAPASZTALAT SZERZÉS:\n&eHarcolj élőlényekkel vagy játékosokkal pusztakézzel. +Guides.Unarmed.Section.1=&3Hogyan működik a Vadulás?\n&eA Vadulás egy jobb klikkeléssel aktiválható képesség. \n&eEbben a módban 50%-kal több sebzést okozol, és \n&ea gyenge anyagokat, mint a föld és füves blokk, instant kiütheted. +Guides.Unarmed.Section.2=&3Hogyan működik az Acél-Ököl Stílus?\n&eAz Acél-Ököl Stílus bónusz sebzést biztosít élőlények és játékosok ellen\n&eha csak az ökleidet használod. +Guides.Unarmed.Section.3=&3Hogyan működik a Nyilak Kitérítése?\n&eA Nyilak Kitérítése egy passzív képesség, amely lehetővé teszi, \n&ehogy elhárítsd a feléd érkező nyilakat.\n&eA nyilak leesnek a földre. +Guides.Unarmed.Section.4=&3Hogyan működik a Vas-Markolás?\n&eA Vas-Markolás a Lefegyverzést akadályozza meg. Minél nagyobb a \n&eFelfegyverzetlen szinted, annál nagyobb eséllyel állsz ellen a Lefegyverzésnek. +Guides.Unarmed.Section.5=&3Hogyan működik a Lefegyverzés?\n&eA Lefegyverzés lehetővé teszi, hogy lefegyverezd az ellenséged,\n&eezáltal az kidobja a fegyverét a földre. ##Woodcutting -Guides.Woodcutting.Section.0=[[DARK_AQUA]]Hogyan m\u0171k\u00F6dik a Fav\u00E1g\u00E1s?\n[[YELLOW]]A Fav\u00E1g\u00E1s a fav\u00E1g\u00E1sr\u00F3l sz\u00F3l.\n\n[[DARK_AQUA]]TAPASZTALAT SZERZ\u00C9S:\n[[YELLOW]]V\u00E1gj ki f\u00E1kat. -Guides.Woodcutting.Section.1=[[DARK_AQUA]]Hogyan m\u0171k\u00F6dik a Fad\u00F6nt\u00E9s?\n[[YELLOW]]A Fad\u00F6nt\u00E9s egy aktiv\u00E1lhat\u00F3 k\u00E9pess\u00E9g, az aktiv\u00E1l\u00E1s\u00E1hoz \n[[YELLOW]]jobb klikkelj balt\u00E1val a kezedben. Ez\u00E1ltal a fa azonnal kid\u0151l\n[[YELLOW]]\u00E9s kidobja az \u00F6sszes r\u00F6nk\u00F6t. -Guides.Woodcutting.Section.2=[[DARK_AQUA]]Hogyan m\u0171k\u00F6dik a Lev\u00E9lf\u00FAj\u00F3?\n[[YELLOW]]A Lev\u00E9lf\u00FAj\u00F3 egy passz\u00EDv k\u00E9pess\u00E9g, amely miatt a levelek azonnal elt\u0171nnek, ha\n[[YELLOW]]r\u00E1kattintasz balt\u00E1val. Alapb\u00F3l a 100-as szinten old\u00F3dik fel ez a k\u00E9pess\u00E9g. -Guides.Woodcutting.Section.3=[[DARK_AQUA]]Hogyan m\u0171k\u00F6dnek a Dupla Drop-ok?\n[[YELLOW]]Ez a passz\u00EDv k\u00E9pess\u00E9g lehet\u0151v\u00E9 teszi, hogy minden kiv\u00E1gott\n[[YELLOW]]far\u00F6nk ut\u00E1n kapj m\u00E9g egyet. +Guides.Woodcutting.Section.0=&3Hogyan működik a Favágás?\n&eA Favágás a favágásról szól.\n\n&3TAPASZTALAT SZERZÉS:\n&eVágj ki fákat. +Guides.Woodcutting.Section.1=&3Hogyan működik a Fadöntés?\n&eA Fadöntés egy aktiválható képesség, az aktiválásához \n&ejobb klikkelj baltával a kezedben. Ezáltal a fa azonnal kidől\n&eés kidobja az összes rönköt. +Guides.Woodcutting.Section.2=&3Hogyan működik a Levélfújó?\n&eA Levélfújó egy passzív képesség, amely miatt a levelek azonnal eltűnnek, ha\n&erákattintasz baltával. Alapból a 100-as szinten oldódik fel ez a képesség. +Guides.Woodcutting.Section.3=&3Hogyan működnek a Dupla Drop-ok?\n&eEz a passzív képesség lehetővé teszi, hogy minden kivágott\n&efarönk után kapj még egyet. #INSPECT -Inspect.Offline= [[RED]]Nincs jogod offline j\u00E1t\u00E9kosok megvizsg\u00E1l\u00E1s\u00E1ra! -Inspect.OfflineStats=A(z) [[YELLOW]]{0} nev\u0171 offline j\u00E1t\u00E9kos mcMMO Statisztik\u00E1ja -Inspect.Stats=[[GREEN]]A(z) [[YELLOW]]{0} [[GREEN]]nev\u0171 j\u00E1t\u00E9kos mcMMO Statisztik\u00E1ja -Inspect.TooFar=T\u00FAl t\u00E1vol vagy, hogy megvizsg\u00E1lhasd ezt a j\u00E1t\u00E9kost! +Inspect.Offline= &cNincs jogod offline játékosok megvizsgálására! +Inspect.OfflineStats=A(z) &e{0} nevű offline játékos mcMMO Statisztikája +Inspect.Stats=&aA(z) &e{0} &anevű játékos mcMMO Statisztikája +Inspect.TooFar=Túl távol vagy, hogy megvizsgálhasd ezt a játékost! #ITEMS -Item.ChimaeraWing.Fail=[[RED]]**KIM\u00C9RA SZ\u00C1RNYAK HASZN\u00C1LATA SIKERTELEN** -Item.ChimaeraWing.Pass=**KIM\u00C9RA SZ\u00C1RNYAK** -Item.ChimaeraWing.Name=Kim\u00E9ra Sz\u00E1rnyak -Item.ChimaeraWing.Lore=[[GRAY]]Az \u00E1gyadhoz teleport\u00E1l. -Item.ChimaeraWing.NotEnough=Sz\u00FCks\u00E9ged van [[YELLOW]]{0}[[RED]] m\u00E9g ennyire [[GOLD]]{1}[[RED]]! -Item.NotEnough=Sz\u00FCks\u00E9ged van [[YELLOW]]{0}[[RED]] m\u00E9g ennyire [[GOLD]]{1}[[RED]]! -Item.Generic.Wait=V\u00E1rnod kell miel\u0151tt \u00FAjra haszn\u00E1lhatn\u00E1d ezt a k\u00E9pess\u00E9get! [[YELLOW]]({0}s) -Item.Injured.Wait=Sebz\u00E9st szenvedt\u00E9l el, \u00FAgyhogy v\u00E1rnod kell, miel\u0151tt haszn\u00E1lhatn\u00E1d. [[YELLOW]]({0}s) -Item.FluxPickaxe.Name=Olvaszt\u00F3 Cs\u00E1k\u00E1ny -Item.FluxPickaxe.Lore.1=[[GRAY]]Bizonyos es\u00E9llyel ki\u00E9geti a kib\u00E1ny\u00E1szott t\u00E1rgyakat. -Item.FluxPickaxe.Lore.2=[[GRAY]]Sz\u00FCks\u00E9ges Olvaszt\u00E1s szint: {0}+ +Item.ChimaeraWing.Fail=&c**KIMÉRA SZÁRNYAK HASZNÁLATA SIKERTELEN** +Item.ChimaeraWing.Pass=**KIMÉRA SZÁRNYAK** +Item.ChimaeraWing.Name=Kiméra Szárnyak +Item.ChimaeraWing.Lore=&7Az ágyadhoz teleportál. +Item.ChimaeraWing.NotEnough=Szükséged van &e{0}&c még ennyire &6{1}&c! +Item.NotEnough=Szükséged van &e{0}&c még ennyire &6{1}&c! +Item.Generic.Wait=Várnod kell mielőtt újra használhatnád ezt a képességet! &e({0}s) +Item.Injured.Wait=Sebzést szenvedtél el, úgyhogy várnod kell, mielőtt használhatnád. &e({0}s) +Item.FluxPickaxe.Name=Olvasztó Csákány +Item.FluxPickaxe.Lore.1=&7Bizonyos eséllyel kiégeti a kibányászott tárgyakat. +Item.FluxPickaxe.Lore.2=&7Szükséges Olvasztás szint: {0}+ #TELEPORTATION -Teleport.Commencing=[[GRAY]]Teleport\u00E1l\u00E1s [[GOLD]]({0}) [[GRAY]]m\u00E1sodperc m\u00FAlva, k\u00E9rlek ne mozogj... -Teleport.Cancelled=[[DARK_RED]]Teleport\u00E1l\u00E1s megszak\u00EDtva! +Teleport.Commencing=&7Teleportálás &6({0}) &7másodperc múlva, kérlek ne mozogj... +Teleport.Cancelled=&4Teleportálás megszakítva! #SKILLS -Skills.Child=[[GOLD]](ALK\u00C9PESS\u00C9G) -Skills.Disarmed=[[DARK_RED]]Lefegyvereztek! -Skills.Header=-----[] [[GREEN]]{0}[[RED]] []----- -Skills.NeedMore=[[DARK_RED]]T\u00F6bb[[GRAY]]{0}-ra/re van sz\u00FCks\u00E9ged -Skills.NeedMore=[[DARK_RED]]T\u00F6bb[[GRAY]]{0}{1}-ra/re van sz\u00FCks\u00E9ged -Skills.Parents= ANYAK\u00C9PESS\u00C9G -Skills.Stats={0}[[GREEN]]{1}[[DARK_AQUA]] XP([[GRAY]]{2}[[DARK_AQUA]]/[[GRAY]]{3}[[DARK_AQUA]]) -Skills.ChildStats={0}[[GREEN]]{1} +Skills.Child=&6(ALKÉPESSÉG) +Skills.Disarmed=&4Lefegyvereztek! +Skills.Header=-----[] &a{0}&c []----- +Skills.NeedMore=&4Több&7{0}-ra/re van szükséged +Skills.NeedMore.Extra=&4Többre van szükséged &7{0}{1} +Skills.Parents= ANYAKÉPESSÉG +Skills.Stats={0}&a{1}&3 XP(&7{2}&3/&7{3}&3) +Skills.ChildStats={0}&a{1} Skills.MaxXP=Max -Skills.TooTired=T\u00FAl f\u00E1radt vagy, hogy \u00FAjra haszn\u00E1lhasd ezt a k\u00E9pess\u00E9get. [[YELLOW]]({0}s) -Skills.Cancelled=[[GOLD]]{0} [[RED]]Megszak\u00EDtva! -Skills.ConfirmOrCancel=[[GREEN]]Jobb klikkelj a meger\u0151s\u00EDt\u00E9shez. [[GOLD]]{0}[[GREEN]]. Bal klikkelj a megszak\u00EDt\u00E1shoz. -Skills.AbilityGateRequirementFail=[[GRAY]]M\u00E9g [[YELLOW]]{0}[[GRAY]] szint sz\u00FCks\u00E9ges a(z) [[DARK_AQUA]]{1}[[GRAY]]b\u00F3l/b\u0151l, hogy haszn\u00E1lhasd ezt a szuper k\u00E9pess\u00E9get. +Skills.TooTired=Túl fáradt vagy, hogy újra használhasd ezt a képességet. &e({0}s) +Skills.TooTired.Named=[[GRAY]](&6{0}&e {1}s[[GRAY]]) +Skills.TooTired.Extra=&6{0} &eSzuperképesség várakozások - {1} +Skills.Cancelled=&6{0} &cMegszakítva! +Skills.ConfirmOrCancel=&aJobb klikkelj a megerősítéshez. &6{0}&a. Bal klikkelj a megszakításhoz. +Skills.AbilityGateRequirementFail=&7Még &e{0}&7 szint szükséges a(z) &3{1}&7ból/ből, hogy használhasd ezt a szuper képességet. #STATISTICS -Stats.Header.Combat=[[GOLD]]-=HARCI K\u00C9PESS\u00C9GEK=- -Stats.Header.Gathering=[[GOLD]]-=GY\u0170JT\u00D6GET\u0150 K\u00C9PESS\u00C9GEK=- -Stats.Header.Misc=[[GOLD]]-=EGY\u00C9B K\u00C9PESS\u00C9GEK=- -Stats.Own.Stats=[[GREEN]][mcMMO] Statisztik\u00E1k +Stats.Header.Combat=&6-=HARCI KÉPESSÉGEK=- +Stats.Header.Gathering=&6-=GYŰJTÖGETŐ KÉPESSÉGEK=- +Stats.Header.Misc=&6-=EGYÉB KÉPESSÉGEK=- +Stats.Own.Stats=&a[mcMMO] Statisztikák #PERKS Perks.XP.Name=Tapasztalat -Perks.XP.Desc=T\u00F6bb tapasztalatot kapsz bizonyos k\u00E9pess\u00E9gekn\u00E9l. +Perks.XP.Desc=Több tapasztalatot kapsz bizonyos képességeknél. Perks.Lucky.Name=Szerencse -Perks.Lucky.Desc=A {0} k\u00E9pess\u00E9gek 33%-kal nagyobb es\u00E9llyel aktiv\u00E1l\u00F3dnak. -Perks.Lucky.Desc.Login=Bizonyos k\u00E9pess\u00E9gek 33%-kal nagyobb es\u00E9llyel aktiv\u00E1l\u00F3dnak. -Perks.Lucky.Bonus=[[GOLD]] ({0} a Szerencse perk-kel) -Perks.Cooldowns.Name=Gyors \u00DAjrat\u00F6lt\u00E9s -Perks.Cooldowns.Desc=Cs\u00F6kkenti a v\u00E1rakoz\u00E1st {0}-al. +Perks.Lucky.Desc=A {0} képességek 33%-kal nagyobb eséllyel aktiválódnak. +Perks.Lucky.Desc.Login=Bizonyos képességek 33%-kal nagyobb eséllyel aktiválódnak. +Perks.Lucky.Bonus=&6 ({0} a Szerencse perk-kel) +Perks.Cooldowns.Name=Gyors Újratöltés +Perks.Cooldowns.Desc=Csökkenti a várakozást {0}-al. Perks.ActivationTime.Name=Tartam -Perks.ActivationTime.Desc=Meghosszabb\u00EDtja a k\u00E9pess\u00E9g aktivit\u00E1s\u00E1t {0} m\u00E1sodperccel. -Perks.ActivationTime.Bonus=[[GOLD]] ({0} m\u00E1sodperc a Tartam perk-kel) +Perks.ActivationTime.Desc=Meghosszabbítja a képesség aktivitását {0} másodperccel. +Perks.ActivationTime.Bonus=&6 ({0} másodperc a Tartam perk-kel) #HARDCORE -Hardcore.Mode.Disabled=[[GOLD]][mcMMO] Hardcore M\u00F3d {0} kikapcsolva {1} sz\u00E1m\u00E1ra. -Hardcore.Mode.Enabled=[[GOLD]][mcMMO] Hardcore M\u00F3d {0} bekapcsolva {1} sz\u00E1m\u00E1ra. -Hardcore.DeathStatLoss.Name=K\u00E9pess\u00E9g Hal\u00E1l B\u00FCntet\u00E9s -Hardcore.DeathStatLoss.PlayerDeath=[[GOLD]][mcMMO] [[DARK_RED]]Elvesztett\u00E9l [[BLUE]]{0}[[DARK_RED]] szintet a hal\u00E1lod miatt. -Hardcore.DeathStatLoss.PercentageChanged=[[GOLD]][mcMMO] A statisztika veszt\u00E9si sz\u00E1zal\u00E9k be\u00E1ll\u00EDtva {0}-ra/re. -Hardcore.Vampirism.Name=Vamp\u00EDrizmus -Hardcore.Vampirism.Killer.Failure=[[GOLD]][mcMMO] [[YELLOW]]{0}[[GRAY]]-nak/nek nem volt el\u00E9g tud\u00E1sa, hogy b\u00E1rmit is kisz\u00EDvhass bel\u0151le. -Hardcore.Vampirism.Killer.Success=[[GOLD]][mcMMO] [[DARK_AQUA]]Ellopt\u00E1l [[BLUE]]{0}[[DARK_AQUA]] szintet [[YELLOW]]{1}-t\u00F3l/t\u0151l. -Hardcore.Vampirism.Victim.Failure=[[GOLD]][mcMMO] [[YELLOW]]{0}[[GRAY]] nem tudott tud\u00E1st lopni t\u0151led! -Hardcore.Vampirism.Victim.Success=[[GOLD]][mcMMO] [[YELLOW]]{0}[[DARK_RED]] ellopott [[BLUE]]{1}[[DARK_RED]] szintet t\u0151led! -Hardcore.Vampirism.PercentageChanged=[[GOLD]][mcMMO] A statisztika szipolyoz\u00E1si sz\u00E1zal\u00E9k be\u00E1ll\u00EDtva {0}-ra/re. +Hardcore.Mode.Disabled=&6[mcMMO] Hardcore Mód {0} kikapcsolva {1} számára. +Hardcore.Mode.Enabled=&6[mcMMO] Hardcore Mód {0} bekapcsolva {1} számára. +Hardcore.DeathStatLoss.Name=Képesség Halál Büntetés +Hardcore.DeathStatLoss.PlayerDeath=&6[mcMMO] &4Elvesztettél &9{0}&4 szintet a halálod miatt. +Hardcore.DeathStatLoss.PercentageChanged=&6[mcMMO] A statisztika vesztési százalék beállítva {0}-ra/re. +Hardcore.Vampirism.Name=Vampírizmus +Hardcore.Vampirism.Killer.Failure=&6[mcMMO] &e{0}&7-nak/nek nem volt elég tudása, hogy bármit is kiszívhass belőle. +Hardcore.Vampirism.Killer.Success=&6[mcMMO] &3Elloptál &9{0}&3 szintet &e{1}-tól/től. +Hardcore.Vampirism.Victim.Failure=&6[mcMMO] &e{0}&7 nem tudott tudást lopni tőled! +Hardcore.Vampirism.Victim.Success=&6[mcMMO] &e{0}&4 ellopott &9{1}&4 szintet tőled! +Hardcore.Vampirism.PercentageChanged=&6[mcMMO] A statisztika szipolyozási százalék beállítva {0}-ra/re. #MOTD -MOTD.Donate=[[DARK_AQUA]]Adakoz\u00E1s inform\u00E1ci\u00F3: -MOTD.Hardcore.Enabled=[[GOLD]][mcMMO] [[DARK_AQUA]]Hardcore M\u00F3d enged\u00E9lyezve: [[DARK_RED]]{0} -MOTD.Hardcore.DeathStatLoss.Stats=[[GOLD]][mcMMO] [[DARK_AQUA]]K\u00E9pess\u00E9g Hal\u00E1l B\u00FCntet\u00E9s: [[DARK_RED]]{0}% -MOTD.Hardcore.Vampirism.Stats=[[GOLD]][mcMMO] [[DARK_AQUA]]V\u00E1mpirizmus szipolyoz\u00E1si sz\u00E1zal\u00E9k: [[DARK_RED]]{0}% -MOTD.PerksPrefix=[[GOLD]][mcMMO Perk-kek] -MOTD.Version=[[GOLD]][mcMMO] Jelenlegi verzi\u00F3 [[DARK_AQUA]]{0} -MOTD.Website=[[GOLD]][mcMMO] [[GREEN]]{0}[[YELLOW]] - mcMMO weboldal +MOTD.Donate=&3Adakozás információ: +MOTD.Hardcore.Enabled=&6[mcMMO] &3Hardcore Mód engedélyezve: &4{0} +MOTD.Hardcore.DeathStatLoss.Stats=&6[mcMMO] &3Képesség Halál Büntetés: &4{0}% +MOTD.Hardcore.Vampirism.Stats=&6[mcMMO] &3Vámpirizmus szipolyozási százalék: &4{0}% +MOTD.PerksPrefix=&6[mcMMO Perk-kek] +MOTD.Version=&6[mcMMO] Jelenlegi verzió &3{0} +MOTD.Website=&6[mcMMO] &a{0}&e - mcMMO weboldal #SMELTING -Smelting.SubSkill.UnderstandingTheArt.Name=A M\u0171v\u00E9szet Meg\u00E9rt\u00E9se -Smelting.SubSkill.UnderstandingTheArt.Description=Tal\u00E1n egy kicsit t\u00FAl sok id\u0151t t\u00F6ltesz a barlangokban az olvaszt\u00E1ssal.\nAz Olvaszt\u00E1s k\u00FCl\u00F6nb\u00F6z\u0151 tulajdons\u00E1gait n\u00F6veli. -Smelting.Ability.FuelEfficiency=Vanilla XP sz\u00E1zal\u00E9k: [[YELLOW]]{0}x -Smelting.Ability.Locked.0=LEZ\u00C1RVA {0}+ K\u00C9PESS\u00C9G SZINTIG (VANILLA XP N\u00D6VEL\u0150) -Smelting.Ability.Locked.1=LEZ\u00C1RVA {0}+ K\u00C9PESS\u00C9G SZINTIG (OLVASZT\u00D3 B\u00C1NY\u00C1SZ\u00C1S) -Smelting.SubSkill.FuelEfficiency.Name=\u00DCzemanyag hat\u00E9konys\u00E1g -Smelting.SubSkill.FuelEfficiency.Description=N\u00F6veli az \u00FCzemanyag id\u0151tartam\u00E1t olvaszt\u00E1sn\u00E1l -Smelting.SubSkill.FuelEfficiency.Stat=\u00DCzemanyag Hat\u00E9konys\u00E1gi szorz\u00F3: [[YELLOW]]{0}x -Smelting.SubSkill.SecondSmelt.Name=M\u00E1sodik olvaszt\u00E1s -SSmelting.SubSkill.SecondSmelt.Description=Megdupl\u00E1zza a kiolvasztott t\u00E1rgyak mennyis\u00E9g\u00E9t -Smelting.SubSkill.SecondSmelt.Stat=Es\u00E9ly M\u00E1sodik B\u00E1ny\u00E1sz\u00E1sra -Smelting.Effect.4=Vanilla XP N\u00F6vel\u0151 -Smelting.Effect.5=N\u00F6veli a kapott XP mennyis\u00E9g\u00E9t olvaszt\u00E1sn\u00E1l -Smelting.SubSkill.FluxMining.Name=Olvaszt\u00F3 B\u00E1ny\u00E1sz\u00E1s -Smelting.SubSkill.FluxMining.Description=Es\u00E9ly arra, hogy a t\u00E1rgyak kiolvadjanak kib\u00E1ny\u00E1sz\u00E1skor -Smelting.SubSkill.FluxMining.Stat=Es\u00E9ly Olvaszt\u00E1s B\u00E1ny\u00E1sz\u00E1sra -Smelting.Listener=Olvaszt\u00E1s: -Smelting.SkillName=OLVASZT\u00C1S +Smelting.SubSkill.UnderstandingTheArt.Name=A Művészet Megértése +Smelting.SubSkill.UnderstandingTheArt.Description=Talán egy kicsit túl sok időt töltesz a barlangokban az olvasztással.\nAz Olvasztás különböző tulajdonságait növeli. +Smelting.Ability.FuelEfficiency=Vanilla XP százalék: &e{0}x +Smelting.Ability.Locked.0=LEZÁRVA {0}+ KÉPESSÉG SZINTIG (VANILLA XP NÖVELŐ) +Smelting.Ability.Locked.1=LEZÁRVA {0}+ KÉPESSÉG SZINTIG (OLVASZTÓ BÁNYÁSZÁS) +Smelting.SubSkill.FuelEfficiency.Name=Üzemanyag hatékonyság +Smelting.SubSkill.FuelEfficiency.Description=Növeli az üzemanyag időtartamát olvasztásnál +Smelting.SubSkill.FuelEfficiency.Stat=Üzemanyag Hatékonysági szorzó: &e{0}x +Smelting.SubSkill.SecondSmelt.Name=Második olvasztás +Smelting.SubSkill.SecondSmelt.Description=Megduplázza a kiolvasztott tárgyak mennyiségét +Smelting.SubSkill.SecondSmelt.Stat=Esély Második Bányászásra +Smelting.Effect.4=Vanilla XP Növelő +Smelting.Effect.5=Növeli a kapott XP mennyiségét olvasztásnál +Smelting.SubSkill.FluxMining.Name=Olvasztó Bányászás +Smelting.SubSkill.FluxMining.Description=Esély arra, hogy a tárgyak kiolvadjanak kibányászáskor +Smelting.SubSkill.FluxMining.Stat=Esély Olvasztás Bányászásra +Smelting.Listener=Olvasztás: +Smelting.SkillName=OLVASZTÁS #COMMAND DESCRIPTIONS -Commands.Description.addlevels=mcMMO szintek ad\u00E1sa egy j\u00E1t\u00E9kosnak +Commands.Description.addlevels=mcMMO szintek adása egy játékosnak Commands.Description.adminchat=mcMMO admin chat -Commands.Description.addxp=mcMMO tapasztalat ad\u00E1sa egy j\u00E1t\u00E9kosnak -Commands.Description.hardcore=Az mcMMO Hardcore be\u00E1ll\u00EDt\u00E1sainak m\u00F3dos\u00EDt\u00E1sa, vagy annak ki/bekapcsol\u00E1sa -Commands.Description.inspect=R\u00E9szletes mcMMO inform\u00E1ci\u00F3 egy j\u00E1t\u00E9kosr\u00F3l -Commands.Description.mcability=mcMMO k\u00E9pess\u00E9g el\u0151k\u00E9sz\u00EDt\u00E9s\u00E9nek ki/bekapcsol\u00E1sa jobb klikkel -Commands.Description.mccooldown=Minden mcMMO v\u00E1rakoz\u00E1si id\u0151 megtekint\u00E9se -Commands.Description.mcchatspy=mcMMO party chat figyel\u00E9s ki vagy bekapcsol\u00E1sa -Commands.Description.mcgod=mcMMO Isten M\u00F3d ki-bekapcsol\u00E1sa -Commands.Description.mchud=mcMMO HUD v\u00E1ltoztat\u00E1sa -Commands.Description.mcmmo=mcMMO le\u00EDr\u00E1s megtekint\u00E9se -Commands.Description.mcnotify=mcMMO k\u00E9pess\u00E9g chatben val\u00F3 \u00E9rtes\u00EDt\u00E9s\u00E9nek ki/bekapcsol\u00E1sa -Commands.Description.mcpurge=Olyan felhaszn\u00E1l\u00F3k t\u00F6rl\u00E9se az mcMMO adatb\u00E1zis\u00E1b\u00F3l, akik nem rendelkeznek szintekkel, vagy {0} h\u00F3napja nem voltak fent. -Commands.Description.mcrank=J\u00E1t\u00E9kos mcMMO rangj\u00E1nak megtekint\u00E9se -Commands.Description.mcrefresh=Minden v\u00E1rakoz\u00E1si id\u0151 friss\u00EDt\u00E9se -Commands.Description.mcremove=Felhaszn\u00E1l\u00F3 elt\u00E1vol\u00EDt\u00E1sa az mcMMO adatb\u00E1zis\u00E1b\u00F3l -Commands.Description.mcscoreboard=mcMMO scoreboard kezel\u00E9se -Commands.Description.mcstats=mcMMO szintjeid \u00E9s tapasztalatod megtekint\u00E9se -Commands.Description.mctop=mcMMO toplista megtekint\u00E9se -Commands.Description.mmoedit=Felhaszn\u00E1l\u00F3 mcMMO szintjeinek szerkeszt\u00E9se -Commands.Description.mmodebug=Bekapcsolja a hibakeres\u00E9si m\u00F3dot, amely hasznos inform\u00E1ci\u00F3kat \u00EDr ki a blokkok meg\u00FCt\u00E9s\u00E9n\u00E9l. -Commands.Description.mmoupdate=mcMMO adatb\u00E1zis mozgat\u00E1sa r\u00E9gi adatb\u00E1zisb\u00F3l \u00FAjba -Commands.Description.mcconvert=Adatb\u00E1zis t\u00EDpusok vagy k\u00E9pletek konvert\u00E1l\u00E1sa -Commands.Description.mmoshowdb=Jelenleg adatb\u00E1zis t\u00EDpus nev\u00E9nek megtekint\u00E9se (k\u00E9s\u0151bbi haszn\u00E1lat /mmoupdate) -Commands.Description.party=mcMMO party be\u00E1ll\u00EDt\u00E1sok ir\u00E1ny\u00EDt\u00E1sa -Commands.Description.partychat=mcMMO party t\u00E1rsalg\u00F3 ki/bekapcsol\u00E1sa vagy party \u00FCzenet k\u00FCld\u00E9se. -Commands.Description.ptp=Teleport\u00E1l\u00E1s egy mcMMO party taghoz -Commands.Description.Skill=R\u00E9szletes le\u00EDr\u00E1s a {0} k\u00E9pess\u00E9gr\u0151l -Commands.Description.skillreset=mcMMO szintek null\u00E1z\u00E1sa egy felhaszn\u00E1l\u00F3 sz\u00E1m\u00E1ra -Commands.Description.vampirism=mcMMO v\u00E1mp\u00EDrizmus sz\u00E1zal\u00E9k\u00E1nak m\u00F3dos\u00EDt\u00E1sa, vagy annak ki/bekapcsol\u00E1sa -Commands.Description.xplock=mcMMO szinted z\u00E1rol\u00E1sa -Commands.Description.xprate=mcMMO XP r\u00E1ta m\u00F3dos\u00EDt\u00E1sa egy mcMMO esem\u00E9nyhez +Commands.Description.addxp=mcMMO tapasztalat adása egy játékosnak +Commands.Description.hardcore=Az mcMMO Hardcore beállításainak módosítása, vagy annak ki/bekapcsolása +Commands.Description.inspect=Részletes mcMMO információ egy játékosról +Commands.Description.mcability=mcMMO képesség előkészítésének ki/bekapcsolása jobb klikkel +Commands.Description.mccooldown=Minden mcMMO várakozási idő megtekintése +Commands.Description.mcchatspy=mcMMO party chat figyelés ki vagy bekapcsolása +Commands.Description.mcgod=mcMMO Isten Mód ki-bekapcsolása +Commands.Description.mchud=mcMMO HUD változtatása +Commands.Description.mcmmo=mcMMO leírás megtekintése +Commands.Description.mcnotify=mcMMO képesség chatben való értesítésének ki/bekapcsolása +Commands.Description.mcpurge=Olyan felhasználók törlése az mcMMO adatbázisából, akik nem rendelkeznek szintekkel, vagy {0} hónapja nem voltak fent. +Commands.Description.mcrank=Játékos mcMMO rangjának megtekintése +Commands.Description.mcrefresh=Minden várakozási idő frissítése +Commands.Description.mcremove=Felhasználó eltávolítása az mcMMO adatbázisából +Commands.Description.mcscoreboard=mcMMO scoreboard kezelése +Commands.Description.mcstats=mcMMO szintjeid és tapasztalatod megtekintése +Commands.Description.mctop=mcMMO toplista megtekintése +Commands.Description.mmoedit=Felhasználó mcMMO szintjeinek szerkesztése +Commands.Description.mmodebug=Bekapcsolja a hibakeresési módot, amely hasznos információkat ír ki a blokkok megütésénél. +Commands.Description.mmoupdate=mcMMO adatbázis mozgatása régi adatbázisból újba +Commands.Description.mcconvert=Adatbázis típusok vagy képletek konvertálása +Commands.Description.mmoshowdb=Jelenleg adatbázis típus nevének megtekintése (későbbi használat /mmoupdate) +Commands.Description.party=mcMMO party beállítások irányítása +Commands.Description.partychat=mcMMO party társalgó ki/bekapcsolása vagy party üzenet küldése. +Commands.Description.ptp=Teleportálás egy mcMMO party taghoz +Commands.Description.Skill=Részletes leírás a {0} képességről +Commands.Description.skillreset=mcMMO szintek nullázása egy felhasználó számára +Commands.Description.vampirism=mcMMO vámpírizmus százalékának módosítása, vagy annak ki/bekapcsolása +Commands.Description.xplock=mcMMO szinted zárolása +Commands.Description.xprate=mcMMO XP ráta módosítása egy mcMMO eseményhez #UPDATE CHECKER -UpdateChecker.Outdated=Egy r\u00E9gebbi mcMMO-t haszn\u00E1lsz! -UpdateChecker.NewAvailable=Egy \u00FAjabb verzi\u00F3 \u00E9rhet\u0151 el a Spigot-on. +UpdateChecker.Outdated=Egy régebbi mcMMO-t használsz! +UpdateChecker.NewAvailable=Egy újabb verzió érhető el a Spigot-on. #SCOREBOARD HEADERS -Scoreboard.Header.PlayerStats=[[YELLOW]]mcMMO Statisztik\u00E1k -Scoreboard.Header.PlayerCooldowns=[[YELLOW]]mcMMO V\u00E1rakoz\u00E1s -Scoreboard.Header.PlayerRank=[[YELLOW]]mcMMO Ranglista -Scoreboard.Header.PlayerInspect=[[YELLOW]]mcMMO Statisztika: {0} -Scoreboard.Header.PowerLevel=[[YELLOW]]Er\u0151 Szint -Scoreboard.Misc.PowerLevel=[[GOLD]]Er\u0151 Szint -Scoreboard.Misc.Level=[[DARK_AQUA]]Szint -Scoreboard.Misc.CurrentXP=[[GREEN]]Jelenlegi XP -Scoreboard.Misc.RemainingXP=[[YELLOW]]Sz\u00FCks\u00E9ges XP -Scoreboard.Misc.Cooldown=[[LIGHT_PURPLE]]V\u00E1rakoz\u00E1s -Scoreboard.Misc.Overall=[[GOLD]]Overall -Scoreboard.Misc.Ability=K\u00E9pess\u00E9g +Scoreboard.Header.PlayerStats=&emcMMO Statisztikák +Scoreboard.Header.PlayerCooldowns=&emcMMO Várakozás +Scoreboard.Header.PlayerRank=&emcMMO Ranglista +Scoreboard.Header.PlayerInspect=&emcMMO Statisztika: {0} +Scoreboard.Header.PowerLevel=&eErő Szint +Scoreboard.Misc.PowerLevel=&6Erő Szint +Scoreboard.Misc.Level=&3Szint +Scoreboard.Misc.CurrentXP=&aJelenlegi XP +Scoreboard.Misc.RemainingXP=&eSzükséges XP +Scoreboard.Misc.Cooldown=&dVárakozás +Scoreboard.Misc.Overall=&6Overall +Scoreboard.Misc.Ability=Képesség #DATABASE RECOVERY -Profile.PendingLoad=[[RED]]Az mcMMO j\u00E1t\u00E9kos adatod m\u00E9g nincs bet\u00F6ltve. -Profile.Loading.Success=[[GREEN]]mcMMO profil sikeresen bet\u00F6ltve. -Profile.Loading.FailurePlayer=[[RED]]Az mcMMO-nak probl\u00E9m\u00E1i vannak az adataid bet\u00F6lt\u00E9sekor, megpr\u00F3b\u00E1ltuk bet\u00F6lteni [[GREEN]]{0}[[RED]]x.[[RED]] Ezzel kapcsolatban \u00E9rdemes kapcsolatba l\u00E9pni a szerver adminisztr\u00E1torokkal. Az mcMMO megpr\u00F3b\u00E1lja bet\u00F6lteni az adatait mindaddig, am\u00EDg nem kapcsol\u00F3dsz le. Nem kapsz XP-t, \u00E9s nem tudod haszn\u00E1lni a k\u00E9pess\u00E9geket, am\u00EDg az adataid nem t\u00F6lt\u0151dnek be. -Profile.Loading.FailureNotice=[[DARK_RED]][A][[RED]] az mcMMO nem tudta bet\u00F6lteni ennek a j\u00E1t\u00E9kosnak az adatait [[YELLOW]]{0}[[RED]]. [[LIGHT_PURPLE]]K\u00E9rj\u00FCk, ellen\u0151rizd az adatb\u00E1zis be\u00E1ll\u00EDt\u00E1sait. Eddig tett k\u00EDs\u00E9rletek {1}. +Profile.PendingLoad=&cAz mcMMO játékos adatod még nincs betöltve. +Profile.Loading.Success=&amcMMO profil sikeresen betöltve. +Profile.Loading.FailurePlayer=&cAz mcMMO-nak problémái vannak az adataid betöltésekor, megpróbáltuk betölteni &a{0}&cx.&c Ezzel kapcsolatban érdemes kapcsolatba lépni a szerver adminisztrátorokkal. Az mcMMO megpróbálja betölteni az adatait mindaddig, amíg nem kapcsolódsz le. Nem kapsz XP-t, és nem tudod használni a képességeket, amíg az adataid nem töltődnek be. +Profile.Loading.FailureNotice=&4[A]&c az mcMMO nem tudta betölteni ennek a játékosnak az adatait &e{0}&c. &dKérjük, ellenőrizd az adatbázis beállításait. Eddig tett kísérletek {1}. #Holiday -Holiday.AprilFools.Levelup=[[GOLD]]{0} jelenlegi szint [[GREEN]]{1}[[GOLD]]! -Holiday.Anniversary=[[BLUE]]Boldog {0}. \u00C9vfordul\u00F3t!\n[[BLUE]]nossr50, \u00E9s az \u00F6sszes fejleszt\u0151 tisztelet\u00E9re itt egy t\u0171zij\u00E1t\u00E9k show! +Holiday.AprilFools.Levelup=&6{0} jelenlegi szint &a{1}&6! +Holiday.Anniversary=&9Boldog {0}. Évfordulót!\n&9nossr50, és az összes fejlesztő tiszteletére itt egy tűzijáték show! #Reminder Messages -Reminder.Squelched=[[GRAY]]Eml\u00E9keztet\u0151: jelenleg nem kapsz \u00E9rtes\u00EDt\u00E9seket az mcMMO-t\u00F3l. Ahhoz, hogy enged\u00E9lyezd az \u00E9rtes\u00EDt\u00E9seket, futtasd \u00FAjra a /mcnotify parancsot. Ez egy automatikus, \u00F3r\u00E1nk\u00E9nti eml\u00E9keztet\u0151. +Reminder.Squelched=&7Emlékeztető: jelenleg nem kapsz értesítéseket az mcMMO-tól. Ahhoz, hogy engedélyezd az értesítéseket, futtasd újra a /mcnotify parancsot. Ez egy automatikus, óránkénti emlékeztető. #Locale -Locale.Reloaded=[[GREEN]]Ford\u00EDt\u00E1s \u00FAjrat\u00F6ltve! +Locale.Reloaded=&aA fordítás újratöltve! #Player Leveling Stuff -LevelCap.PowerLevel=[[GOLD]]([[GREEN]]mcMMO[[GOLD]]) [[YELLOW]]El\u00E9rted ezt a teljes\u00EDtm\u00E9nyszintet [[RED]]{0}[[YELLOW]]. Ezen a ponton megsz\u0171nik a k\u00E9pess\u00E9gek szintje. -LevelCap.Skill=[[GOLD]]([[GREEN]]mcMMO[[GOLD]]) [[YELLOW]]El\u00E9rted ezt a szintet [[RED]]{0}[[YELLOW]] ebben [[GOLD]]{1}[[YELLOW]]. Ezen a ponton megsz\u0171nik a k\u00E9pess\u00E9g szintje. +LevelCap.PowerLevel=&6(&amcMMO&6) &eElérted ezt a teljesítményszintet &c{0}&e. Ezen a ponton megszűnik a képességek szintje. +LevelCap.Skill=&6(&amcMMO&6) &eElérted ezt a szintet &c{0}&e ebben &6{1}&e. Ezen a ponton megszűnik a képesség szintje. +Commands.XPBar.Usage=Proper usage is /mmoxpbar +Commands.Description.mmoxpbar=Player settings for mcMMO XP bars +Commands.Description.mmocompat=Információ az mcMMO-ról és arról, hogy kompatibilitási módban van-e, vagy teljesen működőképes-e. +Compatibility.Layer.Unsupported=&6A kompatibilitás ezen a Minecraft verzión &a{0}&6 nem támogatott. +Compatibility.Layer.PartialSupport=&6A kompatibilitás ezen a Minecraft verzión &a{0}&6 nem teljesen támogatott, de az mcMMO egy másodlagos rendszert futtat néhány hiányzó funkció emulálására. +Commands.XPBar.DisableAll=&6 Most az összes mcMMO XP sáv le van tiltva, használd a /mmoxpbar reset parancsot az alapértelmezett beállítások visszaállításához. +#Modern Chat Settings +Chat.Style.Admin=&b(A) &r{0} &b→ &r{1} +Chat.Style.Party=&a(P) &r{0} &a→ &r{1} +Chat.Style.Party.Leader=&a(P) &r{0} &6→ &r{1} +Chat.Identity.Console=&6* Konzol * +Chat.Channel.On=&6(&amcMMO-Chat&6) &eA chat üzeneteid mostantól automatikusan a(z) &a{0}&e chat csatornára kerülnek. +Chat.Channel.Off=&6(&amcMMO-Chat&6) &7A chat üzeneteid a továbbiakban nem kerülnek automatikusan a meghatározott chat csatornákra. +Chat.Spy.Party=&6[&eSPY&6-&a{2}&6] &r{0} &b→ &r{1} +Broadcasts.LevelUpMilestone=&6(&amcMMO&6) {0}&7 elérte a(z) &a{1}&7. [[DARK_AQUA]]{2}&7 szintet! +Broadcasts.PowerLevelUpMilestone=&6(&amcMMO&6) {0}&7 elérte a(z) &a{1}&7. Erőszintet! diff --git a/src/main/resources/locale/locale_it.properties b/src/main/resources/locale/locale_it.properties index 7fc89d026..c1d7408af 100644 --- a/src/main/resources/locale/locale_it.properties +++ b/src/main/resources/locale/locale_it.properties @@ -7,14 +7,14 @@ JSON.DescriptionHeader=Descrizione JSON.JWrapper.Header=Dettagli JSON.Type.Passive=Passiva JSON.Type.Active=Attiva -JSON.Type.SuperAbility=Super Abilit\u00E0 +JSON.Type.SuperAbility=Super Abilità JSON.Locked=-=[LOCKED]=- JSON.LevelRequirement=Livello Richiesto JSON.JWrapper.Target.Type=Tipo di Bersaglio: JSON.JWrapper.Target.Block=Blocco JSON.JWrapper.Target.Player=Giocatore -JSON.JWrapper.Perks.Header=[[GOLD]]Vantaggi Fortunati -JSON.JWrapper.Perks.Lucky={0}% Migliori Probabilit\u00E0 +JSON.JWrapper.Perks.Header=&6Vantaggi Fortunati +JSON.JWrapper.Perks.Lucky={0}% Migliori Probabilità JSON.Hover.Tips=Consigli JSON.Acrobatics=Acrobatica JSON.Alchemy=Alchimia @@ -36,55 +36,55 @@ JSON.URL.Patreon=Supporta nossr50 e il suo lavoro per McMMO su Patreon! JSON.URL.Spigot=La pagina Spigot ufficiale di mcMMO! JSON.URL.Translation=Traduci mcMMO in altre lingue! JSON.URL.Wiki=La wiki ufficiale di mcMMO! -JSON.SkillUnlockMessage=[[GOLD]][ mcMMO[[YELLOW]] @[[DARK_AQUA]]{0} [[GOLD]]Grado [[DARK_AQUA]]{1}[[GOLD]] Sbloccato! ] +JSON.SkillUnlockMessage=&6[ mcMMO&e @&3{0} &6Grado &3{1}&6 Sbloccato! ] JSON.Hover.Rank=&e&lGrado:&r &f{0} JSON.Hover.NextRank=&7&oProssimo upgrade al livello {0} # for JSON.Hover.Mystery you can add {0} to insert the level required into the name, I don't like how that looks so I'm not doing that atm -JSON.Hover.Mystery=[[GRAY]]??? -JSON.Hover.Mystery2=[[YELLOW]][[[DARK_GRAY]]{0}[[YELLOW]]][[DARK_GRAY]]???&r -JSON.Hover.SkillName=[[DARK_AQUA]]{0}&r -JSON.Hover.SuperAbility=[[DARK_PURPLE]]{0}&r -JSON.Hover.MaxRankSkillName=[[GOLD]]{0}&r -JSON.Hover.AtSymbolSkills=[[YELLOW]]@ -JSON.Hover.AtSymbolURL=[[YELLOW]]@ +JSON.Hover.Mystery=&7??? +JSON.Hover.Mystery2=&e[&8{0}&e]&8???&r +JSON.Hover.SkillName=&3{0}&r +JSON.Hover.SuperAbility=&5{0}&r +JSON.Hover.MaxRankSkillName=&6{0}&r +JSON.Hover.AtSymbolSkills=&e@ +JSON.Hover.AtSymbolURL=&e@ #This is the message sent to players when an ability is activated JSON.Notification.SuperAbility={0} #These are the JSON Strings used for SubSkills -JSON.Acrobatics.Roll.Interaction.Activated=Test [[RED]]Rolled Test +JSON.Acrobatics.Roll.Interaction.Activated=Test &cRolled Test JSON.Acrobatics.SubSkill.Roll.Details.Tips=Se ti accovacci durante la caduta puoi prevenire fino al doppio del danno che che normalmente subiresti! -Anvil.SingleItemStack=[[RED]]Non puoi rottamare o riparare pi\u00F9 oggetti contemporaneamente, prima dividili. +Anvil.SingleItemStack=&cNon puoi rottamare o riparare più oggetti contemporaneamente, prima dividili. #DO NOT USE COLOR CODES IN THE JSON KEYS #COLORS ARE DEFINED IN advanced.yml IF YOU WISH TO CHANGE THEM -mcMMO.Template.Prefix=[[GOLD]]([[GREEN]]mcMMO[[GOLD]]) [[GRAY]]{0} +mcMMO.Template.Prefix=&6(&amcMMO&6) &7{0} # BEGIN STYLING -Ability.Generic.Refresh=[[GREEN]]**CAPACIT\u00E0 RIGENERATE!** -Ability.Generic.Template.Lock=[[GRAY]]{0} +Ability.Generic.Refresh=&a**CAPACITà RIGENERATE!** +Ability.Generic.Template.Lock=&7{0} # Skill Command Styling -Ability.Generic.Template=[[DARK_AQUA]]{0}: [[GREEN]]{1} -Ability.Generic.Template.Custom=[[DARK_AQUA]]{0} -Skills.Overhaul.Header=[[RED]][]=====[][[GREEN]] {0} [[RED]][]=====[] +Ability.Generic.Template=&3{0}: &a{1} +Ability.Generic.Template.Custom=&3{0} +Skills.Overhaul.Header=&c[]=====[]&a {0} &c[]=====[] Effects.Effects=EFFETTI -Effects.SubSkills.Overhaul=Sotto-Abilit\u00E0 -Effects.Child.Overhaul=[[DARK_AQUA]]Figlia Lv.[[YELLOW]] {0}[[DARK_AQUA]]: {1} -Effects.Child.ParentList=[[GREEN]]{0}[[GOLD]]([[DARK_AQUA]]Lv.[[YELLOW]]{1}[[GOLD]]) -Effects.Level.Overhaul=[[GOLD]]LVL: [[YELLOW]]{0} [[DARK_AQUA]]XP[[YELLOW]]([[GOLD]]{1}[[YELLOW]]/[[GOLD]]{2}[[YELLOW]]) -Effects.Parent=[[GOLD]]{0} - -Effects.Template=[[DARK_AQUA]]{0}: [[GREEN]]{1} +Effects.SubSkills.Overhaul=Sotto-Abilità +Effects.Child.Overhaul=&3Figlia Lv.&e {0}&3: {1} +Effects.Child.ParentList=&a{0}&6(&3Lv.&e{1}&6) +Effects.Level.Overhaul=&6LVL: &e{0} &3XP&e(&6{1}&e/&6{2}&e) +Effects.Parent=&6{0} - +Effects.Template=&3{0}: &a{1} Commands.Stats.Self.Overhaul=Statistiche -Commands.XPGain.Overhaul=[[GOLD]]GUADAGNO XP: [[DARK_AQUA]]{0} -MOTD.Version.Overhaul=[[GOLD]][mcMMO] [[DARK_AQUA]]Era della Revisione[[GOLD]] - [[DARK_AQUA]]{0} -Overhaul.mcMMO.Header=[[RED]][]=====[][[GREEN]] mcMMO - Era della Revisione [[RED]][]=====[] -Overhaul.mcMMO.Url.Wrap.Prefix=[[RED]][| -Overhaul.mcMMO.Url.Wrap.Suffix=[[RED]]|] -Overhaul.mcMMO.MmoInfo.Wiki=[[YELLOW]][[[WHITE]]Visualizza questa abilit\u00E0 sulla wiki![[YELLOW]]] +Commands.XPGain.Overhaul=&6GUADAGNO XP: &3{0} +MOTD.Version.Overhaul=&6[mcMMO] &3Era della Revisione&6 - &3{0} +Overhaul.mcMMO.Header=&c[]=====[]&a mcMMO - Era della Revisione &c[]=====[] +Overhaul.mcMMO.Url.Wrap.Prefix=&c[| +Overhaul.mcMMO.Url.Wrap.Suffix=&c|] +Overhaul.mcMMO.MmoInfo.Wiki=&e[&fVisualizza questa abilità sulla wiki!&e] # Overhaul.Levelup can take {0} - Skill Name defined in Overhaul.Name {1} - Amount of levels gained {2} - Level in skill -Overhaul.Levelup=[[BOLD]]{0} \u00E8 aumentata a [[RESET]][[GREEN]][[BOLD]]{2}[[RESET]][[WHITE]]. +Overhaul.Levelup=&l{0} è aumentata a &r&a&l{2}&r&f. Overhaul.Name.Acrobatics=Acrobatica Overhaul.Name.Alchemy=Alchimia Overhaul.Name.Archery=Tiro con l'Arco @@ -102,66 +102,66 @@ Overhaul.Name.Unarmed=Lotta Overhaul.Name.Woodcutting=Taglialegna # /mcMMO Command Style Stuff -Commands.mcc.Header=[[RED]]---[][[GREEN]]Comandi mcMMO[[RED]][]--- -Commands.Other=[[RED]]---[][[GREEN]]COMANDI SPECIALI[[RED]][]--- -Commands.Party.Header=[[RED]]-----[][[GREEN]]PARTY[[RED]][]----- -Commands.Party.Features.Header=[[RED]]-----[][[GREEN]]FUNZIONALIT\u00E0[[RED]][]----- +Commands.mcc.Header=&c---[]&aComandi mcMMO&c[]--- +Commands.Other=&c---[]&aCOMANDI SPECIALI&c[]--- +Commands.Party.Header=&c-----[]&aPARTY&c[]----- +Commands.Party.Features.Header=&c-----[]&aFUNZIONALITà&c[]----- # XP BAR Allows for the following variables -- {0} = Skill Level, {1} Current XP, {2} XP Needed for next level, {3} Power Level, {4} Percentage of Level # Make sure you turn on Experience_Bars.ThisMayCauseLag.AlwaysUpdateTitlesWhenXPIsGained if you want the XP bar title to update every time a player gains XP! XPBar.Template={0} -XPBar.Template.EarlyGameBoost=[[GOLD]]Imparando una nuova abilit\u00E0... -XPBar.Acrobatics=Acrobatica Lv.[[GOLD]]{0} -XPBar.Alchemy=Alchimia Lv.[[GOLD]]{0} -XPBar.Archery=Tiro con l'Arco Lv.[[GOLD]]{0} -XPBar.Axes=Axes Lv.[[GOLD]]{0} -XPBar.Excavation=Scavo Lv.[[GOLD]]{0} -XPBar.Fishing=Fishing Lv.[[GOLD]]{0} -XPBar.Herbalism=Erboristeria Lv.[[GOLD]]{0} -XPBar.Mining=Estrazione Lv.[[GOLD]]{0} -XPBar.Repair=Riparazione Lv.[[GOLD]]{0} -XPBar.Salvage=Rottamazione Lv.[[GOLD]]{0} -XPBar.Smelting=Fusione Lv.[[GOLD]]{0} -XPBar.Swords=Spade Lv.[[GOLD]]{0} -XPBar.Taming=Domesticazione Lv.[[GOLD]]{0} -XPBar.Unarmed=Lotta Lv.[[GOLD]]{0} -XPBar.Woodcutting=Taglialegna Lv.[[GOLD]]{0} +XPBar.Template.EarlyGameBoost=&6Imparando una nuova abilità... +XPBar.Acrobatics=Acrobatica Lv.&6{0} +XPBar.Alchemy=Alchimia Lv.&6{0} +XPBar.Archery=Tiro con l'Arco Lv.&6{0} +XPBar.Axes=Axes Lv.&6{0} +XPBar.Excavation=Scavo Lv.&6{0} +XPBar.Fishing=Fishing Lv.&6{0} +XPBar.Herbalism=Erboristeria Lv.&6{0} +XPBar.Mining=Estrazione Lv.&6{0} +XPBar.Repair=Riparazione Lv.&6{0} +XPBar.Salvage=Rottamazione Lv.&6{0} +XPBar.Smelting=Fusione Lv.&6{0} +XPBar.Swords=Spade Lv.&6{0} +XPBar.Taming=Domesticazione Lv.&6{0} +XPBar.Unarmed=Lotta Lv.&6{0} +XPBar.Woodcutting=Taglialegna Lv.&6{0} #This is just a preset template that gets used if the 'ExtraDetails' setting is turned on in experience.yml (off by default), you can ignore this template and just edit the strings above -XPBar.Complex.Template={0} [[DARK_AQUA]] {4}[[WHITE]]% [[DARK_AQUA]]([[WHITE]]{1}[[DARK_AQUA]]/[[WHITE]]{2}[[DARK_AQUA]]) +XPBar.Complex.Template={0} &3 {4}&f% &3(&f{1}&3/&f{2}&3) # XP BAR Allows for the following variables -- {0} = Skill Level, {1} Current XP, {2} XP Needed for next level, {3} Power Level, {4} Percentage of Level # Make sure you turn on Experience_Bars.ThisMayCauseLag.AlwaysUpdateTitlesWhenXPIsGained if you want the XP bar title to update every time a player gains XP! # END STYLING #ACROBATICS -Acrobatics.Ability.Proc=[[GREEN]]**Atterraggio Aggraziato** -Acrobatics.Combat.Proc=[[GREEN]]**Schivato** -Acrobatics.SubSkill.Roll.Stats=[[GOLD]]Possibilit\u00E0 di Capriola [[YELLOW]]{0}%[[GOLD]] Possibilit\u00E0 di Capriola Aggraziata[[YELLOW]] {1}% -Acrobatics.SubSkill.Roll.Stat=Possibilit\u00E0 di Capriola -Acrobatics.SubSkill.Roll.Stat.Extra=Possibilit\u00E0 di Capriola Aggraziata +Acrobatics.Ability.Proc=&a**Atterraggio Aggraziato** +Acrobatics.Combat.Proc=&a**Schivato** +Acrobatics.SubSkill.Roll.Stats=&6Possibilità di Capriola &e{0}%&6 Possibilità di Capriola Aggraziata&e {1}% +Acrobatics.SubSkill.Roll.Stat=Possibilità di Capriola +Acrobatics.SubSkill.Roll.Stat.Extra=Possibilità di Capriola Aggraziata Acrobatics.SubSkill.Roll.Name=Capriola Acrobatics.SubSkill.Roll.Description=Atterra strategicamente per evitare danni. -Acrobatics.SubSkill.Roll.Chance=Possibilit\u00E0 di Capriola: [[YELLOW]]{0} -Acrobatics.SubSkill.Roll.GraceChance=Possibilit\u00E0 di Capriola Aggraziata: [[YELLOW]]{0} -Acrobatics.SubSkill.Roll.Mechanics=[[GRAY]]La Capriola \u00E8 una Sotto-Abilit\u00E0 attiva con una componente passiva.\nOgni volta che subisci un danno da caduta hai la possibilit\u00E0 di annullare completamente il danno in base al tuo livello di abilit\u00E0, al livello 50 hai il [[YELLOW]]{0}%[[GRAY]] di possibilit\u00E0 di prevenire il danno, e il [[YELLOW]]{1}%[[GRAY]] se attivi Capriola Aggraziata.\nLe possibilit\u00E0 di successo sono scalate rispetto al tuo livello di abilit\u00E0 con una curva lineare fino al livello [[YELLOW]]{2}[[GRAY]] dove diventa massima, ogni livello in Acrobatica ti d\u00E0 il [[YELLOW]]{3}%[[GRAY]] di possibilit\u00E0 di successo.\nTenendo premuto il pulsante di accovacciamento puoi raddoppiare le tue probabilit\u00E0 di evitare i danni da caduta ed evitare fino al doppio del danno da caduta! Stando accovacciato trasformer\u00E0 una capriola normale in una Capriola Aggraziata.\nLe Capriole impediscono solo fino a [[RED]]{4}[[GRAY]] danni. Le Capriole Aggraziate impediscono fino a [[GREEN]]{5}[[GRAY]] danni. +Acrobatics.SubSkill.Roll.Chance=Possibilità di Capriola: &e{0} +Acrobatics.SubSkill.Roll.GraceChance=Possibilità di Capriola Aggraziata: &e{0} +Acrobatics.SubSkill.Roll.Mechanics=&7La Capriola è una Sotto-Abilità attiva con una componente passiva.\nOgni volta che subisci un danno da caduta hai la possibilità di annullare completamente il danno in base al tuo livello di abilità, al livello &e{6}%&7 hai il &e{0}%&7 di possibilità di prevenire il danno, e il &e{1}%&7 se attivi Capriola Aggraziata.\nLe possibilità di successo sono scalate rispetto al tuo livello di abilità con una curva lineare fino al livello &e{2}&7 dove diventa massima, ogni livello in Acrobatica ti dà il &e{3}%&7 di possibilità di successo.\nTenendo premuto il pulsante di accovacciamento puoi raddoppiare le tue probabilità di evitare i danni da caduta ed evitare fino al doppio del danno da caduta! Stando accovacciato trasformerà una capriola normale in una Capriola Aggraziata.\nLe Capriole impediscono solo fino a &c{4}&7 danni. Le Capriole Aggraziate impediscono fino a &a{5}&7 danni. Acrobatics.SubSkill.GracefulRoll.Name=Capriola Aggraziata -Acrobatics.SubSkill.GracefulRoll.Description=Due volte pi\u00F9 efficace di una normale Capriola +Acrobatics.SubSkill.GracefulRoll.Description=Due volte più efficace di una normale Capriola Acrobatics.SubSkill.Dodge.Name=Schivata -Acrobatics.SubSkill.Dodge.Description=Riduce della met\u00E0 il danno di attacco -Acrobatics.SubSkill.Dodge.Stat=Possibilit\u00E0 di Schivata +Acrobatics.SubSkill.Dodge.Description=Riduce della metà il danno di attacco +Acrobatics.SubSkill.Dodge.Stat=Possibilità di Schivata Acrobatics.Listener=Acrobatica: -Acrobatics.Roll.Text=[[ITALIC]]**Capriola Eseguita** +Acrobatics.Roll.Text=&o**Capriola Eseguita** Acrobatics.SkillName=ACROBATICA #ALCHEMY Alchemy.SubSkill.Catalysis.Name=Catalisi -Alchemy.SubSkill.Catalysis.Description=Aumenta la velocit\u00E0 di preparazione delle pozioni -Alchemy.SubSkill.Catalysis.Stat=Velocit\u00E0 di Preparazione +Alchemy.SubSkill.Catalysis.Description=Aumenta la velocità di preparazione delle pozioni +Alchemy.SubSkill.Catalysis.Stat=Velocità di Preparazione Alchemy.SubSkill.Concoctions.Name=Intrugli -Alchemy.SubSkill.Concoctions.Description=Prepara pozioni con pi\u00F9 ingredienti -Alchemy.SubSkill.Concoctions.Stat=Grado Intrugli: [[GREEN]]{0}[[DARK_AQUA]]/[[GREEN]]{1} -Alchemy.SubSkill.Concoctions.Stat.Extra=Ingredienti [[[GREEN]]{0}[[DARK_AQUA]]]: [[GREEN]]{1} +Alchemy.SubSkill.Concoctions.Description=Prepara pozioni con più ingredienti +Alchemy.SubSkill.Concoctions.Stat=Grado Intrugli: &a{0}&3/&a{1} +Alchemy.SubSkill.Concoctions.Stat.Extra=Ingredienti [&a{0}&3]: &a{1} Alchemy.Listener=Alchimia: -Alchemy.Ability.Locked.0=BLOCCATO FINO AD ABILIT\u00E0 {0}+ (CATALISI) +Alchemy.Ability.Locked.0=BLOCCATO FINO AD ABILITà {0}+ (CATALISI) Alchemy.SkillName=ALCHIMIA #ARCHERY @@ -170,12 +170,12 @@ Archery.SubSkill.SkillShot.Description=Aumenta il danno inflitto con gli archi Archery.SubSkill.SkillShot.Stat=Danno Bonus Tiro da Maestro Archery.SubSkill.Daze.Name=Stordimento Archery.SubSkill.Daze.Description=Disorienta i nemici e infligge danni extra -Archery.SubSkill.Daze.Stat=Possibilit\u00E0 di Stordimento +Archery.SubSkill.Daze.Stat=Possibilità di Stordimento Archery.SubSkill.ArrowRetrieval.Name=Recupero Frecce -Archery.SubSkill.ArrowRetrieval.Description=Possibilit\u00E0 di recuperare frecce dai cadaveri -Archery.SubSkill.ArrowRetrieval.Stat=Possibilit\u00E0 di Recupero Frecce +Archery.SubSkill.ArrowRetrieval.Description=Possibilità di recuperare frecce dai cadaveri +Archery.SubSkill.ArrowRetrieval.Stat=Possibilità di Recupero Frecce Archery.SubSkill.ArcheryLimitBreak.Name=Danni Aumentati Tiro con l'Arco -Archery.SubSkill.ArcheryLimitBreak.Description=Supera i tuoi limiti. Danni aumentati contro avversari difficili. Destinato al PVP, sta alle impostazioni del server se aumenter\u00E0 o meno i danni nel PVE. +Archery.SubSkill.ArcheryLimitBreak.Description=Supera i tuoi limiti. Danni aumentati contro avversari difficili. Destinato al PVP, sta alle impostazioni del server se aumenterà o meno i danni nel PVE. Archery.SubSkill.ArcheryLimitBreak.Stat=Danno Massimo di Danni Aumentati Archery.Listener=Tiro con l'Arco: Archery.SkillName=ARCO @@ -187,23 +187,23 @@ Axes.Ability.Bonus.2=Sfonda Armature Axes.Ability.Bonus.3=Infligge {0} danni bonus alle armature Axes.Ability.Bonus.4=Impatto Migliorato Axes.Ability.Bonus.5=Infligge {0} danni bonus ai nemici senza armatura -Axes.Ability.Lower=[[GRAY]]Abbassi l'Ascia. -Axes.Ability.Ready=[[GOLD]]Prepari[[DARK_AQUA]] l'Ascia. -Axes.Combat.CritStruck=[[DARK_RED]]Hai subito un colpo CRITICO! +Axes.Ability.Lower=&7Abbassi l'Ascia. +Axes.Ability.Ready=&6Prepari&3 l'Ascia. +Axes.Combat.CritStruck=&4Hai subito un colpo CRITICO! Axes.Combat.CriticalHit=COLPO CRITICO! -Axes.Combat.GI.Proc=[[GREEN]]**COLPITO CON GRANDE FORZA** +Axes.Combat.GI.Proc=&a**COLPITO CON GRANDE FORZA** Axes.Combat.GI.Struck=**COLPITO DA IMPATTO MIGLIORATO** -Axes.Combat.SS.Struck=[[DARK_RED]]Colpito da SPACCA CRANI! +Axes.Combat.SS.Struck=&4Colpito da SPACCA CRANI! Axes.SubSkill.SkullSplitter.Name=Spacca Crani Axes.SubSkill.SkullSplitter.Description=Infligge Danno ad Area Axes.SubSkill.SkullSplitter.Stat=Durata Spacca Crani Axes.SubSkill.CriticalStrikes.Name=Colpi Critici Axes.SubSkill.CriticalStrikes.Description=Doppio Danno -Axes.SubSkill.CriticalStrikes.Stat=Possibilit\u00E0 di Colpo Critico +Axes.SubSkill.CriticalStrikes.Stat=Possibilità di Colpo Critico Axes.SubSkill.AxeMastery.Name=Maestria con l'Ascia Axes.SubSkill.AxeMastery.Description=Aggiunge danni bonus Axes.SubSkill.AxesLimitBreak.Name=Danni Aumentati Asce -Axes.SubSkill.AxesLimitBreak.Description=Supera i tuoi limiti. Danni aumentati contro avversari difficili. Destinato al PVP, sta alle impostazioni del server se aumenter\u00E0 o meno i danni nel PVE. +Axes.SubSkill.AxesLimitBreak.Description=Supera i tuoi limiti. Danni aumentati contro avversari difficili. Destinato al PVP, sta alle impostazioni del server se aumenterà o meno i danni nel PVE. Axes.SubSkill.AxesLimitBreak.Stat=Danno Massimo di Danni Aumentati Axes.SubSkill.ArmorImpact.Name=Sfonda Armature Axes.SubSkill.ArmorImpact.Description=Colpisci con forza sufficiente per fracassare le armature @@ -211,221 +211,219 @@ Axes.SubSkill.GreaterImpact.Name=Impatto Migliorato Axes.SubSkill.GreaterImpact.Description=Infligge danni bonus ai nemici non armati Axes.Listener=Asce: Axes.SkillName=ASCE -Axes.Skills.SS.Off=**Spacca Crani si \u00E8 esaurito** -Axes.Skills.SS.On=[[GREEN]]**Spacca Crani ATTIVATO** -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.Skills.SS.Off=**Spacca Crani si è esaurito** +Axes.Skills.SS.On=&a**Spacca Crani ATTIVATO** +Axes.Skills.SS.Refresh=&aLa tua capacità &eSpacca Crani &asi è rigenerata! +Axes.Skills.SS.Other.Off=Spacca Crani&a si è esaurito per &e{0} +Axes.Skills.SS.Other.On=&a{0}&2 ha usato &cSpacca Crani! #EXCAVATION -Excavation.Ability.Lower=[[GRAY]]Abbassi la Pala. -Excavation.Ability.Ready=[[GOLD]]Prepari[[DARK_AQUA]] la Pala. +Excavation.Ability.Lower=&7Abbassi la Pala. +Excavation.Ability.Ready=&6Prepari&3 la Pala. Excavation.SubSkill.GigaDrillBreaker.Name=Giga-Trivella Demolitrice -Excavation.SubSkill.GigaDrillBreaker.Description=Drop 3x, XP 3x, +Velocit\u00E0 +Excavation.SubSkill.GigaDrillBreaker.Description=Drop 3x, XP 3x, +Velocità Excavation.SubSkill.GigaDrillBreaker.Stat=Durata Giga-Trivella Demolitrice Excavation.SubSkill.Archaeology.Name=Archeologia -Excavation.SubSkill.Archaeology.Description=Scopri i segreti della terra! Alti livelli di abilit\u00E0 aumentano le tue probabilit\u00E0 di trovare sfere di esperienza quando trovi un tesoro! -Excavation.SubSkill.Archaeology.Stat=Possibilit\u00E0 Sfere di Esperienza Archeologia -Excavation.SubSkill.Archaeology.Stat.Extra=Quantit\u00E0 Sfere di Esperienza Archeologia +Excavation.SubSkill.Archaeology.Description=Scopri i segreti della terra! Alti livelli di abilità aumentano le tue probabilità di trovare sfere di esperienza quando trovi un tesoro! +Excavation.SubSkill.Archaeology.Stat=Possibilità Sfere di Esperienza Archeologia +Excavation.SubSkill.Archaeology.Stat.Extra=Quantità Sfere di Esperienza Archeologia Excavation.Listener=Scavo: Excavation.SkillName=SCAVO -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.Skills.GigaDrillBreaker.Off=**Giga-Trivella Demolitrice si è esaurita** +Excavation.Skills.GigaDrillBreaker.On=&a**GIGA-TRIVELLA DEMOLITRICE ATTIVATA** +Excavation.Skills.GigaDrillBreaker.Refresh=&aLa tua capacità &eGiga-Trivella Demolitrice &asi è rigenerata! +Excavation.Skills.GigaDrillBreaker.Other.Off=Giga-Trivella Demolitrice&a si è esaurita per &e{0} +Excavation.Skills.GigaDrillBreaker.Other.On=&a{0}&2 ha usato &cGiga-Trivella Demolitrice! #FISHING -Fishing.ScarcityTip=[[YELLOW]]&oQuesta zona soffre di pesca eccessiva, getta la tua canna in un punto diverso per pi\u00F9 pesci. Almeno a {0} blocchi di distanza. -Fishing.Scared=[[GRAY]]&oI movimenti caotici spaventeranno i pesci! -Fishing.Exhausting=[[RED]]&oL'uso improprio della canna da pesca provocher\u00E0 affaticamento e usurer\u00E0 la canna! -Fishing.LowResourcesTip=[[GRAY]]Senti che potrebbero non esserci molti pesci rimasti in quest'area. Prova a pescare almeno a {0} blocchi di distanza. -Fishing.Ability.Info=Cacciatore di Magia: [[GRAY]] **Migliora insieme al Grado di Cacciatore di Tesori** -Fishing.Ability.Locked.0=BLOCCATO FINO AD ABILIT\u00E0 {0}+ (SCUOTERE) -Fishing.Ability.Locked.1=BLOCCATO FINO AD ABILIT\u00E0 {0}+ (PESCA SUL GHIACCIO) -Fishing.Ability.Locked.2=BLOCCATO FINO AD ABILIT\u00E0 {0}+ (PESCATORE PROVETTO) +Fishing.ScarcityTip=&e&oQuesta zona soffre di pesca eccessiva, getta la tua canna in un punto diverso per più pesci. Almeno a {0} blocchi di distanza. +Fishing.Scared=&7&oI movimenti caotici spaventeranno i pesci! +Fishing.Exhausting=&c&oL'uso improprio della canna da pesca provocherà affaticamento e usurerà la canna! +Fishing.LowResourcesTip=&7Senti che potrebbero non esserci molti pesci rimasti in quest'area. Prova a pescare almeno a {0} blocchi di distanza. +Fishing.Ability.Info=Cacciatore di Magia: &7 **Migliora insieme al Grado di Cacciatore di Tesori** +Fishing.Ability.Locked.0=BLOCCATO FINO AD ABILITà {0}+ (SCUOTERE) +Fishing.Ability.Locked.1=BLOCCATO FINO AD ABILITà {0}+ (PESCA SUL GHIACCIO) +Fishing.Ability.Locked.2=BLOCCATO FINO AD ABILITà {0}+ (PESCATORE PROVETTO) Fishing.SubSkill.TreasureHunter.Name=Cacciatore di Tesori Fishing.SubSkill.TreasureHunter.Description=Pesca oggetti vari -Fishing.SubSkill.TreasureHunter.Stat=Grado Cacciatore di Tesori: [[GREEN]]{0}[[DARK_AQUA]]/[[GREEN]]{1} -Fishing.SubSkill.TreasureHunter.Stat.Extra=Tasso di Drop: [[GRAY]]Comune: [[YELLOW]]{0} [[GREEN]]Non comune: [[YELLOW]]{1}\n[[BLUE]]Raro: [[YELLOW]]{2} [[LIGHT_PURPLE]]Epico: [[YELLOW]]{3} [[GOLD]]Leggendario: [[YELLOW]]{4} [[AQUA]]Record: [[YELLOW]]{5} +Fishing.SubSkill.TreasureHunter.Stat=Grado Cacciatore di Tesori: &a{0}&3/&a{1} +Fishing.SubSkill.TreasureHunter.Stat.Extra=Tasso di Drop: &7Comune: &e{0} &aNon comune: &e{1}\n&9Raro: &e{2} &dEpico: &e{3} &6Leggendario: &e{4} &bMythic: &e{5} Fishing.SubSkill.MagicHunter.Name=Cacciatore di Magia Fishing.SubSkill.MagicHunter.Description=Trova Oggetti Incantati -Fishing.SubSkill.MagicHunter.Stat=Possibilit\u00E0 Cacciatore di Magia +Fishing.SubSkill.MagicHunter.Stat=Possibilità Cacciatore di Magia Fishing.SubSkill.Shake.Name=Scuotere Fishing.SubSkill.Shake.Description=Scrolla oggetti di dosso ai mob o ai giocatori con una canna da pesca -Fishing.SubSkill.Shake.Stat=Possibilit\u00E0 di Scuotere +Fishing.SubSkill.Shake.Stat=Possibilità di Scuotere Fishing.SubSkill.FishermansDiet.Name=Dieta del Pescatore Fishing.SubSkill.FishermansDiet.Description=Aumenta la fame recuperata tramite cibi pescati -Fishing.SubSkill.FishermansDiet.Stat=Dieta del Pescatore:[[GREEN]] Grado {0} +Fishing.SubSkill.FishermansDiet.Stat=Dieta del Pescatore:&a Grado {0} Fishing.SubSkill.MasterAngler.Name=Pescatore Provetto -Fishing.SubSkill.MasterAngler.Description=Migliora la possibilit\u00E0 di ottenere un morso durante la pesca -Fishing.SubSkill.MasterAngler.Stat=Maggiore Possibilit\u00E0 di Morso alla tua posizione attuale: [[GREEN]]+{0} Fishing.SubSkill.IceFishing.Name=Pesca sul Ghiaccio Fishing.SubSkill.IceFishing.Description=Ti permette di pescare in biomi ghiacciati Fishing.SubSkill.IceFishing.Stat=Pesca sul Ghiaccio -Fishing.Chance.Raining=[[BLUE]] Bonus Pioggia +Fishing.Chance.Raining=&9 Bonus Pioggia Fishing.Listener=Pesca: -Fishing.Ability.TH.MagicFound=[[GRAY]]Senti un tocco di magia in questa cattura... -Fishing.Ability.TH.Boom=[[GRAY]]BOOM TIME!!! -Fishing.Ability.TH.Poison=[[GRAY]]C'\u00E8 qualcosa che puzza... +Fishing.Ability.TH.MagicFound=&7Senti un tocco di magia in questa cattura... +Fishing.Ability.TH.Boom=&7BOOM TIME!!! +Fishing.Ability.TH.Poison=&7C'è qualcosa che puzza... Fishing.SkillName=PESCA #HERBALISM -Herbalism.Ability.GTe.NeedMore=Ti servono pi\u00F9 semi per diffondere Terra Verde. +Herbalism.Ability.GTe.NeedMore=Ti servono più semi per diffondere Terra Verde. Herbalism.Ability.GTh.Fail=**POLLICE VERDE FALLITO** -Herbalism.Ability.GTh=[[GREEN]]**POLLICE VERDE** -Herbalism.Ability.Lower=[[GRAY]]Abbassi la Zappa. -Herbalism.Ability.Ready=[[GOLD]]Prepari[[DARK_AQUA]] la Zappa. +Herbalism.Ability.GTh=&a**POLLICE VERDE** +Herbalism.Ability.Lower=&7Abbassi la Zappa. +Herbalism.Ability.Ready=&6Prepari&3 la Zappa. Herbalism.Ability.ShroomThumb.Fail=**POLLICE FUNGO FALLITO** Herbalism.SubSkill.GreenTerra.Name=Terra Verde Herbalism.SubSkill.GreenTerra.Description=Diffondi la Terra, Drop 3x Herbalism.SubSkill.GreenTerra.Stat=Durata Green Terra Herbalism.SubSkill.GreenThumb.Name=Pollice Verde Herbalism.SubSkill.GreenThumb.Description=Auto-Pianta le colture durante la raccolta -Herbalism.SubSkill.GreenThumb.Stat=Possibilit\u00E0 Pollice Verde -Herbalism.SubSkill.GreenThumb.Stat.Extra=Fase Pollice Verde: [[GREEN]] Le colture crescono nella fase {0} +Herbalism.SubSkill.GreenThumb.Stat=Possibilità Pollice Verde +Herbalism.SubSkill.GreenThumb.Stat.Extra=Fase Pollice Verde: &a Le colture crescono nella fase {0} Herbalism.Effect.4=Pollice Verde (Blocchi) Herbalism.SubSkill.GreenThumb.Description.2=Ricopri i mattoni di muschio o fai crescere l'erba Herbalism.SubSkill.FarmersDiet.Name=Dieta del Contadino Herbalism.SubSkill.FarmersDiet.Description=Aumenta la fame recuperata tramite cibi coltivati -Herbalism.SubSkill.FarmersDiet.Stat=Dieta del Contadino: [[GREEN]]Grado {0} +Herbalism.SubSkill.FarmersDiet.Stat=Dieta del Contadino: &aGrado {0} Herbalism.SubSkill.DoubleDrops.Name=Doppi Drop Herbalism.SubSkill.DoubleDrops.Description=Raddoppia il normale drop -Herbalism.SubSkill.DoubleDrops.Stat=Possibilit\u00E0 di Doppio Drop +Herbalism.SubSkill.DoubleDrops.Stat=Possibilità di Doppio Drop Herbalism.SubSkill.HylianLuck.Name=Fortuna Hylian -Herbalism.SubSkill.HylianLuck.Description=D\u00E0 una piccola possibilit\u00E0 di trovare oggetti rari -Herbalism.SubSkill.HylianLuck.Stat=Possibilit\u00E0 Fortuna Hylian +Herbalism.SubSkill.HylianLuck.Description=Dà una piccola possibilità di trovare oggetti rari +Herbalism.SubSkill.HylianLuck.Stat=Possibilità Fortuna Hylian Herbalism.SubSkill.ShroomThumb.Name=Pollice Fungo Herbalism.SubSkill.ShroomThumb.Description=Diffonde il micelio su terra ed erba -Herbalism.SubSkill.ShroomThumb.Stat=Possibilit\u00E0 Pollice Fungo -Herbalism.HylianLuck=[[GREEN]]Oggi la fortuna di Hyrule \u00E8 con te! +Herbalism.SubSkill.ShroomThumb.Stat=Possibilità Pollice Fungo +Herbalism.HylianLuck=&aOggi la fortuna di Hyrule è 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 capacit\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.Skills.GTe.Off=**Terra Verde si è esaurita** +Herbalism.Skills.GTe.On=&a**TERRA VERDE ATTIVATA** +Herbalism.Skills.GTe.Refresh=&aLa tua capacità &eTerra Verde &asi è rigenerata! +Herbalism.Skills.GTe.Other.Off=Terra Verde&a si è esaurita per &e{0} +Herbalism.Skills.GTe.Other.On=&a{0}&2 ha usato &cTerra Verde! #MINING -Mining.Ability.Locked.0=BLOCCATO FINO AD ABILIT\u00E0 (ESTRAZIONE ESPLOSIVA) -Mining.Ability.Locked.1=BLOCCATO FINO AD ABILIT\u00E0 (BOMBE PI\u00F9 GRANDI) -Mining.Ability.Locked.2=BLOCCATO FINO AD ABILIT\u00E0 (PERIZIA NELLE DEMOLIZIONI) -Mining.Ability.Lower=[[GRAY]]Abbassi il Piccone. -Mining.Ability.Ready=[[GOLD]]Prepari[[DARK_AQUA]] il Piccone. +Mining.Ability.Locked.0=BLOCCATO FINO AD ABILITà (ESTRAZIONE ESPLOSIVA) +Mining.Ability.Locked.1=BLOCCATO FINO AD ABILITà (BOMBE PIù GRANDI) +Mining.Ability.Locked.2=BLOCCATO FINO AD ABILITà (PERIZIA NELLE DEMOLIZIONI) +Mining.Ability.Lower=&7Abbassi il Piccone. +Mining.Ability.Ready=&6Prepari&3 il Piccone. Mining.SubSkill.SuperBreaker.Name=Super Demolitore -Mining.SubSkill.SuperBreaker.Description=Velocit\u00E0+, Possibilit\u00E0 Triplo Drop +Mining.SubSkill.SuperBreaker.Description=Velocità+, Possibilità Triplo Drop Mining.SubSkill.SuperBreaker.Stat=Durata di Super Demolitore Mining.SubSkill.DoubleDrops.Name=Doppi Drop Mining.SubSkill.DoubleDrops.Description=Raddoppia il normale drop -Mining.SubSkill.DoubleDrops.Stat=Possibilit\u00E0 di Doppio Drop +Mining.SubSkill.DoubleDrops.Stat=Possibilità di Doppio Drop Mining.SubSkill.BlastMining.Name=Estrazione Esplosiva Mining.SubSkill.BlastMining.Description=Bonus nell'estrarre minerali col TNT -Mining.SubSkill.BlastMining.Stat=Estrazione Esplosiva:[[GREEN]] Grado {0}/{1} [[GRAY]]({2}) -Mining.SubSkill.BlastMining.Stat.Extra=Aumento Raggio di Esplosione: [[GREEN]]+{0} -Mining.SubSkill.BiggerBombs.Name=Bombe Pi\u00F9 Grandi +Mining.SubSkill.BlastMining.Stat=Estrazione Esplosiva:&a Grado {0}/{1} &7({2}) +Mining.SubSkill.BlastMining.Stat.Extra=Aumento Raggio di Esplosione: &a+{0} +Mining.SubSkill.BiggerBombs.Name=Bombe Più Grandi Mining.SubSkill.BiggerBombs.Description=Aumenta 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.SubSkill.DemolitionsExpertise.Stat=Riduzione del Danno da Perizia nelle Demolizioni 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.Skills.SuperBreaker.Off=**Super Demolitore si è esaurito** +Mining.Skills.SuperBreaker.On=&a**SUPER DEMOLITORE ATTIVATO** +Mining.Skills.SuperBreaker.Other.Off=Super Demolitore&a si è esaurito per &e{0} +Mining.Skills.SuperBreaker.Other.On=&a{0}&2 ha usato &cSuper Demolitore! +Mining.Skills.SuperBreaker.Refresh=&aLa tua capacità &eSuper Demolitore &asi è rigenerata! #Blast Mining -Mining.Blast.Boom=[[GRAY]]**BOOM** +Mining.Blast.Boom=&7**BOOM** Mining.Blast.Cooldown= Mining.Blast.Effect=+{0} minerale raccolto, drop {1}x -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! +Mining.Blast.Other.On=&a{0}&2 ha usato &cEstrazione Esplosiva! +Mining.Blast.Refresh=&aLa tua capacità &eEstrazione Esplosiva &asi è rigenerata! #REPAIR Repair.SubSkill.Repair.Name=Riparazione Repair.SubSkill.Repair.Description=Ripara Attrezzi e Armature -Repair.SubSkill.GoldRepair.Name=Riparazione Oro (ABILIT\u00E0 {0}+) +Repair.SubSkill.GoldRepair.Name=Riparazione Oro (ABILITà {0}+) Repair.SubSkill.GoldRepair.Description=Ripara Attrezzi e Armature d'Oro -Repair.SubSkill.IronRepair.Name=Riparazione Ferro (ABILIT\u00E0 {0}+) +Repair.SubSkill.IronRepair.Name=Riparazione Ferro (ABILITà {0}+) Repair.SubSkill.IronRepair.Description=Ripara Attrezzi e Armature di Ferro -Repair.SubSkill.StoneRepair.Name=Riparazione Pietra (ABILIT\u00E0 {0}+) +Repair.SubSkill.StoneRepair.Name=Riparazione Pietra (ABILITà {0}+) Repair.SubSkill.StoneRepair.Description=Ripara Attrezzi di Pietra Repair.SubSkill.RepairMastery.Name=Maestria nella Riparazione Repair.SubSkill.RepairMastery.Description=Riparazione incrementata -Repair.SubSkill.RepairMastery.Stat=Maestria nella Riparazione: [[GREEN]]{0} durabilit\u00E0 extra ripristinata +Repair.SubSkill.RepairMastery.Stat=Maestria nella Riparazione: &a{0} durabilità extra ripristinata Repair.SubSkill.SuperRepair.Name=Super Riparazione Repair.SubSkill.SuperRepair.Description=Doppia efficacia -Repair.SubSkill.SuperRepair.Stat=Possibilit\u00E0 Super Riparazione -Repair.SubSkill.DiamondRepair.Name=Riparazione Diamante (ABILIT\u00E0 {0}+) +Repair.SubSkill.SuperRepair.Stat=Possibilità Super Riparazione +Repair.SubSkill.DiamondRepair.Name=Riparazione Diamante (ABILITà {0}+) Repair.SubSkill.DiamondRepair.Description=Ripara Attrezzi e Armature di Diamante Repair.SubSkill.ArcaneForging.Name=Forgiatura Arcana Repair.SubSkill.ArcaneForging.Description=Ripara oggetti magici -Repair.SubSkill.ArcaneForging.Stat=Forgiatura Arcana: [[YELLOW]]Grado {0}/{1} -Repair.SubSkill.ArcaneForging.Stat.Extra=[[DARK_AQUA]]Probabilit\u00E0 Forgiatura Arcana:[[GRAY]] Successo [[GREEN]]{0}[[GRAY]]%, Fallimento [[RED]]{1}[[GRAY]]% -Repair.Error=[[DARK_RED]]mcMMO ha riscontrato un errore nel tentativo di riparare questo oggetto! -Repair.Listener.Anvil=[[DARK_RED]]Hai posizionato un'incudine, le incudini possono riparare attrezzi e armature. +Repair.SubSkill.ArcaneForging.Stat=Forgiatura Arcana: &eGrado {0}/{1} +Repair.SubSkill.ArcaneForging.Stat.Extra=&3Probabilità Forgiatura Arcana:&7 Successo &a{0}&7%, Fallimento &c{1}&7% +Repair.Error=&4mcMMO ha riscontrato un errore nel tentativo di riparare questo oggetto! +Repair.Listener.Anvil=&4Hai posizionato 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=[[RED]]Devi essere di livello [[YELLOW]]{0}[[RED]] per riparare [[YELLOW]]{1} -Repair.Skills.FeltEasy=[[GRAY]]Sembrava facile. -Repair.Skills.FullDurability=[[GRAY]]\u00E8 gi\u00E0 a piena durevolezza. -Repair.Skills.StackedItems=[[DARK_RED]]Non puoi riparare oggetti ammucchiati. +Repair.Skills.AdeptDiamond=&4Non sei abbastanza abile da riparare il Diamante. +Repair.Skills.AdeptGold=&4Non sei abbastanza abile da riparare l'Oro. +Repair.Skills.AdeptIron=&4Non sei abbastanza abile da riparare il Ferro. +Repair.Skills.AdeptStone=&4Non sei abbastanza abile da riparare la Pietra. +Repair.Skills.Adept=&cDevi essere di livello &e{0}&c per riparare &e{1} +Repair.Skills.FeltEasy=&7Sembrava facile. +Repair.Skills.FullDurability=&7è già a piena durevolezza. +Repair.Skills.StackedItems=&4Non puoi riparare oggetti ammucchiati. Repair.Pretty.Name=Riparazione #Arcane Forging -Repair.Arcane.Downgrade=Il potere arcano di questo oggetto \u00E8 diminuito. +Repair.Arcane.Downgrade=Il potere arcano di questo oggetto è diminuito. Repair.Arcane.Fail=Il potere arcano ha abbandonato l'oggetto permanentemente. Repair.Arcane.Lost=Non eri abbastanza abile da mantenere alcun incantesimo. -Repair.Arcane.Perfect=[[GREEN]]Hai mantenuto le energie arcane in questo oggetto. +Repair.Arcane.Perfect=&aHai mantenuto le energie arcane in questo oggetto. #SALVAGE Salvage.Pretty.Name=Rottamazione Salvage.SubSkill.UnderstandingTheArt.Name=Capire l'Arte -Salvage.SubSkill.UnderstandingTheArt.Description=Non stai semplicemente scavando nella spazzatura dei tuoi vicini, ti stai prendendo cura dell'ambiente.\nPotenzia varie propriet\u00E0 della Rottamazione. +Salvage.SubSkill.UnderstandingTheArt.Description=Non stai semplicemente scavando nella spazzatura dei tuoi vicini, ti stai prendendo cura dell'ambiente.\nPotenzia varie proprietà della Rottamazione. Salvage.SubSkill.ScrapCollector.Name=Collezionista di Rottami -Salvage.SubSkill.ScrapCollector.Description=Recupera materiali da un oggetto, un perfetto recupero dipende da abilit\u00E0 e fortuna. -Salvage.SubSkill.ScrapCollector.Stat=Collezionista di Rottami: [[GREEN]]Recupera fino a [[YELLOW]]{0}[[GREEN]] oggetti. \u00E8 coinvolta un po' di fortuna. +Salvage.SubSkill.ScrapCollector.Description=Recupera materiali da un oggetto, un perfetto recupero dipende da abilità e fortuna. +Salvage.SubSkill.ScrapCollector.Stat=Collezionista di Rottami: &aRecupera fino a &e{0}&a oggetti. è coinvolta un po' di fortuna. Salvage.SubSkill.ArcaneSalvage.Name=Rottamazione Arcana Salvage.SubSkill.ArcaneSalvage.Description=Estrae incantesimi dagli oggetti -Salvage.SubSkill.ArcaneSalvage.Stat=Rottamazione Arcana: [[YELLOW]]Grado {0}/{1} +Salvage.SubSkill.ArcaneSalvage.Stat=Rottamazione Arcana: &eGrado {0}/{1} Salvage.Ability.Bonus.0=Collezionista di Rottami -Salvage.Ability.Bonus.1=Recupera fino a [[YELLOW]]{0}[[GREEN]] oggetti. \u00E8 coinvolta un po' di fortuna. -Salvage.Arcane.ExtractFull=[[GRAY]]Possibilit\u00E0 di Incantesimo-Completo RA -Salvage.Arcane.ExtractPartial=[[GRAY]]Possibilit\u00E0 di Incantesimo-Parziale RA -Salvage.Skills.Success=[[GREEN]]Oggetto rottamato! -Salvage.Skills.Adept.Damaged=[[DARK_RED]]Non sei abbastanza abile per 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=[[RED]]Non sei riuscito a estrarre le conoscenze contenute in questo oggetto. -Salvage.Skills.ArcanePartial=[[RED]]Sei riuscito a estrarre solo alcune delle conoscenze contenute all'interno di questo oggetto. -Salvage.Skills.ArcaneSuccess=[[GREEN]]Sei riuscito a estrarre tutte le conoscenze contenute in questo oggetto! -Salvage.Listener.Anvil=[[DARK_RED]]Hai posizionato un'incudine da Rottamazione, usala per Rottamare attrezzi e armature. +Salvage.Ability.Bonus.1=Recupera fino a &e{0}&a oggetti. è coinvolta un po' di fortuna. +Salvage.Arcane.ExtractFull=&7Possibilità di Incantesimo-Completo RA +Salvage.Arcane.ExtractPartial=&7Possibilità di Incantesimo-Parziale RA +Salvage.Skills.Success=&aOggetto rottamato! +Salvage.Skills.Adept.Damaged=&4Non sei abbastanza abile per rottamare gli oggetti danneggiati. +Salvage.Skills.Adept.Level=Devi essere di livello &e{0}&c per rottamare &e{1} +Salvage.Skills.TooDamaged=&4Questo oggetto è troppo danneggiato per essere rottamato. +Salvage.Skills.ArcaneFailed=&cNon sei riuscito a estrarre le conoscenze contenute in questo oggetto. +Salvage.Skills.ArcanePartial=&cSei riuscito a estrarre solo alcune delle conoscenze contenute all'interno di questo oggetto. +Salvage.Skills.ArcaneSuccess=&aSei riuscito a estrarre tutte le conoscenze contenute in questo oggetto! +Salvage.Listener.Anvil=&4Hai posizionato un'incudine da Rottamazione, usala per Rottamare attrezzi e armature. Salvage.Listener=Rottamazione: Salvage.SkillName=ROTTAMAZIONE -Salvage.Skills.Lottery.Normal=[[GOLD]]Sei riuscito a rottamare [[DARK_AQUA]]{0}[[GOLD]] materiali da [[YELLOW]]{1}[[GOLD]]. -Salvage.Skills.Lottery.Perfect=[[GREEN]][[BOLD]]Perfetto![[RESET]][[GOLD]] Hai rottamato senza sforzo [[DARK_AQUA]]{1}[[GOLD]], recuperando [[DARK_AQUA]]{0}[[GOLD]] materiali. -Salvage.Skills.Lottery.Untrained=[[GRAY]]Non sei adeguatamente addestrato nel recupero. Sei riuscito a recuperare solo [[RED]]{0}[[GRAY]] materiali da [[GREEN]]{1}[[GRAY]]. +Salvage.Skills.Lottery.Normal=&6Sei riuscito a rottamare &3{0}&6 materiali da &e{1}&6. +Salvage.Skills.Lottery.Perfect=&a&lPerfetto!&r&6 Hai rottamato senza sforzo &3{1}&6, recuperando &3{0}&6 materiali. +Salvage.Skills.Lottery.Untrained=&7Non sei adeguatamente addestrato nel recupero. Sei riuscito a recuperare solo &c{0}&7 materiali da &a{1}&7. #Anvil (Shared between SALVAGE and REPAIR) -Anvil.Unbreakable=Questo oggetto \u00E8 indistruttibile! +Anvil.Unbreakable=Questo oggetto è indistruttibile! #SWORDS -Swords.Ability.Lower=[[GRAY]]Abbassi la Spada. -Swords.Ability.Ready=[[GOLD]]Prepari[[DARK_AQUA]] la Spada. -Swords.Combat.Rupture.Note=[[GRAY]]NOTA: [[YELLOW]]1 Tick si verifica ogni 0.5 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.Hit=[[DARK_RED]]Colpisci con un contrattacco! -Swords.Combat.Countered=[[GREEN]]**CONTRATTACCATO** -Swords.Combat.SS.Struck=[[DARK_RED]]Colpito da COLPI SEGHETTATI! +Swords.Ability.Lower=&7Abbassi la Spada. +Swords.Ability.Ready=&6Prepari&3 la Spada. +Swords.Combat.Rupture.Note=&7NOTA: &e1 Tick si verifica ogni 0.5 secondi! +Swords.Combat.Bleeding.Started=&4 Stai sanguinando! +Swords.Combat.Bleeding.Stopped=&7L'emorragia si è &afermata&7! +Swords.Combat.Bleeding=&a**IL NEMICO HA UN'EMORRAGIA** +Swords.Combat.Counter.Hit=&4Colpisci con un contrattacco! +Swords.Combat.Countered=&a**CONTRATTACCATO** +Swords.Combat.SS.Struck=&4Colpito da COLPI SEGHETTATI! Swords.SubSkill.CounterAttack.Name=Contrattacco Swords.SubSkill.CounterAttack.Description=Riflette una parte del danno quando vieni attaccato! -Swords.SubSkill.CounterAttack.Stat=Possibilit\u00E0 Contrattacco +Swords.SubSkill.CounterAttack.Stat=Possibilità Contrattacco Swords.SubSkill.SerratedStrikes.Name=Colpi Seghettati -Swords.SubSkill.SerratedStrikes.Description=Infligge parte del danno in un EaA con una possibilit\u00E0 di applicare un'Emorragia! +Swords.SubSkill.SerratedStrikes.Description=Infligge parte del danno in un EaA con una possibilità di applicare un'Emorragia! Swords.SubSkill.SerratedStrikes.Stat=Durata di Colpi Seghettati Swords.SubSkill.Rupture.Name=Emorragia Swords.SubSkill.Rupture.Description=Applica un forte sanguinamento DnT @@ -433,19 +431,19 @@ Swords.SubSkill.Stab.Name=Pugnalata Swords.SubSkill.Stab.Description=Aggiunge un danno bonus ai tuoi attacchi. Swords.SubSkill.Stab.Stat=Danno Pugnalata Swords.SubSkill.SwordsLimitBreak.Name=Danni Aumentati Spade -Swords.SubSkill.SwordsLimitBreak.Description=Supera i tuoi limiti. Danni aumentati contro avversari difficili. Destinato al PVP, sta alle impostazioni del server se aumenter\u00E0 o meno i danni nel PVE. +Swords.SubSkill.SwordsLimitBreak.Description=Supera i tuoi limiti. Danni aumentati contro avversari difficili. Destinato al PVP, sta alle impostazioni del server se aumenterà o meno i danni nel PVE. Swords.SubSkill.SwordsLimitBreak.Stat=Danno Massimo di Danni Aumentati -Swords.SubSkill.Rupture.Stat=Possibilit\u00E0 di Emorragia -Swords.SubSkill.Rupture.Stat.Extra=Emorragia: [[GREEN]]{0} tick [{1} Danno vs Giocatori] [{2} Danno vs Mob] +Swords.SubSkill.Rupture.Stat=Possibilità di Emorragia +Swords.SubSkill.Rupture.Stat.Extra=Emorragia: &a{0} tick [{1} Danno vs Giocatori] [{2} Danno vs Mob] Swords.Effect.4=Colpi Seghettati Emorragia+ Swords.Effect.5={0} Tick di Emorragia Swords.Listener=Spade: Swords.SkillName=SPADE -Swords.Skills.SS.Off=**Colpi Seghettati si \u00E8 esaurito** -Swords.Skills.SS.On=[[GREEN]]**COLPI SEGHETTATI ATTIVATO** -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.Skills.SS.Off=**Colpi Seghettati si è esaurito** +Swords.Skills.SS.On=&a**COLPI SEGHETTATI ATTIVATO** +Swords.Skills.SS.Refresh=&aLa tua capacità &eColpi Seghettati &asi è rigenerata! +Swords.Skills.SS.Other.Off=Colpi Seghettati&a si è esaurito per &e{0} +Swords.Skills.SS.Other.On=&a{0}&2 ha usato &cColpi Seghettati! #TAMING Taming.Ability.Bonus.0=Sicurezza Ambientale @@ -457,25 +455,25 @@ 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.9={0} Probabilità 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\u00E0 {0}+ (SICUREZZA AMBIENTALE) -Taming.Ability.Locked.1=BLOCCATO FINO AD ABILIT\u00E0 {0}+ (PELLICCIA FOLTA) -Taming.Ability.Locked.2=BLOCCATO FINO AD ABILIT\u00E0 {0}+ (A PROVA D'URTO) -Taming.Ability.Locked.3=BLOCCATO FINO AD ABILIT\u00E0 {0}+ (ARTIGLI AFFILATI) -Taming.Ability.Locked.4=BLOCCATO FINO AD ABILIT\u00E0 {0}+ (SERVIZIO FAST FOOD) -Taming.Ability.Locked.5=BLOCCATO FINO AD ABILIT\u00E0 {0}+ (SEGUGIO DEL CIELO) -Taming.Combat.Chance.Gore=Possibilit\u00E0 di Sbranare +Taming.Ability.Locked.0=BLOCCATO FINO AD ABILITà {0}+ (SICUREZZA AMBIENTALE) +Taming.Ability.Locked.1=BLOCCATO FINO AD ABILITà {0}+ (PELLICCIA FOLTA) +Taming.Ability.Locked.2=BLOCCATO FINO AD ABILITà {0}+ (A PROVA D'URTO) +Taming.Ability.Locked.3=BLOCCATO FINO AD ABILITà {0}+ (ARTIGLI AFFILATI) +Taming.Ability.Locked.4=BLOCCATO FINO AD ABILITà {0}+ (SERVIZIO FAST FOOD) +Taming.Ability.Locked.5=BLOCCATO FINO AD ABILITà {0}+ (SEGUGIO DEL CIELO) +Taming.Combat.Chance.Gore=Possibilità di Sbranare 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]]RDN: Accovacciati e fai click destro con\n {0} {1} (Ocelot), {2} {3} (Lupo), {4} {5} (Cavallo) +Taming.SubSkill.CallOfTheWild.Description.2=&7RDN: 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.FastFoodService.Description=Probabilità 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 @@ -487,241 +485,241 @@ Taming.SubSkill.EnvironmentallyAware.Description=Evita Cactus/Lava, Immune alle Taming.SubSkill.ThickFur.Name=Pelliccia Folta Taming.SubSkill.ThickFur.Description=Riduzione del Danno, Resistenza al Fuoco Taming.SubSkill.Pummel.Name=Repulsione -Taming.SubSkill.Pummel.Description=I tuoi Lupi hanno una possibilit\u00E0 di respingere i nemici +Taming.SubSkill.Pummel.Description=I tuoi Lupi hanno una possibilità di respingere i nemici Taming.SubSkill.Pummel.TargetMessage=Sei stato respinto da un lupo! -Taming.Listener.Wolf=[[DARK_GRAY]]Il tuo lupo torna da te... +Taming.Listener.Wolf=&8Il tuo lupo torna da te... Taming.Listener=Domesticazione: Taming.SkillName=DOMESTICAZIONE -Taming.Summon.COTW.Success.WithoutLifespan=[[GREEN]](Richiamo della Natura) [[GRAY]]Hai evocato un [[GOLD]]{0}[[GRAY]] -Taming.Summon.COTW.Success.WithLifespan=[[GREEN]](Richiamo della Natura) [[GRAY]]Hai evocato un [[GOLD]]{0}[[GRAY]] e ha una durata di [[GOLD]]{1}[[GRAY]] secondi. -Taming.Summon.COTW.Limit=[[GREEN]](Richiamo della Natura) [[GRAY]]Puoi avere solo [[RED]]{0} [[GRAY]]animali domestici [[GRAY]]{1} allo stesso tempo. -Taming.Summon.COTW.TimeExpired=[[GREEN]](Richiamo della Natura) [[GRAY]]Il tempo \u00E8 scaduto, il tuo [[GOLD]]{0}[[GRAY]] se ne va. -Taming.Summon.COTW.BreedingDisallowed=[[GREEN]](Richiamo della Natura) [[RED]]Non puoi allevare un animale evocato. -Taming.Summon.COTW.NeedMoreItems=[[GREEN]](Richiamo della Natura) [[GRAY]]Ti servono altri [[YELLOW]]{0} [[DARK_AQUA]]{1} -Taming.Summon.Name.Format=[[GOLD]](RDN) [[WHITE]]{1} di {0} +Taming.Summon.COTW.Success.WithoutLifespan=&a(Richiamo della Natura) &7Hai evocato un &6{0}&7 +Taming.Summon.COTW.Success.WithLifespan=&a(Richiamo della Natura) &7Hai evocato un &6{0}&7 e ha una durata di &6{1}&7 secondi. +Taming.Summon.COTW.Limit=&a(Richiamo della Natura) &7Puoi avere solo &c{0} &7animali domestici &7{1} allo stesso tempo. +Taming.Summon.COTW.TimeExpired=&a(Richiamo della Natura) &7Il tempo è scaduto, il tuo &6{0}&7 se ne va. +Taming.Summon.COTW.BreedingDisallowed=&a(Richiamo della Natura) &cNon puoi allevare un animale evocato. +Taming.Summon.COTW.NeedMoreItems=&a(Richiamo della Natura) &7Ti servono altri &e{0} &3{1} +Taming.Summon.Name.Format=&6(RDN) &f{1} di {0} #UNARMED Unarmed.Ability.Bonus.0=Stile Braccio di Ferro Unarmed.Ability.Bonus.1=Potenziamento Danno +{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=[[GOLD]]Prepari[[DARK_AQUA]] i Pugni. +Unarmed.Ability.IronGrip.Defender=&aLa tua presa di ferro ha evitato che venissi disarmato! +Unarmed.Ability.Lower=&7Abbassi i Pugni. +Unarmed.Ability.Ready=&6Prepari&3 i Pugni. Unarmed.SubSkill.Berserk.Name=Furore Unarmed.SubSkill.Berserk.Description=+50% Danni, Rompe materiali fragili Unarmed.SubSkill.Berserk.Stat=Durata di Furore Unarmed.SubSkill.Disarm.Name=Disarmo Unarmed.SubSkill.Disarm.Description=Fa cadere l'oggetto tenuto in mano dal nemico -Unarmed.SubSkill.Disarm.Stat=Possibilit\u00E0 Disarmo +Unarmed.SubSkill.Disarm.Stat=Possibilità Disarmo Unarmed.SubSkill.UnarmedLimitBreak.Name=Danni Aumentati Lotta -Unarmed.SubSkill.UnarmedLimitBreak.Description=Supera i tuoi limiti. Danni aumentati contro avversari difficili. Destinato al PVP, sta alle impostazioni del server se aumenter\u00E0 o meno i danni nel PVE. +Unarmed.SubSkill.UnarmedLimitBreak.Description=Supera i tuoi limiti. Danni aumentati contro avversari difficili. Destinato al PVP, sta alle impostazioni del server se aumenterà o meno i danni nel PVE. Unarmed.SubSkill.UnarmedLimitBreak.Stat=Danno Massimo di Danni Aumentati Unarmed.SubSkill.IronArmStyle.Name=Stile 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=Devia le frecce -Unarmed.SubSkill.ArrowDeflect.Stat=Possibilit\u00E0 Deviazione Frecce +Unarmed.SubSkill.ArrowDeflect.Stat=Possibilità Deviazione Frecce Unarmed.SubSkill.IronGrip.Name=Presa di Ferro Unarmed.SubSkill.IronGrip.Description=Ti impedisce di essere disarmato -Unarmed.SubSkill.IronGrip.Stat=Possibilit\u00E0 Presa di Ferro +Unarmed.SubSkill.IronGrip.Stat=Possibilità Presa di Ferro Unarmed.SubSkill.BlockCracker.Name=Distruttore di Blocchi Unarmed.SubSkill.BlockCracker.Description=Rompi la roccia con i tuoi pugni 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.Skills.Berserk.Off=**Furore si è esaurito** +Unarmed.Skills.Berserk.On=&a**FURORE ATTIVATO** +Unarmed.Skills.Berserk.Other.Off=Furore&a si è esaurito per &e{0} +Unarmed.Skills.Berserk.Other.On=&a{0}&2 ha usato &cFurore! +Unarmed.Skills.Berserk.Refresh=&aLa tua capacità &eFurore &asi è rigenerata! #WOODCUTTING Woodcutting.Ability.0=Soffia Foglie Woodcutting.Ability.1=Soffia via le foglie -Woodcutting.Ability.Locked.0=BLOCCATO FINO AD ABILIT\u00E0 {0}+ (SOFFIA FOGLIE) +Woodcutting.Ability.Locked.0=BLOCCATO FINO AD ABILITà {0}+ (SOFFIA FOGLIE) Woodcutting.SubSkill.TreeFeller.Name=Abbattitore d'Alberi Woodcutting.SubSkill.TreeFeller.Description=Fa esplodere gli alberi Woodcutting.SubSkill.TreeFeller.Stat=Durata di Abbattitore d'Alberi Woodcutting.SubSkill.LeafBlower.Name=Soffia Foglie Woodcutting.SubSkill.LeafBlower.Description=Soffia via le foglie Woodcutting.SubSkill.HarvestLumber.Name=Raccoglitore di Legname -Woodcutting.SubSkill.HarvestLumber.Description=Estrae abilmente pi\u00F9 Legname -Woodcutting.SubSkill.HarvestLumber.Stat=Possibilit\u00E0 di Doppio Drop +Woodcutting.SubSkill.HarvestLumber.Description=Estrae abilmente più Legname +Woodcutting.SubSkill.HarvestLumber.Stat=Possibilità di Doppio Drop Woodcutting.SubSkill.Splinter.Name=Scheggia -Woodcutting.SubSkill.Splinter.Description=Taglia gli alberi in modo pi\u00F9 efficiente. +Woodcutting.SubSkill.Splinter.Description=Taglia gli alberi in modo più efficiente. Woodcutting.SubSkill.BarkSurgeon.Name=Chirurgo della Corteccia Woodcutting.SubSkill.BarkSurgeon.Description=Estrai materiali utili quando scortecci gli alberi. Woodcutting.SubSkill.NaturesBounty.Name=Premio della Natura Woodcutting.SubSkill.NaturesBounty.Description=Raccogli esperienza dalla natura. 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.Off=**Abbattitore d'Alberi si è esaurito** +Woodcutting.Skills.TreeFeller.On=&a**ABBATTITORE D'ALBERI ATTIVATO** +Woodcutting.Skills.TreeFeller.Refresh=&aLa tua capacità &eAbbattitore d'Alberi &asi è rigenerata! +Woodcutting.Skills.TreeFeller.Other.Off=Abbattitore d'Alberi&a si è esaurito per &e{0} +Woodcutting.Skills.TreeFeller.Other.On=&a{0}&2 ha usato &cAbbattitore d'Alberi! Woodcutting.Skills.TreeFeller.Splinter=LA TUA ASCIA SI FRANTUMA IN DOZZINE DI PEZZI! -Woodcutting.Skills.TreeFeller.Threshold=Quell'albero \u00E8 troppo grande! +Woodcutting.Skills.TreeFeller.Threshold=Quell'albero è troppo grande! #ABILITIY #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.BeastLoreHorseSpeed=[[DARK_AQUA]]Velocit\u00E0 di Movimento del Cavallo ([[GREEN]]{0} blocchi/s[[DARK_AQUA]]) -Combat.Gore=[[GREEN]]**SBRANATO** +Combat.ArrowDeflect=&f**FRECCIA DEVIATA** +Combat.BeastLore=&a**CONOSCENZA DELLE BESTIE** +Combat.BeastLoreHealth=&3Salute (&a{0}&3/{1}) +Combat.BeastLoreOwner=&3Proprietario (&c{0}&3) +Combat.BeastLoreHorseSpeed=&3Velocità di Movimento del Cavallo (&a{0} blocchi/s&3) +Combat.Gore=&a**SBRANATO** Combat.StruckByGore=**SEI STATO SBRANATO** -Combat.TargetDazed=Il bersaglio \u00E8 stato [[DARK_RED]]Stordito -Combat.TouchedFuzzy=[[DARK_RED]]Urto Stordino. Vado nel Pallone. +Combat.TargetDazed=Il bersaglio è stato &4Stordito +Combat.TouchedFuzzy=&4Urto Stordino. Vado nel Pallone. #COMMANDS ##generic -mcMMO.Description=[[DARK_AQUA]]Introduzione al Progetto [[YELLOW]]mcMMO[[DARK_AQUA]]:,[[GOLD]]mcMMO \u00E8 una mod RPG [[RED]]open source[[GOLD]] creata nel febbraio 2011,[[GOLD]]da [[BLUE]]nossr50[[GOLD]]. L'obbiettivo \u00E8 di fornire una esperienza di RPG di qualit\u00E0.,[[DARK_AQUA]]Consigli:,[[GOLD]] - [[GREEN]]Usa [[RED]]/mcmmo help[[GREEN]] per vedere i comandi,[[GOLD]] - [[GREEN]]Digita [[RED]]/NOMEABILIT\u00E0[[GREEN]] per visualizzare informazioni dettagliate sull'abilit\u00E0,[[DARK_AQUA]]Sviluppatori:,[[GOLD]] - [[GREEN]]nossr50 [[BLUE]](Creatore & Responsabile del Progetto),[[GOLD]] - [[GREEN]]electronicboy [[BLUE]](Sviluppatore),[[GOLD]] - [[GREEN]]kashike [[BLUE]](Sviluppatore),[[GOLD]] - [[GREEN]]t00thpick1 [[BLUE]](Manutentore versione Classica) -mcMMO.Description.FormerDevs=[[DARK_AQUA]]Ex Sviluppatori: [[GREEN]]GJ, NuclearW, bm01, TfT_02, Glitchfinder -Commands.addlevels.AwardAll.1=[[GREEN]]Ti sono stati assegnati {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 assegnati {0} livelli in {1}! -Commands.addlevels.AwardSkill.2={0} \u00E8 stato modificato per {1}. -Commands.addxp.AwardAll=[[GREEN]]Ti \u00E8 stata assegnata {0} esperienza in tutte le abilit\u00E0! -Commands.addxp.AwardSkill=[[GREEN]]Ti \u00E8 stata assegnata {0} 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 capacit\u00E0 \u00E8 stato attivato/disattivato per [[YELLOW]]{0} -Commands.AdminChat.Off=Chat Admin [[RED]]Inattiva -Commands.AdminChat.On=Chat Admin [[GREEN]]Attiva -Commands.AdminToggle=[[GREEN]]- Attiva/disattiva la chat admin +mcMMO.Description=&3Introduzione al Progetto &emcMMO&3:,&6mcMMO è una mod RPG &copen source&6 creata nel febbraio 2011,&6da &9nossr50&6. L'obbiettivo è di fornire una esperienza di RPG di qualità.,&3Consigli:,&6 - &aUsa &c/mcmmo help&a per vedere i comandi,&6 - &aDigita &c/NOMEABILITà&a per visualizzare informazioni dettagliate sull'abilità,&3Sviluppatori:,&6 - &anossr50 &9(Creatore & Responsabile del Progetto),&6 - &aelectronicboy &9(Sviluppatore),&6 - &akashike &9(Sviluppatore),&6 - &at00thpick1 &9(Manutentore versione Classica) +mcMMO.Description.FormerDevs=&3Ex Sviluppatori: &aGJ, NuclearW, bm01, TfT_02, Glitchfinder +Commands.addlevels.AwardAll.1=&aTi sono stati assegnati {0} livelli in tutte le abilità! +Commands.addlevels.AwardAll.2=Tutte le abilità sono state modificate per {0}. +Commands.addlevels.AwardSkill.1=&aTi sono stati assegnati {0} livelli in {1}! +Commands.addlevels.AwardSkill.2={0} è stato modificato per {1}. +Commands.addxp.AwardAll=&aTi è stata assegnata {0} esperienza in tutte le abilità! +Commands.addxp.AwardSkill=&aTi è stata assegnata {0} esperienza in {1}! +Commands.Ability.Off=Uso delle capacità &cdisattivato +Commands.Ability.On=Uso delle capacità &aattivato +Commands.Ability.Toggle=L'uso delle capacità è stato attivato/disattivato per &e{0} +Commands.AdminChat.Off=Chat Admin &cInattiva +Commands.AdminChat.On=Chat Admin &aAttiva +Commands.AdminToggle=&a- Attiva/disattiva la chat admin Commands.Chat.Console=*Console* -Commands.Cooldowns.Header=[[GOLD]]--= [[GREEN]]Ricariche Capacit\u00E0 mcMMO[[GOLD]] =-- -Commands.Cooldowns.Row.N=\ [[RED]]{0}[[WHITE]] - [[GOLD]]{1} secondi rimanenti -Commands.Cooldowns.Row.Y=\ [[AQUA]]{0}[[WHITE]] - [[DARK_GREEN]]Pronta! +Commands.Cooldowns.Header=&6--= &aRicariche Capacità mcMMO&6 =-- +Commands.Cooldowns.Row.N=\ &c{0}&f - &6{1} secondi rimanenti +Commands.Cooldowns.Row.Y=\ &b{0}&f - &2Pronta! Commands.Database.CooldownMS=Devi aspettare {0} millisecondi prima di utilizzare nuovamente questo comando. -Commands.Database.Processing=Il tuo comando precedente \u00E8 ancora in fase di elaborazione. Attendere prego. -Commands.Disabled=Questo comando \u00E8 disabilitato. -Commands.DoesNotExist= [[RED]]Quel giocatore non esiste nel database! -Commands.GodMode.Disabled=Modalit\u00E0 Dio mcMMO Disabilitata -Commands.GodMode.Enabled=Modalit\u00E0 Dio mcMMO Abilitata +Commands.Database.Processing=Il tuo comando precedente è ancora in fase di elaborazione. Attendere prego. +Commands.Disabled=Questo comando è disabilitato. +Commands.DoesNotExist= &cQuel giocatore non esiste nel database! +Commands.GodMode.Disabled=Modalità Dio mcMMO Disabilitata +Commands.GodMode.Enabled=Modalità Dio mcMMO Abilitata Commands.AdminChatSpy.Enabled=Spia Chat Party mcMMO Abilitata Commands.AdminChatSpy.Disabled=Spia Chat Party mcMMO Disabilitata -Commands.AdminChatSpy.Toggle=La Chat Party mcMMO \u00E8 stata attivata/disattivata [[YELLOW]]{0} -Commands.AdminChatSpy.Chat=[[GOLD]][SPIA: [[GREEN]]{0}[[GOLD]]] [[WHITE]]{1} -Commands.GodMode.Forbidden=[mcMMO] La Modalit\u00E0 Dio non \u00E8 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 tipo di barra della salute \u00E8 stato modificato a [[RED]]Cuori[[WHITE]]. -Commands.Healthbars.Changed.BAR=[mcMMO] Il tipo di barra della salute \u00E8 stato modificato a [[YELLOW]]Caselle[[WHITE]]. -Commands.Healthbars.Changed.DISABLED=[mcMMO] Le tue barre della salute dei mob sono state [[GRAY]]disabilitate[[WHITE]]. +Commands.AdminChatSpy.Toggle=La Chat Party mcMMO è stata attivata/disattivata &e{0} +Commands.AdminChatSpy.Chat=&6[SPIA: &a{0}&6] &f{1} +Commands.GodMode.Forbidden=[mcMMO] La Modalità Dio non è permessa in questo mondo (Vedi i Permessi) +Commands.GodMode.Toggle=La modalità Dio è stata attivata/disattivata per &e{0} +Commands.Healthbars.Changed.HEARTS=[mcMMO] Il tipo di barra della salute è stato modificato a &cCuori&f. +Commands.Healthbars.Changed.BAR=[mcMMO] Il tipo di barra della salute è stato modificato a &eCaselle&f. +Commands.Healthbars.Changed.DISABLED=[mcMMO] Le tue barre della salute dei mob sono state &7disabilitate&f. Commands.Healthbars.Invalid=Tipo di barra della salute non valido! -Commands.Inspect= [[GREEN]]- Visualizza informazioni dettagliate sul giocatore -Commands.Invite.Success=[[GREEN]]Invito inviato con successo. -Commands.Leaderboards= [[GREEN]]- Classifiche -Commands.mcgod=[[GREEN]]- Attiva/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]]-=CLASSIFICHE PERSONALI=- -Commands.mcrank.Overall=Complessivo[[GREEN]] - [[GOLD]]Grado [[WHITE]]#[[GREEN]]{0} -Commands.mcrank.Player=[[YELLOW]]Classifiche per [[WHITE]]{0} -Commands.mcrank.Skill=[[YELLOW]]{0}[[GREEN]] - [[GOLD]]Grado [[WHITE]]#[[GREEN]]{1} -Commands.mcrank.Unranked=[[WHITE]]Non classificato +Commands.Inspect= &a- Visualizza informazioni dettagliate sul giocatore +Commands.Invite.Success=&aInvito inviato con successo. +Commands.Leaderboards= &a- Classifiche +Commands.mcgod=&a- Attiva/disattiva la Modalità Dio +Commands.mchud.Invalid=Quello non è un tipo di HUD valido. +Commands.mcpurge.Success=&aIl database è stato ripulito con successo! +Commands.mcrank.Heading=&6-=CLASSIFICHE PERSONALI=- +Commands.mcrank.Overall=Complessivo&a - &6Grado &f#&a{0} +Commands.mcrank.Player=&eClassifiche per &f{0} +Commands.mcrank.Skill=&e{0}&a - &6Grado &f#&a{1} +Commands.mcrank.Unranked=&fNon classificato Commands.mcrefresh.Success=Le ricariche di {0} sono state rigenerate. -Commands.mcremove.Success=[[GREEN]]{0} \u00E8 stato rimosso con successo dal database! -Commands.mctop.Tip=[[GOLD]]Consiglio: Usa [[RED]]/mcrank[[GOLD]] per visualizzare tutte le tue classifiche personali! -Commands.mmoedit=[giocatore] [[GREEN]] - Modifica il bersaglio -Commands.mmoedit.AllSkills.1=[[GREEN]]Il tuo livello in tutte le abilit\u00E0 \u00E8 stato impostato a {0}! -Commands.mmoedit.Modified.1=[[GREEN]]Il tuo livello in {0} \u00E8 stato impostato a {1}! -Commands.mmoedit.Modified.2={0} \u00E8 stata modificata per {1}. -Commands.mcconvert.Database.Same=Stai gi\u00E0 utilizzando il database {0}! -Commands.mcconvert.Database.InvalidType={0} non \u00E8 un tipo di database valido. -Commands.mcconvert.Database.Start=[[GRAY]]Avvio della conversione da {0} a {1}... -Commands.mcconvert.Database.Finish=[[GRAY]]Migrazione del database completata; il database {1} ora ha tutti i dati dal database {0}. -Commands.mmoshowdb=Il database attualmente utilizzato \u00E8 [[GREEN]]{0} -Commands.mcconvert.Experience.Invalid=Tipo di formula sconosciuto! I tipi validi sono: [[GREEN]]LINEAR [[RED]]and [[GREEN]]EXPONENTIAL. -Commands.mcconvert.Experience.Same=Il tipo di formula {0} \u00E8 gi\u00E0 in uso -Commands.mcconvert.Experience.Start=[[GRAY]]Avvio della conversione dalla curva {0} alla curva {1} -Commands.mcconvert.Experience.Finish=[[GRAY]]Conversione formula completata; ora \u00E8 in uso la curva XP {0}. -Commands.ModDescription=[[GREEN]]- Leggi una breve descrizione della mod +Commands.mcremove.Success=&a{0} è stato rimosso con successo dal database! +Commands.mctop.Tip=&6Consiglio: Usa &c/mcrank&6 per visualizzare tutte le tue classifiche personali! +Commands.mmoedit=[giocatore] &a - Modifica il bersaglio +Commands.mmoedit.AllSkills.1=&aIl tuo livello in tutte le abilità è stato impostato a {0}! +Commands.mmoedit.Modified.1=&aIl tuo livello in {0} è stato impostato a {1}! +Commands.mmoedit.Modified.2={0} è stata modificata per {1}. +Commands.mcconvert.Database.Same=Stai già utilizzando il database {0}! +Commands.mcconvert.Database.InvalidType={0} non è un tipo di database valido. +Commands.mcconvert.Database.Start=&7Avvio della conversione da {0} a {1}... +Commands.mcconvert.Database.Finish=&7Migrazione del database completata; il database {1} ora ha tutti i dati dal database {0}. +Commands.mmoshowdb=Il database attualmente utilizzato è &a{0} +Commands.mcconvert.Experience.Invalid=Tipo di formula sconosciuto! I tipi validi sono: &aLINEAR &cand &aEXPONENTIAL. +Commands.mcconvert.Experience.Same=Il tipo di formula {0} è già in uso +Commands.mcconvert.Experience.Start=&7Avvio della conversione dalla curva {0} alla curva {1} +Commands.mcconvert.Experience.Finish=&7Conversione formula completata; ora è in uso la curva XP {0}. +Commands.ModDescription=&a- Leggi una breve descrizione della mod Commands.NoConsole=Questo comando non supporta l'utilizzo dalla console. -Commands.Notifications.Off=Le notifiche delle abilit\u00E0 sono state [[RED]]disattivate -Commands.Notifications.On=Le notifiche sulle abilit\u00E0 sono state [[GREEN]]attivate +Commands.Notifications.Off=Le notifiche delle abilità sono state &cdisattivate +Commands.Notifications.On=Le notifiche sulle abilità sono state &aattivate Commands.Offline=Questo comando non funziona per i giocatori offline. -Commands.NotLoaded=Il profilo del giocatore non \u00E8 ancora caricato. -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]]Funzionalit\u00E0 Sbloccate: [[GRAY]][[ITALIC]]{0} -Commands.Party.ShareMode=[[DARK_GRAY]]MODALIT\u00E0 SPARTIZIONE: -Commands.Party.ItemShare=[[GRAY]]OGGETTI [[DARK_AQUA]]({0}) -Commands.Party.ExpShare=[[GRAY]]XP [[DARK_AQUA]]({0}) -Commands.Party.ItemShareCategories=[[DARK_GRAY]]Spartizione 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 un invito in un party -Commands.Party.Chat.Off=Chat Party [[RED]]Inattiva -Commands.Party.Chat.On=Chat Party [[GREEN]]Attiva -Commands.Party.Commands=[[RED]]---[][[GREEN]]COMANDI PARTY[[RED]][]--- -Commands.Party.Invite.0=[[RED]]AVVISO: [[GREEN]]Hai ricevuto un invito ad unirti al gruppo {0} da {1} -Commands.Party.Invite.1=[[YELLOW]]Digita [[GREEN]]/party accept[[YELLOW]] per accettare l'invito -Commands.Party.Invite=[[GREEN]]- Invia un invito a entrare nel party -Commands.Party.Invite.Accepted=[[GREEN]]Invito Accettato. Ti sei unito al party {0} -Commands.Party.Join=[[GRAY]]Unito al Party: {0} -Commands.Party.PartyFull=[[GOLD]]{0}[[RED]] \u00E8 pieno! -Commands.Party.PartyFull.Invite=Non puoi invitare [[YELLOW]]{0}[[RED]] in [[GREEN]]{1}[[RED]] perch\u00E9 ha gi\u00E0 [[DARK_AQUA]]{2}[[RED]] giocatori! -Commands.Party.PartyFull.InviteAccept=Non puoi unirti a [[GREEN]]{0}[[RED]] perch\u00E9 ha gi\u00E0 [[DARK_AQUA]]{1}[[RED]] giocatori! -Commands.Party.Create=[[GRAY]]Party Creato: {0} -Commands.Party.Rename=[[GRAY]]Nome party cambiato a: [[WHITE]]{0} -Commands.Party.SetSharing=[[GRAY]]Modalit\u00E0 spartizione del party {0} impostata a: [[DARK_AQUA]]{1} -Commands.Party.ToggleShareCategory=[[GRAY]]La condivisione oggetti del party per [[GOLD]]{0} [[GRAY]]\u00E8 stata [[DARK_AQUA]]{1} -Commands.Party.AlreadyExists=[[DARK_RED]]Il party {0} gi\u00E0 esiste! -Commands.Party.Kick=[[RED]]Sei stato espulso dal party [[GREEN]]{0}[[RED]]! -Commands.Party.Leave=[[YELLOW]]Hai abbandonato quel party -Commands.Party.Members.Header=[[RED]]-----[][[GREEN]]MEMBRI[[RED]][]----- -Commands.Party.None=[[RED]]Non sei in un party. -Commands.Party.Quit=[[GREEN]]- Abbandona il tuo party attuale -Commands.Party.Teleport=[[GREEN]]- Teletrasportati da un membro del party -Commands.Party.Toggle=[[GREEN]]- Attiva/disattiva la Chat Party -Commands.Party1=[[GREEN]]- Crea un nuovo party -Commands.Party2=[[GREEN]]- Entra in un party di giocatori -Commands.Party.Alliance.Header=[[RED]]-----[][[GREEN]]ALLEANZA PARTY[[RED]][]----- -Commands.Party.Alliance.Ally=[[WHITE]]{0} [[DARK_GRAY]]\u00E8 ALLEATO CON: [[WHITE]]{1} -Commands.Party.Alliance.Members.Header=[[RED]]-----[][[GREEN]]MEMBRI ALLEANZA[[RED]][]----- -Commands.Party.Alliance.Invite.0=AVVISO: [[GREEN]]Hai ricevuto un invito di alleanza del party 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=[[RED]]Il tuo party non ha un alleato. -Commands.Party.Alliance.AlreadyAllies=[[RED]]Il tuo party ha gi\u00E0 un'alleato. Sciogli l'alleanza con [[DARK_AQUA]]/party alliance disband -Commands.Party.Alliance.Help.0=[[RED]]Questo party non ha formato un'alleanza. Invita un capo party -Commands.Party.Alliance.Help.1=[[RED]] forma un'alleanza con [[DARK_AQUA]]/party alliance invite [[RED]]. -Commands.ptp.Enabled=Teletrasporto party [[GREEN]]abilitato -Commands.ptp.Disabled=Teletrasporto party [[RED]]disabilitato -Commands.ptp.NoRequests=[[RED]]Non hai richieste di teletrasporto in questo momento -Commands.ptp.NoWorldPermissions=[[RED]][mcMMO] Non hai il permesso di teletrasportarti nel mondo {0}. -Commands.ptp.Request1=[[YELLOW]]{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 party [[GREEN]]abilitata -Commands.ptp.AcceptAny.Disabled=Conferma delle richieste di teletrasporto del party [[RED]]disabilitata -Commands.ptp.RequestExpired=[[RED]]La richiesta di teletrasporto del party \u00E8 scaduta! -Commands.PowerLevel.Leaderboard=[[YELLOW]]--mcMMO[[BLUE]] Livello di Potere [[YELLOW]]Classifica-- -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]]Il tuo livello di abilit\u00E0 di {0} \u00E8 stato azzerato con successo. -Commands.Reset=[[GREEN]]- Reimposta un livello di abilit\u00E0 a 0 -Commands.Scoreboard.Clear=[[DARK_AQUA]]Scoreboard mcMMO rimossa. -Commands.Scoreboard.NoBoard=[[RED]]La scoreboard mcMMO non \u00E8 attiva. -Commands.Scoreboard.Keep=[[DARK_AQUA]]La scoreboard mcMMO rimmarr\u00E0 finch\u00E9 non userai [[GREEN]]/mcscoreboard clear[[DARK_AQUA]]. -Commands.Scoreboard.Timer=[[DARK_AQUA]]La scoreboard mcMMO sar\u00E0 rimossa tra [[GOLD]]{0}[[DARK_AQUA]] secondi da ora. -Commands.Scoreboard.Help.0=[[GOLD]] == [[GREEN]]Aiuto per [[RED]]/mcscoreboard[[GOLD]] == -Commands.Scoreboard.Help.1=[[DARK_AQUA]]/mcscoreboard[[AQUA]] clear [[WHITE]] - rimuove 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]] - rimuove la scoreboard mcMMO dopo [[LIGHT_PURPLE]]n[[WHITE]] secondi -Commands.Scoreboard.Tip.Keep=[[GOLD]]Consiglio: Usa [[RED]]/mcscoreboard keep[[GOLD]] quando la scoreboard \u00E8 attiva per evitare che vada via. -Commands.Scoreboard.Tip.Clear=[[GOLD]]Consiglio: Usa [[RED]]/mcscoreboard clear[[GOLD]] per sbarazzarti della scoreboard. -Commands.Skill.Invalid=Quello non \u00E8 un nome di abilit\u00E0 valido! -Commands.Skill.ChildSkill=Le abilit\u00E0 figlie non sono valide per questo comando! -Commands.Skill.Leaderboard=--mcMMO [[BLUE]]{0}[[YELLOW]] Classifica-- -Commands.SkillInfo=[[GREEN]]- Visualizza informazioni dettagliate su un'abilit\u00E0 -Commands.Stats=[[GREEN]]- Visualizza le tue statistiche mcMMO -Commands.ToggleAbility=[[GREEN]]- Attiva o disattiva l'attivazione delle abilit\u00E0 con il click destro -Commands.Usage.0=[[RED]]L'uso appropriato \u00E8 /{0} -Commands.Usage.1=[[RED]]L'uso appropriato \u00E8 /{0} {1} -Commands.Usage.2=[[RED]]L'uso appropriato \u00E8 /{0} {1} {2} -Commands.Usage.3=[[RED]]L'uso appropriato \u00E8 /{0} {1} {2} {3} +Commands.NotLoaded=Il profilo del giocatore non è ancora caricato. +Commands.Party.Status=&8NOME: &f{0} {1} &8LIVELLO: &3{2} +Commands.Party.Status.Alliance=&8ALLEATO: &f{0} +Commands.Party.UnlockedFeatures=&8Funzionalità Sbloccate: &7&o{0} +Commands.Party.ShareMode=&8MODALITà SPARTIZIONE: +Commands.Party.ItemShare=&7OGGETTI &3({0}) +Commands.Party.ExpShare=&7XP &3({0}) +Commands.Party.ItemShareCategories=&8Spartizione Oggetti: &7&o{0} +Commands.Party.MembersNear=&8VICINO A TE &3{0}&8/&3{1} +Commands.Party.Accept=&a- Accetta un invito in un party +Commands.Party.Chat.Off=Chat Party &cInattiva +Commands.Party.Chat.On=Chat Party &aAttiva +Commands.Party.Commands=&c---[]&aCOMANDI PARTY&c[]--- +Commands.Party.Invite.0=&cAVVISO: &aHai ricevuto un invito ad unirti al gruppo {0} da {1} +Commands.Party.Invite.1=&eDigita &a/party accept&e per accettare l'invito +Commands.Party.Invite=&a- Invia un invito a entrare nel party +Commands.Party.Invite.Accepted=&aInvito Accettato. Ti sei unito al party {0} +Commands.Party.Join=&7Unito al Party: {0} +Commands.Party.PartyFull=&6{0}&c è pieno! +Commands.Party.PartyFull.Invite=Non puoi invitare &e{0}&c in &a{1}&c perché ha già &3{2}&c giocatori! +Commands.Party.PartyFull.InviteAccept=Non puoi unirti a &a{0}&c perché ha già &3{1}&c giocatori! +Commands.Party.Create=&7Party Creato: {0} +Commands.Party.Rename=&7Nome party cambiato a: &f{0} +Commands.Party.SetSharing=&7Modalità spartizione del party {0} impostata a: &3{1} +Commands.Party.ToggleShareCategory=&7La condivisione oggetti del party per &6{0} &7è stata &3{1} +Commands.Party.AlreadyExists=&4Il party {0} già esiste! +Commands.Party.Kick=&cSei stato espulso dal party &a{0}&c! +Commands.Party.Leave=&eHai abbandonato quel party +Commands.Party.Members.Header=&c-----[]&aMEMBRI&c[]----- +Commands.Party.None=&cNon sei in un party. +Commands.Party.Quit=&a- Abbandona il tuo party attuale +Commands.Party.Teleport=&a- Teletrasportati da un membro del party +Commands.Party.Toggle=&a- Attiva/disattiva la Chat Party +Commands.Party1=&a- Crea un nuovo party +Commands.Party2=&a- Entra in un party di giocatori +Commands.Party.Alliance.Header=&c-----[]&aALLEANZA PARTY&c[]----- +Commands.Party.Alliance.Ally=&f{0} &8è ALLEATO CON: &f{1} +Commands.Party.Alliance.Members.Header=&c-----[]&aMEMBRI ALLEANZA&c[]----- +Commands.Party.Alliance.Invite.0=AVVISO: &aHai ricevuto un invito di alleanza del party per {0} da {1} +Commands.Party.Alliance.Invite.1=Digita &a/party alliance accept&e per accettare l'invito +Commands.Party.Alliance.Invite.Accepted=&aInvito di alleanza accettato. +Commands.Party.Alliance.None=&cIl tuo party non ha un alleato. +Commands.Party.Alliance.AlreadyAllies=&cIl tuo party ha già un'alleato. Sciogli l'alleanza con &3/party alliance disband +Commands.Party.Alliance.Help.0=&cQuesto party non ha formato un'alleanza. Invita un capo party +Commands.Party.Alliance.Help.1=&c forma un'alleanza con &3/party alliance invite &c. +Commands.ptp.Enabled=Teletrasporto party &aabilitato +Commands.ptp.Disabled=Teletrasporto party &cdisabilitato +Commands.ptp.NoRequests=&cNon hai richieste di teletrasporto in questo momento +Commands.ptp.NoWorldPermissions=&c[mcMMO] Non hai il permesso di teletrasportarti nel mondo {0}. +Commands.ptp.Request1=&e{0} &aha richiesto di teletrasportarsi da te. +Commands.ptp.Request2=&aPer teletrasportarti digita &e/ptp accept&a. La richiesta scadrà tra &c{0} &asecondi. +Commands.ptp.AcceptAny.Enabled=Conferma delle richieste di teletrasporto del party &aabilitata +Commands.ptp.AcceptAny.Disabled=Conferma delle richieste di teletrasporto del party &cdisabilitata +Commands.ptp.RequestExpired=&cLa richiesta di teletrasporto del party è scaduta! +Commands.PowerLevel.Leaderboard=&e--mcMMO&9 Livello di Potere &eClassifica-- +Commands.PowerLevel.Capped=&4LIVELLO DI POTERE: &a{0} &4LIVELLO MASSIMO: &e{1} +Commands.PowerLevel=&4LIVELLO DI POTERE: &a{0} +Commands.Reset.All=&aTutti i tuoi livelli di abilità sono stati azzerati con successo. +Commands.Reset.Single=&aIl tuo livello di abilità di {0} è stato azzerato con successo. +Commands.Reset=&a- Reimposta un livello di abilità a 0 +Commands.Scoreboard.Clear=&3Scoreboard mcMMO rimossa. +Commands.Scoreboard.NoBoard=&cLa scoreboard mcMMO non è attiva. +Commands.Scoreboard.Keep=&3La scoreboard mcMMO rimmarrà finché non userai &a/mcscoreboard clear&3. +Commands.Scoreboard.Timer=&3La scoreboard mcMMO sarà rimossa tra &6{0}&3 secondi da ora. +Commands.Scoreboard.Help.0=&6 == &aAiuto per &c/mcscoreboard&6 == +Commands.Scoreboard.Help.1=&3/mcscoreboard&b clear &f - rimuove la scoreboard mcMMO +Commands.Scoreboard.Help.2=&3/mcscoreboard&b keep &f - mantiene la scoreboard mcMMO attiva +Commands.Scoreboard.Help.3=&3/mcscoreboard&b time [n] &f - rimuove la scoreboard mcMMO dopo &dn&f secondi +Commands.Scoreboard.Tip.Keep=&6Consiglio: Usa &c/mcscoreboard keep&6 quando la scoreboard è attiva per evitare che vada via. +Commands.Scoreboard.Tip.Clear=&6Consiglio: Usa &c/mcscoreboard clear&6 per sbarazzarti della scoreboard. +Commands.Skill.Invalid=Quello non è un nome di abilità valido! +Commands.Skill.ChildSkill=Le abilità figlie non sono valide per questo comando! +Commands.Skill.Leaderboard=--mcMMO &9{0}&e Classifica-- +Commands.SkillInfo=&a- Visualizza informazioni dettagliate su un'abilità +Commands.Stats=&a- Visualizza le tue statistiche mcMMO +Commands.ToggleAbility=&a- Attiva o disattiva l'attivazione delle abilità con il click destro +Commands.Usage.0=&cL'uso appropriato è /{0} +Commands.Usage.1=&cL'uso appropriato è /{0} {1} +Commands.Usage.2=&cL'uso appropriato è /{0} {1} {2} +Commands.Usage.3=&cL'uso appropriato è /{0} {1} {2} {3} Commands.Usage.FullClassName=nome classe Commands.Usage.Level=livello Commands.Usage.Message=messaggio @@ -730,74 +728,74 @@ Commands.Usage.PartyName=nome Commands.Usage.Password=password Commands.Usage.Player=giocatore Commands.Usage.Rate=rate -Commands.Usage.Skill=abilit\u00E0 +Commands.Usage.Skill=abilità Commands.Usage.SubSkill=subskill Commands.Usage.XP=xp -Commands.Description.mmoinfo=Leggi i dettagli su un'abilit\u00E0 o una meccanica. -Commands.MmoInfo.Mystery=[[GRAY]]Non hai ancora sbloccato questa abilit\u00E0, ma quando lo farai sarai in grado di leggere i dettagli al riguardo qui! -Commands.MmoInfo.NoMatch=Quella sottoabilit\u00E0 non esiste! -Commands.MmoInfo.Header=[[DARK_AQUA]]-=[]=====[][[GOLD]] Info MMO [[DARK_AQUA]][]=====[]=- -Commands.MmoInfo.SubSkillHeader=[[GOLD]]Nome:[[YELLOW]] {0} -Commands.MmoInfo.DetailsHeader=[[DARK_AQUA]]-=[]=====[][[GREEN]] Dettagli [[DARK_AQUA]][]=====[]=- -Commands.MmoInfo.OldSkill=[[GRAY]]Le abilit\u00E0 mcMMO stanno venendo convertite in un sistema di abilit\u00E0 modulare migliorato, sfortunatamente questa abilit\u00E0 non \u00E8 stata ancora convertita e manca di statistiche dettagliate. Il nuovo sistema consentir\u00E0 tempi di rilascio pi\u00F9 rapidi per le nuove abilit\u00E0 mmMMO e una maggiore flessibilit\u00E0 con le abilit\u00E0 esistenti. -Commands.MmoInfo.Mechanics=[[DARK_AQUA]]-=[]=====[][[GOLD]] Meccaniche [[DARK_AQUA]][]=====[]=- +Commands.Description.mmoinfo=Leggi i dettagli su un'abilità o una meccanica. +Commands.MmoInfo.Mystery=&7Non hai ancora sbloccato questa abilità, ma quando lo farai sarai in grado di leggere i dettagli al riguardo qui! +Commands.MmoInfo.NoMatch=Quella sottoabilità non esiste! +Commands.MmoInfo.Header=&3-=[]=====[]&6 Info MMO &3[]=====[]=- +Commands.MmoInfo.SubSkillHeader=&6Nome:&e {0} +Commands.MmoInfo.DetailsHeader=&3-=[]=====[]&a Dettagli &3[]=====[]=- +Commands.MmoInfo.OldSkill=&7Le abilità mcMMO stanno venendo convertite in un sistema di abilità modulare migliorato, sfortunatamente questa abilità non è stata ancora convertita e manca di statistiche dettagliate. Il nuovo sistema consentirà tempi di rilascio più rapidi per le nuove abilità mmMMO e una maggiore flessibilità con le abilità esistenti. +Commands.MmoInfo.Mechanics=&3-=[]=====[]&6 Meccaniche &3[]=====[]=- Commands.MmoInfo.Stats=STATISTICHE: {0} -Commands.Mmodebug.Toggle=La modalit\u00E0 debug di mcMMO \u00E8 ora [[GOLD]]{0}[[GRAY]], usa di nuovo questo comando per cambiarla. Con la modalit\u00E0 debug abilitata, \u00E8 possibile colpire i blocchi per mostrare informazioni utili utilizzate per il supporto. -mcMMO.NoInvites=[[RED]]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 verr\u00E0 mostrata qui. +Commands.Mmodebug.Toggle=La modalità debug di mcMMO è ora &6{0}&7, usa di nuovo questo comando per cambiarla. Con la modalità debug abilitata, è possibile colpire i blocchi per mostrare informazioni utili utilizzate per il supporto. +mcMMO.NoInvites=&cNon hai inviti in questo momento +mcMMO.NoPermission=&4Permessi insufficienti. +mcMMO.NoSkillNote=&8Se non hai accesso a un'abilità, non verrà mostrata qui. ##party Party.Forbidden=[mcMMO] I party non sono consentiti in questo mondo (Vedi i Permessi) -Party.Help.0=[[RED]]L'uso appropriato \u00E8 [[DARK_AQUA]]{0} [password]. -Party.Help.1=[[RED]]Per creare un party, usa [[DARK_AQUA]]{0} [password]. -Party.Help.2=[[RED]]Consulta [[DARK_AQUA]]{0} [[RED]]per maggiori informazioni -Party.Help.3=[[RED]]Usa [[DARK_AQUA]]{0} [password] [[RED]]per unirti o [[DARK_AQUA]]{1} [[RED]]per congedarti -Party.Help.4=[[RED]]Per bloccare o sbloccare il tuo party, usa [[DARK_AQUA]]{0} -Party.Help.5=[[RED]]Per proteggere con password il tuo party, usa [[DARK_AQUA]]{0} -Party.Help.6=[[RED]]Per espellere un giocatore dal tuo party, usa [[DARK_AQUA]]{0} -Party.Help.7=[[RED]]Per trasferire la propriet\u00E0 del tuo party, utilizza [[DARK_AQUA]]{0} -Party.Help.8=[[RED]]Per sciogliere il tuo party, usa [[DARK_AQUA]]{0} -Party.Help.9=[[RED]]Usa [[DARK_AQUA]]{0} [[RED]]per spartire gli oggetti con i membri del party -Party.Help.10=[[RED]]Usa [[DARK_AQUA]]{0} [[RED]]per abilitare la spartizione XP con i membri del party -Party.InformedOnJoin={0} [[GREEN]]\u00E8 entrato nel tuo party -Party.InformedOnQuit={0} [[GREEN]]ha abbandonato il tuo party -Party.InformedOnNameChange=[[GOLD]]{0} [[GREEN]]ha impostato il nome del party a [[WHITE]]{1} -Party.InvalidName=[[DARK_RED]]Questo non \u00E8 un nome di party valido. -Party.Invite.Self=[[RED]]Non puoi invitare te stesso! -Party.IsLocked=[[RED]]Questo party \u00E8 gi\u00E0 bloccato! -Party.IsntLocked=[[RED]]Questo party non \u00E8 bloccato! -Party.Locked=[[RED]]Il party \u00E8 chiuso, solo il capo pu\u00F2 invitare. -Party.NotInYourParty=[[DARK_RED]]{0} non \u00E8 il tuo party -Party.NotOwner=[[DARK_RED]]Non sei il capo del party. -Party.Target.NotOwner=[[DARK_RED]]{0} non \u00E8 il capo del party. -Party.Owner.New=[[GREEN]]{0} \u00E8 il nuovo capo del party. -Party.Owner.NotLeader=[[DARK_RED]]Non sei pi\u00F9 il capo del party. -Party.Owner.Player =[[GREEN]]Ora sei il capo del party. -Party.Password.None=[[RED]]Questo party \u00E8 protetto da password. Fornisci una password per entrare. -Party.Password.Incorrect=[[RED]]La password del party non \u00E8 corretta. -Party.Password.Set=[[GREEN]]Password del party impostata a {0} -Party.Password.Removed=[[GREEN]]La password del party \u00E8 stata rimossa. -Party.Player.Invalid=[[RED]]Quello non \u00E8 un giocatore valido. -Party.NotOnline=[[DARK_RED]]{0} non \u00E8 online! -Party.Player.InSameParty=[[RED]]{0} \u00E8 gi\u00E0 nel tuo party! -Party.PlayerNotInParty=[[DARK_RED]]{0} non \u00E8 in un party -Party.Specify=[[RED]]Devi specificare un party. -Party.Teleport.Dead=[[RED]]Non puoi teletrasportarti da un giocatore morto. -Party.Teleport.Hurt=[[RED]]Sei stato ferito negli ultimi {0} secondi e non ti puoi teletrasportare. -Party.Teleport.Player=[[GREEN]]Ti sei teletrasportato da {0}. -Party.Teleport.Self=[[RED]]Non puoi teletrasportarti da te stesso! -Party.Teleport.Target=[[GREEN]]{0} si \u00E8 teletrasportato da te. -Party.Teleport.Disabled=[[RED]]{0} non consente il teletrasporto del party. -Party.Rename.Same=[[RED]]Quello \u00E8 gi\u00E0 il nome del tuo party! -Party.Join.Self=[[RED]]Non puoi entrare nel tuo stesso party! -Party.Unlocked=[[GRAY]]Il party \u00E8 sbloccato -Party.Disband=[[GRAY]]Il party \u00E8 stato sciolto -Party.Alliance.Formed=[[GRAY]]Il tuo party \u00E8 ora alleato con [[GREEN]]{0} -Party.Alliance.Disband=[[GRAY]]Il tuo party non \u00E8 pi\u00F9 alleato con [[RED]]{0} -Party.Status.Locked=[[DARK_RED]](SOLO-INVITO) -Party.Status.Unlocked=[[DARK_GREEN]](APERTO) -Party.LevelUp=[[YELLOW]]Livello party aumentato di {0}. Totale ({1}) +Party.Help.0=&cL'uso appropriato è &3{0} [password]. +Party.Help.1=&cPer creare un party, usa &3{0} [password]. +Party.Help.2=&cConsulta &3{0} &cper maggiori informazioni +Party.Help.3=&cUsa &3{0} [password] &cper unirti o &3{1} &cper congedarti +Party.Help.4=&cPer bloccare o sbloccare il tuo party, usa &3{0} +Party.Help.5=&cPer proteggere con password il tuo party, usa &3{0} +Party.Help.6=&cPer espellere un giocatore dal tuo party, usa &3{0} +Party.Help.7=&cPer trasferire la proprietà del tuo party, utilizza &3{0} +Party.Help.8=&cPer sciogliere il tuo party, usa &3{0} +Party.Help.9=&cUsa &3{0} &cper spartire gli oggetti con i membri del party +Party.Help.10=&cUsa &3{0} &cper abilitare la spartizione XP con i membri del party +Party.InformedOnJoin={0} &aè entrato nel tuo party +Party.InformedOnQuit={0} &aha abbandonato il tuo party +Party.InformedOnNameChange=&6{0} &aha impostato il nome del party a &f{1} +Party.InvalidName=&4Questo non è un nome di party valido. +Party.Invite.Self=&cNon puoi invitare te stesso! +Party.IsLocked=&cQuesto party è già bloccato! +Party.IsntLocked=&cQuesto party non è bloccato! +Party.Locked=&cIl party è chiuso, solo il capo può invitare. +Party.NotInYourParty=&4{0} non è il tuo party +Party.NotOwner=&4Non sei il capo del party. +Party.Target.NotOwner=&4{0} non è il capo del party. +Party.Owner.New=&a{0} è il nuovo capo del party. +Party.Owner.NotLeader=&4Non sei più il capo del party. +Party.Owner.Player =&aOra sei il capo del party. +Party.Password.None=&cQuesto party è protetto da password. Fornisci una password per entrare. +Party.Password.Incorrect=&cLa password del party non è corretta. +Party.Password.Set=&aPassword del party impostata a {0} +Party.Password.Removed=&aLa password del party è stata rimossa. +Party.Player.Invalid=&cQuello non è un giocatore valido. +Party.NotOnline=&4{0} non è online! +Party.Player.InSameParty=&c{0} è già nel tuo party! +Party.PlayerNotInParty=&4{0} non è in un party +Party.Specify=&cDevi specificare un party. +Party.Teleport.Dead=&cNon puoi teletrasportarti da un giocatore morto. +Party.Teleport.Hurt=&cSei stato ferito negli ultimi {0} secondi e non ti puoi teletrasportare. +Party.Teleport.Player=&aTi sei teletrasportato da {0}. +Party.Teleport.Self=&cNon puoi teletrasportarti da te stesso! +Party.Teleport.Target=&a{0} si è teletrasportato da te. +Party.Teleport.Disabled=&c{0} non consente il teletrasporto del party. +Party.Rename.Same=&cQuello è già il nome del tuo party! +Party.Join.Self=&cNon puoi entrare nel tuo stesso party! +Party.Unlocked=&7Il party è sbloccato +Party.Disband=&7Il party è stato sciolto +Party.Alliance.Formed=&7Il tuo party è ora alleato con &a{0} +Party.Alliance.Disband=&7Il tuo party non è più alleato con &c{0} +Party.Status.Locked=&4(SOLO-INVITO) +Party.Status.Unlocked=&2(APERTO) +Party.LevelUp=&eLivello party aumentato di {0}. Totale ({1}) Party.Feature.Chat=Chat Party Party.Feature.Teleport=Teletrasporto Party Party.Feature.Alliance=Alleanze @@ -808,11 +806,11 @@ Party.Feature.Locked.Teleport=BLOCCATO FINO A {0}+ (TELETRASPORTO PARTY) Party.Feature.Locked.Alliance=BLOCCATO FINO A {0}+ (ALLEANZE) Party.Feature.Locked.ItemShare=BLOCCATO FINO A {0}+ (SPARTIZIONE OGGETTI) Party.Feature.Locked.XpShare=BLOCCATO FINO A {0}+ (SPARTIZIONE XP) -Party.Feature.Disabled.1=[[RED]]La chat del party non \u00E8 ancora stata sbloccata. -Party.Feature.Disabled.2=[[RED]]Il teletrasporto del party non \u00E8 ancora stato sbloccato. -Party.Feature.Disabled.3=[[RED]]Le alleanze del party non sono ancora state sbloccate. -Party.Feature.Disabled.4=[[RED]]La condivisione oggetti del party non \u00E8 ancora stata sbloccata. -Party.Feature.Disabled.5=[[RED]]La condivisione XP del party non \u00E8 ancora stata sbloccata. +Party.Feature.Disabled.1=&cLa chat del party non è ancora stata sbloccata. +Party.Feature.Disabled.2=&cIl teletrasporto del party non è ancora stato sbloccato. +Party.Feature.Disabled.3=&cLe alleanze del party non sono ancora state sbloccate. +Party.Feature.Disabled.4=&cLa condivisione oggetti del party non è ancora stata sbloccata. +Party.Feature.Disabled.5=&cLa condivisione XP del party non è ancora stata sbloccata. Party.ShareType.Xp=XP Party.ShareType.Item=OGGETTI Party.ShareMode.None=NESSUNA @@ -829,7 +827,7 @@ Commands.XPGain.Acrobatics=Cadendo Commands.XPGain.Alchemy=Preparando Pozioni Commands.XPGain.Archery=Attaccando Mostri Commands.XPGain.Axes=Attaccando Mostri -Commands.XPGain.Child=Ottenendo livelli con le Abilit\u00E0 Madri +Commands.XPGain.Child=Ottenendo livelli con le Abilità Madri Commands.XPGain.Excavation=Scavando e trovando tesori Commands.XPGain.Fishing=Pescando (ma va'!) Commands.XPGain.Herbalism=Raccogliendo Piante @@ -839,232 +837,232 @@ Commands.XPGain.Swords=Attaccando Mostri Commands.XPGain.Taming=Addomesticando Animali, o combattendo con i tuoi lupi Commands.XPGain.Unarmed=Attaccando Mostri Commands.XPGain.Woodcutting=Abbattendo 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=[[RED]]Il TASSO XP \u00E8 stato portato a {0} -Commands.xprate.over=[[RED]]L'Evento di mcMMO Tasso XP \u00E8 FINITO!! -Commands.xprate.proper.0=[[RED]]L'uso corretto per cambiare il tasso di XP \u00E8 /xprate -Commands.xprate.proper.1=[[RED]]L'uso corretto per ripristinare il tasso di XP al valore predefinito \u00E8 /xprate reset -Commands.xprate.proper.2=[[RED]]Specifica "true" o "false" per indicare se questo \u00E8 un evento XP o meno +Commands.XPGain=&8GUADAGNO XP: &f{0} +Commands.xplock.locked=&6La tua BARRA XP è ora bloccata a {0}! +Commands.xplock.unlocked=&6La tua BARRA XP è ora &aSBLOCCATA&6! +Commands.xprate.modified=&cIl TASSO XP è stato portato a {0} +Commands.xprate.over=&cL'Evento di mcMMO Tasso XP è FINITO!! +Commands.xprate.proper.0=&cL'uso corretto per cambiare il tasso di XP è /xprate +Commands.xprate.proper.1=&cL'uso corretto per ripristinare il tasso di XP al valore predefinito è /xprate reset +Commands.xprate.proper.2=&cSpecifica "true" o "false" per indicare se questo è un evento XP o meno Commands.NegativeNumberWarn=Non usare numeri negativi! -Commands.Event.Start=[[GREEN]]mcMMO[[GOLD]] Evento! -Commands.Event.Stop=[[GREEN]]mcMMO[[DARK_AQUA]] Evento Finito! -Commands.Event.Stop.Subtitle=[[GREEN]]Spero che ti sia divertito! -Commands.Event.XP=[[DARK_AQUA]]Il Tasso XP \u00E8 ora [[GOLD]]{0}[[DARK_AQUA]]x -Commands.xprate.started.0=[[GOLD]]\u00E8 INIZIATO UN EVENTO XP PER mcMMO! -Commands.xprate.started.1=[[GOLD]]IL TASSO DI XP DI mcMMO \u00E8 ORA {0}x! +Commands.Event.Start=&amcMMO&6 Evento! +Commands.Event.Stop=&amcMMO&3 Evento Finito! +Commands.Event.Stop.Subtitle=&aSpero che ti sia divertito! +Commands.Event.XP=&3Il Tasso XP è ora &6{0}&3x +Commands.xprate.started.0=&6è INIZIATO UN EVENTO XP PER mcMMO! +Commands.xprate.started.1=&6IL TASSO DI XP DI mcMMO è ORA {0}x! # Admin Notifications -Server.ConsoleName=[[YELLOW]][Server] -Notifications.Admin.XPRate.Start.Self=[[GRAY]]Hai impostato il moltiplicatore XP globale a [[GOLD]]{0}x -Notifications.Admin.XPRate.End.Self=[[GRAY]]Hai terminato l'evento tasso XP. -Notifications.Admin.XPRate.End.Others={0} [[GRAY]]ha terminato l'evento tasso XP -Notifications.Admin.XPRate.Start.Others={0} [[GRAY]]ha avviato o modificato un evento di tasso XP con un moltiplicatore globale di {1}x -Notifications.Admin.Format.Others=[[GOLD]]([[GREEN]]mcMMO [[DARK_AQUA]]Admin[[GOLD]]) [[GRAY]]{0} -Notifications.Admin.Format.Self=[[GOLD]]([[GREEN]]mcMMO[[GOLD]]) [[GRAY]]{0} +Server.ConsoleName=&e[Server] +Notifications.Admin.XPRate.Start.Self=&7Hai impostato il moltiplicatore XP globale a &6{0}x +Notifications.Admin.XPRate.End.Self=&7Hai terminato l'evento tasso XP. +Notifications.Admin.XPRate.End.Others={0} &7ha terminato l'evento tasso XP +Notifications.Admin.XPRate.Start.Others={0} &7ha avviato o modificato un evento di tasso XP con un moltiplicatore globale di {1}x +Notifications.Admin.Format.Others=&6(&amcMMO &3Admin&6) &7{0} +Notifications.Admin.Format.Self=&6(&amcMMO&6) &7{0} # Event -XPRate.Event=[[GOLD]]mcMMO \u00E8 attualmente in un evento di tasso XP! Il tasso XP \u00E8 {0}x! +XPRate.Event=&6mcMMO è attualmente in un evento di tasso XP! Il tasso XP è {0}x! #GUIDES -Guides.Available=[[GRAY]]Guida per {0} disponibile - digita /{1} ? [pagina] -Guides.Header=[[GOLD]]-=[[GREEN]]Guida {0}[[GOLD]]=- -Guides.Page.Invalid=Non \u00E8 un numero di pagina valido! +Guides.Available=&7Guida per {0} disponibile - digita /{1} ? [pagina] +Guides.Header=&6-=&aGuida {0}&6=- +Guides.Page.Invalid=Non è un numero di pagina valido! Guides.Page.OutOfRange=Quella pagina non esiste, ci sono solo {0} pagine totali. -Guides.Usage= L'uso \u00E8 /{0} ? [pagina] +Guides.Usage= L'uso è /{0} ? [pagina] ##Acrobatics -Guides.Acrobatics.Section.0=[[DARK_AQUA]]Introduzione all'Acrobatica:\n[[YELLOW]]L'Acrobatica \u00E8 l'arte di muoversi con grazia in mcMMO.\n[[YELLOW]]Fornisce bonus di combattimento e bonus ai danni ambientali.\n\n[[DARK_AQUA]]GUADAGNO XP:\n[[YELLOW]]Per ottenere XP in questa abilit\u00E0 devi eseguire delle schivate\n[[YELLOW]]in combattimento o sopravvivere a cadute con danno. -Guides.Acrobatics.Section.1=[[DARK_AQUA]]Come funziona la Capriola?\n[[YELLOW]]Hai una possibilit\u00E0 passiva quando subisci danni da caduta\n[[YELLOW]]di annullare il danno subito. Puoi accovacciarti per\n[[YELLOW]]raddoppiare la possibilit\u00E0 durante la caduta.\n[[YELLOW]]Questo attiva una Capriola Aggraziata invece di quella normale.\n[[YELLOW]]Le Capriole Aggraziate sono come quelle normali ma hanno il doppio delle probabilit\u00E0\n[[YELLOW]]di verificarsi e forniscono pi\u00F9 protezione di quelle normali.\n[[YELLOW]]La probabilit\u00E0 di Capriola \u00E8 legata al tuo livello di abilit\u00E0 -Guides.Acrobatics.Section.2=[[DARK_AQUA]]Come funziona la Schivata?\n[[YELLOW]]Hai una possibilit\u00E0 passiva quando sei\n[[YELLOW]]ferito in combattimento di dimezzare il danno subito.\n[[YELLOW]]\u00E8 legata al tuo livello di abilit\u00E0. +Guides.Acrobatics.Section.0=&3Introduzione all'Acrobatica:\n&eL'Acrobatica è l'arte di muoversi con grazia in mcMMO.\n&eFornisce bonus di combattimento e bonus ai danni ambientali.\n\n&3GUADAGNO XP:\n&ePer ottenere XP in questa abilità devi eseguire delle schivate\n&ein combattimento o sopravvivere a cadute con danno. +Guides.Acrobatics.Section.1=&3Come funziona la Capriola?\n&eHai una possibilità passiva quando subisci danni da caduta\n&edi annullare il danno subito. Puoi accovacciarti per\n&eraddoppiare la possibilità durante la caduta.\n&eQuesto attiva una Capriola Aggraziata invece di quella normale.\n&eLe Capriole Aggraziate sono come quelle normali ma hanno il doppio delle probabilità\n&edi verificarsi e forniscono più protezione di quelle normali.\n&eLa probabilità di Capriola è legata al tuo livello di abilità +Guides.Acrobatics.Section.2=&3Come funziona la Schivata?\n&eHai una possibilità passiva quando sei\n&eferito in combattimento di dimezzare il danno subito.\n&eè legata al tuo livello di abilità. ##Alchemy -Guides.Alchemy.Section.0=[[DARK_AQUA]]Introduzione all'Alchimia:\n[[YELLOW]]L'Alchimia riguarda la preparazione di pozioni.\n[[YELLOW]]Fornisce un aumento della velocit\u00E0 di preparazione delle pozioni, così\n[[YELLOW]]come l'aggiunta di nuove pozioni (precedentemente) non ottenibili.\n\n\n[[DARK_AQUA]]GUADAGNO XP:\n[[YELLOW]]Per ottenere XP in questa abilit\u00E0 devi preparare pozioni. -Guides.Alchemy.Section.1=[[DARK_AQUA]]Come funziona Catalisi?\n[[YELLOW]]Catalizza la velocit\u00E0 di preparazione, con una\n[[YELLOW]]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]]La capacit\u00E0 Intrugli consente di preparare pi\u00F9 pozioni con ingredienti personalizzati.\n[[YELLOW]]Quali ingredienti speciali sono sbloccati \u00E8 determinato\n[[YELLOW]]dal tuo Grado. Ci sono 8 gradi da sbloccare. -Guides.Alchemy.Section.3=[[DARK_AQUA]]Ingredienti Intrugli di grado 1:\n[[YELLOW]]Polvere di blaze, Occhio di ragno fermentato, Lacrima di ghast, Redstone,\n[[YELLOW]]Polvere di luminite, Zucchero, Melone luccicante, Carota d'oro,\n[[YELLOW]]Crema di Magma, Verruca del Nether, Occhio di ragno, Polvere da sparo, Ninfea,\n[[YELLOW]]Pesce palla\n[[YELLOW]](Pozioni Vanilla) -Guides.Alchemy.Section.4=[[DARK_AQUA]]Ingredienti Intrugli di grado 2:\n[[YELLOW]]Carota (Pozione di velocit\u00E0)\n[[YELLOW]]Palla di slime (Pozione di Affaticamento)\n\n[[DARK_AQUA]]Ingredienti Intrugli di grado 3:\n[[YELLOW]]Quartzo (Pozione di Assorbimento)\n[[YELLOW]]Fungo rosso (Pozione di salto) -Guides.Alchemy.Section.5=[[DARK_AQUA]]Ingredienti Intrugli di grado 4:\n[[YELLOW]]Mela (Pozione di salute ampliata)\n[[YELLOW]]Carne marcia (Pozione di fame)\n\n[[DARK_AQUA]]Ingredienti Intrugli di grado 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 di grado 6:\n[[YELLOW]]Felce (Pozione di Saziet\u00E0)\n\n[[DARK_AQUA]]Ingredienti Intrugli di grado 7:\n[[YELLOW]]Patata velenosa (Pozione di Avvizzimento)\n\n[[DARK_AQUA]]Ingredienti Intrugli di grado 8:\n[[YELLOW]]Mela d'oro (Pozione di Resistenza) +Guides.Alchemy.Section.0=&3Introduzione all'Alchimia:\n&eL'Alchimia riguarda la preparazione di pozioni.\n&eFornisce un aumento della velocità di preparazione delle pozioni, così\n&ecome l'aggiunta di nuove pozioni (precedentemente) non ottenibili.\n\n\n&3GUADAGNO XP:\n&ePer ottenere XP in questa abilità devi preparare pozioni. +Guides.Alchemy.Section.1=&3Come funziona Catalisi?\n&eCatalizza la velocità di preparazione, con una\n&evelocità massima di 4x al livello 1000.\n&eQuesta abilità è sbloccata al livello 100 di default. +Guides.Alchemy.Section.2=&3Come funziona Intrugli?\n&eLa capacità Intrugli consente di preparare più pozioni con ingredienti personalizzati.\n&eQuali ingredienti speciali sono sbloccati è determinato\n&edal tuo Grado. Ci sono 8 gradi da sbloccare. +Guides.Alchemy.Section.3=&3Ingredienti Intrugli di grado 1:\n&ePolvere di blaze, Occhio di ragno fermentato, Lacrima di ghast, Redstone,\n&ePolvere di luminite, Zucchero, Melone luccicante, Carota d'oro,\n&eCrema di Magma, Verruca del Nether, Occhio di ragno, Polvere da sparo, Ninfea,\n&ePesce palla\n&e(Pozioni Vanilla) +Guides.Alchemy.Section.4=&3Ingredienti Intrugli di grado 2:\n&eCarota (Pozione di velocità)\n&ePalla di slime (Pozione di Affaticamento)\n\n&3Ingredienti Intrugli di grado 3:\n&eQuartzo (Pozione di Assorbimento)\n&eFungo rosso (Pozione di salto) +Guides.Alchemy.Section.5=&3Ingredienti Intrugli di grado 4:\n&eMela (Pozione di salute ampliata)\n&eCarne marcia (Pozione di fame)\n\n&3Ingredienti Intrugli di grado 5:\n&eFungo marrone (Pozione di nausea)\n&eSacca d'inchiostro (Pozione di Cecità) +Guides.Alchemy.Section.6=&3Ingredienti Intrugli di grado 6:\n&eFelce (Pozione di Sazietà)\n\n&3Ingredienti Intrugli di grado 7:\n&ePatata velenosa (Pozione di Avvizzimento)\n\n&3Ingredienti Intrugli di grado 8:\n&eMela d'oro (Pozione di Resistenza) ##Archery -Guides.Archery.Section.0=[[DARK_AQUA]]Introduzione al 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 aumento di danni\n[[YELLOW]]che scala con il livello e la capacit\u00E0 di stordire i tuoi\n[[YELLOW]]avversari in PvP. Inoltre puoi recuperare\n[[YELLOW]]dai cadaveri dei tuoi nemici alcune delle frecce usate.\n\n\n[[DARK_AQUA]]GUADAGNO XP:\n[[YELLOW]]Per ottenere XP in questa abilit\u00E0 devi colpire mob o\n[[YELLOW]]altri giocatori. -Guides.Archery.Section.1=[[DARK_AQUA]]Come funziona Tiro da Maestro?\n[[YELLOW]]Tiro da Maestro 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 predefinite, il danno dei tiri con l'arco aumenta del 10%\n[[YELLOW]]ogni 50 livelli, fino a un massimo del 200%. -Guides.Archery.Section.2=[[DARK_AQUA]]Come funziona Stordimento?\n[[YELLOW]]Hai una possibilit\u00E0 passiva di stordire gli altri giocatori quando\n[[YELLOW]]li colpisci. Stordimento costringe i tuoi avversari\n[[YELLOW]]a guardare verso l'alto per un breve periodo.\n[[YELLOW]]Un colpo con Stordimento 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 recupera alcune delle tue frecce\n[[YELLOW]]quando uccidi un mob con il tuo arco.\n[[YELLOW]]Questa possibilit\u00E0 aumenta all'aumentare del tuo livello in Tiro con l'Arco.\n[[YELLOW]]Di default, Questa capacit\u00E0 aumenta del 0.1% per livello, fino al 100%\n[[YELLOW]]al livello 1000. +Guides.Archery.Section.0=&3Introduzione al Tiro con l'Arco:\n&eTiro con l'Arco riguarda il tirare con arco e freccia.\n&eFornisce vari bonus di combattimento, come un aumento di danni\n&eche scala con il livello e la capacità di stordire i tuoi\n&eavversari in PvP. Inoltre puoi recuperare\n&edai cadaveri dei tuoi nemici alcune delle frecce usate.\n\n\n&3GUADAGNO XP:\n&ePer ottenere XP in questa abilità devi colpire mob o\n&ealtri giocatori. +Guides.Archery.Section.1=&3Come funziona Tiro da Maestro?\n&eTiro da Maestro un danno aggiuntivo ai tuoi colpi.\n&eIl danno bonus da Tiro da Maestro aumenta\n&eall'aumentare del livello di Tiro con l'Arco.\n&eCon le impostazioni predefinite, il danno dei tiri con l'arco aumenta del 10%\n&eogni 50 livelli, fino a un massimo del 200%. +Guides.Archery.Section.2=&3Come funziona Stordimento?\n&eHai una possibilità passiva di stordire gli altri giocatori quando\n&eli colpisci. Stordimento costringe i tuoi avversari\n&ea guardare verso l'alto per un breve periodo.\n&eUn colpo con Stordimento procura anche ulteriori 4 danni (2 cuori). +Guides.Archery.Section.3=&3Come funziona Recupero Frecce?\n&eHai una possibilità passiva di recupera alcune delle tue frecce\n&equando uccidi un mob con il tuo arco.\n&eQuesta possibilità aumenta all'aumentare del tuo livello in Tiro con l'Arco.\n&eDi default, Questa capacità aumenta del 0.1% per livello, fino al 100%\n&eal livello 1000. ##Axes -Guides.Axes.Section.0=[[DARK_AQUA]]Introduzione ad Asce:\n[[YELLOW]]Con l'abilit\u00E0 Asce puoi usare la tua ascia per molto pi\u00F9 che\n[[YELLOW]]deforestare! Puoi fare a pezzi e tagliuzzare i mob\n[[YELLOW]]e i giocatori per ottenere XP, colpire i mob con l'effetto di\n[[YELLOW]]contraccolpo e infliggere danni critici MORTALI ai mob e ai giocatori.\n[[YELLOW]]La tua ascia diventa anche un trituratore portatile,\n[[YELLOW]]che abbatte l'armatura del nemico con facilit\u00E0 all'aumentare\n[[YELLOW]]del tuo livello.\n[[DARK_AQUA]]GUADAGNO XP:\n[[YELLOW]]Per ottenere XP in questa abilit\u00E0 devi colpire altri mob o giocatori\n[[YELLOW]]con la tua Ascia. -Guides.Axes.Section.1=[[DARK_AQUA]]Come funziona Spacca Crani?\n[[YELLOW]]Questa capacit\u00E0 consente di infliggere un colpo EaA (Effetto ad Area).\n[[YELLOW]]Questo colpo EaA infligger\u00E0 la met\u00E0 del danno fatto\n[[YELLOW]]all'obbiettivo principale, quindi \u00E8 ottimo per eliminare 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]]una possibilit\u00E0 di infliggere danno extra.\n[[YELLOW]]Con le impostazioni predefinite, ogni 2 livelli abilit\u00E0 in Asce ottieni un\n[[YELLOW]]0.1% di possibilit\u00E0 in pi\u00F9 di infliggere un Colpo Critico, che causa 2.0 volte il danno\n[[YELLOW]]ai mob o 1.5 volte il danno agli altri giocatori. -Guides.Axes.Section.3=[[DARK_AQUA]]Come funziona Maestria con l'Ascia?\n[[YELLOW]]Maestria con l'Ascia \u00E8 una capacit\u00E0 passiva che aggiunge ulteriori danni\n[[YELLOW]]ai tuoi colpi con l'Ascia.\n[[YELLOW]]Di default, il danno bonus aumenta di 1 ogni 50 livelli,\n[[YELLOW]]fino a un massimo di 4 danni extra al livello 200. -Guides.Axes.Section.4=[[DARK_AQUA]]Come funziona Sfonda Armature?\n[[YELLOW]]Colpisci con forza sufficiente da fracassare l'armatura!\n[[YELLOW]]Sfonda Armature ha una possibilit\u00E0 passiva di dannegiare l'armatura\n[[YELLOW]]del tuo avversario. Questo danno aumenta all'aumentare del tuo livello in Asce. -Guides.Axes.Section.5=[[DARK_AQUA]]Come funziona Impatto Migliorato?\n[[YELLOW]]Hai una possibilit\u00E0 passiva di ottenere un impatto maggiore\n[[YELLOW]]colpendo i mob o i giocatori con la tua ascia.\n[[YELLOW]]Di default questa possibilit\u00E0 \u00E8 del 25%. Questa capacit\u00E0 passiva ha un\n[[YELLOW]]estremo contraccolpo, simile all'incantesimo\n[[YELLOW]]Contraccolpo II. Inoltre, infligge danni bonus al bersaglio. +Guides.Axes.Section.0=&3Introduzione ad Asce:\n&eCon l'abilità Asce puoi usare la tua ascia per molto più che\n&edeforestare! Puoi fare a pezzi e tagliuzzare i mob\n&ee i giocatori per ottenere XP, colpire i mob con l'effetto di\n&econtraccolpo e infliggere danni critici MORTALI ai mob e ai giocatori.\n&eLa tua ascia diventa anche un trituratore portatile,\n&eche abbatte l'armatura del nemico con facilità all'aumentare\n&edel tuo livello.\n&3GUADAGNO XP:\n&ePer ottenere XP in questa abilità devi colpire altri mob o giocatori\n&econ la tua Ascia. +Guides.Axes.Section.1=&3Come funziona Spacca Crani?\n&eQuesta capacità consente di infliggere un colpo EaA (Effetto ad Area).\n&eQuesto colpo EaA infliggerà la metà del danno fatto\n&eall'obbiettivo principale, quindi è ottimo per eliminare grandi mucchi di mob. +Guides.Axes.Section.2=&3Come funziona Colpi Critici?\n&eColpi Critici è una capacità passiva che dà ai giocatori\n&euna possibilità di infliggere danno extra.\n&eCon le impostazioni predefinite, ogni 2 livelli abilità in Asce ottieni un\n&e0.1% di possibilità in più di infliggere un Colpo Critico, che causa 2.0 volte il danno\n&eai mob o 1.5 volte il danno agli altri giocatori. +Guides.Axes.Section.3=&3Come funziona Maestria con l'Ascia?\n&eMaestria con l'Ascia è una capacità passiva che aggiunge ulteriori danni\n&eai tuoi colpi con l'Ascia.\n&eDi default, il danno bonus aumenta di 1 ogni 50 livelli,\n&efino a un massimo di 4 danni extra al livello 200. +Guides.Axes.Section.4=&3Come funziona Sfonda Armature?\n&eColpisci con forza sufficiente da fracassare l'armatura!\n&eSfonda Armature ha una possibilità passiva di dannegiare l'armatura\n&edel tuo avversario. Questo danno aumenta all'aumentare del tuo livello in Asce. +Guides.Axes.Section.5=&3Come funziona Impatto Migliorato?\n&eHai una possibilità passiva di ottenere un impatto maggiore\n&ecolpendo i mob o i giocatori con la tua ascia.\n&eDi default questa possibilità è del 25%. Questa capacità passiva ha un\n&eestremo contraccolpo, simile all'incantesimo\n&eContraccolpo II. Inoltre, infligge danni bonus al bersaglio. ##Excavation -Guides.Excavation.Section.0=[[DARK_AQUA]]Introduzione allo Scavo:\n[[YELLOW]]Lo Scavo \u00E8 l'atto di scavare la terra per trovare tesori.\n[[YELLOW]]Scavando la terra troverai tesori.\n[[YELLOW]]Pi\u00F9 lo fai, pi\u00F9 tesori puoi trovare.\n\n[[DARK_AQUA]]GUADAGNO XP:\n[[YELLOW]]Per ottenere XP in questa abilit\u00E0 devi scavare con una pala in mano.\n[[YELLOW]]Solo alcuni materiali possono essere scavati per trovare tesori e XP. -Guides.Excavation.Section.1=[[DARK_AQUA]]Materiali Compatibili:\n[[YELLOW]]Erba, Terra, Sabbia, Argilla, Ghiaia, Micelio, Sabbia delle anime, Neve -Guides.Excavation.Section.2=[[DARK_AQUA]]Come usare la Giga-Trivella Demolitrice:\n[[YELLOW]]Con una pala in mano fai clic destro per preparare il tuo strumento.\n[[YELLOW]]Una volta in questo stato hai circa 4 secondi per fare\n[[YELLOW]]contatto con i materiali compatibili, questo\n[[YELLOW]]attiver\u00E0 la Giga-Trivella Demolitrice. -Guides.Excavation.Section.3=[[DARK_AQUA]]Cos'\u00E8 la Giga-Trivella Demolitrice?\n[[YELLOW]]La Giga-Trivella Demolitrice \u00E8 una capacit\u00E0 con una ricarica\n[[YELLOW]]legata all'abilit\u00E0 di Scavo. Triplica la tua possibilit\u00E0\n[[YELLOW]]di trovare tesori e abilita la rottura istantanea\n[[YELLOW]]dei materiali di Scavo. -Guides.Excavation.Section.4=[[DARK_AQUA]]Come funziona Archeologia?\n[[YELLOW]]Ogni possibile tesoro per lo Scavo ha il suo\n[[YELLOW]]requisito di livello di abilit\u00E0 per il suo drop, di conseguenza \u00E8\n[[YELLOW]]difficile dire quanto ti stia aiutando.\n[[YELLOW]]Tieni presente che maggiore \u00E8 la tua abilit\u00E0 di Scavo,\n[[YELLOW]]pi\u00F9 tesori si possono trovare.\n[[YELLOW]]E tieni anche presente che ogni tipo di materiale\n[[YELLOW]]compatibile ha la sua lista unica di tesori.\n[[YELLOW]]In altre parole, nella Terra troverai tesori diversi\n[[YELLOW]]da quelli che troverai nella Ghiaia. -Guides.Excavation.Section.5=[[DARK_AQUA]]Note sullo Scavo:\n[[YELLOW]]I drop dello Scavo sono completamente personalizzabili\n[[YELLOW]]Quindi i risultati variano da server a server. +Guides.Excavation.Section.0=&3Introduzione allo Scavo:\n&eLo Scavo è l'atto di scavare la terra per trovare tesori.\n&eScavando la terra troverai tesori.\n&ePiù lo fai, più tesori puoi trovare.\n\n&3GUADAGNO XP:\n&ePer ottenere XP in questa abilità devi scavare con una pala in mano.\n&eSolo alcuni materiali possono essere scavati per trovare tesori e XP. +Guides.Excavation.Section.1=&3Materiali Compatibili:\n&eErba, Terra, Sabbia, Argilla, Ghiaia, Micelio, Sabbia delle anime, Neve +Guides.Excavation.Section.2=&3Come usare la Giga-Trivella Demolitrice:\n&eCon una pala in mano fai clic destro per preparare il tuo strumento.\n&eUna volta in questo stato hai circa 4 secondi per fare\n&econtatto con i materiali compatibili, questo\n&eattiverà la Giga-Trivella Demolitrice. +Guides.Excavation.Section.3=&3Cos'è la Giga-Trivella Demolitrice?\n&eLa Giga-Trivella Demolitrice è una capacità con una ricarica\n&elegata all'abilità di Scavo. Triplica la tua possibilità\n&edi trovare tesori e abilita la rottura istantanea\n&edei materiali di Scavo. +Guides.Excavation.Section.4=&3Come funziona Archeologia?\n&eOgni possibile tesoro per lo Scavo ha il suo\n&erequisito di livello di abilità per il suo drop, di conseguenza è\n&edifficile dire quanto ti stia aiutando.\n&eTieni presente che maggiore è la tua abilità di Scavo,\n&epiù tesori si possono trovare.\n&eE tieni anche presente che ogni tipo di materiale\n&ecompatibile ha la sua lista unica di tesori.\n&eIn altre parole, nella Terra troverai tesori diversi\n&eda quelli che troverai nella Ghiaia. +Guides.Excavation.Section.5=&3Note sullo Scavo:\n&eI drop dello Scavo sono completamente personalizzabili\n&eQuindi i risultati variano da server a server. ##Fishing -Guides.Fishing.Section.0=[[DARK_AQUA]]Introduzione alla Pesca:\n[[YELLOW]]Con l'abilit\u00E0 di Pesca, La pesca \u00E8 di nuovo emozionante!\n[[YELLOW]]Trova tesori nascosti, e scrolla oggetti di dosso dai mob.\n\n[[DARK_AQUA]]GUADAGNO XP:\n[[YELLOW]]Cattura pesci. -Guides.Fishing.Section.1=[[DARK_AQUA]]Come funziona Cacciatore di Tesori?\n[[YELLOW]]Questa capacit\u00E0 ti consente di trovare tesori pescando\n[[YELLOW]]con una piccola possibilit\u00E0 che gli oggetti vengano incantati.\n[[YELLOW]]Ogni possibile tesoro di Pesca ha una possibilit\u00E0\n[[YELLOW]]di essere trovato a ogni livello. Dipende comunque\n[[YELLOW]]dalla rarit\u00E0 dell'oggetto quanto spesso si trover\u00E0.\n[[YELLOW]]Quanto pi\u00F9 alta \u00E8 la tua abilit\u00E0 di Pesca, maggiori\n[[YELLOW]]saranno le tue possibilit\u00E0 di trovare tesori migliori. -Guides.Fishing.Section.2=[[DARK_AQUA]]Come funziona Pesca sul Ghiaccio?\n[[YELLOW]]Questa capacit\u00E0 passiva ti consente di pescare sui laghi ghiacciati!\n[[YELLOW]]Lancia la tua canna da pesca in un lago di ghiaccio e l'abilit\u00E0\n[[YELLOW]]creer\u00E0 un piccolo buco nel ghiaccio in cui pescare. -Guides.Fishing.Section.3=[[DARK_AQUA]]Come funziona Pescatore Provetto?\n[[YELLOW]]Questa capacit\u00E0 passiva aumenta la possibilit\u00E0 che i pesci abbocchino durante la pesca.\n[[YELLOW]]Quando sblocchi questa abilit\u00E0, pescare in\n[[YELLOW]]una barca o in un bioma oceanico raddoppia la possibilit\u00E0 che i pesci abbocchino. -Guides.Fishing.Section.4=[[DARK_AQUA]]Come funziona Scuotere?\n[[YELLOW]]Questa capacit\u00E0 attiva ti consente di scrollare gli oggetti persi dai mob\n[[YELLOW]]agganciandoli con la canna da pesca. \n[[YELLOW]]I Mob lasceranno cadere oggetti che normalmente cadrebbero alla loro morte.\n[[YELLOW]]\u00E8 anche possibile acquisire teschi di mob, che non sono ottenibili \n[[YELLOW]]normalmente in modalit\u00E0 sopravvivenza. -Guides.Fishing.Section.5=[[DARK_AQUA]]Come funziona Dieta del Pescatore?\n[[YELLOW]]Questa capacit\u00E0 passiva aumenta la quantit\u00E0 di fame ripristinata\n[[YELLOW]]mangiando pesce. -Guides.Fishing.Section.6=[[DARK_AQUA]]Note sulla Pesca:\n[[YELLOW]]I drop della Pesca sono completamente personalizzabili,\n[[YELLOW]]quindi i risultati possono variare da server a server. +Guides.Fishing.Section.0=&3Introduzione alla Pesca:\n&eCon l'abilità di Pesca, La pesca è di nuovo emozionante!\n&eTrova tesori nascosti, e scrolla oggetti di dosso dai mob.\n\n&3GUADAGNO XP:\n&eCattura pesci. +Guides.Fishing.Section.1=&3Come funziona Cacciatore di Tesori?\n&eQuesta capacità ti consente di trovare tesori pescando\n&econ una piccola possibilità che gli oggetti vengano incantati.\n&eOgni possibile tesoro di Pesca ha una possibilità\n&edi essere trovato a ogni livello. Dipende comunque\n&edalla rarità dell'oggetto quanto spesso si troverà.\n&eQuanto più alta è la tua abilità di Pesca, maggiori\n&esaranno le tue possibilità di trovare tesori migliori. +Guides.Fishing.Section.2=&3Come funziona Pesca sul Ghiaccio?\n&eQuesta capacità passiva ti consente di pescare sui laghi ghiacciati!\n&eLancia la tua canna da pesca in un lago di ghiaccio e l'abilità\n&ecreerà un piccolo buco nel ghiaccio in cui pescare. +Guides.Fishing.Section.3=&3Come funziona Pescatore Provetto?\n&eQuesta capacità passiva aumenta la possibilità che i pesci abbocchino durante la pesca.\n&eQuando sblocchi questa abilità, pescare in\n&euna barca o in un bioma oceanico raddoppia la possibilità che i pesci abbocchino. +Guides.Fishing.Section.4=&3Come funziona Scuotere?\n&eQuesta capacità attiva ti consente di scrollare gli oggetti persi dai mob\n&eagganciandoli con la canna da pesca. \n&eI Mob lasceranno cadere oggetti che normalmente cadrebbero alla loro morte.\n&eè anche possibile acquisire teschi di mob, che non sono ottenibili \n&enormalmente in modalità sopravvivenza. +Guides.Fishing.Section.5=&3Come funziona Dieta del Pescatore?\n&eQuesta capacità passiva aumenta la quantità di fame ripristinata\n&emangiando pesce. +Guides.Fishing.Section.6=&3Note sulla Pesca:\n&eI drop della Pesca sono completamente personalizzabili,\n&equindi i risultati possono variare da server a server. ##Herbalism -Guides.Herbalism.Section.0=[[DARK_AQUA]]Introduzione all'Erboristeria:\n[[YELLOW]]L'Erboristeria riguarda la raccolta di erbe e piante.\n\n\n[[DARK_AQUA]]GUADAGNO XP:\n[[YELLOW]]Raccogli 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, Funghi,\n[[YELLOW]]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 clic-destro\n[[YELLOW]]con una zappa in mano per attivare Terra Verde.\n[[YELLOW]]Terra Verde d\u00E0 ai giocatori la possibilit\u00E0 di ottenere drop 3x\n[[YELLOW]]raccogliendo piante. Inoltre d\u00E0 ai giocatori l'abilit\u00E0 di\n[[YELLOW]]diffondere la vita nei blocchi e trasformarli usando dei semi\n[[YELLOW]]dal tuo inventario. -Guides.Herbalism.Section.3=[[DARK_AQUA]]Come funziona Pollice Verde (Colture)?\n[[YELLOW]]Questa capacit\u00E0 passiva ripianter\u00E0 automaticamente le colture durante\n[[YELLOW]]la raccolta.\n[[YELLOW]]Le tue possibilit\u00E0 di successo dipendono dalla tua abilit\u00E0 di Erboristeria. -Guides.Herbalism.Section.4=[[DARK_AQUA]]Come funziona Pollice Verde (Pietrisco/Mattoni di pietra/Terra)?\n[[YELLOW]]Questa capacit\u00E0 passiva ti consente di trasformare i blocchi nelle loro\n[[YELLOW]]controparti "piante". Puoi farlo facendo clic-destro\n[[YELLOW]]su un blocco, con dei semi in mano. Fare ci\u00F2 consumer\u00E0 1 seme. -Guides.Herbalism.Section.5=[[DARK_AQUA]]Come funziona Dieta del Contadino?\n[[YELLOW]]Questa capacit\u00E0 passiva aumenta la quantit\u00E0 di 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 ti d\u00E0 una possibilit\u00E0 di trovare oggetti rari\n[[YELLOW]]quando determinati blocchi vengono rotti con una spada. -Guides.Herbalism.Section.7=[[DARK_AQUA]]Come funziona Doppi Drop?\n[[YELLOW]]Questa capacit\u00E0 passiva d\u00E0 ai giocatori una resa migliore ai loro\n[[YELLOW]]raccolti. +Guides.Herbalism.Section.0=&3Introduzione all'Erboristeria:\n&eL'Erboristeria riguarda la raccolta di erbe e piante.\n\n\n&3GUADAGNO XP:\n&eRaccogli piante ed erbe. +Guides.Herbalism.Section.1=&3Blocchi Compatibili\n&eGrano, Patate, Carote, Meloni, \n&eZucchine, Canne da zucchero, Fave di cacao, Fiori, Cactus, Funghi,\n&eVerruche del Nether, Ninfee, e Rampicanti. +Guides.Herbalism.Section.2=&3Come funziona Terra Verde?\n&eTerra Verde è una capacità attiva, puoi fare clic-destro\n&econ una zappa in mano per attivare Terra Verde.\n&eTerra Verde dà ai giocatori la possibilità di ottenere drop 3x\n&eraccogliendo piante. Inoltre dà ai giocatori l'abilità di\n&ediffondere la vita nei blocchi e trasformarli usando dei semi\n&edal tuo inventario. +Guides.Herbalism.Section.3=&3Come funziona Pollice Verde (Colture)?\n&eQuesta capacità passiva ripianterà automaticamente le colture durante\n&ela raccolta.\n&eLe tue possibilità di successo dipendono dalla tua abilità di Erboristeria. +Guides.Herbalism.Section.4=&3Come funziona Pollice Verde (Pietrisco/Mattoni di pietra/Terra)?\n&eQuesta capacità passiva ti consente di trasformare i blocchi nelle loro\n&econtroparti "piante". Puoi farlo facendo clic-destro\n&esu un blocco, con dei semi in mano. Fare ciò consumerà 1 seme. +Guides.Herbalism.Section.5=&3Come funziona Dieta del Contadino?\n&eQuesta capacità passiva aumenta la quantità di fame ripristinata\n&emangiando Pane, Biscotti, Meloni, Zuppe di funghi, Carote,\n&ee Patate. +Guides.Herbalism.Section.6=&3Come funziona Fortuna Hylian?\n&eQuesta capacità passiva ti dà una possibilità di trovare oggetti rari\n&equando determinati blocchi vengono rotti con una spada. +Guides.Herbalism.Section.7=&3Come funziona Doppi Drop?\n&eQuesta capacità passiva dà ai giocatori una resa migliore ai loro\n&eraccolti. ##Mining -Guides.Mining.Section.0=[[DARK_AQUA]]Introduzione all'Estrazione:\n[[YELLOW]]L'Estrazione consiste nell'estrarre pietre e minerali. Fornisce bonus\n[[YELLOW]]alla quantit\u00E0 di materiali estratti.\n\n[[DARK_AQUA]]GUADAGNO XP:\n[[YELLOW]]Per ottenere XP in questa abilit\u00E0, devi minare con un piccone in mano.\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, Redstone grezza,\n[[YELLOW]]Lapislazzuli grezzo, Ossidiana, Pietrisco muschioso, Pietra dell'End,\n[[YELLOW]]Luminite, e Netherrack. -Guides.Mining.Section.2=[[DARK_AQUA]]Come usare Super Demolitore:\n[[YELLOW]]Con un piccone in mano, fai clic destro per preparare il tuo strumento.\n[[YELLOW]]Una volta in questo stato, hai circa 4 secondi per fare contatto\n[[YELLOW]]con i materiali compatibili, che attiveranno il\n[[YELLOW]]Super Demolitore. -Guides.Mining.Section.3=[[DARK_AQUA]]Cos'\u00E8 il Super Demolitore?\n[[YELLOW]]Il Super Demolitore \u00E8 una capacit\u00E0 con una ricarica legata all'abilit\u00E0\n[[YELLOW]]di Estrazione. Triplica le tue possibilit\u00E0 di ottenere oggetti extra e\n[[YELLOW]]abilita la rottura istantanea dei materiali da Estrazione. -Guides.Mining.Section.4=[[DARK_AQUA]]Come usare Estrazione Esplosiva:\n[[YELLOW]]Con un piccone in mano,\n[[YELLOW]]accovacciati e fai clic-destro sul TNT da una certa distanza. Ci\u00F2 far\u00E0\n[[YELLOW]]esplodere istantaneamente il TNT. -Guides.Mining.Section.5=[[DARK_AQUA]]Come funziona Estrazione Esplosiva?\n[[YELLOW]]Estrazione Esplosiva \u00E8 una capacit\u00E0 con una ricarica legata all'abilit\u00E0\n[[YELLOW]]di Estrazione. Fornisce bonus durante l'estrazione con il TNT e ti consente\n[[YELLOW]]di detonare il TNT a distanza. Ci sono tre parti di Estrazione Esplosiva.\n[[YELLOW]]La prima parte \u00E8 Bombe pi\u00F9 Grandi, che aumenta il raggio di esplosione.\n[[YELLOW]]La seconda \u00E8 Perizia nelle Demolizioni, che diminuisce il danno\n[[YELLOW]]dalle esplosioni di TNT. La terza parte semplicemente aumenta\n[[YELLOW]]la quantit\u00E0 di minerali grezzi ottenuti dal TNT e diminuisce i\n[[YELLOW]]detriti. +Guides.Mining.Section.0=&3Introduzione all'Estrazione:\n&eL'Estrazione consiste nell'estrarre pietre e minerali. Fornisce bonus\n&ealla quantità di materiali estratti.\n\n&3GUADAGNO XP:\n&ePer ottenere XP in questa abilità, devi minare con un piccone in mano.\n&eSolo alcuni blocchi assegnano XP. +Guides.Mining.Section.1=&3Materiali Compatibili:\n&ePietra, Carbone grezzo, Ferro grezzo, Oro grezzo, Diamante grezzo, Redstone grezza,\n&eLapislazzuli grezzo, Ossidiana, Pietrisco muschioso, Pietra dell'End,\n&eLuminite, e Netherrack. +Guides.Mining.Section.2=&3Come usare Super Demolitore:\n&eCon un piccone in mano, fai clic destro per preparare il tuo strumento.\n&eUna volta in questo stato, hai circa 4 secondi per fare contatto\n&econ i materiali compatibili, che attiveranno il\n&eSuper Demolitore. +Guides.Mining.Section.3=&3Cos'è il Super Demolitore?\n&eIl Super Demolitore è una capacità con una ricarica legata all'abilità\n&edi Estrazione. Triplica le tue possibilità di ottenere oggetti extra e\n&eabilita la rottura istantanea dei materiali da Estrazione. +Guides.Mining.Section.4=&3Come usare Estrazione Esplosiva:\n&eCon un piccone in mano,\n&eaccovacciati e fai clic-destro sul TNT da una certa distanza. Ciò farà\n&eesplodere istantaneamente il TNT. +Guides.Mining.Section.5=&3Come funziona Estrazione Esplosiva?\n&eEstrazione Esplosiva è una capacità con una ricarica legata all'abilità\n&edi Estrazione. Fornisce bonus durante l'estrazione con il TNT e ti consente\n&edi detonare il TNT a distanza. Ci sono tre parti di Estrazione Esplosiva.\n&eLa prima parte è Bombe più Grandi, che aumenta il raggio di esplosione.\n&eLa seconda è Perizia nelle Demolizioni, che diminuisce il danno\n&edalle esplosioni di TNT. La terza parte semplicemente aumenta\n&ela quantità di minerali grezzi ottenuti dal TNT e diminuisce i\n&edetriti. ##Repair -Guides.Repair.Section.0=[[DARK_AQUA]]Introduzione alla Riparazione:\n[[YELLOW]]La Riparazione ti consente di usare un blocco di ferro\n[[YELLOW]]per riparare armature e attrezzi.\n\n[[DARK_AQUA]]GUADAGNO XP:\n[[YELLOW]]Ripara attrezzi o armature usando l'Incudine di mcMMO. Quest'ultima \u00E8\n[[YELLOW]]un blocco di ferro di default e non dovrebbe essere confusa\n[[YELLOW]]con l'Incudine Vanilla di Minecraft. -Guides.Repair.Section.1=[[DARK_AQUA]]Come posso usare Riparazione?\n[[YELLOW]]Posiziona un'Incudine di mcMMO e fai clic-destro per riparare l'oggetto\n[[YELLOW]]che hai in mano. Fare ci\u00F2 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. La quantit\u00E0 extra\n[[YELLOW]]riparata \u00E8 influenzata dal tuo livello di abilit\u00E0 in Riparazione. -Guides.Repair.Section.3=[[DARK_AQUA]]Come funziona Super Riparazione?\n[[YELLOW]]Super Riparazione \u00E8 una capacit\u00E0 passiva. Durante la riparazione di un oggetto,\n[[YELLOW]]d\u00E0 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 ti consente di riparare gli oggetti con una certa\n[[YELLOW]]possibilit\u00E0 di mantenere i suoi incantesimi. Gli incantesimi possono essere\n[[YELLOW]]mantenuti ai loro livelli, declassati a un livello inferiore,\n[[YELLOW]]o persi interamente. +Guides.Repair.Section.0=&3Introduzione alla Riparazione:\n&eLa Riparazione ti consente di usare un blocco di ferro\n&eper riparare armature e attrezzi.\n\n&3GUADAGNO XP:\n&eRipara attrezzi o armature usando l'Incudine di mcMMO. Quest'ultima è\n&eun blocco di ferro di default e non dovrebbe essere confusa\n&econ l'Incudine Vanilla di Minecraft. +Guides.Repair.Section.1=&3Come posso usare Riparazione?\n&ePosiziona un'Incudine di mcMMO e fai clic-destro per riparare l'oggetto\n&eche hai in mano. Fare ciò consuma 1 oggetto per ogni uso. +Guides.Repair.Section.2=&3Come funziona Maestria nella Riparazione?\n&eMaestria nella Riparazione aumenta la quantità di riparazione. La quantità extra\n&eriparata è influenzata dal tuo livello di abilità in Riparazione. +Guides.Repair.Section.3=&3Come funziona Super Riparazione?\n&eSuper Riparazione è una capacità passiva. Durante la riparazione di un oggetto,\n&edà ai giocatori una possibilità di riparare un oggetto con\n&edoppia efficacia. +Guides.Repair.Section.4=&3Come funziona Forgiatura Arcana?\n&eQuesta capacità passiva ti consente di riparare gli oggetti con una certa\n&epossibilità di mantenere i suoi incantesimi. Gli incantesimi possono essere\n&emantenuti ai loro livelli, declassati a un livello inferiore,\n&eo persi interamente. ##Salvage -Guides.Salvage.Section.0=[[DARK_AQUA]]Introduzione alla Rottamazione:\n[[YELLOW]]La Rottamazione ti consente di usare un blocco d'oro per rottamare\n[[YELLOW]]armature e attrezzi.\n\n[[DARK_AQUA]]GUADAGNO XP:\n[[YELLOW]]La Rottamazione \u00E8 un'abilit\u00E0 figlia di Riparazione e Pesca, il tuo livello\n[[YELLOW]]di abilit\u00E0 di Rottamazione \u00E8 basato su i tuoi livelli di Pesca e Riparazione. -Guides.Salvage.Section.1=[[DARK_AQUA]]Come posso usare la Rottamazione?\n[[YELLOW]]Posiziona un'Incudine da Rottamazione di mcMMO e fai clic-destro per rottamare\n[[YELLOW]]l'oggetto che hai in mano. Ci\u00F2 romper\u00E0 l'oggetto,\n[[YELLOW]]e ti dar\u00E0 indietro i materiali usati per crearlo.\n\n[[YELLOW]]Per esempio, rottamando un piccone di ferro ti dar\u00E0 dei lingotti di ferro. -Guides.Salvage.Section.2=[[DARK_AQUA]]Come funziona la Rottamazione Avanzata?\n[[YELLOW]]Una volta sbloccata, questa capacit\u00E0 ti consente di rottamare gli oggetti danneggiati.\n[[YELLOW]]La percentuale di rendimento aumenta all'aumentare del tuo livello. Un rendimento pi\u00F9 elevato\n[[YELLOW]]significa che puoi recuperare pi\u00F9 materiali.\n[[YELLOW]]Con la rottamazione avanzata otterrai sempre almeno 1 materiale,\n[[YELLOW]]a meno che l'oggetto non sia troppo danneggiato. Quindi non devi preoccuparti\n[[YELLOW]]se distruggi un oggetto senza ottenere niente in cambio. -Guides.Salvage.Section.3=[[DARK_AQUA]]Per illustrare come funziona, ecco un esempio:\n[[YELLOW]]Diciamo che rottamiamo un piccone d'oro che \u00E8 danneggiato per il 20%,\n[[YELLOW]]ci\u00F2 significa che la quantit\u00E0 massima che potrai ottenere \u00E8 solo 2\n[[YELLOW]](perch\u00E9 il piccone \u00E8 fatto con 3 lingotti - ognuno vale\n[[YELLOW]]il 33,33% di durabilit\u00E0) che equivale al 66%. Se la tua percentuale\n[[YELLOW]]di rendimento \u00E8 sotto il 66% non potrai ottenere 2 lingotti.\n[[YELLOW]]Se \u00E8 sopra questo valore potrai ottenere la "quantit\u00E0 intera",\n[[YELLOW]]il che significa che otterrai 2 lingotti. -Guides.Salvage.Section.4=[[DARK_AQUA]]Come funziona Rottamazione Arcana?\n[[YELLOW]]Questa capacit\u00E0 ti consente di ottenere libri incantati rottamando\n[[YELLOW]]oggetti incantati. La probabilit\u00E0 di estrarre con successo un incantesimo\n[[YELLOW]]completo o parziale varia a seconda del tuo livello di abilit\u00E0.\n\n[[YELLOW]]Quando un incantesimo \u00E8 estratto parzialmente, il libro\n[[YELLOW]]incantato avr\u00E0 un livello minore rispetto a quello\n[[YELLOW]]che era sull'oggetto. +Guides.Salvage.Section.0=&3Introduzione alla Rottamazione:\n&eLa Rottamazione ti consente di usare un blocco d'oro per rottamare\n&earmature e attrezzi.\n\n&3GUADAGNO XP:\n&eLa Rottamazione è un'abilità figlia di Riparazione e Pesca, il tuo livello\n&edi abilità di Rottamazione è basato su i tuoi livelli di Pesca e Riparazione. +Guides.Salvage.Section.1=&3Come posso usare la Rottamazione?\n&ePosiziona un'Incudine da Rottamazione di mcMMO e fai clic-destro per rottamare\n&el'oggetto che hai in mano. Ciò romperà l'oggetto,\n&ee ti darà indietro i materiali usati per crearlo.\n\n&ePer esempio, rottamando un piccone di ferro ti darà dei lingotti di ferro. +Guides.Salvage.Section.2=&3Come funziona la Rottamazione Avanzata?\n&eUna volta sbloccata, questa capacità ti consente di rottamare gli oggetti danneggiati.\n&eLa percentuale di rendimento aumenta all'aumentare del tuo livello. Un rendimento più elevato\n&esignifica che puoi recuperare più materiali.\n&eCon la rottamazione avanzata otterrai sempre almeno 1 materiale,\n&ea meno che l'oggetto non sia troppo danneggiato. Quindi non devi preoccuparti\n&ese distruggi un oggetto senza ottenere niente in cambio. +Guides.Salvage.Section.3=&3Per illustrare come funziona, ecco un esempio:\n&eDiciamo che rottamiamo un piccone d'oro che è danneggiato per il 20%,\n&eciò significa che la quantità massima che potrai ottenere è solo 2\n&e(perché il piccone è fatto con 3 lingotti - ognuno vale\n&eil 33,33% di durabilità) che equivale al 66%. Se la tua percentuale\n&edi rendimento è sotto il 66% non potrai ottenere 2 lingotti.\n&eSe è sopra questo valore potrai ottenere la "quantità intera",\n&eil che significa che otterrai 2 lingotti. +Guides.Salvage.Section.4=&3Come funziona Rottamazione Arcana?\n&eQuesta capacità ti consente di ottenere libri incantati rottamando\n&eoggetti incantati. La probabilità di estrarre con successo un incantesimo\n&ecompleto o parziale varia a seconda del tuo livello di abilità.\n\n&eQuando un incantesimo è estratto parzialmente, il libro\n&eincantato avrà un livello minore rispetto a quello\n&eche era sull'oggetto. ##Smelting Guides.Smelting.Section.0=Prossimamente... ##Swords -Guides.Swords.Section.0=[[DARK_AQUA]]Introduzione a Spade:\n[[YELLOW]]Questa abilit\u00E0 assegna bonus di combattimento a chiunque combatta con una\n[[YELLOW]]spada.\n\n[[DARK_AQUA]]GUADAGNO XP:\n[[YELLOW]]Gli XP si ottengono in base alla quantit\u00E0 di danoo inflitto ai mob o\n[[YELLOW]]agli altri giocatori brandendo 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]]clic-destro con una spada. Questa capacit\u00E0 ti consente di infliggere\n[[YELLOW]]un colpo EaA (Effetto ad Area). Questo EaA far\u00E0 un danno 25%\n[[YELLOW]]bonus e infligger\u00E0 un effetto di sanguinamento per 5 tick. -Guides.Swords.Section.2=[[DARK_AQUA]]Come funziona Contrattacco?\n[[YELLOW]]Contrattacco \u00E8 una capacit\u00E0 passiva. Quando blocchi e prendi\n[[YELLOW]]colpi dai mob, hai una possibilit\u00E0 di riflettere il 50% del \n[[YELLOW]]danno preso. -Guides.Swords.Section.3=[[DARK_AQUA]]Come funziona Emorragia?\n[[YELLOW]]L'Emorragia provoca danni ai nemici ogni due secondi. \n[[YELLOW]]L'obbiettivo sanguiner\u00E0 fino alla fine dell'effetto, o alla morte, \n[[YELLOW]]quello che viene prima.\n[[YELLOW]]La durata del sanguinamento \u00E8 aumentata dalla tua abilit\u00E0 Spade. +Guides.Swords.Section.0=&3Introduzione a Spade:\n&eQuesta abilità assegna bonus di combattimento a chiunque combatta con una\n&espada.\n\n&3GUADAGNO XP:\n&eGli XP si ottengono in base alla quantità di danoo inflitto ai mob o\n&eagli altri giocatori brandendo una spada. +Guides.Swords.Section.1=&3Come funziona Colpi Seghettati?\n&eColpi Seghettati è una capacità attiva, puoi attivarla facendo\n&eclic-destro con una spada. Questa capacità ti consente di infliggere\n&eun colpo EaA (Effetto ad Area). Questo EaA farà un danno 25%\n&ebonus e infliggerà un effetto di sanguinamento per 5 tick. +Guides.Swords.Section.2=&3Come funziona Contrattacco?\n&eContrattacco è una capacità passiva. Quando blocchi e prendi\n&ecolpi dai mob, hai una possibilità di riflettere il 50% del \n&edanno preso. +Guides.Swords.Section.3=&3Come funziona Emorragia?\n&eL'Emorragia provoca danni ai nemici ogni due secondi. \n&eL'obbiettivo sanguinerà fino alla fine dell'effetto, o alla morte, \n&equello che viene prima.\n&eLa durata del sanguinamento è aumentata dalla tua abilità Spade. ##Taming -Guides.Taming.Section.0=[[DARK_AQUA]]Introduzione alla Domesticazione:\n[[YELLOW]]La Domesticazione d\u00E0 ai giocatori vari bonus di combattimento durante l'utilizzo\n[[YELLOW]]di lupi addomesticati.\n\n[[DARK_AQUA]]GUADAGNO XP:\n[[YELLOW]]Per ottenere XP in questa abilit\u00E0, devi addomesticare lupi/ocelot o\n[[YELLOW]]combattere 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 ti consente di evocare\n[[YELLOW]]un lupo o un ocelot al tuo fianco. Puoi farlo\n[[YELLOW]]accovacciandoti + clic-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 gli animali domestici e e controllare\n[[YELLOW]]le statistiche dei lupi e gli ocelot. Fai clic-sinistro su un lupo o un ocelot per usare\n[[YELLOW]]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 di infliggere un\n[[YELLOW]]effetto di sanguinamento ai bersagli dei tuoi lupi. -Guides.Taming.Section.4=[[DARK_AQUA]]Come funziona Artigli Affilati?\n[[YELLOW]]Artigli Affilati fornisce un danno bonus al danno inflitto\n[[YELLOW]]dai lupi. Il danno bonus dipende dal tuo livello di Domesticazione. -Guides.Taming.Section.5=[[DARK_AQUA]]Come funziona Sicurezza Ambientale?\n[[YELLOW]]Questa capacit\u00E0 passiva consente ai lupi di teletrasportarsi da te quando\n[[YELLOW]]si trovano vicino a dei pericoli, come Cactus/Lava. Inoltre fornisce\n[[YELLOW]]ai lupi immunit\u00E0 al danno da caduta. -Guides.Taming.Section.6=[[DARK_AQUA]]Come funziona Pelliccia Folta?\n[[YELLOW]]Questa capacit\u00E0 passiva riduce il danno e rende i lupi\n[[YELLOW]]resistenti al fuoco. -Guides.Taming.Section.7=[[DARK_AQUA]]Come funziona A Prova d'Urto?\n[[YELLOW]]Questa capacit\u00E0 passiva riduce il danno fatti ai lupi\n[[YELLOW]]dalle esplosioni. -Guides.Taming.Section.8=[[DARK_AQUA]]Come funziona Servizio Fast Food?\n[[YELLOW]]Questa capacit\u00E0 passiva d\u00E0 ai lupi una possibilit\u00E0 di guarire ogni volta\n[[YELLOW]]che effettuano un attacco. +Guides.Taming.Section.0=&3Introduzione alla Domesticazione:\n&eLa Domesticazione dà ai giocatori vari bonus di combattimento durante l'utilizzo\n&edi lupi addomesticati.\n\n&3GUADAGNO XP:\n&ePer ottenere XP in questa abilità, devi addomesticare lupi/ocelot o\n&ecombattere con i tuoi lupi. +Guides.Taming.Section.1=&3Come funziona Richiamo della Natura?\n&eRichiamo della Natura è una capacità attiva che ti consente di evocare\n&eun lupo o un ocelot al tuo fianco. Puoi farlo\n&eaccovacciandoti + clic-sinistro con in mano ossa o pesce. +Guides.Taming.Section.2=&3Come funziona Conoscenza delle Bestie?\n&eConoscenza delle Bestie consente ai giocatori di ispezionare gli animali domestici e e controllare\n&ele statistiche dei lupi e gli ocelot. Fai clic-sinistro su un lupo o un ocelot per usare\n&eConoscenza delle Bestie. +Guides.Taming.Section.3=&3Come funziona Sbranare?\n&eSbranare è una capacità passiva che ha una possibilità di infliggere un\n&eeffetto di sanguinamento ai bersagli dei tuoi lupi. +Guides.Taming.Section.4=&3Come funziona Artigli Affilati?\n&eArtigli Affilati fornisce un danno bonus al danno inflitto\n&edai lupi. Il danno bonus dipende dal tuo livello di Domesticazione. +Guides.Taming.Section.5=&3Come funziona Sicurezza Ambientale?\n&eQuesta capacità passiva consente ai lupi di teletrasportarsi da te quando\n&esi trovano vicino a dei pericoli, come Cactus/Lava. Inoltre fornisce\n&eai lupi immunità al danno da caduta. +Guides.Taming.Section.6=&3Come funziona Pelliccia Folta?\n&eQuesta capacità passiva riduce il danno e rende i lupi\n&eresistenti al fuoco. +Guides.Taming.Section.7=&3Come funziona A Prova d'Urto?\n&eQuesta capacità passiva riduce il danno fatti ai lupi\n&edalle esplosioni. +Guides.Taming.Section.8=&3Come funziona Servizio Fast Food?\n&eQuesta capacità passiva dà ai lupi una possibilità di guarire ogni volta\n&eche effettuano un attacco. ##Unarmed -Guides.Unarmed.Section.0=[[DARK_AQUA]]Introduzione alla Lotta:\n[[YELLOW]]L'abilit\u00E0 di Lotta d\u00E0 ai giocatori vari bonus di combattimento quando usando\n[[YELLOW]]i pugni come arma. \n\n[[DARK_AQUA]]GUADAGNO XP:\n[[YELLOW]]Gli XP ottenuti si basano sulla quantit\u00E0 di danno inflitto a mani nude\n[[YELLOW]]ai mob o agli altri giocatori. -Guides.Unarmed.Section.1=[[DARK_AQUA]]Come funziona Furore?\n[[YELLOW]]Furore \u00E8 una capacit\u00E0 attiva che \u00E8 attivata dal\n[[YELLOW]]clic-destro. In modalit\u00E0 Furore, infliggi il 50% di danni\n[[YELLOW]]in pi\u00F9 e puoi rompere i materiali fragili istantaneamente, come\n[[YELLOW]]Terra ed Erba. -Guides.Unarmed.Section.2=[[DARK_AQUA]]Come funziona Braccio di Ferro?\n[[YELLOW]]Braccio di Ferro aumenta il danno inflitto colpendo mob o\n[[YELLOW]]giocatori con i tuoi pugni. -Guides.Unarmed.Section.3=[[DARK_AQUA]]Come funziona Deviazione Frecce?\n[[YELLOW]]Deviazione Frecce \u00E8 una capacit\u00E0 passiva che ti d\u00E0 una possibilit\u00E0\n[[YELLOW]]di deviare frecce tirate da scheletri o altri giocatori.\n[[YELLOW]]La freccia cadr\u00E0 innocuamente a terra. -Guides.Unarmed.Section.4=[[DARK_AQUA]]Come funziona Presa di Ferro?\n[[YELLOW]]Presa di Ferro \u00E8 una capacit\u00E0 passiva che contrasta il disarmo. All'aumentare\n[[YELLOW]]del tuo livello in Lotta, la possibilit\u00E0 di prevenire un disarmo aumenta. -Guides.Unarmed.Section.5=[[DARK_AQUA]]Come funziona Disarmo?\n[[YELLOW]]Questa capacit\u00E0 passiva consente ai giocatori di disarmare altri giocatori,\n[[YELLOW]]facendo cadere a terra l'oggetto equipaggiato dal bersaglio. +Guides.Unarmed.Section.0=&3Introduzione alla Lotta:\n&eL'abilità di Lotta dà ai giocatori vari bonus di combattimento quando usando\n&ei pugni come arma. \n\n&3GUADAGNO XP:\n&eGli XP ottenuti si basano sulla quantità di danno inflitto a mani nude\n&eai mob o agli altri giocatori. +Guides.Unarmed.Section.1=&3Come funziona Furore?\n&eFurore è una capacità attiva che è attivata dal\n&eclic-destro. In modalità Furore, infliggi il 50% di danni\n&ein più e puoi rompere i materiali fragili istantaneamente, come\n&eTerra ed Erba. +Guides.Unarmed.Section.2=&3Come funziona Braccio di Ferro?\n&eBraccio di Ferro aumenta il danno inflitto colpendo mob o\n&egiocatori con i tuoi pugni. +Guides.Unarmed.Section.3=&3Come funziona Deviazione Frecce?\n&eDeviazione Frecce è una capacità passiva che ti dà una possibilità\n&edi deviare frecce tirate da scheletri o altri giocatori.\n&eLa freccia cadrà innocuamente a terra. +Guides.Unarmed.Section.4=&3Come funziona Presa di Ferro?\n&ePresa di Ferro è una capacità passiva che contrasta il disarmo. All'aumentare\n&edel tuo livello in Lotta, la possibilità di prevenire un disarmo aumenta. +Guides.Unarmed.Section.5=&3Come funziona Disarmo?\n&eQuesta capacità passiva consente ai giocatori di disarmare altri giocatori,\n&efacendo cadere a terra l'oggetto equipaggiato dal bersaglio. ##Woodcutting -Guides.Woodcutting.Section.0=[[DARK_AQUA]]Introduzione a Taglialegna:\n[[YELLOW]]Taglialegna consiste tutto nell'abbattere alberi.\n\n[[DARK_AQUA]]GUADAGNO XP:\n[[YELLOW]]Gli XP si ottengono ogni volta che rompi i tronchi d'albero. -Guides.Woodcutting.Section.1=[[DARK_AQUA]]Come funziona Abbattitore d'Alberi?\n[[YELLOW]]Abbattitore d'Alberi \u00E8 una capacit\u00E0 attiva, puoi fare clic-destro\n[[YELLOW]]con un'ascia in mano per attivare Abbattitore d'Alberi. Questo\n[[YELLOW]]far\u00E0 rompere l'intero albero istantaneamente, droppando tutti\n[[YELLOW]]i suoi tronchi insieme. -Guides.Woodcutting.Section.2=[[DARK_AQUA]]Come funziona Soffia Foglie?\n[[YELLOW]]Soffia Foglie \u00E8 una capacit\u00E0 passiva che fa\n[[YELLOW]]cadere le foglie istantaneamente quando colpite da un'ascia. Di default,\n[[YELLOW]]questa capacit\u00E0 si sblocca al livello 100. -Guides.Woodcutting.Section.3=[[DARK_AQUA]]Come funziona Doppi Drop?\n[[YELLOW]]Questa capacit\u00E0 passiva ti d\u00E0 una possibilit\u00E0 di ottenere un blocco\n[[YELLOW]]extra per ogni tronco che tagli. +Guides.Woodcutting.Section.0=&3Introduzione a Taglialegna:\n&eTaglialegna consiste tutto nell'abbattere alberi.\n\n&3GUADAGNO XP:\n&eGli XP si ottengono ogni volta che rompi i tronchi d'albero. +Guides.Woodcutting.Section.1=&3Come funziona Abbattitore d'Alberi?\n&eAbbattitore d'Alberi è una capacità attiva, puoi fare clic-destro\n&econ un'ascia in mano per attivare Abbattitore d'Alberi. Questo\n&efarà rompere l'intero albero istantaneamente, droppando tutti\n&ei suoi tronchi insieme. +Guides.Woodcutting.Section.2=&3Come funziona Soffia Foglie?\n&eSoffia Foglie è una capacità passiva che fa\n&ecadere le foglie istantaneamente quando colpite da un'ascia. Di default,\n&equesta capacità si sblocca al livello 100. +Guides.Woodcutting.Section.3=&3Come funziona Doppi Drop?\n&eQuesta capacità passiva ti dà una possibilità di ottenere un blocco\n&eextra per ogni tronco che tagli. #INSPECT -Inspect.Offline= [[RED]]Non hai il permesso per ispezionare i giocatori offline! -Inspect.OfflineStats=Statistiche mcMMO per il Giocatore Offline [[YELLOW]]{0} -Inspect.Stats=[[GREEN]]Statistiche mcMMO per [[YELLOW]]{0} +Inspect.Offline= &cNon hai il permesso per ispezionare i giocatori offline! +Inspect.OfflineStats=Statistiche mcMMO per il Giocatore Offline &e{0} +Inspect.Stats=&aStatistiche mcMMO per &e{0} Inspect.TooFar=Sei troppo lontano per ispezionare quel giocatore! #ITEMS -Item.ChimaeraWing.Fail=[[RED]]**ALA DI CHIMERA FALLITA!** +Item.ChimaeraWing.Fail=&c**ALA DI CHIMERA FALLITA!** Item.ChimaeraWing.Pass=**ALA DI CHIMERA** Item.ChimaeraWing.Name=Ala di Chimera -Item.ChimaeraWing.Lore=[[GRAY]]Ti teletrasporta al tuo letto. -Item.ChimaeraWing.NotEnough=Hai bisogno di altri [[YELLOW]]{0} [[GOLD]]{1}[[RED]]! -Item.NotEnough=Hai bisogno di altri [[YELLOW]]{0} [[GOLD]]{1}[[RED]]! -Item.Generic.Wait=Devi aspettare prima di poterlo utilizzare di nuovo! [[YELLOW]]({0}s) -Item.Injured.Wait=Sei stato ferito di recente e devi aspettare per usarlo. [[YELLOW]]({0}s) +Item.ChimaeraWing.Lore=&7Ti teletrasporta al tuo letto. +Item.ChimaeraWing.NotEnough=Hai bisogno di altri &e{0} &6{1}&c! +Item.NotEnough=Hai bisogno di altri &e{0} &6{1}&c! +Item.Generic.Wait=Devi aspettare prima di poterlo utilizzare di nuovo! &e({0}s) +Item.Injured.Wait=Sei stato ferito di recente e devi aspettare per usarlo. &e({0}s) Item.FluxPickaxe.Name=Piccone a Fusione -Item.FluxPickaxe.Lore.1=[[GRAY]]C'\u00E8 la possibilit\u00E0 che fonda istantaneamente i minerali estratti. -Item.FluxPickaxe.Lore.2=[[GRAY]]Richiede il livello di Fusione {0}+ +Item.FluxPickaxe.Lore.1=&7C'è la possibilità che fonda istantaneamente i minerali estratti. +Item.FluxPickaxe.Lore.2=&7Richiede il livello di Fusione {0}+ #TELEPORTATION -Teleport.Commencing=[[GRAY]]Il teletrasporto inizier\u00E0 tra [[GOLD]]({0}) [[GRAY]]secondi, non muoverti... -Teleport.Cancelled=[[DARK_RED]]Teletrasporto annullato! +Teleport.Commencing=&7Il teletrasporto inizierà tra &6({0}) &7secondi, non muoverti... +Teleport.Cancelled=&4Teletrasporto annullato! #SKILLS -Skills.Child=[[GOLD]](ABILIT\u00E0 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.NeedMore.Extra=[[DARK_RED]]Hai bisogno di altri [[GRAY]]{0}{1} +Skills.Child=&6(ABILITà FIGLIA) +Skills.Disarmed=&4Sei stato disarmato! +Skills.Header=-----[] &a{0}&c []----- +Skills.NeedMore=&4Hai bisogno di più &7{0} +Skills.NeedMore.Extra=&4Hai bisogno di altri &7{0}{1} Skills.Parents= GENITORI -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 di nuovo quella capacit\u00E0. [[YELLOW]]({0}s) -Skills.Cancelled=[[GOLD]]{0} [[RED]]annullato! -Skills.ConfirmOrCancel=[[GREEN]]Fai nuovamente click-destro per confermare [[GOLD]]{0}[[GREEN]]. Click-sinistro per annullare. -Skills.AbilityGateRequirementFail=[[GRAY]]Ti servono altri [[YELLOW]]{0}[[GRAY]] livelli di [[DARK_AQUA]]{1}[[GRAY]] per usare questa super capacit\u00E0. +Skills.Stats={0}&a{1}&3 XP(&7{2}&3/&7{3}&3) +Skills.ChildStats={0}&a{1} +Skills.TooTired=Sei troppo stanco per usare di nuovo quella capacità. &e({0}s) +Skills.Cancelled=&6{0} &cannullato! +Skills.ConfirmOrCancel=&aFai nuovamente click-destro per confermare &6{0}&a. Click-sinistro per annullare. +Skills.AbilityGateRequirementFail=&7Ti servono altri &e{0}&7 livelli di &3{1}&7 per usare questa super capacità. #STATISTICS -Stats.Header.Combat=[[GOLD]]-=ABILIT\u00E0 DI COMBATTIMENTO=- -Stats.Header.Gathering=[[GOLD]]-=ABILIT\u00E0 DI RACCOLTA=- -Stats.Header.Misc=[[GOLD]]-=ABILIT\u00E0 VARIE=- -Stats.Own.Stats=[[GREEN]][mcMMO] Statistiche +Stats.Header.Combat=&6-=ABILITà DI COMBATTIMENTO=- +Stats.Header.Gathering=&6-=ABILITà DI RACCOLTA=- +Stats.Header.Misc=&6-=ABILITà VARIE=- +Stats.Own.Stats=&a[mcMMO] Statistiche #PERKS Perks.XP.Name=Esperienza -Perks.XP.Desc=Ricevi XP potenziati in determinate abilit\u00E0. +Perks.XP.Desc=Ricevi XP potenziati in determinate abilità. Perks.Lucky.Name=Fortuna -Perks.Lucky.Desc=Fornisce a {0} abilit\u00E0 e capacit\u00E0 una probabilit\u00E0 del 33,3% in pi\u00F9 di attivarsi. -Perks.Lucky.Desc.Login=Fornisce ad alcune abilit\u00E0 e capacit\u00E0 una probabilit\u00E0 del 33,3% in pi\u00F9 di attivarsi. -Perks.Lucky.Bonus=[[GOLD]] ({0} con il Vantaggio Fortuna) +Perks.Lucky.Desc=Fornisce a {0} abilità e capacità una probabilità del 33,3% in più di attivarsi. +Perks.Lucky.Desc.Login=Fornisce ad alcune abilità e capacità una probabilità del 33,3% in più di attivarsi. +Perks.Lucky.Bonus=&6 ({0} con il Vantaggio Fortuna) Perks.Cooldowns.Name=Recupero Rapido Perks.Cooldowns.Desc=Riduce il tempo di recupero di {0}. Perks.ActivationTime.Name=Resistenza -Perks.ActivationTime.Desc=Aumenta il tempo di attivazione delle capacit\u00E0 di {0} secondi. -Perks.ActivationTime.Bonus=[[GOLD]] ({0}s con il Vantaggio Resistenza) +Perks.ActivationTime.Desc=Aumenta il tempo di attivazione delle capacità di {0} secondi. +Perks.ActivationTime.Bonus=&6 ({0}s con il Vantaggio Resistenza) #HARDCORE -Hardcore.Mode.Disabled=[[GOLD]][mcMMO] Modalit\u00E0 hardcore {0} disabilitata per {1}. -Hardcore.Mode.Enabled=[[GOLD]][mcMMO] Modalit\u00E0 hardcore {0} abilitata per {1}. -Hardcore.DeathStatLoss.Name=Perdita di Abilit\u00E0 alla Morte -Hardcore.DeathStatLoss.PlayerDeath=[[GOLD]][mcMMO] [[DARK_RED]]Hai perso [[BLUE]]{0}[[DARK_RED]] livelli a causa della morte. -Hardcore.DeathStatLoss.PercentageChanged=[[GOLD]][mcMMO] La percentuale di Vampirismo \u00E8 stata modificata a {0}. +Hardcore.Mode.Disabled=&6[mcMMO] Modalità hardcore {0} disabilitata per {1}. +Hardcore.Mode.Enabled=&6[mcMMO] Modalità hardcore {0} abilitata per {1}. +Hardcore.DeathStatLoss.Name=Perdita di Abilità alla Morte +Hardcore.DeathStatLoss.PlayerDeath=&6[mcMMO] &4Hai perso &9{0}&4 livelli a causa della morte. +Hardcore.DeathStatLoss.PercentageChanged=&6[mcMMO] La percentuale di Vampirismo è stata modificata a {0}. Hardcore.Vampirism.Name=Vampirismo -Hardcore.Vampirism.Killer.Failure=[[GOLD]][mcMMO] [[YELLOW]]{0}[[GRAY]] era troppo inesperto per fornirti 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 la conoscenza! -Hardcore.Vampirism.Victim.Success=[[GOLD]][mcMMO] [[YELLOW]]{0}[[DARK_RED]] ha rubato [[BLUE]]{1}[[DARK_RED]] livelli da te! -Hardcore.Vampirism.PercentageChanged=[[GOLD]][mcMMO] La percentuale di Vampirismo \u00E8 stata modificata a {0}. +Hardcore.Vampirism.Killer.Failure=&6[mcMMO] &e{0}&7 era troppo inesperto per fornirti alcuna conoscenza. +Hardcore.Vampirism.Killer.Success=&6[mcMMO] &3Hai rubato &9{0}&3 livelli da &e{1}. +Hardcore.Vampirism.Victim.Failure=&6[mcMMO] &e{0}&7 non è riuscito a rubarti la conoscenza! +Hardcore.Vampirism.Victim.Success=&6[mcMMO] &e{0}&4 ha rubato &9{1}&4 livelli da te! +Hardcore.Vampirism.PercentageChanged=&6[mcMMO] La percentuale di Vampirismo è stata modificata 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]]Perdita di Abilit\u00E0 alla Morte: [[DARK_RED]]{0}% -MOTD.Hardcore.Vampirism.Stats=[[GOLD]][mcMMO] [[DARK_AQUA]]Percentuale di Vampirismo: [[DARK_RED]]{0}% -MOTD.PerksPrefix=[[GOLD]][Vantaggi mcMMO] -MOTD.Version=[[GOLD]][mcMMO] Versione [[DARK_AQUA]]{0} -MOTD.Website=[[GOLD]][mcMMO] [[GREEN]]{0}[[YELLOW]] - Sito Web di mcMMO +MOTD.Donate=&3Info Donazioni: +MOTD.Hardcore.Enabled=&6[mcMMO] &3Modalità hardcore abilitata: &4{0} +MOTD.Hardcore.DeathStatLoss.Stats=&6[mcMMO] &3Perdita di Abilità alla Morte: &4{0}% +MOTD.Hardcore.Vampirism.Stats=&6[mcMMO] &3Percentuale di Vampirismo: &4{0}% +MOTD.PerksPrefix=&6[Vantaggi mcMMO] +MOTD.Version=&6[mcMMO] Versione &3{0} +MOTD.Website=&6[mcMMO] &a{0}&e - Sito Web di mcMMO #SMELTING Smelting.SubSkill.UnderstandingTheArt.Name=Capire l'Arte -Smelting.SubSkill.UnderstandingTheArt.Description=Forse stai trascorrendo un po' troppo tempo a fondere nelle caverne.\nPotenzia varie propriet\u00E0 della Fusione. -Smelting.SubSkill.UnderstandingTheArt.Stat=Moltiplicatore XP Vanilla: [[YELLOW]]{0}x -Smelting.Ability.Locked.0=BLOCCATO FINO AD ABILIT\u00E0 {0}+ (POTENZIAMENTO XP VANILLA) -Smelting.Ability.Locked.1=BLOCCATO FINO AD ABILIT\u00E0 {0}+ (FUSIONE ISTANTANEA) +Smelting.SubSkill.UnderstandingTheArt.Description=Forse stai trascorrendo un po' troppo tempo a fondere nelle caverne.\nPotenzia varie proprietà della Fusione. +Smelting.SubSkill.UnderstandingTheArt.Stat=Moltiplicatore XP Vanilla: &e{0}x +Smelting.Ability.Locked.0=BLOCCATO FINO AD ABILITà {0}+ (POTENZIAMENTO XP VANILLA) +Smelting.Ability.Locked.1=BLOCCATO FINO AD ABILITà {0}+ (FUSIONE ISTANTANEA) Smelting.SubSkill.FuelEfficiency.Name=Efficienza Combustibile Smelting.SubSkill.FuelEfficiency.Description=Aumenta il tempo di combustione del carburante usato nelle fornaci -Smelting.SubSkill.FuelEfficiency.Stat=Moltiplicatore Efficienza Combustibile: [[YELLOW]]{0}x +Smelting.SubSkill.FuelEfficiency.Stat=Moltiplicatore Efficienza Combustibile: &e{0}x Smelting.SubSkill.SecondSmelt.Name=Seconda Fusione Smelting.SubSkill.SecondSmelt.Description=Raddoppia le risorse ottenute dalla fusione -Smelting.SubSkill.SecondSmelt.Stat=Possibilit\u00E0 Seconda Fusione +Smelting.SubSkill.SecondSmelt.Stat=Possibilità Seconda Fusione Smelting.Effect.4=Potenziamento XP Vanilla Smelting.Effect.5=Aumenta gli XP vanilla ottenuti con la fusione Smelting.SubSkill.FluxMining.Name=Fusione Istantanea -Smelting.SubSkill.FluxMining.Description=Possibilit\u00E0 di fusione istantanea dei minerali durante l'estrazione -Smelting.SubSkill.FluxMining.Stat=Possibilit\u00E0 Fusione Istantanea +Smelting.SubSkill.FluxMining.Description=Possibilità di fusione istantanea dei minerali durante l'estrazione +Smelting.SubSkill.FluxMining.Stat=Possibilità Fusione Istantanea Smelting.Listener=Fusione: Smelting.SkillName=FUSIONE @@ -1072,15 +1070,15 @@ Smelting.SkillName=FUSIONE Commands.Description.addlevels=Aggiungi livelli di mcMMO a un utente Commands.Description.adminchat=Attiva / disattiva la chat admin di mcMMO o invia messaggi in chat admin Commands.Description.addxp=Aggiungi XP di mcMMO a un utente -Commands.Description.hardcore=Modifica la percentuale di hardcore mcMMO o attiva/disattiva la modalit\u00E0 hardcore +Commands.Description.hardcore=Modifica la percentuale di hardcore mcMMO o attiva/disattiva la modalità hardcore Commands.Description.inspect=Visualizza informazioni dettagliate di mcMMO su un altro giocatore -Commands.Description.mcability=Abilita/disabilita l'attivazione delle capacit\u00E0 di mcMMO con il click-destro -Commands.Description.mccooldown=Visualizza tutto sulle ricariche delle capacit\u00E0 di mcMMO +Commands.Description.mcability=Abilita/disabilita l'attivazione delle capacità di mcMMO con il click-destro +Commands.Description.mccooldown=Visualizza tutto sulle ricariche delle capacità di mcMMO Commands.Description.mcchatspy=Attiva o disattiva lo spionaggio della chat party -Commands.Description.mcgod=Attiva/disattiva la modalit\u00E0 dio di mcMMO +Commands.Description.mcgod=Attiva/disattiva la modalità dio di mcMMO Commands.Description.mchud=Cambia lo stile del tuo HUD di mcMMO Commands.Description.mcmmo=Mostra una breve descrizione di mcMMO -Commands.Description.mcnotify=Attiva/disattiva la visualizzazione in chat delle notifiche delle capacit\u00E0 di mcMMO +Commands.Description.mcnotify=Attiva/disattiva la visualizzazione in chat delle notifiche delle capacità di mcMMO Commands.Description.mcpurge=Elimina gli utenti senza livelli mcMMO e quelli che non si sono connessi negli ultimi {0} mesi. Commands.Description.mcrank=Mostra la classifica mcMMO di un giocatore Commands.Description.mcrefresh=Rigenera tutte le ricariche di mcMMO @@ -1089,53 +1087,56 @@ Commands.Description.mcscoreboard=Gestisci la tua Scoreboard mcMMO Commands.Description.mcstats=Mostra i tuoi livelli e XP mcMMO Commands.Description.mctop=Mostra le classifiche di mcMMO Commands.Description.mmoedit=Modifica i livelli di mcMMO per un utente -Commands.Description.mmodebug=Attiva/disattiva una modalit\u00E0 di debug che mostra informazioni utili quando colpisci i blocchi +Commands.Description.mmodebug=Attiva/disattiva una modalità di debug che mostra informazioni utili quando colpisci i blocchi Commands.Description.mmoupdate=Migra il database mcMMO da uno vecchio a quello attuale Commands.Description.mcconvert=Converte tipi di database o tipi di formule di esperienza Commands.Description.mmoshowdb=Mostra il nome del tipo di database attuale (per uso futuro con /mmoupdate) Commands.Description.party=Controlla le varie impostazioni dei party di mcMMO Commands.Description.partychat=Attiva/disattiva la chat party di mcMMO o invia messaggi in chat party Commands.Description.ptp=Teletrasportati da un membro del party mcMMO -Commands.Description.Skill=Mostra informazioni dettagliate sulle abilit\u00E0 mcMMO per {0} +Commands.Description.Skill=Mostra informazioni dettagliate sulle abilità mcMMO per {0} Commands.Description.skillreset=Azzera i livelli mcMMO di un utente -Commands.Description.vampirism=Modifica la percentuale di vampirismo mcMMO o attiva/disattiva la modalit\u00E0 vampirismo -Commands.Description.xplock=Blocca la barra XP mcMMO su un'abilit\u00E0 mcMMO specifica +Commands.Description.vampirism=Modifica la percentuale di vampirismo mcMMO o attiva/disattiva la modalità vampirismo +Commands.Description.xplock=Blocca la barra XP mcMMO su un'abilità mcMMO specifica Commands.Description.xprate=Modifica il tasso XP di mcMMO o avvia un evento XP mcMMO #UPDATE CHECKER UpdateChecker.Outdated=Stai utilizzando una versione non aggiornata di mcMMO! -UpdateChecker.NewAvailable=C'\u00E8 una nuova versione disponibile su Spigot. +UpdateChecker.NewAvailable=C'è una nuova versione disponibile su Spigot. #SCOREBOARD HEADERS -Scoreboard.Header.PlayerStats=[[YELLOW]]Statistiche mcMMO -Scoreboard.Header.PlayerCooldowns=[[YELLOW]]Ricariche mcMMO -Scoreboard.Header.PlayerRank=[[YELLOW]]Classifiche mcMMO -Scoreboard.Header.PlayerInspect=[[YELLOW]]Statistiche mcMMO: {0} -Scoreboard.Header.PowerLevel=[[RED]]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=[[YELLOW]]XP Rimanenti -Scoreboard.Misc.Cooldown=[[LIGHT_PURPLE]]Ricarica -Scoreboard.Misc.Overall=[[GOLD]]Complessivo -Scoreboard.Misc.Ability=Capacit\u00E0 +Scoreboard.Header.PlayerStats=&eStatistiche mcMMO +Scoreboard.Header.PlayerCooldowns=&eRicariche mcMMO +Scoreboard.Header.PlayerRank=&eClassifiche mcMMO +Scoreboard.Header.PlayerInspect=&eStatistiche mcMMO: {0} +Scoreboard.Header.PowerLevel=&cLivello di Potere +Scoreboard.Misc.PowerLevel=&6Livello di Potere +Scoreboard.Misc.Level=&3Livello +Scoreboard.Misc.CurrentXP=&aXP Attuali +Scoreboard.Misc.RemainingXP=&eXP Rimanenti +Scoreboard.Misc.Cooldown=&dRicarica +Scoreboard.Misc.Overall=&6Complessivo +Scoreboard.Misc.Ability=Capacità #DATABASE RECOVERY -Profile.PendingLoad=[[RED]]I tuoi dati di mcMMO non sono stati ancora caricati. -Profile.Loading.Success=[[GREEN]]Il tuo profilo mcMMO \u00E8 stato caricato. -Profile.Loading.FailurePlayer=[[RED]]mcMMO ha dei problemi nel caricare i tuoi dati, abbiamo tentato di caricarli [[GREEN]]{0}[[RED]] volte.[[RED]] Potresti voler contattare gli amministratori del server per questo problema. mcMMO tenter\u00E0 di caricare i tuoi dati fino a che non ti disconnetterai, non guadagnerai XP n\u00E9 potrai usare abilit\u00E0 finch\u00E9 i dati non verranno caricati. -Profile.Loading.FailureNotice=[[DARK_RED]][A][[RED]] mcMMO non \u00E8 stato in grado di caricare i dati per [[YELLOW]]{0}[[RED]]. [[LIGHT_PURPLE]]Controlla la configurazione del database. Tentativi fatti finora {1}. +Profile.PendingLoad=&cI tuoi dati di mcMMO non sono stati ancora caricati. +Profile.Loading.Success=&aIl tuo profilo mcMMO è stato caricato. +Profile.Loading.FailurePlayer=&cmcMMO ha dei problemi nel caricare i tuoi dati, abbiamo tentato di caricarli &a{0}&c volte.&c Potresti voler contattare gli amministratori del server per questo problema. mcMMO tenterà di caricare i tuoi dati fino a che non ti disconnetterai, non guadagnerai XP né potrai usare abilità finché i dati non verranno caricati. +Profile.Loading.FailureNotice=&4[A]&c mcMMO non è stato in grado di caricare i dati per &e{0}&c. &dControlla la configurazione del database. Tentativi fatti finora {1}. #Holiday -Holiday.AprilFools.Levelup=[[GOLD]]{0} \u00E8 ora al livello [[GREEN]]{1}[[GOLD]]! -Holiday.Anniversary=[[BLUE]]Buon Capodanno {0}!\n[[BLUE]]In onore di tutto il lavoro di nossr50 e di tutti gli sviluppatori, ecco uno spettacolo pirotecnico! +Holiday.AprilFools.Levelup=&6{0} è ora al livello &a{1}&6! +Holiday.Anniversary=&9Buon Capodanno {0}!\n&9In onore di tutto il lavoro di nossr50 e di tutti gli sviluppatori, ecco uno spettacolo pirotecnico! #Reminder Messages -Reminder.Squelched=[[GRAY]]Promemoria: Al momento non ricevi notifiche da mcMMO, per abilitare le notifiche esegui nuovamente il comando /mcnotify. Questo \u00E8 un promemoria automatico per ogni ora. +Reminder.Squelched=&7Promemoria: Al momento non ricevi notifiche da mcMMO, per abilitare le notifiche esegui nuovamente il comando /mcnotify. Questo è un promemoria automatico per ogni ora. #Locale -Locale.Reloaded=[[GREEN]]Traduzioni ricaricate! +Locale.Reloaded=&aTraduzioni ricaricate! #Player Leveling Stuff -LevelCap.PowerLevel=[[GOLD]]([[GREEN]]mcMMO[[GOLD]]) [[YELLOW]]Hai raggiunto il livello massimo di potenza di [[RED]]{0}[[YELLOW]]. Da questo punto in poi cesserai di aumentare di livello nelle tue abilit\u00E0. -LevelCap.Skill=[[GOLD]]([[GREEN]]mcMMO[[GOLD]]) [[YELLOW]]Hai raggiunto il livello massimo di [[RED]]{0}[[YELLOW]] per [[GOLD]]{1}[[YELLOW]]. Da questo punto in poi cesserai di salire di livello in questa abilit\u00E0. +LevelCap.PowerLevel=&6(&amcMMO&6) &eHai raggiunto il livello massimo di potenza di &c{0}&e. Da questo punto in poi cesserai di aumentare di livello nelle tue abilità. +LevelCap.Skill=&6(&amcMMO&6) &eHai raggiunto il livello massimo di &c{0}&e per &6{1}&e. Da questo punto in poi cesserai di salire di livello in questa abilità. +Commands.XPBar.Usage=Proper usage is /mmoxpbar +Commands.Description.mmoxpbar=Player settings for mcMMO XP bars +Commands.Description.mmocompat=Information about mcMMO and whether or not its in compatibility mode or fully functional. diff --git a/src/main/resources/locale/locale_ja_JP.properties b/src/main/resources/locale/locale_ja_JP.properties index 87771d5d3..9f123a5a1 100644 --- a/src/main/resources/locale/locale_ja_JP.properties +++ b/src/main/resources/locale/locale_ja_JP.properties @@ -1,1127 +1,1177 @@ -JSON.Rank=\u30e9\u30f3\u30af -JSON.DescriptionHeader=\u8aac\u660e -JSON.JWrapper.Header=\u8a73\u7d30 -JSON.Type.Passive=\u30d1\u30c3\u30b7\u30d6 -JSON.Type.Active=\u30a2\u30af\u30c6\u30a3\u30d6 -JSON.Type.SuperAbility=\u30b9\u30fc\u30d1\u30fc\u30a2\u30d3\u30ea\u30c6\u30a3 -JSON.Locked=-=[\u30ed\u30c3\u30af]=- -JSON.LevelRequirement=\u5fc5\u8981\u30ec\u30d9\u30eb -JSON.JWrapper.Target.Type=\u30bf\u30fc\u30b2\u30c3\u30c8\u30bf\u30a4\u30d7: -JSON.JWrapper.Target.Block=\u30d6\u30ed\u30c3\u30af -JSON.JWrapper.Target.Player=\u30d7\u30ec\u30a4\u30e4\u30fc -JSON.JWrapper.Perks.Header=[[GOLD]]\u30e9\u30c3\u30ad\u30fc\u30d1\u30fc\u30af -JSON.JWrapper.Perks.Lucky={0}% \u826f\u3044\u30aa\u30c3\u30ba -JSON.Hover.Tips=Tips -JSON.Acrobatics=\u30a2\u30af\u30ed\u30d0\u30c6\u30a3\u30c3\u30af -JSON.Alchemy=\u932c\u91d1\u8853 -JSON.Archery=\u5f13 -JSON.Axes=\u65a7 -JSON.Excavation=\u6398\u524a -JSON.Fishing=\u91e3\u308a -JSON.Herbalism=\u8fb2\u696d -JSON.Mining=\u63a1\u6398 -JSON.Repair=\u4fee\u7406 -JSON.Salvage=\u30b5\u30eb\u30d9\u30fc\u30b8 -JSON.Swords=\u5263 -JSON.Taming=\u8abf\u6559 -JSON.Unarmed=\u7d20\u624b -JSON.Woodcutting=\u6728\u3053\u308a -JSON.URL.Website=mcMMO\u516c\u5f0f\u30a6\u30a7\u30d6\u30b5\u30a4\u30c8 -JSON.URL.Discord=mcMMO\u516c\u5f0fDiscord\u30b5\u30fc\u30d0\u30fc -JSON.URL.Patreon=nossr50\u3068\u5f7c\u306emcMMO\u3078\u306e\u50cd\u304d\u3092Patreon\u3067\u652f\u63f4\u3059\u308b\uff01 -JSON.URL.Spigot=mcMMO\u306e\u516c\u5f0fSpigot\u30ea\u30bd\u30fc\u30b9\u30da\u30fc\u30b8 -JSON.URL.Translation=mcMMO\u3092\u4ed6\u306e\u8a00\u8a9e\u306b\u7ffb\u8a33\u3059\u308b\uff01 -JSON.URL.Wiki=mcMMO\u516c\u5f0fwiki -JSON.SkillUnlockMessage=[[GOLD]][ mcMMO[[YELLOW]] @[[DARK_AQUA]]{0} [[GOLD]]\u30e9\u30f3\u30af [[DARK_AQUA]]{1}[[GOLD]] \u30a2\u30f3\u30ed\u30c3\u30af\uff01 ] -JSON.Hover.Rank=&9&l\u30e9\u30f3\u30af&r&7-&r &e{0} -JSON.Hover.NextRank=&7&o{0}\u30ec\u30d9\u30eb\u3067\u306e\u6b21\u306e\u30a2\u30c3\u30d7\u30b0\u30ec\u30fc\u30c9 -JSON.Hover.Mystery=[[GRAY]]??? -JSON.Hover.Mystery2=[[YELLOW]][[[DARK_GRAY]]{0}[[YELLOW]]][[DARK_GRAY]]???&r -JSON.Hover.SkillName=[[DARK_AQUA]]{0}&r -JSON.Hover.SuperAbility=[[DARK_PURPLE]]{0}&r -JSON.Hover.MaxRankSkillName=[[GOLD]]{0}&r -JSON.Hover.AtSymbolSkills=[[YELLOW]]@ -JSON.Hover.AtSymbolURL=[[YELLOW]]@ +#I'm going to try to normalize our locale file, forgive the mess for now. +#DO NOT USE COLOR CODES IN THE JSON KEYS +#COLORS ARE DEFINED IN advanced.yml IF YOU WISH TO CHANGE THEM +JSON.Rank=ランク +JSON.DescriptionHeader=説明 +JSON.JWrapper.Header=詳細 +JSON.Type.Passive=パッシブ +JSON.Type.Active=アクティブ +JSON.Type.SuperAbility=スーパーアビリティ +JSON.Locked=-=[ロック]=- +JSON.LevelRequirement=必要レベル +JSON.JWrapper.Target.Type=ターゲットタイプ: +JSON.JWrapper.Target.Block=ブロック +JSON.JWrapper.Target.Player=プレイヤー +JSON.JWrapper.Perks.Header=&6ラッキーパーク +JSON.JWrapper.Perks.Lucky={0}% 良いオッズ +JSON.Hover.Tips=Tips +JSON.Acrobatics=アクロバティック +JSON.Alchemy=錬金術 +JSON.Archery=弓 +JSON.Axes=斧 +JSON.Excavation=掘削 +JSON.Fishing=釣り +JSON.Herbalism=農業 +JSON.Mining=採掘 +JSON.Repair=修理 +JSON.Salvage=サルベージ +JSON.Swords=剣 +JSON.Taming=調教 +JSON.Unarmed=素手 +JSON.Woodcutting=木こり +JSON.URL.Website=mcMMO公式ウェブサイト +JSON.URL.Discord=mcMMO公式Discordサーバー +JSON.URL.Patreon=nossr50と彼のmcMMOへの働きをPatreonで支援する! +JSON.URL.Spigot=mcMMOの公式Spigotリソースページ +JSON.URL.Translation=mcMMOを他の言語に翻訳する! +JSON.URL.Wiki=mcMMO公式wiki +JSON.SkillUnlockMessage=&6[ mcMMO&e @&3{0} &6ランク &3{1}&6 アンロック! ] +JSON.Hover.Rank=&9&lランク&r&7-&r &e{0} +JSON.Hover.NextRank=&7&o{0}レベルでの次のアップグレード +# for JSON.Hover.Mystery you can add {0} to insert the level required into the name, I don't like how that looks so I'm not doing that atm +JSON.Hover.Mystery=&7??? +JSON.Hover.Mystery2=&e[&8{0}&e]&8???&r +JSON.Hover.SkillName=&3{0}&r +JSON.Hover.SuperAbility=&5{0}&r +JSON.Hover.MaxRankSkillName=&6{0}&r +JSON.Hover.AtSymbolSkills=&e@ +JSON.Hover.AtSymbolURL=&e@ + +#This is the message sent to players when an ability is activated JSON.Notification.SuperAbility={0} -JSON.Acrobatics.Roll.Interaction.Activated=\u30c6\u30b9\u30c8 [[RED]]\u53d7\u3051\u8eab\u30c6\u30b9\u30c8 -JSON.Acrobatics.SubSkill.Roll.Details.Tips=\u843d\u4e0b\u4e2d\u306b\u30b9\u30cb\u30fc\u30af\u3059\u308b\u3068\u3001\u6700\u59272\u500d\u306e\u30c0\u30e1\u30fc\u30b8\u3092\u9632\u3050\u3053\u3068\u304c\u3067\u304d\u307e\u3059\uff01 -Anvil.SingleItemStack=[[RED]]\u30b9\u30bf\u30c3\u30af\u3055\u308c\u305f\u30a2\u30a4\u30c6\u30e0\u306f\u30b5\u30eb\u30d9\u30fc\u30b8\u307e\u305f\u306f\u4fee\u5fa9\u3059\u308b\u3053\u3068\u304c\u3067\u304d\u307e\u305b\u3093\u3002\u6700\u521d\u306b\u30b9\u30bf\u30c3\u30af\u3092\u5206\u5272\u3057\u3066\u304f\u3060\u3055\u3044\u3002 +#These are the JSON Strings used for SubSkills +JSON.Acrobatics.Roll.Interaction.Activated=テスト &c受け身テスト +JSON.Acrobatics.SubSkill.Roll.Details.Tips=落下中にスニークすると、最大2倍のダメージを防ぐことができます! +Anvil.SingleItemStack=&cスタックされたアイテムはサルベージまたは修復することができません。最初にスタックを分割してください。 -mcMMO.Template.Prefix=[[GOLD]]([[GREEN]]mcMMO[[GOLD]]) [[GRAY]]{0} +#DO NOT USE COLOR CODES IN THE JSON KEYS +#COLORS ARE DEFINED IN advanced.yml IF YOU WISH TO CHANGE THEM -### BEGIN STYLING ### -Ability.Generic.Refresh=[[GREEN]]**\u30a2\u30d3\u30ea\u30c6\u30a3 \u30ea\u30d5\u30ec\u30c3\u30b7\u30e5\uff01** -Ability.Generic.Template.Lock=[[GRAY]]{0} +mcMMO.Template.Prefix=&6(&amcMMO&6) &7{0} + +# BEGIN STYLING +Ability.Generic.Refresh=&a**アビリティ リフレッシュ!** +Ability.Generic.Template.Lock=&7{0} # Skill Command Styling -Ability.Generic.Template=[[DARK_AQUA]]{0}: [[GREEN]]{1} -Ability.Generic.Template.Custom=[[DARK_AQUA]]{0} -Skills.Overhaul.Header=[[RED]][]=====[][[GREEN]] {0} [[RED]][]=====[] -Effects.Effects=\u30a8\u30d5\u30a7\u30af\u30c8 -Effects.SubSkills.Overhaul=\u30b5\u30d6\u30b9\u30ad\u30eb -Effects.Child.Overhaul=[[DARK_AQUA]]Child Lv.[[YELLOW]] {0}[[DARK_AQUA]]: {1} -Effects.Child.ParentList=[[GREEN]]{0}[[GOLD]]([[DARK_AQUA]]Lv.[[YELLOW]]{1}[[GOLD]]) -Effects.Level.Overhaul=[[GOLD]]LVL: [[YELLOW]]{0} [[DARK_AQUA]]XP[[YELLOW]]([[GOLD]]{1}[[YELLOW]]/[[GOLD]]{2}[[YELLOW]]) -Effects.Parent=[[GOLD]]{0} - -Effects.Template=[[DARK_AQUA]]{0}: [[GREEN]]{1} -Commands.Stats.Self.Overhaul=\u7d71\u8a08 -Commands.XPGain.Overhaul=[[GOLD]]XP\u7372\u5f97: [[DARK_AQUA]]{0} -MOTD.Version.Overhaul=[[GOLD]][mcMMO] [[DARK_AQUA]]Overhaul Era[[GOLD]] - [[DARK_AQUA]]{0} -Overhaul.mcMMO.Header=[[RED]][]=====[][[GREEN]] mcMMO - Overhaul Era [[RED]][]=====[] -Overhaul.mcMMO.Url.Wrap.Prefix=[[RED]][| -Overhaul.mcMMO.Url.Wrap.Suffix=[[RED]]|] -Overhaul.mcMMO.MmoInfo.Wiki=[[YELLOW]][[[WHITE]]wiki\u3067\u3053\u306e\u30b9\u30ad\u30eb\u3092\u898b\u308b[[YELLOW]]] -Overhaul.Levelup=[[BOLD]]{0}\u304c[[RESET]][[GREEN]][[BOLD]]{2}[[RESET]][[WHITE]][[BOLD]]\u306b\u5897\u52a0\u3057\u307e\u3057\u305f\u3002 -Overhaul.Name.Acrobatics=\u30a2\u30af\u30ed\u30d0\u30c6\u30a3\u30c3\u30af -Overhaul.Name.Alchemy=\u932c\u91d1\u8853 -Overhaul.Name.Archery=\u5f13 -Overhaul.Name.Axes=\u65a7 -Overhaul.Name.Excavation=\u6398\u524a -Overhaul.Name.Fishing=\u91e3\u308a -Overhaul.Name.Herbalism=\u8fb2\u696d -Overhaul.Name.Mining=\u63a1\u6398 -Overhaul.Name.Repair=\u4fee\u7406 -Overhaul.Name.Salvage=\u30b5\u30eb\u30d9\u30fc\u30b8 -Overhaul.Name.Smelting=\u7cbe\u932c -Overhaul.Name.Swords=\u5263 -Overhaul.Name.Taming=\u8abf\u6559 -Overhaul.Name.Unarmed=\u7d20\u624b -Overhaul.Name.Woodcutting=\u6728\u3053\u308a +Ability.Generic.Template=&3{0}: &a{1} +Ability.Generic.Template.Custom=&3{0} +Skills.Overhaul.Header=&c[]=====[]&a {0} &c[]=====[] +Effects.Effects=エフェクト +Effects.SubSkills.Overhaul=サブスキル +Effects.Child.Overhaul=&3Child Lv.&e {0}&3: {1} +Effects.Child.ParentList=&a{0}&6(&3Lv.&e{1}&6) +Effects.Level.Overhaul=&6LVL: &e{0} &3XP&e(&6{1}&e/&6{2}&e) +Effects.Parent=&6{0} - +Effects.Template=&3{0}: &a{1} +Commands.Stats.Self.Overhaul=統計 +Commands.XPGain.Overhaul=&6XP獲得: &3{0} +MOTD.Version.Overhaul=&6[mcMMO] &3Overhaul Era&6 - &3{0} +Overhaul.mcMMO.Header=&c[]=====[]&a mcMMO - Overhaul Era &c[]=====[] +Overhaul.mcMMO.Url.Wrap.Prefix=&c[| +Overhaul.mcMMO.Url.Wrap.Suffix=&c|] +Overhaul.mcMMO.MmoInfo.Wiki=&e[&fwikiでこのスキルを見る&e] +# Overhaul.Levelup can take {0} - Skill Name defined in Overhaul.Name {1} - Amount of levels gained {2} - Level in skill +Overhaul.Levelup=&l{0}が&r&a&l{2}&r&f&lに増加しました。 +Overhaul.Name.Acrobatics=アクロバティック +Overhaul.Name.Alchemy=錬金術 +Overhaul.Name.Archery=弓 +Overhaul.Name.Axes=斧 +Overhaul.Name.Excavation=掘削 +Overhaul.Name.Fishing=釣り +Overhaul.Name.Herbalism=農業 +Overhaul.Name.Mining=採掘 +Overhaul.Name.Repair=修理 +Overhaul.Name.Salvage=サルベージ +Overhaul.Name.Smelting=精錬 +Overhaul.Name.Swords=剣 +Overhaul.Name.Taming=調教 +Overhaul.Name.Unarmed=素手 +Overhaul.Name.Woodcutting=木こり # /mcMMO Command Style Stuff -Commands.mcc.Header=[[RED]]---[][[GREEN]]mcMMO \u30b3\u30de\u30f3\u30c9[[RED]][]--- -Commands.Other=[[RED]]---[][[GREEN]]\u30b9\u30da\u30b7\u30e3\u30eb\u30b3\u30de\u30f3\u30c9[[RED]][]--- -Commands.Party.Header=[[RED]]-----[][[GREEN]]\u30d1\u30fc\u30c6\u30a3\u30fc[[RED]][]----- -Commands.Party.Features.Header=[[RED]]-----[][[GREEN]]\u7279\u5fb4[[RED]][]----- +Commands.mcc.Header=&c---[]&amcMMO コマンド&c[]--- +Commands.Other=&c---[]&aスペシャルコマンド&c[]--- +Commands.Party.Header=&c-----[]&aパーティー&c[]----- +Commands.Party.Features.Header=&c-----[]&a特徴&c[]----- +# XP BAR Allows for the following variables -- {0} = Skill Level, {1} Current XP, {2} XP Needed for next level, {3} Power Level, {4} Percentage of Level +# Make sure you turn on Experience_Bars.ThisMayCauseLag.AlwaysUpdateTitlesWhenXPIsGained if you want the XP bar title to update every time a player gains XP! XPBar.Template={0} -XPBar.Template.EarlyGameBoost=[[GOLD]]\u65b0\u3057\u3044\u30b9\u30ad\u30eb\u3092\u5b66\u3093\u3067\u3044\u307e\u3059... -XPBar.Acrobatics=\u30a2\u30af\u30ed\u30d0\u30c6\u30a3\u30c3\u30af Lv.[[GOLD]]{0} -XPBar.Alchemy=\u932c\u91d1\u8853 Lv.[[GOLD]]{0} -XPBar.Archery=\u5f13 Lv.[[GOLD]]{0} -XPBar.Axes=\u65a7 Lv.[[GOLD]]{0} -XPBar.Excavation=\u6398\u524a Lv.[[GOLD]]{0} -XPBar.Fishing=\u91e3\u308a Lv.[[GOLD]]{0} -XPBar.Herbalism=\u8fb2\u696d Lv.[[GOLD]]{0} -XPBar.Mining=\u63a1\u6398 Lv.[[GOLD]]{0} -XPBar.Repair=\u4fee\u7406 Lv.[[GOLD]]{0} -XPBar.Salvage=\u30b5\u30eb\u30d9\u30fc\u30b8 Lv.[[GOLD]]{0} -XPBar.Smelting=\u7cbe\u932c Lv.[[GOLD]]{0} -XPBar.Swords=\u5263 Lv.[[GOLD]]{0} -XPBar.Taming=\u8abf\u6559 Lv.[[GOLD]]{0} -XPBar.Unarmed=\u7d20\u624b Lv.[[GOLD]]{0} -XPBar.Woodcutting=\u6728\u3053\u308a Lv.[[GOLD]]{0} -XPBar.Complex.Template={0} [[DARK_AQUA]] {4}[[WHITE]]% [[DARK_AQUA]]([[WHITE]]{1}[[DARK_AQUA]]/[[WHITE]]{2}[[DARK_AQUA]]) -### END STYLING ### +XPBar.Template.EarlyGameBoost=&6新しいスキルを学んでいます... +XPBar.Acrobatics=アクロバティック Lv.&6{0} +XPBar.Alchemy=錬金術 Lv.&6{0} +XPBar.Archery=弓 Lv.&6{0} +XPBar.Axes=斧 Lv.&6{0} +XPBar.Excavation=掘削 Lv.&6{0} +XPBar.Fishing=釣り Lv.&6{0} +XPBar.Herbalism=農業 Lv.&6{0} +XPBar.Mining=採掘 Lv.&6{0} +XPBar.Repair=修理 Lv.&6{0} +XPBar.Salvage=サルベージ Lv.&6{0} +XPBar.Smelting=精錬 Lv.&6{0} +XPBar.Swords=剣 Lv.&6{0} +XPBar.Taming=調教 Lv.&6{0} +XPBar.Unarmed=素手 Lv.&6{0} +XPBar.Woodcutting=木こり Lv.&6{0} +#This is just a preset template that gets used if the 'ExtraDetails' setting is turned on in experience.yml (off by default), you can ignore this template and just edit the strings above +XPBar.Complex.Template={0} &3 {4}&f% &3(&f{1}&3/&f{2}&3) +# XP BAR Allows for the following variables -- {0} = Skill Level, {1} Current XP, {2} XP Needed for next level, {3} Power Level, {4} Percentage of Level +# Make sure you turn on Experience_Bars.ThisMayCauseLag.AlwaysUpdateTitlesWhenXPIsGained if you want the XP bar title to update every time a player gains XP! + +# END STYLING # ACROBATICS -Acrobatics.Ability.Proc=[[GREEN]]**\u512a\u96c5\u306b\u7740\u5730\u3057\u305f** -Acrobatics.Combat.Proc=[[GREEN]]**\u8eb1\u3057\u305f** -Acrobatics.SubSkill.Roll.Stats=[[GOLD]]\u53d7\u3051\u8eab \u78ba\u7387 [[YELLOW]]{0}%[[GOLD]] \u512a\u96c5\u306a\u53d7\u3051\u8eab \u78ba\u7387[[YELLOW]] {1}% -Acrobatics.SubSkill.Roll.Stat=\u53d7\u3051\u8eab \u78ba\u7387 -Acrobatics.SubSkill.Roll.Stat.Extra=\u512a\u96c5\u306a\u53d7\u3051\u8eab \u78ba\u7387 -Acrobatics.SubSkill.Roll.Name=\u53d7\u3051\u8eab -Acrobatics.SubSkill.Roll.Description=\u30c0\u30e1\u30fc\u30b8\u3092\u907f\u3051\u308b\u70ba\u306b\u843d\u4e0b\u6642\u306b\u53d7\u3051\u8eab\u3059\u308b\u3002 -Acrobatics.SubSkill.Roll.Chance=\u53d7\u3051\u8eab \u78ba\u7387: [[YELLOW]]{0} -Acrobatics.SubSkill.Roll.GraceChance=\u512a\u96c5\u306a\u53d7\u3051\u8eab \u78ba\u7387: [[YELLOW]]{0} -Acrobatics.SubSkill.GracefulRoll.Name=\u512a\u96c5\u306a\u53d7\u3051\u8eab -Acrobatics.SubSkill.GracefulRoll.Description=\u53d7\u3051\u8eab\u306e\u4e8c\u500d\u306e\u52b9\u679c\u3092\u767a\u63ee\u3059\u308b\u3002 -Acrobatics.SubSkill.Dodge.Name=\u8eb1\u3059 -Acrobatics.SubSkill.Dodge.Description=\u653b\u6483\u3067\u53d7\u3051\u308b\u30c0\u30e1\u30fc\u30b8\u3092\u534a\u6e1b\u3059\u308b\u3002 -Acrobatics.SubSkill.Dodge.Stat=\u8eb1\u3059 \u78ba\u7387 -Acrobatics.Listener=\u30a2\u30af\u30ed\u30d0\u30c6\u30a3\u30c3\u30af: -Acrobatics.Roll.Text=[[ITALIC]]**\u53d7\u3051\u8eab\u3092\u3057\u305f** -Acrobatics.SkillName=\u30a2\u30af\u30ed\u30d0\u30c6\u30a3\u30c3\u30af +Acrobatics.Ability.Proc=&a**優雅に着地した** +Acrobatics.Combat.Proc=&a**躱した** +Acrobatics.SubSkill.Roll.Stats=&6受け身の確率 &e{0}%&6 優雅な受け身の確率&e {1}% +Acrobatics.SubSkill.Roll.Stat=受け身の確率 +Acrobatics.SubSkill.Roll.Stat.Extra=優雅な受け身の確率 +Acrobatics.SubSkill.Roll.Name=受け身 +Acrobatics.SubSkill.Roll.Description=ダメージを避ける為に落下時に受け身する。 +Acrobatics.SubSkill.Roll.Chance=受け身の確率: &e{0} +Acrobatics.SubSkill.Roll.GraceChance=優雅な受け身の確率: &e{0} +Acrobatics.SubSkill.Roll.Mechanics=&7落下ダメージを受けるたびに、スキルレベルに応じてダメージを完全に防ぐ可能性があり、レベル&e{6}%&7ではダメージを防ぐ確率が&e{0}%&7です。\nスニークボタンを押すことで、落下ダメージを回避する確率が2倍になり、最大2倍の落下ダメージを回避することができます。スニークボタンを押すと、通常の受け身が「優雅な受け身」に変化します。優雅な受け身は最大で&a{5}&7ダメージを防ぐことができます。 +Acrobatics.SubSkill.GracefulRoll.Name=優雅な受け身 +Acrobatics.SubSkill.GracefulRoll.Description=受け身の二倍の効果を発揮する。 +Acrobatics.SubSkill.Dodge.Name=躱す +Acrobatics.SubSkill.Dodge.Description=攻撃で受けるダメージを半減する。 +Acrobatics.SubSkill.Dodge.Stat=躱す確率 +Acrobatics.Listener=アクロバティック: +Acrobatics.Roll.Text=&o**受け身をした** +Acrobatics.SkillName=アクロバティック # ALCHEMY -Alchemy.SubSkill.Catalysis.Name=\u89e6\u5a92\u4f5c\u7528 -Alchemy.SubSkill.Catalysis.Description=\u30dd\u30fc\u30b7\u30e7\u30f3\u306e\u91b8\u9020\u901f\u5ea6\u3092\u5411\u4e0a\u3059\u308b\u3002 -Alchemy.SubSkill.Catalysis.Stat=\u91b8\u9020\u901f\u5ea6 -Alchemy.SubSkill.Concoctions.Name=\u8abf\u5408 -Alchemy.SubSkill.Concoctions.Description=\u3082\u3063\u3068\u6750\u6599\u3092\u5165\u308c\u305f\u30dd\u30fc\u30b7\u30e7\u30f3\u3092\u4f5c\u6210\u3059\u308b\u3002 -Alchemy.SubSkill.Concoctions.Stat=\u8abf\u5408 \u30e9\u30f3\u30af: [[GREEN]]{0}[[DARK_AQUA]]/[[GREEN]]{1} -Alchemy.SubSkill.Concoctions.Stat.Extra=\u6750\u6599 [[[GREEN]]{0}[[DARK_AQUA]]]: [[GREEN]]{1} -Alchemy.Listener=\u932c\u91d1\u8853: -Alchemy.Ability.Locked.0=\u30ed\u30c3\u30af\u3055\u308c\u308b\u307e\u3067 {0}+ \u30b9\u30ad\u30eb (\u89e6\u5a92\u4f5c\u7528) -Alchemy.SkillName=\u932c\u91d1\u8853 +Alchemy.SubSkill.Catalysis.Name=触媒作用 +Alchemy.SubSkill.Catalysis.Description=ポーションの醸造速度を向上する。 +Alchemy.SubSkill.Catalysis.Stat=醸造速度 +Alchemy.SubSkill.Concoctions.Name=調合 +Alchemy.SubSkill.Concoctions.Description=もっと材料を入れたポーションを作成する。 +Alchemy.SubSkill.Concoctions.Stat=調合 ランク: &a{0}&3/&a{1} +Alchemy.SubSkill.Concoctions.Stat.Extra=材料 [&a{0}&3]: &a{1} +Alchemy.Listener=錬金術: +Alchemy.Ability.Locked.0=ロックされるまで {0}+ スキル (触媒作用) +Alchemy.SkillName=錬金術 # ARCHERY -Archery.SubSkill.SkillShot.Name=\u30b9\u30ad\u30eb\u30b7\u30e7\u30c3\u30c8 -Archery.SubSkill.SkillShot.Description=\u5f13\u306e\u30c0\u30e1\u30fc\u30b8\u3092\u5897\u52a0\u3059\u308b\u3002 -Archery.SubSkill.SkillShot.Stat=\u30b9\u30ad\u30eb\u30b7\u30e7\u30c3\u30c8 \u8ffd\u52a0\u30c0\u30e1\u30fc\u30b8 -Archery.SubSkill.Daze.Name=\u5e7b\u60d1 -Archery.SubSkill.Daze.Description=\u6575\u3092\u6df7\u4e71\u3055\u305b\u3001\u8ffd\u52a0\u30c0\u30e1\u30fc\u30b8\u3092\u4e0e\u3048\u308b\u3002 -Archery.SubSkill.Daze.Stat=\u5e7b\u60d1 \u78ba\u7387 -Archery.SubSkill.ArrowRetrieval.Name=\u77e2\u306e\u56de\u53ce -Archery.SubSkill.ArrowRetrieval.Description=\u6b7b\u4f53\u304b\u3089\u77e2\u3092\u78ba\u7387\u3067\u56de\u53ce\u3059\u308b\u3002 -Archery.SubSkill.ArrowRetrieval.Stat=\u77e2\u306e\u56de\u53ce \u78ba\u7387 -Archery.SubSkill.ArcheryLimitBreak.Name=\u9650\u754c\u7a81\u7834 -Archery.SubSkill.ArcheryLimitBreak.Description=\u9650\u754c\u3092\u7834\u308b\u3002\u30bf\u30d5\u306a\u6575\u306b\u5bfe\u3059\u308b\u30c0\u30e1\u30fc\u30b8\u304c\u5897\u52a0\u3057\u307e\u3059\u3002PvP\u3092\u5bfe\u8c61\u3068\u3057\u3001PvE\u3078\u306e\u9069\u5fdc\u306f\u30b5\u30fc\u30d0\u30fc\u306e\u8a2d\u5b9a\u6b21\u7b2c\u3067\u3059\u3002 -Archery.SubSkill.ArcheryLimitBreak.Stat=\u9650\u754c\u7a81\u7834 \u6700\u5927\u30c0\u30e1\u30fc\u30b8 -Archery.Listener=\u5f13: -Archery.SkillName=\u5f13 +Archery.SubSkill.SkillShot.Name=スキルショット +Archery.SubSkill.SkillShot.Description=弓のダメージを増加する。 +Archery.SubSkill.SkillShot.Stat=スキルショット 追加ダメージ +Archery.SubSkill.Daze.Name=幻惑 +Archery.SubSkill.Daze.Description=敵を混乱させ、追加ダメージを与える。 +Archery.SubSkill.Daze.Stat=幻惑の確率 +Archery.SubSkill.ArrowRetrieval.Name=矢回収 +Archery.SubSkill.ArrowRetrieval.Description=死体から矢を確率で回収する。 +Archery.SubSkill.ArrowRetrieval.Stat=矢回収の確率 +Archery.SubSkill.ArcheryLimitBreak.Name=限界突破 +Archery.SubSkill.ArcheryLimitBreak.Description=限界を破る。タフな敵に対するダメージが増加します。PvPを対象とし、PvEへの適応はサーバーの設定次第です。 +Archery.SubSkill.ArcheryLimitBreak.Stat=限界突破 最大ダメージ +Archery.Listener=弓: +Archery.SkillName=弓 # AXES -Axes.Ability.Bonus.0=\u65a7 \u7df4\u5ea6 -Axes.Ability.Bonus.1=\u30dc\u30fc\u30ca\u30b9 {0} \u30c0\u30e1\u30fc\u30b8 -Axes.Ability.Bonus.2=\u30a2\u30fc\u30de\u30fc\u30a4\u30f3\u30d1\u30af\u30c8 -Axes.Ability.Bonus.3=\u9632\u5177\u306b{0}\u306e\u30dc\u30fc\u30ca\u30b9\u30c0\u30e1\u30fc\u30b8\u3092\u4e0e\u3048\u308b -Axes.Ability.Bonus.4=\u30b0\u30ea\u30fc\u30bf\u30fc\u30a4\u30f3\u30d1\u30af\u30c8 -Axes.Ability.Bonus.5=\u9632\u5177\u306e\u306a\u3044\u6575\u306b{0}\u306e\u30dc\u30fc\u30ca\u30b9\u30c0\u30e1\u30fc\u30b8\u3092\u4e0e\u3048\u308b -Axes.Ability.Lower=[[GRAY]]\u65a7\u3092\u4e0b\u3052\u305f\u3002 -Axes.Ability.Ready=[[DARK_AQUA]]\u65a7\u3092[[GOLD]]\u6e96\u5099[[DARK_AQUA]]\u3057\u305f\u3002 -Axes.Combat.CritStruck=[[DARK_RED]]\u3042\u306a\u305f\u306f\u91cd\u5927\u306a\u30c0\u30e1\u30fc\u30b8\u3092\u53d7\u3051\u307e\u3057\u305f\uff01 -Axes.Combat.CriticalHit=\u30af\u30ea\u30c6\u30a3\u30ab\u30eb\u30d2\u30c3\u30c8\uff01 -Axes.Combat.GI.Proc=[[GREEN]]**\u5927\u304d\u306a\u529b\u304c\u8972\u3063\u3066\u304d\u305f** -Axes.Combat.GI.Struck=**\u30b0\u30ec\u30fc\u30bf\u30fc\u30a4\u30f3\u30d1\u30af\u30c8\u306b\u8972\u308f\u308c\u305f\uff01** -Axes.Combat.SS.Struck=[[DARK_RED]]\u30b9\u30ab\u30eb\u30b9\u30d7\u30ea\u30c3\u30bf\u30fc\u306b\u8972\u308f\u308c\u305f\uff01 -Axes.SubSkill.SkullSplitter.Name=\u30b9\u30ab\u30eb\u30b9\u30d7\u30ea\u30c3\u30bf\u30fc -Axes.SubSkill.SkullSplitter.Description=AoE\u30c0\u30e1\u30fc\u30b8\u3092\u4e0e\u3048\u308b\u3002 -Axes.SubSkill.SkullSplitter.Stat=\u30b9\u30ab\u30eb\u30b9\u30d7\u30ea\u30c3\u30bf\u30fc \u671f\u9593 -Axes.SubSkill.CriticalStrikes.Name=\u30af\u30ea\u30c6\u30a3\u30ab\u30eb\u30b9\u30c8\u30e9\u30a4\u30af -Axes.SubSkill.CriticalStrikes.Description=\u30c0\u30e1\u30fc\u30b8\u4e8c\u500d -Axes.SubSkill.CriticalStrikes.Stat=\u30af\u30ea\u30c6\u30a3\u30ab\u30eb\u30b9\u30c8\u30e9\u30a4\u30af \u78ba\u7387 -Axes.SubSkill.AxeMastery.Name=\u65a7 \u7df4\u5ea6 -Axes.SubSkill.AxeMastery.Description=\u8ffd\u52a0\u30c0\u30e1\u30fc\u30b8\u3092\u4e0e\u3048\u308b\u3002 -Axes.SubSkill.AxesLimitBreak.Name=\u65a7 \u9650\u754c\u7a81\u7834 -Axes.SubSkill.AxesLimitBreak.Description=\u9650\u754c\u3092\u7834\u308b\u3002\u30bf\u30d5\u306a\u6575\u306b\u5bfe\u3059\u308b\u30c0\u30e1\u30fc\u30b8\u304c\u5897\u52a0\u3057\u307e\u3059\u3002PvP\u3092\u5bfe\u8c61\u3068\u3057\u3001PvE\u3078\u306e\u9069\u5fdc\u306f\u30b5\u30fc\u30d0\u30fc\u306e\u8a2d\u5b9a\u6b21\u7b2c\u3067\u3059\u3002 -Axes.SubSkill.AxesLimitBreak.Stat=\u9650\u754c\u7a81\u7834 \u8ffd\u52a0\u30c0\u30e1\u30fc\u30b8 -Axes.SubSkill.ArmorImpact.Name=\u30a2\u30fc\u30de\u30fc\u30a4\u30f3\u30d1\u30af\u30c8 -Axes.SubSkill.ArmorImpact.Description=\u9632\u5177\u3092\u7c89\u7815\u3059\u308b\u5a01\u529b\u3067\u653b\u6483\u3059\u308b\u3002 -Axes.SubSkill.GreaterImpact.Name=\u30b0\u30ec\u30fc\u30bf\u30fc\u30a4\u30f3\u30d1\u30af\u30c8 -Axes.SubSkill.GreaterImpact.Description=\u9632\u5177\u306e\u306a\u3044\u6575\u306b\u8ffd\u52a0\u30c0\u30e1\u30fc\u30b8\u3092\u4e0e\u3048\u308b\u3002 -Axes.Listener=\u65a7: -Axes.SkillName=\u65a7 -Axes.Skills.SS.Off=**\u30b9\u30ab\u30eb\u30b9\u30d7\u30ea\u30c3\u30bf\u30fc \u3092\u6d88\u8017\u3057\u305f** -Axes.Skills.SS.On=[[GREEN]]**\u30b9\u30ab\u30eb\u30b9\u30d7\u30ea\u30c3\u30bf\u30fc \u30a2\u30af\u30c6\u30a3\u30d9\u30fc\u30c8** -Axes.Skills.SS.Refresh=[[YELLOW]]\u30b9\u30ab\u30eb\u30b9\u30d7\u30ea\u30c3\u30bf\u30fc [[GREEN]]\u30a2\u30d3\u30ea\u30c6\u30a3\u304c\u56de\u5fa9\u3057\u307e\u3057\u305f\uff01 -Axes.Skills.SS.Other.Off=[[YELLOW]]{0}\u304c [[WHITE]]\u30b9\u30ab\u30eb\u30b9\u30d7\u30ea\u30c3\u30bf\u30fc [[GREEN]]\u3092\u6d88\u8017\u3057\u305f -Axes.Skills.SS.Other.On=[[GREEN]]{0}[[DARK_GREEN]]\u304c [[RED]]\u30b9\u30ab\u30eb\u30b9\u30d7\u30ea\u30c3\u30bf\u30fc [[DARK_GREEN]]\u3092\u4f7f\u3063\u305f\uff01 +Axes.Ability.Bonus.0=アックスマスタリー +Axes.Ability.Bonus.1=ボーナス {0} ダメージ +Axes.Ability.Bonus.2=アーマーインパクト +Axes.Ability.Bonus.3=防具に{0}のボーナスダメージを与える +Axes.Ability.Bonus.4=グリーターインパクト +Axes.Ability.Bonus.5=防具のない敵に{0}のボーナスダメージを与える +Axes.Ability.Lower=&7斧を下げた。 +Axes.Ability.Ready=&3斧を&6準備&3した。 +Axes.Ability.Ready.Extra=&3斧を&6準備&3した。 &7({0} が {1} 秒のクールダウン中) +Axes.Combat.CritStruck=&4あなたは重大なダメージを受けました! +Axes.Combat.CriticalHit=クリティカルヒット! +Axes.Combat.GI.Proc=&a**大きな力が襲ってきた** +Axes.Combat.GI.Struck=**グレーターインパクトに襲われた!** +Axes.Combat.SS.Struck=&4スカルスプリッターに襲われた! +Axes.SubSkill.SkullSplitter.Name=スカルスプリッター +Axes.SubSkill.SkullSplitter.Description=AoEダメージを与える。 +Axes.SubSkill.SkullSplitter.Stat=スカルスプリッター 期間 +Axes.SubSkill.CriticalStrikes.Name=クリティカルストライク +Axes.SubSkill.CriticalStrikes.Description=ダメージ二倍 +Axes.SubSkill.CriticalStrikes.Stat=クリティカルストライクの確率 +Axes.SubSkill.AxeMastery.Name=アックスマスタリー +Axes.SubSkill.AxeMastery.Description=追加ダメージを与える。 +Axes.SubSkill.AxesLimitBreak.Name=斧 限界突破 +Axes.SubSkill.AxesLimitBreak.Description=限界を破る。タフな敵に対するダメージが増加します。PvPを対象とし、PvEへの適応はサーバーの設定次第です。 +Axes.SubSkill.AxesLimitBreak.Stat=限界突破 追加ダメージ +Axes.SubSkill.ArmorImpact.Name=アーマーインパクト +Axes.SubSkill.ArmorImpact.Description=防具を粉砕する威力で攻撃する。 +Axes.SubSkill.GreaterImpact.Name=グレーターインパクト +Axes.SubSkill.GreaterImpact.Description=防具のない敵に追加ダメージを与える。 +Axes.Listener=斧: +Axes.SkillName=斧 +Axes.Skills.SS.Off=**スカルスプリッター を消耗した** +Axes.Skills.SS.On=&a**スカルスプリッター アクティベート** +Axes.Skills.SS.Refresh=&eスカルスプリッター &aアビリティが回復しました! +Axes.Skills.SS.Other.Off=&e{0}が &fスカルスプリッター &aを消耗した +Axes.Skills.SS.Other.On=&a{0}&2が &cスカルスプリッター &2を使った! # EXCAVATION -Excavation.Ability.Lower=[[GRAY]]\u30b7\u30e3\u30d9\u30eb\u3092\u4e0b\u3052\u305f\u3002 -Excavation.Ability.Ready=[[DARK_AQUA]]\u30b7\u30e3\u30d9\u30eb\u3092[[GOLD]]\u6e96\u5099[[DARK_AQUA]]\u3057\u305f\u3002 -Excavation.SubSkill.GigaDrillBreaker.Name=\u30ae\u30ac\u30c9\u30ea\u30eb\u30d6\u30ec\u30fc\u30ab\u30fc -Excavation.SubSkill.GigaDrillBreaker.Description=3x \u30c9\u30ed\u30c3\u30d7\u7387, 3x EXP, +\u30b9\u30d4\u30fc\u30c9 -Excavation.SubSkill.GigaDrillBreaker.Stat=\u30ae\u30ac\u30c9\u30ea\u30eb\u30d6\u30ec\u30fc\u30ab\u30fc \u671f\u9593 -Excavation.SubSkill.Archaeology.Name=\u8003\u53e4\u5b66 -Excavation.SubSkill.Archaeology.Description=\u5b9d\u3092\u767a\u6398\u3057\u3088\u3046\uff01\u30b9\u30ad\u30eb\u30ec\u30d9\u30eb\u304c\u9ad8\u3044\u3068\u3001\u5b9d\u3092\u898b\u3064\u3051\u305f\u3068\u304d\u306b\u7d4c\u9a13\u5024\u30aa\u30fc\u30d6\u3092\u898b\u3064\u3051\u308b\u53ef\u80fd\u6027\u304c\u9ad8\u304f\u306a\u308a\u307e\u3059\u3002 -Excavation.SubSkill.Archaeology.Stat=\u8003\u53e4\u5b66 \u7d4c\u9a13\u5024\u30aa\u30fc\u30d6\u767a\u898b\u78ba\u7387 -Excavation.SubSkill.Archaeology.Stat.Extra=\u8003\u53e4\u5b66 \u7d4c\u9a13\u5024\u30aa\u30fc\u30d6\u91cf +Excavation.Ability.Lower=&7シャベルを下げた。 +Excavation.Ability.Ready=&3シャベルを&6準備&3した。 +Excavation.SubSkill.GigaDrillBreaker.Name=ギガドリルブレイカー +Excavation.SubSkill.GigaDrillBreaker.Description=3x ドロップ率, 3x EXP, +スピード +Excavation.SubSkill.GigaDrillBreaker.Stat=ギガドリルブレイカー 期間 +Excavation.SubSkill.Archaeology.Name=考古学 +Excavation.SubSkill.Archaeology.Description=宝を発掘しよう!スキルレベルが高いと、宝を見つけたときに経験値オーブを見つける可能性が高くなります。 +Excavation.SubSkill.Archaeology.Stat=考古学 経験値オーブ発見確率 +Excavation.SubSkill.Archaeology.Stat.Extra=考古学 経験値オーブ量 -Excavation.Listener=\u6398\u524a: -Excavation.SkillName=\u6398\u524a -Excavation.Skills.GigaDrillBreaker.Off=**\u30ae\u30ac\u30c9\u30ea\u30eb\u30d6\u30ec\u30fc\u30ab\u30fc \u3092\u6d88\u8017\u3057\u305f** -Excavation.Skills.GigaDrillBreaker.On=[[GREEN]]**\u30ae\u30ac\u30c9\u30ea\u30eb\u30d6\u30ec\u30fc\u30ab\u30fc \u30a2\u30af\u30c6\u30a3\u30d9\u30fc\u30c8** -Excavation.Skills.GigaDrillBreaker.Refresh=[[YELLOW]]\u30ae\u30ac\u30c9\u30ea\u30eb\u30d6\u30ec\u30fc\u30ab\u30fc [[GREEN]]\u30a2\u30d3\u30ea\u30c6\u30a3\u304c\u56de\u5fa9\u3057\u307e\u3057\u305f\uff01 -Excavation.Skills.GigaDrillBreaker.Other.Off=[[YELLOW]]{0}\u304c [[WHITE]]\u30ae\u30ac\u30c9\u30ea\u30eb\u30d6\u30ec\u30fc\u30ab\u30fc [[GREEN]]\u3092\u6d88\u8017\u3057\u305f -Excavation.Skills.GigaDrillBreaker.Other.On=[[GREEN]]{0}[[DARK_GREEN]]\u304c [[RED]]\u30ae\u30ac\u30c9\u30ea\u30eb\u30d6\u30ec\u30fc\u30ab\u30fc [[DARK_GREEN]]\u3092\u4f7f\u3063\u305f\uff01 +Excavation.Listener=掘削: +Excavation.SkillName=掘削 +Excavation.Skills.GigaDrillBreaker.Off=**ギガドリルブレイカー を消耗した** +Excavation.Skills.GigaDrillBreaker.On=&a**ギガドリルブレイカー アクティベート** +Excavation.Skills.GigaDrillBreaker.Refresh=&eギガドリルブレイカー &aアビリティが回復しました! +Excavation.Skills.GigaDrillBreaker.Other.Off=&e{0}が &fギガドリルブレイカー &aを消耗した +Excavation.Skills.GigaDrillBreaker.Other.On=&a{0}&2が &cギガドリルブレイカー &2を使った! # FISHING -Fishing.ScarcityTip=[[YELLOW]]&o\u3053\u306e\u5730\u57df\u306f\u9b5a\u306e\u4e71\u7372\u306b\u82e6\u3057\u3093\u3067\u3044\u307e\u3059\u3002\u3088\u308a\u591a\u304f\u306e\u9b5a\u3092\u91e3\u308b\u305f\u3081\u306b\u306f\u5225\u306e\u5834\u6240\u3067\u91e3\u308a\u3092\u3059\u308b\u5fc5\u8981\u304c\u3042\u308a\u307e\u3059\u3002\u5c11\u306a\u304f\u3068\u3082{0}\u30d6\u30ed\u30c3\u30af\u5148\u3002 -Fishing.Scared=[[GRAY]]&o\u6df7\u6c8c\u3068\u3057\u305f\u52d5\u304d\u306f\u9b5a\u3092\u6016\u304c\u3089\u305b\u307e\u3059\uff01 -Fishing.Exhausting=[[RED]]&o\u91e3\u308a\u7aff\u3092\u4e0d\u9069\u5207\u306b\u4f7f\u7528\u3059\u308b\u3068\u3001\u75b2\u52b4\u3092\u5f15\u304d\u8d77\u3053\u3057\u305f\u308a\u3001\u8010\u4e45\u5024\u3092\u6d88\u8cbb\u3057\u305f\u308a\u3057\u307e\u3059\u3002 -Fishing.LowResourcesTip=[[GRAY]]\u3053\u306e\u5730\u57df\u306b\u3044\u308b\u9b5a\u304c\u305d\u308c\u307b\u3069\u591a\u304f\u306a\u3044\u3053\u3068\u3092\u611f\u3058\u307e\u3057\u305f\u3002\u5c11\u306a\u304f\u3068\u3082{0}\u30d6\u30ed\u30c3\u30af\u96e2\u308c\u305f\u3068\u3053\u308d\u3067\u91e3\u308a\u3092\u3057\u3066\u307f\u3066\u4e0b\u3055\u3044\u3002 -Fishing.Ability.Info=\u30de\u30b8\u30c3\u30af\u30cf\u30f3\u30bf\u30fc: [[GRAY]] **\u30c8\u30ec\u30b8\u30e3\u30fc\u30cf\u30f3\u30bf\u30fc \u30e9\u30f3\u30af\u3067\u6539\u5584\u3059\u308b** -Fishing.Ability.Locked.0=\u30ed\u30c3\u30af\u3055\u308c\u308b\u307e\u3067 {0}+ \u30b9\u30ad\u30eb (\u30b7\u30a7\u30a4\u30af) -Fishing.Ability.Locked.1=\u30ed\u30c3\u30af\u3055\u308c\u308b\u307e\u3067 {0}+ \u30b9\u30ad\u30eb (\u7a74\u91e3\u308a) -Fishing.Ability.Locked.2=\u30ed\u30c3\u30af\u3055\u308c\u308b\u307e\u3067 {0}+ \u30b9\u30ad\u30eb (\u30de\u30b9\u30bf\u30fc\u30a2\u30f3\u30b0\u30e9\u30fc) -Fishing.SubSkill.TreasureHunter.Name=\u30c8\u30ec\u30b8\u30e3\u30fc\u30cf\u30f3\u30bf\u30fc -Fishing.SubSkill.TreasureHunter.Description=\u9b5a\u3084\u7269\u3092\u91e3\u308a\u4e0a\u3052\u308b\u3002 -Fishing.SubSkill.TreasureHunter.Stat=\u30c8\u30ec\u30b8\u30e3\u30fc\u30cf\u30f3\u30bf\u30fc \u30e9\u30f3\u30af: [[GREEN]]{0}[[DARK_AQUA]]/[[GREEN]]{1} -Fishing.SubSkill.TreasureHunter.Stat.Extra=\u30c9\u30ed\u30c3\u30d7\u7387: [[GRAY]]\u30b3\u30e2\u30f3: [[YELLOW]]{0} [[GREEN]]\u30a2\u30f3\u30b3\u30e2\u30f3: [[YELLOW]]{1}\n[[BLUE]]\u30ec\u30a2: [[YELLOW]]{2} [[LIGHT_PURPLE]]\u30a8\u30d4\u30c3\u30af: [[YELLOW]]{3} [[GOLD]]\u30ec\u30b8\u30a7\u30f3\u30c0\u30ea\u30fc: [[YELLOW]]{4} [[AQUA]]\u30ec\u30b3\u30fc\u30c9: [[YELLOW]]{5} -Fishing.SubSkill.MagicHunter.Name=\u30de\u30b8\u30c3\u30af\u30cf\u30f3\u30bf\u30fc -Fishing.SubSkill.MagicHunter.Description=\u30a8\u30f3\u30c1\u30e3\u30f3\u30c8\u3055\u308c\u305f\u30a2\u30a4\u30c6\u30e0\u3092\u898b\u3064\u3051\u308b\u3002 -Fishing.SubSkill.MagicHunter.Stat=\u30de\u30b8\u30c3\u30af\u30cf\u30f3\u30bf\u30fc \u78ba\u7387 -Fishing.SubSkill.Shake.Name=\u30b7\u30a7\u30a4\u30af -Fishing.SubSkill.Shake.Description=Mob\u3084\u30d7\u30ec\u30a4\u30e4\u30fc\u304b\u3089\u91e3\u308a\u7aff\u3067\u30a2\u30a4\u30c6\u30e0\u3092\u632f\u308a\u843d\u3068\u3059\u3002 -Fishing.SubSkill.Shake.Stat=\u30b7\u30a7\u30a4\u30af \u78ba\u7387 -Fishing.SubSkill.FishermansDiet.Name=\u6f01\u5e2b\u306e\u98df\u4e8b -Fishing.SubSkill.FishermansDiet.Description=\u9b5a\u4ecb\u985e\u304b\u3089\u56de\u5fa9\u3059\u308b\u6e80\u8179\u5ea6\u3092\u6539\u5584\u3059\u308b\u3002 -Fishing.SubSkill.FishermansDiet.Stat=\u6f01\u5e2b\u306e\u98df\u4e8b:[[GREEN]] \u30e9\u30f3\u30af {0} -Fishing.SubSkill.MasterAngler.Name=\u30de\u30b9\u30bf\u30fc\u30a2\u30f3\u30b0\u30e9\u30fc -Fishing.SubSkill.MasterAngler.Description=\u91e3\u308c\u308b\u78ba\u7387\u304c\u4e0a\u304c\u308a\u307e\u3059\u3002 -Fishing.SubSkill.MasterAngler.Stat=\u73fe\u5728\u306e\u5834\u6240\u306b\u9b5a\u304c\u98df\u3044\u4ed8\u304f\u78ba\u7387\u3092\u8ffd\u52a0\u3057\u307e\u3057\u305f\u3002: [[GREEN]]+[[YELLOW]]{0} -Fishing.SubSkill.IceFishing.Name=\u7a74\u91e3\u308a -Fishing.SubSkill.IceFishing.Description=\u5bd2\u3044\u30d0\u30a4\u30aa\u30fc\u30e0\u3067\u306e\u91e3\u308a\u304c\u3067\u304d\u308b\u3088\u3046\u306b\u306a\u308b\u3002 -Fishing.SubSkill.IceFishing.Stat=\u7a74\u91e3\u308a -Fishing.Chance.Raining=[[BLUE]] \u96e8\u30dc\u30fc\u30ca\u30b9 -Fishing.Listener=\u91e3\u308a: -Fishing.Ability.TH.MagicFound=[[GRAY]]\u9b54\u6cd5\u3092\u611f\u3058\u307e\u3059\u3002 -Fishing.Ability.TH.Boom=[[GRAY]]BOOM TIME!!! -Fishing.Ability.TH.Poison=[[GRAY]]\u306a\u304b\u306a\u304b\u3044\u3044\u5302\u3044\u304c\u3057\u306a\u3044... -Fishing.SkillName=\u91e3\u308a +Fishing.ScarcityTip=&e&oこの地域は魚の乱獲に苦しんでいます。より多くの魚を釣るためには別の場所で釣りをする必要があります。少なくとも{0}ブロック先。 +Fishing.Scared=&7&o混沌とした動きは魚を怖がらせます! +Fishing.Exhausting=&c&o釣り竿を不適切に使用すると、疲労を引き起こしたり、耐久値を消費したりします。 +Fishing.LowResourcesTip=&7この地域にいる魚がそれほど多くないことを感じました。少なくとも{0}ブロック離れたところで釣りをしてみて下さい。 +Fishing.Ability.Info=マジックハンター: &7 **トレジャーハンター ランクで改善する** +Fishing.Ability.Locked.0=ロックされるまで {0}+ スキル (シェイク) +Fishing.Ability.Locked.1=ロックされるまで {0}+ スキル (アイスフィッシング) +Fishing.Ability.Locked.2=ロックされるまで {0}+ スキル (マスターアングラー) +Fishing.SubSkill.TreasureHunter.Name=トレジャーハンター +Fishing.SubSkill.TreasureHunter.Description=魚や物を釣り上げる。 +Fishing.SubSkill.TreasureHunter.Stat=トレジャーハンター ランク: &a{0}&3/&a{1} +Fishing.SubSkill.TreasureHunter.Stat.Extra=ドロップ率: &7コモン: &e{0} &aアンコモン: &e{1}\n&9レア: &e{2} &dエピック: &e{3} &6レジェンダリー: &e{4} &bMythic: &e{5} +Fishing.SubSkill.MagicHunter.Name=マジックハンター +Fishing.SubSkill.MagicHunter.Description=エンチャントされたアイテムを見つける。 +Fishing.SubSkill.MagicHunter.Stat=マジックハンターの確率 +Fishing.SubSkill.Shake.Name=シェイク +Fishing.SubSkill.Shake.Description=Mobやプレイヤーから釣り竿でアイテムを振り落とす。 +Fishing.SubSkill.Shake.Stat=シェイクの確率 +Fishing.SubSkill.FishermansDiet.Name=漁師の食事 +Fishing.SubSkill.FishermansDiet.Description=魚介類から回復する満腹度を改善する。 +Fishing.SubSkill.FishermansDiet.Stat=漁師の食事:&a ランク {0} +Fishing.SubSkill.MasterAngler.Name=マスターアングラー +Fishing.SubSkill.MasterAngler.Description=魚がよく釣れます、船からの釣りではより効果的です。 +Fishing.SubSkill.MasterAngler.Stat=釣りの最低待ち時間短縮: &a-{0} 秒 +Fishing.SubSkill.MasterAngler.Stat.Extra=釣りの最大待ち時間短縮: &a-{0} 秒 +Fishing.SubSkill.IceFishing.Name=アイスフィッシング +Fishing.SubSkill.IceFishing.Description=寒いバイオームでの釣りができるようになる。 +Fishing.SubSkill.IceFishing.Stat=アイスフィッシング +Fishing.Chance.Raining=&9 雨ボーナス +Fishing.Listener=釣り: +Fishing.Ability.TH.MagicFound=&7魔法を感じます。 +Fishing.Ability.TH.Boom=&7BOOM TIME!!! +Fishing.Ability.TH.Poison=&7なかなかいい匂いがしない... +Fishing.SkillName=釣り # HERBALISM -Herbalism.Ability.GTe.NeedMore=\u7dd1\u3092\u5897\u3084\u3059\u306b\u306f\u3082\u3063\u3068\u7a2e\u304c\u5fc5\u8981\u3067\u3059\u3002 -Herbalism.Ability.GTh.Fail=**\u7dd1\u8272\u306e\u89aa\u6307 \u5931\u6557** -Herbalism.Ability.GTh=[[GREEN]]**\u7dd1\u8272\u306e\u89aa\u6307** -Herbalism.Ability.Lower=[[GRAY]]\u30af\u30ef\u3092\u4e0b\u3052\u305f\u3002 -Herbalism.Ability.Ready=[[DARK_AQUA]]\u30af\u30ef\u3092[[GOLD]]\u6e96\u5099[[DARK_AQUA]]\u3057\u305f\u3002 -Herbalism.Ability.ShroomThumb.Fail=**\u30ad\u30ce\u30b3\u306e\u89aa\u6307 \u5931\u6557** -Herbalism.SubSkill.GreenTerra.Name=\u30b0\u30ea\u30fc\u30f3\u30c6\u30e9 -Herbalism.SubSkill.GreenTerra.Description=\u7dd1\u3092\u5e83\u3052\u308b, 3x \u30c9\u30ed\u30c3\u30d7 -Herbalism.SubSkill.GreenTerra.Stat=\u30b0\u30ea\u30fc\u30f3\u30c6\u30e9 \u671f\u9593 -Herbalism.SubSkill.GreenThumb.Name=\u7dd1\u8272\u306e\u89aa\u6307 -Herbalism.SubSkill.GreenThumb.Description=\u4f5c\u7269\u306e\u53ce\u7a6b\u6642\u306b\u81ea\u52d5\u3067\u690d\u3048\u66ff\u3048\u3092\u3059\u308b\u3002 -Herbalism.SubSkill.GreenThumb.Stat=\u7dd1\u8272\u306e\u89aa\u6307 \u78ba\u7387 -Herbalism.SubSkill.GreenThumb.Stat.Extra=\u7dd1\u8272\u306e\u89aa\u6307 \u30b9\u30c6\u30fc\u30b8: [[GREEN]] \u4f5c\u7269\u306f\u30b9\u30c6\u30fc\u30b8 {0} \u306b\u6210\u9577 -Herbalism.Effect.4=\u7dd1\u8272\u306e\u89aa\u6307 (\u30d6\u30ed\u30c3\u30af) -Herbalism.SubSkill.GreenThumb.Description.2=\u77f3\u30ec\u30f3\u30ac\u3092\u82d4\u3080\u3057\u305f\u72b6\u614b\u306b\u3059\u308b\u3002\u307e\u305f\u306f\u8349\u3092\u6210\u9577\u3055\u305b\u308b\u3002 -Herbalism.SubSkill.FarmersDiet.Name=\u8fb2\u5bb6\u306e\u98df\u4e8b -Herbalism.SubSkill.FarmersDiet.Description=\u8fb2\u4f5c\u7269\u304b\u3089\u56de\u5fa9\u3059\u308b\u6e80\u8179\u5ea6\u3092\u6539\u5584\u3059\u308b\u3002 -Herbalism.SubSkill.FarmersDiet.Stat=\u8fb2\u5bb6\u306e\u98df\u4e8b: [[GREEN]]\u30e9\u30f3\u30af {0} -Herbalism.SubSkill.DoubleDrops.Name=\u30c9\u30ed\u30c3\u30d7\u4e8c\u500d -Herbalism.SubSkill.DoubleDrops.Description=\u30c9\u30ed\u30c3\u30d7\u304c\u4e8c\u500d\u306b\u306a\u308b\u3002 -Herbalism.SubSkill.DoubleDrops.Stat=\u30c9\u30ed\u30c3\u30d7\u4e8c\u500d \u78ba\u7387 -Herbalism.SubSkill.HylianLuck.Name=\u30cf\u30a4\u30ea\u30a2\u306e\u904b -Herbalism.SubSkill.HylianLuck.Description=\u5e0c\u5c11\u54c1\u3092\u898b\u3064\u3051\u308b\u78ba\u7387\u304c\u4e0a\u304c\u308b\u3002 -Herbalism.SubSkill.HylianLuck.Stat=\u30cf\u30a4\u30ea\u30a2\u306e\u904b \u78ba\u7387 -Herbalism.SubSkill.ShroomThumb.Name=\u30ad\u30ce\u30b3\u306e\u89aa\u6307 -Herbalism.SubSkill.ShroomThumb.Description=\u571f\u3084\u8349\u306b\u83cc\u7cf8\u3092\u5e83\u3052\u308b\u3002 -Herbalism.SubSkill.ShroomThumb.Stat=\u30ad\u30ce\u30b3\u306e\u89aa\u6307 \u78ba\u7387 -Herbalism.HylianLuck=[[GREEN]]\u30cf\u30a4\u30e9\u30eb\u306e\u904b\u306f\u4eca\u65e5\u306e\u3042\u306a\u305f\u306b\u3064\u3044\u3066\u3044\u307e\u3059\uff01 -Herbalism.Listener=\u8fb2\u696d: -Herbalism.SkillName=\u8fb2\u696d -Herbalism.Skills.GTe.Off=**\u30b0\u30ea\u30fc\u30f3\u30c6\u30e9 \u3092\u6d88\u8017\u3057\u305f** -Herbalism.Skills.GTe.On=[[GREEN]]**\u30b0\u30ea\u30fc\u30f3\u30c6\u30e9 \u30a2\u30af\u30c6\u30a3\u30d9\u30fc\u30c8** -Herbalism.Skills.GTe.Refresh=[[YELLOW]]\u30b0\u30ea\u30fc\u30f3\u30c6\u30e9 [[GREEN]]\u30a2\u30d3\u30ea\u30c6\u30a3\u304c\u56de\u5fa9\u3057\u307e\u3057\u305f\uff01 -Herbalism.Skills.GTe.Other.Off=[[YELLOW]]{0}\u304c [[WHITE]]\u30b0\u30ea\u30fc\u30f3\u30c6\u30e9 [[GREEN]]\u3092\u6d88\u8017\u3057\u305f -Herbalism.Skills.GTe.Other.On=[[GREEN]]{0}[[DARK_GREEN]]\u304c [[RED]]\u30b0\u30ea\u30fc\u30f3\u30c6\u30e9 [[DARK_GREEN]]\u3092\u4f7f\u3063\u305f\uff01 +Herbalism.Ability.GTe.NeedMore=緑を増やすにはもっと種が必要です。 +Herbalism.Ability.GTh.Fail=**グリーンサム 失敗** +Herbalism.Ability.GTh=&a**グリーンサム** +Herbalism.Ability.Lower=&7クワを下げた。 +Herbalism.Ability.Ready=&3クワを&6準備&3した。 +Herbalism.Ability.ShroomThumb.Fail=**シュルームサム 失敗** +Herbalism.SubSkill.GreenTerra.Name=グリーンテラ +Herbalism.SubSkill.GreenTerra.Description=緑を広げる, 3x ドロップ +Herbalism.SubSkill.GreenTerra.Stat=グリーンテラ 期間 +Herbalism.SubSkill.GreenThumb.Name=グリーンサム +Herbalism.SubSkill.GreenThumb.Description=作物の収穫時に自動で植え替えをする。 +Herbalism.SubSkill.GreenThumb.Stat=グリーンサムの確率 +Herbalism.SubSkill.GreenThumb.Stat.Extra=グリーンサム ステージ: &a 作物はステージ {0} に成長 +Herbalism.Effect.4=グリーンサム (ブロック) +Herbalism.SubSkill.GreenThumb.Description.2=石レンガを苔むした状態にする。または草を成長させる。 +Herbalism.SubSkill.FarmersDiet.Name=農家の食事 +Herbalism.SubSkill.FarmersDiet.Description=農作物から回復する満腹度を改善する。 +Herbalism.SubSkill.FarmersDiet.Stat=農家の食事: &aランク {0} +Herbalism.SubSkill.DoubleDrops.Name=ドロップ二倍 +Herbalism.SubSkill.DoubleDrops.Description=ドロップが二倍になる。 +Herbalism.SubSkill.DoubleDrops.Stat=ドロップ二倍の確率 +Herbalism.SubSkill.HylianLuck.Name=ハイリアンラック +Herbalism.SubSkill.HylianLuck.Description=希少品を見つける確率が上がる。 +Herbalism.SubSkill.HylianLuck.Stat=ハイリアンラックの確率 +Herbalism.SubSkill.ShroomThumb.Name=シュルームサム +Herbalism.SubSkill.ShroomThumb.Description=土や草に菌糸を広げる。 +Herbalism.SubSkill.ShroomThumb.Stat=シュルームサムの確率 +Herbalism.HylianLuck=&aハイリアンラックは今日のあなたについています! +Herbalism.Listener=農業: +Herbalism.SkillName=農業 +Herbalism.Skills.GTe.Off=**グリーンテラ を消耗した** +Herbalism.Skills.GTe.On=&a**グリーンテラ アクティベート** +Herbalism.Skills.GTe.Refresh=&eグリーンテラ &aアビリティが回復しました! +Herbalism.Skills.GTe.Other.Off=&e{0}が &fグリーンテラ &aを消耗した +Herbalism.Skills.GTe.Other.On=&a{0}&2が &cグリーンテラ &2を使った! # MINING -Mining.Ability.Locked.0=\u30ed\u30c3\u30af\u3055\u308c\u308b\u307e\u3067 {0}+ \u30b9\u30ad\u30eb (\u30d6\u30e9\u30b9\u30c8\u30de\u30a4\u30cb\u30f3\u30b0) -Mining.Ability.Locked.1=\u30ed\u30c3\u30af\u3055\u308c\u308b\u307e\u3067 {0}+ \u30b9\u30ad\u30eb (\u5927\u304d\u306a\u7206\u5f3e) -Mining.Ability.Locked.2=\u30ed\u30c3\u30af\u3055\u308c\u308b\u307e\u3067 {0}+ \u30b9\u30ad\u30eb (\u89e3\u4f53\u5c02\u9580\u77e5\u8b58) -Mining.Ability.Lower=[[GRAY]]\u30d4\u30c3\u30b1\u30eb\u3092\u4e0b\u3052\u305f\u3002 -Mining.Ability.Ready=[[DARK_AQUA]]\u30d4\u30c3\u30b1\u30eb\u3092[[GOLD]]\u6e96\u5099[[DARK_AQUA]]\u3057\u305f\u3002 -Mining.SubSkill.SuperBreaker.Name=\u30b9\u30fc\u30d1\u30fc\u30d6\u30ec\u30fc\u30ab\u30fc -Mining.SubSkill.SuperBreaker.Description=\u30b9\u30d4\u30fc\u30c9+, \u30c9\u30ed\u30c3\u30d7\u7387\u4e09\u500d -Mining.SubSkill.SuperBreaker.Stat=\u30b9\u30fc\u30d1\u30fc\u30d6\u30ec\u30fc\u30ab\u30fc\u306e\u9577\u3055 -Mining.SubSkill.DoubleDrops.Name=\u30c9\u30ed\u30c3\u30d7\u4e8c\u500d -Mining.SubSkill.DoubleDrops.Description=\u30c9\u30ed\u30c3\u30d7\u304c\u4e8c\u500d\u306b\u306a\u308b\u3002 -Mining.SubSkill.DoubleDrops.Stat=\u30c9\u30ed\u30c3\u30d7\u4e8c\u500d \u78ba\u7387: [[YELLOW]]{0} -Mining.SubSkill.BlastMining.Name=\u30d6\u30e9\u30b9\u30c8\u30de\u30a4\u30cb\u30f3\u30b0 -Mining.SubSkill.BlastMining.Description=TNT\u306b\u3088\u308b\u63a1\u6398\u306e\u30dc\u30fc\u30ca\u30b9 -Mining.SubSkill.BlastMining.Stat=\u30d6\u30e9\u30b9\u30c8\u30de\u30a4\u30cb\u30f3\u30b0:[[GREEN]] \u30e9\u30f3\u30af {0}/{1} [[GRAY]]({2}) -Mining.SubSkill.BlastMining.Stat.Extra=\u7206\u767a\u7bc4\u56f2\u5897\u52a0: [[GREEN]]+{0} -Mining.SubSkill.BiggerBombs.Name=\u5927\u304d\u306a\u7206\u5f3e -Mining.SubSkill.BiggerBombs.Description=TNT\u306e\u7206\u767a\u7bc4\u56f2\u3092\u62e1\u5927\u3059\u308b\u3002 -Mining.SubSkill.DemolitionsExpertise.Name=\u89e3\u4f53\u5c02\u9580\u77e5\u8b58 -Mining.SubSkill.DemolitionsExpertise.Description=TNT\u306b\u3088\u308b\u30c0\u30e1\u30fc\u30b8\u3092\u8efd\u6e1b\u3059\u308b\u3002 -Mining.SubSkill.DemolitionsExpertise.Stat=\u89e3\u4f53\u30a8\u30ad\u30b9\u30d1\u30fc\u30c8\u306e\u30c0\u30e1\u30fc\u30b8\u8efd\u6e1b -Mining.Listener=\u63a1\u6398: -Mining.SkillName=\u63a1\u6398 -Mining.Skills.SuperBreaker.Off=**\u30b9\u30fc\u30d1\u30fc\u30d6\u30ec\u30fc\u30ab\u30fc \u3092\u6d88\u8017\u3057\u305f** -Mining.Skills.SuperBreaker.On=[[GREEN]]**\u30b9\u30fc\u30d1\u30fc\u30d6\u30ec\u30fc\u30ab\u30fc \u30a2\u30af\u30c6\u30a3\u30d9\u30fc\u30c8** -Mining.Skills.SuperBreaker.Refresh=[[YELLOW]]\u30b9\u30fc\u30d1\u30fc\u30d6\u30ec\u30fc\u30ab\u30fc [[GREEN]]\u30a2\u30d3\u30ea\u30c6\u30a3\u304c\u56de\u5fa9\u3057\u307e\u3057\u305f\uff01 -Mining.Skills.SuperBreaker.Other.Off=[[YELLOW]]{0}\u304c [[WHITE]]\u30b9\u30fc\u30d1\u30fc\u30d6\u30ec\u30fc\u30ab\u30fc [[GREEN]]\u3092\u6d88\u8017\u3057\u305f -Mining.Skills.SuperBreaker.Other.On=[[GREEN]]{0}[[DARK_GREEN]]\u304c [[RED]]\u30b9\u30fc\u30d1\u30fc\u30d6\u30ec\u30fc\u30ab\u30fc [[DARK_GREEN]]\u3092\u4f7f\u3063\u305f\uff01 +Mining.Ability.Locked.0=ロックされるまで {0}+ スキル (ブラストマイニング) +Mining.Ability.Locked.1=ロックされるまで {0}+ スキル (大きな爆弾) +Mining.Ability.Locked.2=ロックされるまで {0}+ スキル (解体専門知識) +Mining.Ability.Lower=&7ピッケルを下げた。 +Mining.Ability.Ready=&3ピッケルを&6準備&3した。 +Mining.SubSkill.SuperBreaker.Name=スーパーブレイカー +Mining.SubSkill.SuperBreaker.Description=スピード+, ドロップ率三倍 +Mining.SubSkill.SuperBreaker.Stat=スーパーブレイカーの長さ +Mining.SubSkill.DoubleDrops.Name=ドロップ二倍 +Mining.SubSkill.DoubleDrops.Description=ドロップが二倍になる。 +Mining.SubSkill.DoubleDrops.Stat=ドロップ二倍の確率: &e{0} +Mining.SubSkill.BlastMining.Name=ブラストマイニング +Mining.SubSkill.BlastMining.Description=TNTによる採掘のボーナス +Mining.SubSkill.BlastMining.Stat=ブラストマイニング:&a ランク {0}/{1} &7({2}) +Mining.SubSkill.BlastMining.Stat.Extra=爆発範囲増加: &a+{0} +Mining.SubSkill.BiggerBombs.Name=大きな爆弾 +Mining.SubSkill.BiggerBombs.Description=TNTの爆発範囲を拡大する。 +Mining.SubSkill.DemolitionsExpertise.Name=解体専門知識 +Mining.SubSkill.DemolitionsExpertise.Description=TNTによるダメージを軽減する。 +Mining.SubSkill.DemolitionsExpertise.Stat=解体エキスパートのダメージ軽減 +Mining.Listener=採掘: +Mining.SkillName=採掘 +Mining.Skills.SuperBreaker.Off=**スーパーブレイカー を消耗した** +Mining.Skills.SuperBreaker.On=&a**スーパーブレイカー アクティベート** +Mining.Skills.SuperBreaker.Other.Off=&e{0}が &fスーパーブレイカー &aを消耗した +Mining.Skills.SuperBreaker.Other.On=&a{0}&2が &cスーパーブレイカー &2を使った! +Mining.Skills.SuperBreaker.Refresh=&eスーパーブレイカー &aアビリティが回復しました! # Blast Mining -Mining.Blast.Boom=[[GRAY]]**BOOM** +Mining.Blast.Boom=&7**BOOM** Mining.Blast.Cooldown= -Mining.Blast.Effect=+{0} ore yield, {1}x \u30c9\u30ed\u30c3\u30d7 -Mining.Blast.Other.On=[[GREEN]]{0}[[DARK_GREEN]] \u304c [[RED]]\u30d6\u30e9\u30b9\u30c8\u30de\u30a4\u30cb\u30f3\u30b0 [[DARK_GREEN]]\u3092\u4f7f\u3063\u305f\uff01 -Mining.Blast.Refresh=[[YELLOW]]\u30d6\u30e9\u30b9\u30c8\u30de\u30a4\u30cb\u30f3\u30b0[GREEN]]\u30a2\u30d3\u30ea\u30c6\u30a3\u304c\u56de\u5fa9\u3057\u307e\u3057\u305f\uff01 +Mining.Blast.Effect=鉱石 +{0} の収量, {1}x ドロップ +Mining.Blast.Other.On=&a{0}&2 が &cブラストマイニング &2を使った! +Mining.Blast.Refresh=&eブラストマイニング[GREEN]]アビリティが回復しました! # REPAIR -Repair.SubSkill.Repair.Name=\u4fee\u7406 -Repair.SubSkill.Repair.Description=\u30c4\u30fc\u30eb\u3068\u9632\u5177\u3092\u4fee\u7406\u3059\u308b\u3002 -Repair.SubSkill.GoldRepair.Name=\u91d1 \u4fee\u7406 ({0}+ SKILL) -Repair.SubSkill.GoldRepair.Description=\u91d1\u306e\u30c4\u30fc\u30eb\u3068\u9632\u5177\u3092\u4fee\u7406\u3059\u308b\u3002 -Repair.SubSkill.IronRepair.Name=\u9244 \u4fee\u7406 ({0}+ SKILL) -Repair.SubSkill.IronRepair.Description=\u9244\u306e\u30c4\u30fc\u30eb\u3068\u9632\u5177\u3092\u4fee\u7406\u3059\u308b\u3002 -Repair.SubSkill.StoneRepair.Name=\u77f3 \u4fee\u7406 ({0}+ SKILL) -Repair.SubSkill.StoneRepair.Description=\u77f3\u306e\u30c4\u30fc\u30eb\u3068\u9632\u5177\u3092\u4fee\u7406\u3059\u308b\u3002 -Repair.SubSkill.RepairMastery.Name=\u4fee\u7406 \u7df4\u5ea6 -Repair.SubSkill.RepairMastery.Description=\u4fee\u7406\u91cf\u306e\u5897\u52a0 -Repair.SubSkill.RepairMastery.Stat=\u4fee\u7406 \u7df4\u5ea6: [[GREEN]]Extra {0} durability restored -Repair.SubSkill.SuperRepair.Name=\u30b9\u30fc\u30d1\u30fc\u4fee\u7406 -Repair.SubSkill.SuperRepair.Description=\u4e8c\u91cd\u306e\u52b9\u679c -Repair.SubSkill.SuperRepair.Stat=\u30b9\u30fc\u30d1\u30fc\u4fee\u7406 \u78ba\u7387 -Repair.SubSkill.DiamondRepair.Name=\u30c0\u30a4\u30a2\u30e2\u30f3\u30c9 \u4fee\u7406 ({0}+ SKILL) -Repair.SubSkill.DiamondRepair.Description=\u30c0\u30a4\u30a2\u30e2\u30f3\u30c9\u306e\u30c4\u30fc\u30eb\u3068\u9632\u5177\u3092\u4fee\u7406\u3059\u308b\u3002 -Repair.SubSkill.ArcaneForging.Name=\u96e3\u89e3\u306a\u935b\u9020 -Repair.SubSkill.ArcaneForging.Description=\u9b54\u6cd5\u306e\u30a2\u30a4\u30c6\u30e0\u3092\u4fee\u7406\u3059\u308b\u3002 -Repair.SubSkill.ArcaneForging.Stat=\u96e3\u89e3\u306a\u935b\u9020: [[YELLOW]]\u30e9\u30f3\u30af {0}/{1} -Repair.SubSkill.ArcaneForging.Stat.Extra=[[DARK_AQUA]]\u96e3\u89e3\u306a\u935b\u9020 \u30aa\u30c3\u30ba:[[GRAY]] \u6210\u529f [[GREEN]]{0}[[GRAY]]%, \u5931\u6557 [[RED]]{1}[[GRAY]]% -Repair.Error=[[DARK_RED]]\u3053\u306e\u30a2\u30a4\u30c6\u30e0\u3092\u4fee\u7406\u3057\u3088\u3046\u3068\u3057\u3066\u3044\u308b\u3068\u304d\u306bmcMMO\u3067\u30a8\u30e9\u30fc\u304c\u767a\u751f\u3057\u307e\u3057\u305f\u3002 -Repair.Listener.Anvil=[[DARK_RED]]\u9244\u5e8a\u3092\u8a2d\u7f6e\u3057\u307e\u3057\u305f\u3001\u9244\u5e8a\u306f\u30c4\u30fc\u30eb\u3068\u9632\u5177\u3092\u4fee\u7406\u3067\u304d\u307e\u3059\u3002 -Repair.Listener=\u4fee\u7406: -Repair.SkillName=\u4fee\u7406 -Repair.Skills.AdeptDiamond=[[DARK_RED]]\u3042\u306a\u305f\u306f\u30c0\u30a4\u30e4\u30e2\u30f3\u30c9\u3092\u4fee\u7406\u3059\u308b\u306e\u306b\u5341\u5206\u306a\u7df4\u5ea6\u3092\u5f97\u3066\u3044\u307e\u305b\u3093\u3002 -Repair.Skills.AdeptGold=[[DARK_RED]]\u3042\u306a\u305f\u306f\u91d1\u3092\u4fee\u7406\u3059\u308b\u306e\u306b\u5341\u5206\u306a\u7df4\u5ea6\u3092\u5f97\u3066\u3044\u307e\u305b\u3093\u3002 -Repair.Skills.AdeptIron=[[DARK_RED]]\u3042\u306a\u305f\u306f\u9244\u3092\u4fee\u7406\u3059\u308b\u306e\u306b\u5341\u5206\u306a\u7df4\u5ea6\u3092\u5f97\u3066\u3044\u307e\u305b\u3093\u3002 -Repair.Skills.AdeptStone=[[DARK_RED]]\u3042\u306a\u305f\u306f\u77f3\u3092\u4fee\u7406\u3059\u308b\u306e\u306b\u5341\u5206\u306a\u7df4\u5ea6\u3092\u5f97\u3066\u3044\u307e\u305b\u3093\u3002 -Repair.Skills.Adept=[[YELLOW]]{1} [[RED]]\u3092\u4fee\u7406\u3059\u308b\u305f\u3081\u306b\u306f [[YELLOW]]{0} [[RED]]\u30ec\u30d9\u30eb\u304c\u5fc5\u8981\u3067\u3059\u3002 -Repair.Skills.FeltEasy=[[GRAY]]\u305d\u308c\u306f\u7c21\u5358\u306b\u611f\u3058\u305f\u3002 -Repair.Skills.FullDurability=[[GRAY]]\u305d\u308c\u306f\u5b8c\u5168\u306a\u8010\u4e45\u6027\u3067\u3059\u3002 -Repair.Skills.StackedItems=[[DARK_RED]]\u30b9\u30bf\u30c3\u30af\u3055\u308c\u305f\u30a2\u30a4\u30c6\u30e0\u306f\u4fee\u7406\u3067\u304d\u307e\u305b\u3093\u3002 -Repair.Pretty.Name=\u4fee\u7406 +Repair.SubSkill.Repair.Name=修理 +Repair.SubSkill.Repair.Description=ツールと防具を修理する。 +Repair.SubSkill.GoldRepair.Name=金 修理 ({0}+ SKILL) +Repair.SubSkill.GoldRepair.Description=金のツールと防具を修理する。 +Repair.SubSkill.IronRepair.Name=鉄 修理 ({0}+ SKILL) +Repair.SubSkill.IronRepair.Description=鉄のツールと防具を修理する。 +Repair.SubSkill.StoneRepair.Name=石 修理 ({0}+ SKILL) +Repair.SubSkill.StoneRepair.Description=石のツールと防具を修理する。 +Repair.SubSkill.RepairMastery.Name=リペアマスタリー +Repair.SubSkill.RepairMastery.Description=修理量の増加 +Repair.SubSkill.RepairMastery.Stat=リペアマスタリー: &a追加 {0} 耐久力回復 +Repair.SubSkill.SuperRepair.Name=スーパーリペア +Repair.SubSkill.SuperRepair.Description=二重の効果 +Repair.SubSkill.SuperRepair.Stat=スーパーリペアの確率 +Repair.SubSkill.DiamondRepair.Name=ダイアモンド 修理 ({0}+ SKILL) +Repair.SubSkill.DiamondRepair.Description=ダイアモンドのツールと防具を修理する。 +Repair.SubSkill.ArcaneForging.Name=アルカンフォージング +Repair.SubSkill.ArcaneForging.Description=魔法のアイテムを修理する。 +Repair.SubSkill.ArcaneForging.Stat=アルカンフォージング: &eランク {0}/{1} +Repair.SubSkill.ArcaneForging.Stat.Extra=&3アルカンフォージング オッズ:&7 成功 &a{0}&7%, 失敗 &c{1}&7% +Repair.Error=&4このアイテムを修理しようとしているときにmcMMOでエラーが発生しました。 +Repair.Listener.Anvil=&4鉄床を設置しました、鉄床はツールと防具を修理できます。 +Repair.Listener=修理: +Repair.SkillName=修理 +Repair.Skills.AdeptDiamond=&4あなたはダイヤモンドを修理するのに十分な練度を得ていません。 +Repair.Skills.AdeptGold=&4あなたは金を修理するのに十分な練度を得ていません。 +Repair.Skills.AdeptIron=&4あなたは鉄を修理するのに十分な練度を得ていません。 +Repair.Skills.AdeptStone=&4あなたは石を修理するのに十分な練度を得ていません。 +Repair.Skills.Adept=&e{1} &cを修理するためには &e{0} &cレベルが必要です。 +Repair.Skills.FeltEasy=&7それは簡単に感じた。 +Repair.Skills.FullDurability=&7それは完全な耐久性です。 +Repair.Skills.StackedItems=&4スタックされたアイテムは修理できません。 +Repair.Pretty.Name=修理 # Arcane Forging -Repair.Arcane.Downgrade=\u3053\u306e\u30a2\u30a4\u30c6\u30e0\u306e\u96e3\u89e3\u306a\u529b\u306f\u6e1b\u5c11\u3057\u307e\u3057\u305f\u3002 -Repair.Arcane.Fail=\u96e3\u89e3\u306a\u529b\u306f\u3053\u306e\u30a2\u30a4\u30c6\u30e0\u304b\u3089\u6d88\u3048\u307e\u3057\u305f\u3002 -Repair.Arcane.Lost=\u3042\u306a\u305f\u306f\u30a8\u30f3\u30c1\u30e3\u30f3\u30c8\u3059\u308b\u7a0b\u5341\u5206\u306a\u7df4\u5ea6\u3092\u7372\u5f97\u3057\u3066\u3044\u307e\u305b\u3093\u3067\u3057\u305f\u3002 -Repair.Arcane.Perfect=[[GREEN]]\u3042\u306a\u305f\u306f\u3053\u306e\u30a2\u30a4\u30c6\u30e0\u306e\u96e3\u89e3\u306a\u30a8\u30cd\u30eb\u30ae\u30fc\u3092\u6301\u7d9a\u3057\u3066\u304d\u307e\u3057\u305f\u3002 +Repair.Arcane.Downgrade=このアイテムの難解な力は減少しました。 +Repair.Arcane.Fail=難解な力はこのアイテムから消えました。 +Repair.Arcane.Lost=あなたはエンチャントする程十分な練度を獲得していませんでした。 +Repair.Arcane.Perfect=&aあなたはこのアイテムの難解なエネルギーを持続してきました。 # SALVAGE -Salvage.Pretty.Name=\u30b5\u30eb\u30d9\u30fc\u30b8 -Salvage.SubSkill.UnderstandingTheArt.Name=\u82b8\u8853\u3092\u7406\u89e3\u3059\u308b\u3002 -Salvage.SubSkill.UnderstandingTheArt.Description=\u3042\u306a\u305f\u306f\u305f\u3060\u3042\u306a\u305f\u306e\u96a3\u4eba\u306e\u30b4\u30df\u3092\u6398\u308a\u4e0b\u3052\u308b\u306e\u3067\u306f\u306a\u304f\u3001\u3042\u306a\u305f\u306f\u74b0\u5883\u306e\u4e16\u8a71\u3092\u3057\u3066\u3044\u307e\u3059\u3002\n\u30b5\u30eb\u30d9\u30fc\u30b8\u306e\u69d8\u3005\u306a\u7279\u6027\u3092\u5f15\u304d\u51fa\u3059\u3002 -Salvage.SubSkill.ScrapCollector.Name=\u30b9\u30af\u30e9\u30c3\u30d7\u30b3\u30ec\u30af\u30bf\u30fc -Salvage.SubSkill.ScrapCollector.Description=\u30b5\u30eb\u30d9\u30fc\u30b8\u306b\u3088\u308b\u30a2\u30a4\u30c6\u30e0\u304b\u3089\u306e\u7d20\u6750\u56de\u53ce\u3001\u5b8c\u74a7\u306a\u30b5\u30eb\u30d9\u30fc\u30b8\u306f\u30b9\u30ad\u30eb\u3068\u904b\u306b\u4f9d\u5b58\u3057\u307e\u3059\u3002 -Salvage.SubSkill.ScrapCollector.Stat=\u30b9\u30af\u30e9\u30c3\u30d7\u30b3\u30ec\u30af\u30bf\u30fc: [[GREEN]]\u6700\u5927[[YELLOW]]{0}\u500b[[GREEN]]\u306e\u30a2\u30a4\u30c6\u30e0\u3092\u30b5\u30eb\u30d9\u30fc\u30b8\u3002\u904b\u304c\u95a2\u4fc2\u3057\u3066\u3044\u307e\u3059\u3002 -Salvage.SubSkill.ArcaneSalvage.Name=\u96e3\u89e3\u306a\u30b5\u30eb\u30d9\u30fc\u30b8 -Salvage.SubSkill.ArcaneSalvage.Description=\u30a2\u30a4\u30c6\u30e0\u304b\u3089\u30a8\u30f3\u30c1\u30e3\u30f3\u30c8\u3092\u62bd\u51fa\u3059\u308b\u3002 -Salvage.SubSkill.ArcaneSalvage.Stat=\u96e3\u89e3\u306a\u30b5\u30eb\u30d9\u30fc\u30b8: [[YELLOW]]\u30e9\u30f3\u30af {0}/{1} -Salvage.Ability.Bonus.0=\u30b9\u30af\u30e9\u30c3\u30d7\u30b3\u30ec\u30af\u30bf\u30fc -Salvage.Ability.Bonus.1=[[GREEN]]\u6700\u5927[[YELLOW]]{0}\u500b[[GREEN]]\u306e\u30a2\u30a4\u30c6\u30e0\u3092\u30b5\u30eb\u30d9\u30fc\u30b8\u3002\u904b\u304c\u95a2\u4fc2\u3057\u3066\u3044\u307e\u3059\u3002 -Salvage.Arcane.ExtractFull=[[GRAY]]\u30d5\u30eb\u30a8\u30f3\u30c1\u30e3\u30f3\u30c8 \u78ba\u7387 -Salvage.Arcane.ExtractPartial=[[GRAY]]\u90e8\u5206\u7684\u306a\u30a8\u30f3\u30c1\u30e3\u30f3\u30c8 \u78ba\u7387 -Salvage.Skills.Success=[[GREEN]]\u30a2\u30a4\u30c6\u30e0\u3092\u30b5\u30eb\u30d9\u30fc\u30b8\uff01 -Salvage.Skills.Adept.Damaged=[[DARK_RED]]\u3042\u306a\u305f\u306f\u8010\u4e45\u5024\u306e\u6e1b\u3063\u305f\u30a2\u30a4\u30c6\u30e0\u3092\u30b5\u30eb\u30d9\u30fc\u30b8\u3059\u308b\u306e\u306b\u5341\u5206\u306a\u7df4\u5ea6\u3092\u5f97\u3066\u3044\u307e\u305b\u3093\u3002 -Salvage.Skills.Adept.Level=[[YELLOW]]{1} [[RED]]\u3092\u30b5\u30eb\u30d9\u30fc\u30b8\u3059\u308b\u305f\u3081\u306b\u306f [[YELLOW]]{0} [[RED]]\u30ec\u30d9\u30eb\u304c\u5fc5\u8981\u3067\u3059\u3002 -Salvage.Skills.TooDamaged=[[DARK_RED]]\u3053\u306e\u30a2\u30a4\u30c6\u30e0\u306f\u30c0\u30e1\u30fc\u30b8\u3092\u53d7\u3051\u3066\u3044\u308b\u305f\u3081\u3001\u30b5\u30eb\u30d9\u30fc\u30b8\u3067\u304d\u307e\u305b\u3093\u3002 -Salvage.Skills.ArcaneFailed=[[RED]]\u3053\u306e\u30a2\u30a4\u30c6\u30e0\u306b\u542b\u307e\u308c\u3066\u3044\u308b\u77e5\u8b58\u3092\u62bd\u51fa\u3067\u304d\u307e\u305b\u3093\u3067\u3057\u305f\u3002 -Salvage.Skills.ArcanePartial=[[RED]]\u3053\u306e\u30a2\u30a4\u30c6\u30e0\u306b\u542b\u307e\u308c\u3066\u3044\u308b\u77e5\u8b58\u3092\u4e00\u90e8\u3057\u304b\u62bd\u51fa\u3067\u304d\u307e\u305b\u3093\u3067\u3057\u305f\u3002 -Salvage.Skills.ArcaneSuccess=[[GREEN]]\u3053\u306e\u30a2\u30a4\u30c6\u30e0\u306b\u542b\u307e\u308c\u3066\u3044\u308b\u77e5\u8b58\u3092\u62bd\u51fa\u3067\u304d\u307e\u3057\u305f\uff01 -Salvage.Listener.Anvil=[[DARK_RED]]\u3042\u306a\u305f\u306f\u30b5\u30eb\u30d9\u30fc\u30b8\u30a2\u30f3\u30d3\u30eb\u3092\u8a2d\u7f6e\u3057\u307e\u3057\u305f\u3002\u3053\u308c\u3092\u30c4\u30fc\u30eb\u3068\u9632\u5177\u306e\u30b5\u30eb\u30d9\u30fc\u30b8\u306b\u4f7f\u3063\u3066\u304f\u3060\u3055\u3044\u3002 -Salvage.Listener=\u30b5\u30eb\u30d9\u30fc\u30b8: -Salvage.SkillName=\u30b5\u30eb\u30d9\u30fc\u30b8 -Salvage.Skills.Lottery.Normal=[[YELLOW]]{1}[[GOLD]]\u304b\u3089[[DARK_AQUA]]{0}[[GOLD]]\u306e\u7d20\u6750\u3092\u56de\u53ce\u3059\u308b\u3053\u3068\u304c\u3067\u304d\u307e\u3057\u305f\u3002 -Salvage.Skills.Lottery.Perfect=[[GREEN]][[BOLD]]\u30d1\u30fc\u30d5\u30a7\u30af\u30c8\uff01[[RESET]][[GOLD]] \u3042\u306a\u305f\u306f [[DARK_AQUA]]{1}[[GOLD]]\u3092\u30b5\u30eb\u30d9\u30fc\u30b8\u3057\u3001[[DARK_AQUA]]{0}[[GOLD]]\u500b\u306e\u7d20\u6750\u3092\u56de\u53ce\u3057\u307e\u3057\u305f\u3002 -Salvage.Skills.Lottery.Untrained=[[GRAY]]\u3042\u306a\u305f\u306f\u30b5\u30eb\u30d9\u30fc\u30b8\u3092\u6b63\u3057\u304f\u8a13\u7df4\u3067\u304d\u3066\u3044\u307e\u305b\u3093\u3002 [[GREEN]]{1}[[GRAY]]\u304b\u3089[[RED]]{0}[[GRAY]]\u500b\u306e\u7d20\u6750\u3057\u304b\u56de\u53ce\u3067\u304d\u307e\u305b\u3093\u3067\u3057\u305f +Salvage.Pretty.Name=サルベージ +Salvage.SubSkill.UnderstandingTheArt.Name=芸術を理解する。 +Salvage.SubSkill.UnderstandingTheArt.Description=あなたはただあなたの隣人のゴミを掘り下げるのではなく、あなたは環境の世話をしています。\nサルベージの様々な特性を引き出す。 +Salvage.SubSkill.ScrapCollector.Name=スクラップコレクター +Salvage.SubSkill.ScrapCollector.Description=サルベージによるアイテムからの素材回収、完璧なサルベージはスキルと運に依存します。 +Salvage.SubSkill.ScrapCollector.Stat=スクラップコレクター: &a最大&e{0}個&aのアイテムをサルベージ。運が関係しています。 +Salvage.SubSkill.ArcaneSalvage.Name=アルカンサルベージ +Salvage.SubSkill.ArcaneSalvage.Description=アイテムからエンチャントを抽出する。 +Salvage.SubSkill.ArcaneSalvage.Stat=アルカンサルベージ: &eランク {0}/{1} +Salvage.Ability.Bonus.0=スクラップコレクター +Salvage.Ability.Bonus.1=&a最大&e{0}個&aのアイテムをサルベージ。運が関係しています。 +Salvage.Arcane.ExtractFull=&7フルエンチャントの確率 +Salvage.Arcane.ExtractPartial=&7部分的なエンチャントの確率 +Salvage.Skills.Success=&aアイテムをサルベージ! +Salvage.Skills.Adept.Damaged=&4あなたは耐久値の減ったアイテムをサルベージするのに十分な練度を得ていません。 +Salvage.Skills.Adept.Level=&e{1} &cをサルベージするためには &e{0} &cレベルが必要です。 +Salvage.Skills.TooDamaged=&4このアイテムはダメージを受けているため、サルベージできません。 +Salvage.Skills.ArcaneFailed=&cこのアイテムに含まれている知識を抽出できませんでした。 +Salvage.Skills.ArcanePartial=&cこのアイテムに含まれている知識を一部しか抽出できませんでした。 +Salvage.Skills.ArcaneSuccess=&aこのアイテムに含まれている知識を抽出できました! +Salvage.Listener.Anvil=&4あなたはサルベージアンビルを設置しました。これをツールと防具のサルベージに使ってください。 +Salvage.Listener=サルベージ: +Salvage.SkillName=サルベージ +Salvage.Skills.Lottery.Normal=&e{1}&6から&3{0}&6の素材を回収することができました。 +Salvage.Skills.Lottery.Perfect=&a&lパーフェクト!&r&6 あなたは &3{1}&6をサルベージし、&3{0}&6個の素材を回収しました。 +Salvage.Skills.Lottery.Untrained=&7あなたはサルベージを正しく訓練できていません。 &a{1}&7から&c{0}&7個の素材しか回収できませんでした # Anvil (Shared between SALVAGE and REPAIR) -Anvil.Unbreakable=\u3053\u306e\u30a2\u30a4\u30c6\u30e0\u306f\u58ca\u308c\u307e\u305b\u3093\uff01 +Anvil.Unbreakable=このアイテムは壊れません! # SWORDS -Swords.Ability.Lower=[[GRAY]]\u5263\u3092\u4e0b\u3052\u305f\u3002 -Swords.Ability.Ready=[[DARK_AQUA]]\u5263\u3092[[GOLD]]\u6e96\u5099[[DARK_AQUA]]\u3057\u305f\u3002 -Swords.Combat.Rupture.Note=[[GREY]]\u6ce8\u610f\uff1a[[YELLOW]] 0.5\u79d2\u3054\u3068\u306b1tick\u304c\u767a\u751f\u3057\u307e\u3059\u3002 -Swords.Combat.Bleeding.Started=[[DARK_RED]] \u3042\u306a\u305f\u306f\u51fa\u8840\u3057\u3066\u3044\u307e\u3059\uff01 -Swords.Combat.Bleeding.Stopped=[[GRAY]]\u51fa\u8840\u304c [[GREEN]]\u6b62\u307e\u308a\u307e\u3057\u305f[[GRAY]]\uff01 -Swords.Combat.Bleeding=[[GREEN]]**\u30a8\u30cd\u30df\u30fc \u51fa\u8840** -Swords.Combat.Counter.Hit=[[DARK_RED]]\u30ab\u30a6\u30f3\u30bf\u30fc\u653b\u6483\u304c\u30d2\u30c3\u30c8\uff01 -Swords.Combat.Countered=[[GREEN]]**\u30ab\u30a6\u30f3\u30bf\u30fc\u653b\u6483** -Swords.Combat.SS.Struck=[[DARK_RED]]Struck by SERRATED STRIKES! -Swords.SubSkill.CounterAttack.Name=\u30ab\u30a6\u30f3\u30bf\u30fc\u653b\u6483 -Swords.SubSkill.CounterAttack.Description=\u653b\u6483\u3055\u308c\u305f\u3068\u304d\u306b\u30c0\u30e1\u30fc\u30b8\u306e\u4e00\u90e8\u3092\u53cd\u5c04\u3059\u308b\uff01 -Swords.SubSkill.CounterAttack.Stat=\u30ab\u30a6\u30f3\u30bf\u30fc\u653b\u6483 \u78ba\u7387 -Swords.SubSkill.SerratedStrikes.Name=\u92f8\u6b6f\u72b6\u306e\u653b\u6483 -Swords.SubSkill.SerratedStrikes.Description=AOE\u3067\u30c0\u30e1\u30fc\u30b8\u3092\u4e0e\u3048\u3001\u7834\u88c2\u3092\u3055\u305b\u308b\u53ef\u80fd\u6027\u304c\u3042\u308a\u307e\u3059\uff01 -Swords.SubSkill.SerratedStrikes.Stat=\u92f8\u6b6f\u72b6\u306e\u653b\u6483\u306e\u9577\u3055 -Swords.SubSkill.Rupture.Name=\u7834\u88c2 -Swords.SubSkill.Rupture.Description=\u5f37\u529b\u306a\u51fa\u8840DoT\u3092\u4e0e\u3048\u308b\u3002 -Swords.SubSkill.Stab.Name=\u30b9\u30bf\u30d6 -Swords.SubSkill.Stab.Description=\u653b\u6483\u306b\u30dc\u30fc\u30ca\u30b9\u30c0\u30e1\u30fc\u30b8\u3092\u4e0e\u3048\u308b\u3002 -Swords.SubSkill.Stab.Stat=\u30b9\u30bf\u30d6 \u30c0\u30e1\u30fc\u30b8 -Swords.SubSkill.SwordsLimitBreak.Name=\u5263 \u9650\u754c\u7a81\u7834 -Swords.SubSkill.SwordsLimitBreak.Description=\u9650\u754c\u3092\u7834\u308b\u3002\u30bf\u30d5\u306a\u6575\u306b\u5bfe\u3059\u308b\u30c0\u30e1\u30fc\u30b8\u304c\u5897\u52a0\u3057\u307e\u3059\u3002PvP\u3092\u5bfe\u8c61\u3068\u3057\u3001PvE\u3078\u306e\u9069\u5fdc\u306f\u30b5\u30fc\u30d0\u30fc\u306e\u8a2d\u5b9a\u6b21\u7b2c\u3067\u3059\u3002 -Swords.SubSkill.SwordsLimitBreak.Stat=\u9650\u754c\u7a81\u7834 \u8ffd\u52a0\u30c0\u30e1\u30fc\u30b8 -Swords.SubSkill.Rupture.Stat=\u7834\u88c2 \u78ba\u7387 -Swords.SubSkill.Rupture.Stat.Extra=\u7834\u88c2: [[GREEN]]{0} ticks [{1} DMG vs Player] [{2} DMG vs Mobs] -Swords.Effect.4=\u92f8\u6b6f\u72b6\u306e\u653b\u6483\u306e\u7834\u88c2+ -Swords.Effect.5={0} Tick \u7834\u88c2 -Swords.Listener=\u5263: -Swords.SkillName=\u5263 -Swords.Skills.SS.Off=**\u92f8\u6b6f\u72b6\u306e\u653b\u6483 \u3092\u6d88\u8017\u3057\u305f** -Swords.Skills.SS.On=[[GREEN]]**\u92f8\u6b6f\u72b6\u306e\u653b\u6483 \u30a2\u30af\u30c6\u30a3\u30d9\u30fc\u30c8** -Swords.Skills.SS.Refresh=[[YELLOW]]\u92f8\u6b6f\u72b6\u306e\u653b\u6483 [[GREEN]]\u30a2\u30d3\u30ea\u30c6\u30a3\u304c\u56de\u5fa9\u3057\u307e\u3057\u305f\uff01 -Swords.Skills.SS.Other.Off=[[YELLOW]]{0}\u304c [[WHITE]]\u92f8\u6b6f\u72b6\u306e\u653b\u6483 [[GREEN]]\u3092\u6d88\u8017\u3057\u305f -Swords.Skills.SS.Other.On=[[GREEN]]{0}[[DARK_GREEN]] \u304c [[RED]]\u92f8\u6b6f\u72b6\u306e\u653b\u6483 [[DARK_GREEN]]\u3092\u4f7f\u3063\u305f\uff01 +Swords.Ability.Lower=&7剣を下げた。 +Swords.Ability.Ready=&3剣を&6準備&3した。 +Swords.Combat.Rupture.Note=&7注意:&e 0.5秒ごとに1tickが発生します。 +Swords.Combat.Bleeding.Started=&4 あなたは出血しています! +Swords.Combat.Bleeding.Stopped=&7出血が &a止まりました&7! +Swords.Combat.Bleeding=&a**エネミー 出血** +Swords.Combat.Counter.Hit=&4カウンター攻撃がヒット! +Swords.Combat.Countered=&a**カウンター攻撃** +Swords.Combat.SS.Struck=&4Struck by SERRATED STRIKES! +Swords.SubSkill.CounterAttack.Name=カウンター攻撃 +Swords.SubSkill.CounterAttack.Description=攻撃されたときにダメージの一部を反射する! +Swords.SubSkill.CounterAttack.Stat=カウンター攻撃の確率 +Swords.SubSkill.SerratedStrikes.Name=セレーションストライク +Swords.SubSkill.SerratedStrikes.Description=AOEでダメージを与え、破裂をさせる可能性があります! +Swords.SubSkill.SerratedStrikes.Stat=セレーションストライクの長さ +Swords.SubSkill.Rupture.Name=破裂 +Swords.SubSkill.Rupture.Description=強力な出血DoTを与える。 +Swords.SubSkill.Stab.Name=スタブ +Swords.SubSkill.Stab.Description=攻撃にボーナスダメージを与える。 +Swords.SubSkill.Stab.Stat=スタブ ダメージ +Swords.SubSkill.SwordsLimitBreak.Name=剣 限界突破 +Swords.SubSkill.SwordsLimitBreak.Description=限界を破る。タフな敵に対するダメージが増加します。PvPを対象とし、PvEへの適応はサーバーの設定次第です。 +Swords.SubSkill.SwordsLimitBreak.Stat=限界突破 追加ダメージ +Swords.SubSkill.Rupture.Stat=破裂の確率 +Swords.SubSkill.Rupture.Stat.Extra=&3破裂: &e{0}s&a vs プレイヤー, &e{1}s&a vs Mobs. +Swords.SubSkill.Rupture.Stat.TickDamage=&3破裂のティックあたりのダメージ: &e{0}&a vs プレイヤー, &e{1}&a vs Mobs. +Swords.SubSkill.Rupture.Stat.ExplosionDamage=&3破裂の爆発ダメージ: &e{0}&a vs プレイヤー, &e{1}&a vs Mobs +Swords.Effect.4=セレーションストライクの破裂+ +Swords.Effect.5={0} Tick 破裂 +Swords.Listener=剣: +Swords.SkillName=剣 +Swords.Skills.SS.Off=**セレーションストライク を消耗した** +Swords.Skills.SS.On=&a**セレーションストライク アクティベート** +Swords.Skills.SS.Refresh=&eセレーションストライク &aアビリティが回復しました! +Swords.Skills.SS.Other.Off=&e{0}が &fセレーションストライク &aを消耗した +Swords.Skills.SS.Other.On=&a{0}&2 が &cセレーションストライク &2を使った! # TAMING -Taming.Ability.Bonus.0=\u74b0\u5883\u306b\u914d\u616e -Taming.Ability.Bonus.1=\u72fc\u306f\u5371\u967a\u3092\u907f\u3051\u308b -Taming.Ability.Bonus.2=\u539a\u3044\u6bdb\u76ae -Taming.Ability.Bonus.3=1/{0} \u30c0\u30e1\u30fc\u30b8, \u8010\u706b\u6027 -Taming.Ability.Bonus.4=\u885d\u6483\u8010\u6027 -Taming.Ability.Bonus.5=\u7206\u767a\u7269\u304c 1/{0} \u30c0\u30e1\u30fc\u30b8\u4e0e\u3048\u308b -Taming.Ability.Bonus.6=\u92ed\u3044\u722a -Taming.Ability.Bonus.7=+{0} \u30c0\u30e1\u30fc\u30b8 -Taming.Ability.Bonus.8=\u30d5\u30a1\u30fc\u30b9\u30c8\u30d5\u30fc\u30c9\u30b5\u30fc\u30d3\u30b9 -Taming.Ability.Bonus.9={0} \u306e\u78ba\u7387\u3067\u653b\u6483\u6642\u56de\u5fa9 -Taming.Ability.Bonus.10=\u30db\u30fc\u30ea\u30fc\u30cf\u30a6\u30f3\u30c9 -Taming.Ability.Bonus.11=\u9b54\u6cd5\u3084\u6bd2\u3067\u30c0\u30e1\u30fc\u30b8\u3092\u53d7\u3051\u305f\u6642\u72b6\u614b\u7570\u5e38\u3092\u53d6\u308a\u6d88\u3059\u3002 -Taming.Ability.Locked.0=\u30ed\u30c3\u30af\u3055\u308c\u308b\u307e\u3067 {0}+ \u30b9\u30ad\u30eb (\u74b0\u5883\u914d\u616e) -Taming.Ability.Locked.1=\u30ed\u30c3\u30af\u3055\u308c\u308b\u307e\u3067 {0}+ \u30b9\u30ad\u30eb (\u539a\u3044\u6bdb\u76ae) -Taming.Ability.Locked.2=\u30ed\u30c3\u30af\u3055\u308c\u308b\u307e\u3067 {0}+ \u30b9\u30ad\u30eb (\u885d\u6483\u8010\u6027) -Taming.Ability.Locked.3=\u30ed\u30c3\u30af\u3055\u308c\u308b\u307e\u3067 {0}+ \u30b9\u30ad\u30eb (\u92ed\u3044\u722a) -Taming.Ability.Locked.4=\u30ed\u30c3\u30af\u3055\u308c\u308b\u307e\u3067 {0}+ \u30b9\u30ad\u30eb (\u30d5\u30a1\u30fc\u30b9\u30c8\u30d5\u30fc\u30c9\u30b5\u30fc\u30d3\u30b9) -Taming.Ability.Locked.5=\u30ed\u30c3\u30af\u3055\u308c\u308b\u307e\u3067 {0}+ \u30b9\u30ad\u30eb (\u30db\u30fc\u30ea\u30fc\u30cf\u30a6\u30f3\u30c9) -Taming.Combat.Chance.Gore=\u30b4\u30a2 \u78ba\u7387 -Taming.SubSkill.BeastLore.Name=\u30d3\u30fc\u30b9\u30c8\u30ed\u30a2 -Taming.SubSkill.BeastLore.Description=\u72fc\u3068\u732b\u3092\u9aa8\u3067\u691c\u67fb\u3059\u308b\u3002 -Taming.SubSkill.ShockProof.Name=\u885d\u6483\u8010\u6027 -Taming.SubSkill.ShockProof.Description=\u7206\u767a\u30c0\u30e1\u30fc\u30b8\u306e\u8efd\u6e1b -Taming.SubSkill.CallOfTheWild.Name=\u30ef\u30a4\u30eb\u30c9\u30aa\u30d6\u30b3\u30fc\u30eb -Taming.SubSkill.CallOfTheWild.Description=\u52d5\u7269\u3092\u53ec\u559a\u3059\u308b\u3002 -Taming.SubSkill.CallOfTheWild.Description.2=[[GRAY]]COTW: \u3057\u3083\u304c\u3093\u3067\u5de6\u30af\u30ea\u30c3\u30af\n {0} {1} (\u732b), {2} {3} (Wolf), {4} {5} (\u99ac) -Taming.SubSkill.FastFoodService.Name=\u30d5\u30a1\u30fc\u30b9\u30c8\u30d5\u30fc\u30c9\u30b5\u30fc\u30d3\u30b9 -Taming.SubSkill.FastFoodService.Description=\u78ba\u7387\u3067\u72fc\u304c\u653b\u6483\u6642\u56de\u5fa9\u3059\u308b\u3002 -Taming.SubSkill.HolyHound.Name=\u30db\u30fc\u30ea\u30fc\u30cf\u30a6\u30f3\u30c9 -Taming.SubSkill.HolyHound.Description=\u9b54\u6cd5\u3068\u6bd2\u3067\u72fc\u3092\u56de\u5fa9\u3059\u308b\u3002 -Taming.SubSkill.Gore.Name=\u30b4\u30a2 -Taming.SubSkill.Gore.Description=\u30af\u30ea\u30c6\u30a3\u304b\u3064\u653b\u6483\u3067\u7834\u88c2\u52b9\u679c\u3092\u4e0e\u3048\u308b\u3002 -Taming.SubSkill.SharpenedClaws.Name=\u92ed\u3044\u722a -Taming.SubSkill.SharpenedClaws.Description=\u30c0\u30e1\u30fc\u30b8\u30dc\u30fc\u30ca\u30b9 -Taming.SubSkill.EnvironmentallyAware.Name=\u74b0\u5883\u914d\u616e -Taming.SubSkill.EnvironmentallyAware.Description=\u30b5\u30dc\u30c6\u30f3\u3001\u6eb6\u5ca9\u3001\u843d\u4e0b\u30c0\u30e1\u30fc\u30b8\u3092\u907f\u3051\u308b\u3002 -Taming.SubSkill.ThickFur.Name=\u539a\u3044\u6bdb\u76ae -Taming.SubSkill.ThickFur.Description=\u30c0\u30e1\u30fc\u30b8\u8efd\u6e1b\u3001\u8010\u706b -Taming.SubSkill.Pummel.Name=\u30d1\u30f3\u30e1\u30eb -Taming.SubSkill.Pummel.Description=\u78ba\u7387\u3067\u72fc\u304c\u6575\u3092\u30ce\u30c3\u30af\u30d0\u30c3\u30af\u3059\u308b\u3002 -Taming.SubSkill.Pummel.TargetMessage=\u72fc\u306b\u30ce\u30c3\u30af\u30d0\u30c3\u30af\u3055\u308c\u307e\u3057\u305f\uff01 -Taming.Listener.Wolf=[[DARK_GRAY]]\u72fc\u306f\u3042\u306a\u305f\u306e\u3082\u3068\u306b\u6025\u3044\u3067\u623b\u308a\u307e\u3059... -Taming.Listener=\u8abf\u6559: -Taming.SkillName=\u8abf\u6559 -Taming.Summon.COTW.Success.WithoutLifespan=[[GREEN]]\uff08\u91ce\u751f\u306e\u547c\u3073\u304b\u3051\uff09 [[GRAY]]\u3042\u306a\u305f\u306f[[GOLD]]{0}[[GRAY]]\u3092\u53ec\u559a\u3057\u307e\u3057\u305f[[GRAY]] -Taming.Summon.COTW.Success.WithLifespan=[[GREEN]]\uff08\u91ce\u751f\u306e\u547c\u3073\u304b\u3051\uff09 [[GOLD]]{0}[[GRAY]]\u3092\u53ec\u559a\u3057\u307e\u3057\u305f\u304c\u3001\u6301\u7d9a\u6642\u9593\u306f[[GOLD]]{1}[[GRAY]]\u79d2\u3067\u3059\u3002 -Taming.Summon.COTW.Limit=[[GREEN]]\uff08\u91ce\u751f\u306e\u547c\u3073\u304b\u3051\uff09 [[GOLD]]{0}[[GRAY]]\u306f\u540c\u6642\u306b[[GOLD]]{1}[[GRAY]]\u5339\u3057\u304b\u53ec\u559a\u3067\u304d\u307e\u305b\u3093\u3002 -Taming.Summon.COTW.TimeExpired=[[GREEN]]\uff08\u91ce\u751f\u306e\u547c\u3073\u304b\u3051\uff09 [[GRAY]]\u6642\u9593\u5207\u308c\u3067[[GOLD]]{0}[[GRAY]]\u304c\u7acb\u3061\u53bb\u308a\u307e\u3057\u305f\u3002 -Taming.Summon.COTW.BreedingDisallowed=[[GREEN]]\uff08\u91ce\u751f\u306e\u547c\u3073\u304b\u3051\uff09 [[RED]]\u53ec\u559a\u3055\u308c\u305f\u52d5\u7269\u3092\u7e41\u6b96\u3059\u308b\u3053\u3068\u306f\u3067\u304d\u307e\u305b\u3093\u3002 -Taming.Summon.COTW.NeedMoreItems=[[GREEN]]\uff08\u91ce\u751f\u306e\u547c\u3073\u304b\u3051\uff09 [[YELLOW]]{0}[[GRAY]]\u304c[[DARK_AQUA]]{1}[[GRAY]]\u500b\u5fc5\u8981\u3067\u3059\u3002 -Taming.Summon.Name.Format=[[GOLD]](COTW) [[WHITE]]{0} {1} - +Taming.Ability.Bonus.0=環境に配慮 +Taming.Ability.Bonus.1=狼は危険を避ける +Taming.Ability.Bonus.2=厚い毛皮 +Taming.Ability.Bonus.3=1/{0} ダメージ, 耐火性 +Taming.Ability.Bonus.4=衝撃耐性 +Taming.Ability.Bonus.5=爆発物が 1/{0} ダメージ与える +Taming.Ability.Bonus.6=鋭い爪 +Taming.Ability.Bonus.7=+{0} ダメージ +Taming.Ability.Bonus.8=ファーストフードサービス +Taming.Ability.Bonus.9={0} の確率で攻撃時回復 +Taming.Ability.Bonus.10=ホーリーハウンド +Taming.Ability.Bonus.11=魔法や毒でダメージを受けた時状態異常を取り消す。 +Taming.Ability.Locked.0=ロックされるまで {0}+ スキル (環境配慮) +Taming.Ability.Locked.1=ロックされるまで {0}+ スキル (厚い毛皮) +Taming.Ability.Locked.2=ロックされるまで {0}+ スキル (衝撃耐性) +Taming.Ability.Locked.3=ロックされるまで {0}+ スキル (鋭い爪) +Taming.Ability.Locked.4=ロックされるまで {0}+ スキル (ファーストフードサービス) +Taming.Ability.Locked.5=ロックされるまで {0}+ スキル (ホーリーハウンド) +Taming.Combat.Chance.Gore=流血の確率 +Taming.SubSkill.BeastLore.Name=ビーストロア +Taming.SubSkill.BeastLore.Description=狼と猫を骨で検査する。 +Taming.SubSkill.ShockProof.Name=衝撃耐性 +Taming.SubSkill.ShockProof.Description=爆発ダメージの軽減 +Taming.SubSkill.CallOfTheWild.Name=コールオブザワイルド +Taming.SubSkill.CallOfTheWild.Description=動物を召喚する。 +Taming.SubSkill.CallOfTheWild.Description.2=&7COTW: しゃがんで左クリック\n {0} {1} (猫), {2} {3} (Wolf), {4} {5} (馬) +Taming.SubSkill.FastFoodService.Name=ファーストフードサービス +Taming.SubSkill.FastFoodService.Description=確率で狼が攻撃時回復する。 +Taming.SubSkill.HolyHound.Name=ホーリーハウンド +Taming.SubSkill.HolyHound.Description=魔法と毒で狼を回復する。 +Taming.SubSkill.Gore.Name=流血 +Taming.SubSkill.Gore.Description=クリティかつ攻撃で破裂効果を与える。 +Taming.SubSkill.SharpenedClaws.Name=鋭い爪 +Taming.SubSkill.SharpenedClaws.Description=ダメージボーナス +Taming.SubSkill.EnvironmentallyAware.Name=環境配慮 +Taming.SubSkill.EnvironmentallyAware.Description=サボテン、溶岩、落下ダメージを避ける。 +Taming.SubSkill.ThickFur.Name=厚い毛皮 +Taming.SubSkill.ThickFur.Description=ダメージ軽減、耐火 +Taming.SubSkill.Pummel.Name=パンメル +Taming.SubSkill.Pummel.Description=確率で狼が敵をノックバックする。 +Taming.SubSkill.Pummel.TargetMessage=狼にノックバックされました! +Taming.Listener.Wolf=&8狼はあなたのもとに急いで戻ります... +Taming.Listener=調教: +Taming.SkillName=調教 +Taming.Summon.COTW.Success.WithoutLifespan=&a(コールオブザワイルド) &7あなたは&6{0}&7を召喚しました&7 +Taming.Summon.COTW.Success.WithLifespan=&a(コールオブザワイルド) &6{0}&7を召喚しましたが、持続時間は&6{1}&7秒です。 +Taming.Summon.COTW.Limit=&a(コールオブザワイルド) &6{0}&7は同時に&6{1}&7匹しか召喚できません。 +Taming.Summon.COTW.TimeExpired=&a(コールオブザワイルド) &7時間切れで&6{0}&7が立ち去りました。 +Taming.Summon.COTW.Removed=&a(コールオブザワイルド) &7あなたの召喚した&6{0}&7はワールドから消えました。 +Taming.Summon.COTW.BreedingDisallowed=&a(コールオブザワイルド) &4召喚された動物を繁殖することはできません。 +Taming.Summon.COTW.NeedMoreItems=&a(コールオブザワイルド) &e{1}&7が&3{0}&7個必要です。 +Taming.Summon.Name.Format=&6(COTW) &f{0} {1} # UNARMED -Unarmed.Ability.Bonus.0=\u9244\u8155\u30b9\u30bf\u30a4\u30eb -Unarmed.Ability.Bonus.1=+{0} \u30c0\u30e1\u30fc\u30b8\u30a2\u30c3\u30d7\u30b0\u30ec\u30fc\u30c9 -Unarmed.Ability.IronGrip.Attacker=\u76f8\u624b\u306f\u30a2\u30a4\u30a2\u30f3\u30b0\u30ea\u30c3\u30d7\u3092\u6301\u3063\u3066\u3044\u307e\u3059\uff01 -Unarmed.Ability.IronGrip.Defender=[[GREEN]]\u30a2\u30a4\u30a2\u30f3\u30b0\u30ea\u30c3\u30d7\u304c\u6b66\u88c5\u89e3\u9664\u3092\u9632\u304e\u307e\u3057\u305f\uff01 -Unarmed.Ability.Lower=[[GRAY]]\u7d20\u624b\u3092\u4e0b\u3052\u305f\u3002 -Unarmed.Ability.Ready=[[DARK_AQUA]]\u7d20\u624b\u3092[[GOLD]]\u6e96\u5099[[DARK_AQUA]]\u3057\u305f\u3002 -Unarmed.SubSkill.Berserk.Name=\u30d0\u30fc\u30b5\u30fc\u30ab\u30fc -Unarmed.SubSkill.Berserk.Description=+50% \u30c0\u30e1\u30fc\u30b8, \u5f31\u3044\u30de\u30c6\u30ea\u30a2\u30eb\u3092\u58ca\u3059 -Unarmed.SubSkill.Berserk.Stat=\u30d0\u30fc\u30b5\u30fc\u30ab\u30fc \u9577\u3055 -Unarmed.SubSkill.Disarm.Name=\u6b66\u88c5\u89e3\u9664 -Unarmed.SubSkill.Disarm.Description=\u6575\u306e\u30a2\u30a4\u30c6\u30e0\u3092\u30c9\u30ed\u30c3\u30d7\u3055\u305b\u308b\u3002 -Unarmed.SubSkill.Disarm.Stat=\u6b66\u88c5\u89e3\u9664 \u78ba\u7387 -Unarmed.SubSkill.UnarmedLimitBreak.Name=\u7d20\u624b \u9650\u754c\u7a81\u7834 -Unarmed.SubSkill.UnarmedLimitBreak.Description=\u9650\u754c\u3092\u7834\u308b\u3002\u30bf\u30d5\u306a\u6575\u306b\u5bfe\u3059\u308b\u30c0\u30e1\u30fc\u30b8\u304c\u5897\u52a0\u3057\u307e\u3059\u3002PvP\u3092\u5bfe\u8c61\u3068\u3057\u3001PvE\u3078\u306e\u9069\u5fdc\u306f\u30b5\u30fc\u30d0\u30fc\u306e\u8a2d\u5b9a\u6b21\u7b2c\u3067\u3059\u3002 -Unarmed.SubSkill.UnarmedLimitBreak.Stat=\u9650\u754c\u7a81\u7834 \u8ffd\u52a0\u30c0\u30e1\u30fc\u30b8 -Unarmed.SubSkill.IronArmStyle.Name=\u9244\u8155\u30b9\u30bf\u30a4\u30eb -Unarmed.SubSkill.IronArmStyle.Description=\u6642\u9593\u3092\u304b\u3051\u3066\u7d20\u624b\u3092\u56fa\u3081\u308b\u3002 -Unarmed.SubSkill.ArrowDeflect.Name=\u77e2\u3092\u305d\u3089\u3059 -Unarmed.SubSkill.ArrowDeflect.Description=\u77e2\u3092\u305d\u3089\u3059\u3002 -Unarmed.SubSkill.ArrowDeflect.Stat=\u77e2\u3092\u305d\u3089\u3059 \u78ba\u7387 -Unarmed.SubSkill.IronGrip.Name=\u30a2\u30a4\u30a2\u30f3\u30b0\u30ea\u30c3\u30d7 -Unarmed.SubSkill.IronGrip.Description=\u6b66\u88c5\u89e3\u9664\u3055\u308c\u308b\u306e\u3092\u9632\u304e\u307e\u3059\u3002 -Unarmed.SubSkill.IronGrip.Stat=\u30a2\u30a4\u30a2\u30f3\u30b0\u30ea\u30c3\u30d7 \u78ba\u7387 -Unarmed.SubSkill.BlockCracker.Name=\u30d6\u30ed\u30c3\u30af\u30af\u30e9\u30c3\u30ab\u30fc -Unarmed.SubSkill.BlockCracker.Description=\u62f3\u3067\u5ca9\u3092\u7834\u58ca\u3059\u308b\u3002 -Unarmed.Listener=\u7d20\u624b: -Unarmed.SkillName=\u7d20\u624b -Unarmed.Skills.Berserk.Off=**\u30d0\u30fc\u30b5\u30fc\u30ab\u30fc \u3092\u6d88\u8017\u3057\u305f** -Unarmed.Skills.Berserk.On=[[GREEN]]**\u30d0\u30fc\u30b5\u30fc\u30ab\u30fc \u30a2\u30af\u30c6\u30a3\u30d9\u30fc\u30c8** -Unarmed.Skills.Berserk.Refresh=[[YELLOW]]\u30d0\u30fc\u30b5\u30fc\u30ab\u30fc [[GREEN]]\u30a2\u30d3\u30ea\u30c6\u30a3\u304c\u56de\u5fa9\u3057\u307e\u3057\u305f\uff01 -Unarmed.Skills.Berserk.Other.Off=[[YELLOW]]{0}\u304c [[WHITE]]\u30d0\u30fc\u30b5\u30fc\u30ab\u30fc [[GREEN]]\u3092\u6d88\u8017\u3057\u305f -Unarmed.Skills.Berserk.Other.On=[[GREEN]]{0}[[DARK_GREEN]]\u304c [[RED]]\u30d0\u30fc\u30b5\u30fc\u30ab\u30fc [[DARK_GREEN]]\u3092\u4f7f\u3063\u305f\uff01 +Unarmed.Ability.Bonus.0=スチールアームスタイル +Unarmed.Ability.Bonus.1=+{0} ダメージアップグレード +Unarmed.Ability.IronGrip.Attacker=相手はアイアングリップを持っています! +Unarmed.Ability.IronGrip.Defender=&aアイアングリップが武装解除を防ぎました! +Unarmed.Ability.Lower=&7素手を下げた。 +Unarmed.Ability.Ready=&3素手を&6準備&3した。 +Unarmed.SubSkill.Berserk.Name=バーサーカー +Unarmed.SubSkill.Berserk.Description=+50% ダメージ, 弱いマテリアルを壊す +Unarmed.SubSkill.Berserk.Stat=バーサーカー 長さ +Unarmed.SubSkill.Disarm.Name=武装解除 +Unarmed.SubSkill.Disarm.Description=敵のアイテムをドロップさせる。 +Unarmed.SubSkill.Disarm.Stat=武装解除の確率 +Unarmed.SubSkill.UnarmedLimitBreak.Name=素手 限界突破 +Unarmed.SubSkill.UnarmedLimitBreak.Description=限界を破る。タフな敵に対するダメージが増加します。PvPを対象とし、PvEへの適応はサーバーの設定次第です。 +Unarmed.SubSkill.UnarmedLimitBreak.Stat=限界突破 追加ダメージ +Unarmed.SubSkill.SteelArmStyle.Name=スチールアームスタイル +Unarmed.SubSkill.SteelArmStyle.Description=時間が経つと腕が硬くなる +Unarmed.SubSkill.ArrowDeflect.Name=アローディフレクション +Unarmed.SubSkill.ArrowDeflect.Description=矢をそらす。 +Unarmed.SubSkill.ArrowDeflect.Stat=矢をそらすの確率 +Unarmed.SubSkill.IronGrip.Name=アイアングリップ +Unarmed.SubSkill.IronGrip.Description=武装解除されるのを防ぎます。 +Unarmed.SubSkill.IronGrip.Stat=アイアングリップの確率 +Unarmed.SubSkill.BlockCracker.Name=ブロッククラッカー +Unarmed.SubSkill.BlockCracker.Description=拳で岩を破壊する。 +Unarmed.Listener=素手: +Unarmed.SkillName=素手 +Unarmed.Skills.Berserk.Off=**バーサーカー を消耗した** +Unarmed.Skills.Berserk.On=&a**バーサーカー アクティベート** +Unarmed.Skills.Berserk.Other.Off=&e{0}が &fバーサーカー &aを消耗した +Unarmed.Skills.Berserk.Other.On=&a{0}&2が &cバーサーカー &2を使った! +Unarmed.Skills.Berserk.Refresh=&eバーサーカー &aアビリティが回復しました! # WOODCUTTING -Woodcutting.Ability.0=\u30ea\u30fc\u30d5\u30d6\u30ed\u30ef\u30fc -Woodcutting.Ability.1=\u8449\u3092\u5439\u304d\u98db\u3070\u3059 -Woodcutting.Ability.Locked.0=\u30ed\u30c3\u30af\u3055\u308c\u308b\u307e\u3067 {0}+ \u30b9\u30ad\u30eb (\u30ea\u30fc\u30d5\u30d6\u30ed\u30ef\u30fc) -Woodcutting.SubSkill.TreeFeller.Name=\u30c4\u30ea\u30fc\u30d5\u30a7\u30e9\u30fc -Woodcutting.SubSkill.TreeFeller.Description=\u6728\u3092\u7206\u767a\u3055\u305b\u308b\u3002 -Woodcutting.SubSkill.TreeFeller.Stat=\u30c4\u30ea\u30fc\u30d5\u30a7\u30e9\u30fc \u9577\u3055 -Woodcutting.SubSkill.LeafBlower.Name=\u30ea\u30fc\u30d5\u30d6\u30ed\u30ef\u30fc -Woodcutting.SubSkill.LeafBlower.Description=\u8449\u3092\u5439\u304d\u98db\u3070\u3059\u3002 -Woodcutting.SubSkill.HarvestLumber.Name=\u53ce\u7a6b\u6750 -Woodcutting.SubSkill.HarvestLumber.Description=\u3088\u308a\u591a\u304f\u306e\u6728\u6750\u3092\u5de7\u307f\u306b\u62bd\u51fa\u3059\u308b\u3002 -Woodcutting.SubSkill.HarvestLumber.Stat=\u30c9\u30ed\u30c3\u30d7\u4e8c\u500d \u78ba\u7387 -Woodcutting.SubSkill.Splinter.Name=\u7834\u7247 -Woodcutting.SubSkill.Splinter.Description=\u3088\u308a\u52b9\u7387\u3088\u304f\u6728\u3092\u4f10\u63a1\u3059\u308b\u3002 -Woodcutting.SubSkill.BarkSurgeon.Name=\u6a39\u76ae\u5916\u79d1\u533b -Woodcutting.SubSkill.BarkSurgeon.Description=\u6728\u3092\u5265\u304e\u53d6\u308b\u3068\u304d\u306b\u6709\u7528\u306a\u6750\u6599\u3092\u62bd\u51fa\u3059\u308b\u3002 -Woodcutting.SubSkill.NaturesBounty.Name=\u81ea\u7136\u306e\u6075\u307f -Woodcutting.SubSkill.NaturesBounty.Description=\u81ea\u7136\u304b\u3089\u7d4c\u9a13\u5024\u3092\u96c6\u3081\u308b\u3002 -Woodcutting.Listener=\u6728\u3053\u308a: -Woodcutting.SkillName=\u6728\u3053\u308a -Woodcutting.Skills.TreeFeller.Off=**\u30c4\u30ea\u30fc\u30d5\u30a7\u30e9\u30fc \u3092\u6d88\u8017\u3057\u305f** -Woodcutting.Skills.TreeFeller.On=[[GREEN]]**\u30c4\u30ea\u30fc\u30d5\u30a7\u30e9\u30fc \u30a2\u30af\u30c6\u30a3\u30d9\u30fc\u30c8** -Woodcutting.Skills.TreeFeller.Refresh=[[YELLOW]]\u30c4\u30ea\u30fc\u30d5\u30a7\u30e9\u30fc [[GREEN]]\u30a2\u30d3\u30ea\u30c6\u30a3\u304c\u56de\u5fa9\u3057\u307e\u3057\u305f\uff01 -Woodcutting.Skills.TreeFeller.Other.Off=[[YELLOW]]{0}\u304c [[WHITE]]\u30c4\u30ea\u30fc\u30d5\u30a7\u30e9\u30fc [[GREEN]]\u3092\u6d88\u8017\u3057\u305f -Woodcutting.Skills.TreeFeller.Other.On=[[GREEN]]{0}[[DARK_GREEN]]\u304c [[RED]]\u30c4\u30ea\u30fc\u30d5\u30a7\u30e9\u30fc [[DARK_GREEN]]\u3092\u4f7f\u3063\u305f\uff01 -Woodcutting.Skills.TreeFeller.Splinter=\u65a7\u306f\u4f55\u5341\u3082\u306e\u7834\u7247\u306b\u7815\u3051\u305f\uff01 -Woodcutting.Skills.TreeFeller.Threshold=\u6728\u304c\u5927\u304d\u3059\u304e\u308b\uff01 +Woodcutting.Ability.0=リーフブロワー +Woodcutting.Ability.1=葉を吹き飛ばす +Woodcutting.Ability.Locked.0=ロックされるまで {0}+ スキル (リーフブロワー) +Woodcutting.SubSkill.TreeFeller.Name=ツリーフェラー +Woodcutting.SubSkill.TreeFeller.Description=木を爆発させる。 +Woodcutting.SubSkill.TreeFeller.Stat=ツリーフェラー 長さ +Woodcutting.SubSkill.LeafBlower.Name=リーフブロワー +Woodcutting.SubSkill.LeafBlower.Description=葉を吹き飛ばす。 +Woodcutting.SubSkill.KnockOnWood.Name=ノックオンウッド +Woodcutting.SubSkill.KnockOnWood.Description=ツリー・フェラーを使用している場合、さらにお得なグッズを探すことができる。 +Woodcutting.SubSkill.KnockOnWood.Stat=ノックオンウッド +Woodcutting.SubSkill.KnockOnWood.Loot.Normal=木からの標準的なアイテム +Woodcutting.SubSkill.KnockOnWood.Loot.Rank2=木からの標準的なアイテムと経験値オーブ +Woodcutting.SubSkill.HarvestLumber.Name=収穫材 +Woodcutting.SubSkill.HarvestLumber.Description=より多くの木材を巧みに抽出する。 +Woodcutting.SubSkill.HarvestLumber.Stat=ドロップ二倍の確率 +Woodcutting.SubSkill.Splinter.Name=破片 +Woodcutting.SubSkill.Splinter.Description=より効率よく木を伐採する。 +Woodcutting.SubSkill.BarkSurgeon.Name=樹皮外科医 +Woodcutting.SubSkill.BarkSurgeon.Description=木を剥ぎ取るときに有用な材料を抽出する。 +Woodcutting.SubSkill.NaturesBounty.Name=自然の恵み +Woodcutting.SubSkill.NaturesBounty.Description=自然から経験値を集める。 +Woodcutting.Listener=木こり: +Woodcutting.SkillName=木こり +Woodcutting.Skills.TreeFeller.Off=**ツリーフェラー を消耗した** +Woodcutting.Skills.TreeFeller.On=&a**ツリーフェラー アクティベート** +Woodcutting.Skills.TreeFeller.Refresh=&eツリーフェラー &aアビリティが回復しました! +Woodcutting.Skills.TreeFeller.Other.Off=&e{0}が &fツリーフェラー &aを消耗した +Woodcutting.Skills.TreeFeller.Other.On=&a{0}&2が &cツリーフェラー &2を使った! +Woodcutting.Skills.TreeFeller.Splinter=斧は何十もの破片に砕けた! +Woodcutting.Skills.TreeFeller.Threshold=木が大きすぎる! # COMBAT -Combat.ArrowDeflect=[[WHITE]]**\u77e2\u3092\u305d\u3089\u3057\u305f** -Combat.BeastLore=[[GREEN]]**\u30d3\u30fc\u30b9\u30c8\u30ed\u30a2** -Combat.BeastLoreHealth=[[DARK_AQUA]]\u4f53\u529b ([[GREEN]]{0}[[DARK_AQUA]]/{1}) -Combat.BeastLoreOwner=[[DARK_AQUA]]\u6240\u6709\u8005 ([[RED]]{0}[[DARK_AQUA]]) -Combat.BeastLoreHorseSpeed=[[DARK_AQUA]]\u99ac\u306e\u79fb\u52d5\u901f ([[GREEN]]{0} \u30d6\u30ed\u30c3\u30af/\u79d2[[DARK_AQUA]]) -Combat.BeastLoreHorseJumpStrength=[[DARK_AQUA]]\u99ac\u306e\u30b8\u30e3\u30f3\u30d7\u529b ([[GREEN]]\u6700\u5927 {0} \u30d6\u30ed\u30c3\u30af[[DARK_AQUA]]) -Combat.Gore=[[GREEN]]**\u6d41\u8840** -Combat.StruckByGore=**\u6d41\u8840\u3057\u3066\u3044\u307e\u3059** -Combat.TargetDazed=\u30bf\u30fc\u30b2\u30c3\u30c8\u306f[[DARK_RED]]\u5e7b\u60d1[[[RESET]]\u3060\u3063\u305f -Combat.TouchedFuzzy=[[DARK_RED]]Touched Fuzzy. Felt Dizzy. +Combat.ArrowDeflect=&f**矢をそらした** +Combat.BeastLore=&a**ビーストロア** +Combat.BeastLoreHealth=&3体力 (&a{0}&3/{1}) +Combat.BeastLoreOwner=&3所有者 (&c{0}&3) +Combat.BeastLoreHorseSpeed=&3馬の移動速 (&a{0} ブロック/秒&3) +Combat.BeastLoreHorseJumpStrength=&3馬のジャンプ力 (&a最大 {0} ブロック&3) +Combat.Gore=&a**流血** +Combat.StruckByGore=**流血しています** +Combat.TargetDazed=ターゲットは&4幻惑[&rだった +Combat.TouchedFuzzy=&4Touched Fuzzy. Felt Dizzy. # COMMANDS ## generic -mcMMO.Description=[[YELLOW]]mcMMO[[DARK_AQUA]]\u30d7\u30ed\u30b8\u30a7\u30af\u30c8\u306b\u3064\u3044\u3066:,[[GOLD]]mcMMO\u306f2011\u5e742\u6708\u306b[[BLUE]]nossr50[[GOLD]]\u306b\u3088\u3063\u3066\u958b\u59cb\u3055\u308c\u305f[[RED]]\u30aa\u30fc\u30d7\u30f3\u30bd\u30fc\u30b9\u306e[[GOLD]]RPG mod\u3067\u3059\u3002,\u76ee\u6a19\u306f\u9ad8\u54c1\u8cea\u306eRPG\u4f53\u9a13\u3092\u63d0\u4f9b\u3059\u308b\u3053\u3068\u3067\u3059\u3002,[[DARK_AQUA]]\u30d2\u30f3\u30c8:,[[GOLD]] - [[RED]]/mcmmo help[[GREEN]]\u3092\u4f7f\u7528\u3057\u3066\u30b3\u30de\u30f3\u30c9\u3092\u8868\u793a\u3057\u307e\u3059,[[GOLD]] - [[RED]]/\u30b9\u30ad\u30eb\u540d[[GREEN]]\u3092\u4f7f\u7528\u3057\u3066\u30b9\u30ad\u30eb\u306e\u8a73\u7d30\u60c5\u5831\u3092\u8868\u793a\u3057\u307e\u3059,[[DARK_AQUA]]\u958b\u767a\u8005:,[[GOLD]] - [[GREEN]]nossr50 [[BLUE]](\u4f5c\u8005 & \u30d7\u30ed\u30b8\u30a7\u30af\u30c8\u30ea\u30fc\u30c0\u30fc),[[GOLD]] - [[GREEN]]electronicboy [[BLUE]](\u958b\u767a),[[GOLD]] - [[GREEN]]kashike [[BLUE]](\u958b\u767a),[[GOLD]] - [[GREEN]]t00thpick1 [[BLUE]](Classic \u30e1\u30f3\u30c6\u30ca\u30fc) -mcMMO.Description.FormerDevs=[[DARK_AQUA]]\u5143\u958b\u767a\u8005: [[GREEN]]GJ, NuclearW, bm01, TfT_02, Glitchfinder -Commands.addlevels.AwardAll.1=[[GREEN]]\u3059\u3079\u3066\u306e\u30b9\u30ad\u30eb\u3067{0}\u30ec\u30d9\u30eb\u3092\u7372\u5f97\u3057\u307e\u3057\u305f\uff01 -Commands.addlevels.AwardAll.2=\u3059\u3079\u3066\u306e\u30b9\u30ad\u30eb\u304c{0}\u306b\u5909\u66f4\u3055\u308c\u307e\u3057\u305f\u3002 -Commands.addlevels.AwardSkill.1=[[GREEN]]{1}\u3067{0}\u30ec\u30d9\u30eb\u3092\u7372\u5f97\u3057\u307e\u3057\u305f\u3002 -Commands.addlevels.AwardSkill.2={0}\u304c{1}\u306b\u5909\u66f4\u3055\u308c\u307e\u3057\u305f\u3002 -Commands.addxp.AwardAll=[[GREEN]]\u3059\u3079\u3066\u306e\u30b9\u30ad\u30eb\u3067{0}\u7d4c\u9a13\u5024\u3092\u7372\u5f97\u3057\u307e\u3057\u305f\uff01 -Commands.addxp.AwardSkill=[[GREEN]]{1}\u3067{0}\u7d4c\u9a13\u5024\u3092\u7372\u5f97\u3057\u307e\u3057\u305f\u3002 -Commands.Ability.Off=\u30a2\u30d3\u30ea\u30c6\u30a3\u306e\u4f7f\u7528\u3092[[RED]]\u30aa\u30d5[[WHITE]]\u306b\u5207\u308a\u66ff\u3048\u307e\u3057\u305f\u3002 -Commands.Ability.On=\u30a2\u30d3\u30ea\u30c6\u30a3\u306e\u4f7f\u7528\u3092[[GREEN]]\u30aa\u30f3[[WHITE]]\u306b\u5207\u308a\u66ff\u3048\u307e\u3057\u305f\u3002 -Commands.Ability.Toggle=[[YELLOW]]{0}[[WHITE]]\u306e\u30a2\u30d3\u30ea\u30c6\u30a3\u306e\u4f7f\u7528\u3092\u5207\u308a\u66ff\u3048\u3089\u308c\u307e\u3057\u305f\u3002 -Commands.AdminChat.Off=\u7ba1\u7406\u7528\u30c1\u30e3\u30c3\u30c8\u306e\u4f7f\u7528\u3092[[RED]]\u30aa\u30d5[[WHITE]]\u306b\u5207\u308a\u66ff\u3048\u307e\u3057\u305f\u3002 -Commands.AdminChat.On=\u7ba1\u7406\u7528\u30c1\u30e3\u30c3\u30c8\u306e\u4f7f\u7528\u3092[[GREEN]]\u30aa\u30f3[[WHITE]]\u306b\u5207\u308a\u66ff\u3048\u307e\u3057\u305f\u3002 -Commands.AdminToggle=[[GREEN]]- \u7ba1\u7406\u7528\u30c1\u30e3\u30c3\u30c8\u306e\u5207\u308a\u66ff\u3048 -Commands.Chat.Console=*\u30b3\u30f3\u30bd\u30fc\u30eb* -Commands.Cooldowns.Header=[[GOLD]]--= [[GREEN]]mcMMO \u30a2\u30d3\u30ea\u30c6\u30a3 \u30af\u30fc\u30eb\u30c0\u30a6\u30f3[[GOLD]] =-- -Commands.Cooldowns.Row.N=\ [[RED]]{0}[[WHITE]] - [[GOLD]]\u6b8b\u308a {1} \u79d2 -Commands.Cooldowns.Row.Y=\ [[AQUA]]{0}[[WHITE]] - [[DARK_GREEN]]\u6e96\u5099\u5b8c\u4e86\uff01 -Commands.Database.CooldownMS=\u3053\u306e\u30b3\u30de\u30f3\u30c9\u3092\u518d\u5ea6\u4f7f\u7528\u3059\u308b\u306b\u306f{0}\u30df\u30ea\u79d2\u5f85\u3064\u5fc5\u8981\u304c\u3042\u308a\u307e\u3059\u3002 -Commands.Database.Processing=\u524d\u56de\u306e\u30b3\u30de\u30f3\u30c9\u304c\u307e\u3060\u51e6\u7406\u4e2d\u3067\u3059\u3002\u304a\u5f85\u3061\u4e0b\u3055\u3044\u3002 -Commands.Disabled=\u3053\u306e\u30b3\u30de\u30f3\u30c9\u306f\u7121\u52b9\u3067\u3059\u3002 -Commands.DoesNotExist= [[RED]]\u30d7\u30ec\u30a4\u30e4\u30fc\u304c\u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u306b\u5b58\u5728\u3057\u307e\u305b\u3093\uff01 -Commands.GodMode.Disabled=mcMMO \u30b4\u30c3\u30c9\u30e2\u30fc\u30c9\u304c\u7121\u52b9 -Commands.GodMode.Enabled=mcMMO \u30b4\u30c3\u30c9\u30e2\u30fc\u30c9\u304c\u6709\u52b9 -Commands.AdminChatSpy.Enabled=mcMMO \u30d1\u30fc\u30c6\u30a3\u30fc\u30c1\u30e3\u30c3\u30c8SPY\u3092\u6709\u52b9 -Commands.AdminChatSpy.Disabled=mcMMO \u30d1\u30fc\u30c6\u30a3\u30fc\u30c1\u30e3\u30c3\u30c8SPY\u3092\u7121\u52b9 -Commands.AdminChatSpy.Toggle=mcMMO \u30d1\u30fc\u30c6\u30a3\u30fc\u30c1\u30e3\u30c3\u30c8\u304c[[YELLOW]]{0}[[WHITE]]\u306b\u5207\u308a\u66ff\u3048\u3089\u308c\u307e\u3057\u305f\u3002 -Commands.AdminChatSpy.Chat=[[GOLD]][SPY: [[GREEN]]{0}[[GOLD]]] [[WHITE]]{1} -Commands.GodMode.Forbidden=[mcMMO] \u30b4\u30c3\u30c9\u30e2\u30fc\u30c9\u306f\u3053\u306e\u30ef\u30fc\u30eb\u30c9\u3067\u8a31\u53ef\u3055\u308c\u3066\u3044\u307e\u305b\u3093\uff08\u6a29\u9650\u3092\u53c2\u7167\uff09 -Commands.GodMode.Toggle=\u30b4\u30c3\u30c9\u30e2\u30fc\u30c9\u304c[[YELLOW]]{0}[[WHITE]]\u306b\u5207\u308a\u66ff\u3048\u3089\u308c\u307e\u3057\u305f\u3002 -Commands.Healthbars.Changed.HEARTS=[mcMMO] \u4f53\u529b\u30d0\u30fc\u306e\u8868\u793a\u304c[[RED]]Heart[[WHITE]]\u306b\u5207\u308a\u66ff\u3048\u3089\u308c\u307e\u3057\u305f\u3002 -Commands.Healthbars.Changed.BAR=[mcMMO] \u4f53\u529b\u30d0\u30fc\u306e\u8868\u793a\u304c[[YELLOW]]Boxed[[WHITE]]\u306b\u5207\u308a\u66ff\u3048\u3089\u308c\u307e\u3057\u305f\u3002 -Commands.Healthbars.Changed.DISABLED=[mcMMO] MOB\u306e\u4f53\u529b\u30d0\u30fc\u304c[[GRAY]]\u7121\u52b9[[WHITE]]\u3002 -Commands.Healthbars.Invalid=\u4f53\u529b\u30d0\u30fc\u306e\u30bf\u30a4\u30d7\u304c\u7121\u52b9\uff01 -Commands.Inspect=<\u30d7\u30ec\u30a4\u30e4\u30fc> [[GREEN]]- \u8a73\u7d30\u306a\u30d7\u30ec\u30a4\u30e4\u30fc\u60c5\u5831\u3092\u898b\u308b\u3002 -Commands.Invite.Success=[[GREEN]]\u62db\u5f85\u304c\u6b63\u5e38\u306b\u9001\u4fe1\u3055\u308c\u307e\u3057\u305f\u3002 -Commands.Leaderboards=<\u30b9\u30ad\u30eb> <\u30da\u30fc\u30b8> [[GREEN]]- \u30ea\u30fc\u30c0\u30fc\u30dc\u30fc\u30c9 -Commands.mcgod=[[GREEN]]- \u30b4\u30c3\u30c9\u30e2\u30fc\u30c9\u3092\u5207\u308a\u66ff\u3048 -Commands.mchud.Invalid=\u6709\u52b9\u306aHUD\u30bf\u30a4\u30d7\u3067\u306f\u3042\u308a\u307e\u305b\u3093\u3002 -Commands.mcpurge.Success=[[GREEN]]\u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u306f\u6b63\u5e38\u306b\u30d1\u30fc\u30b8\u3055\u308c\u307e\u3057\u305f\uff01 -Commands.mcrank.Heading=[[GOLD]]-=\u500b\u4eba\u30e9\u30f3\u30ad\u30f3\u30b0=- -Commands.mcrank.Overall=\u5168\u4f53[[GREEN]] - [[GOLD]]\u30e9\u30f3\u30af [[WHITE]]#[[GREEN]]{0} -Commands.mcrank.Player=[[YELLOW]]\u30e9\u30f3\u30ad\u30f3\u30b0 [[WHITE]]{0} -Commands.mcrank.Skill=[[YELLOW]]{0}[[GREEN]] - [[GOLD]]\u30e9\u30f3\u30af [[WHITE]]#[[GREEN]]{1} -Commands.mcrank.Unranked=[[WHITE]]\u30e9\u30f3\u30af\u306a\u3057 -Commands.mcrefresh.Success={0}\u306e\u30af\u30fc\u30eb\u30c0\u30a6\u30f3\u304c\u66f4\u65b0\u3055\u308c\u307e\u3057\u305f\u3002 -Commands.mcremove.Success=[[GREEN]]{0}\u304c\u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u304b\u3089\u6b63\u5e38\u306b\u524a\u9664\u3055\u308c\u307e\u3057\u305f\uff01 -Commands.mctop.Tip=[[GOLD]]\u30d2\u30f3\u30c8: [[RED]]/mcrank[[GOLD]]\u3092\u4f7f\u7528\u3057\u3066\u5168\u3066\u306e\u500b\u4eba\u30e9\u30f3\u30ad\u30f3\u30b0\u3092\u8868\u793a\uff01 -Commands.mmoedit=[\u30d7\u30ec\u30a4\u30e4\u30fc] <\u30b9\u30ad\u30eb> <\u65b0\u3057\u3044\u5024> [[GREEN]] - \u30bf\u30fc\u30b2\u30c3\u30c8\u3092\u5909\u66f4 -Commands.mmoedit.AllSkills.1=[[GREEN]]\u5168\u3066\u306e\u30b9\u30ad\u30eb\u30ec\u30d9\u30eb\u304c{0}\u306b\u8a2d\u5b9a\u3055\u308c\u307e\u3057\u305f\uff01 -Commands.mmoedit.Modified.1=[[GREEN]]{0}\u306e\u30ec\u30d9\u30eb\u306f{1}\u306b\u8a2d\u5b9a\u3055\u308c\u307e\u3057\u305f\uff01 -Commands.mmoedit.Modified.2={0}\u306f{1}\u306b\u5909\u66f4\u3055\u308c\u307e\u3057\u305f\u3002 -Commands.mcconvert.Database.Same=\u3059\u3067\u306b{0}\u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u3092\u4f7f\u7528\u3057\u3066\u3044\u307e\u3059\uff01 -Commands.mcconvert.Database.InvalidType={0}\u306f\u6709\u52b9\u306a\u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u30bf\u30a4\u30d7\u3067\u306f\u3042\u308a\u307e\u305b\u3093\u3002 -Commands.mcconvert.Database.Start=[[GRAY]]{0}\u304b\u3089{1}\u3078\u306e\u5909\u63db\u3092\u958b\u59cb\u3057\u3066\u3044\u307e\u3059... -Commands.mcconvert.Database.Finish=[[GRAY]]\u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u306e\u4ee5\u964d\u304c\u5b8c\u4e86\u3057\u307e\u3057\u305f\u3002; {1}\u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u306b\u306f{0}\u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u306e\u5168\u3066\u306e\u30c7\u30fc\u30bf\u304c\u542b\u307e\u308c\u3066\u3044\u307e\u3059\u3002 -Commands.mmoshowdb=\u73fe\u5728\u4f7f\u7528\u3057\u3066\u3044\u308b\u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u306f[[GREEN]]{0}[[WHITE]]\u3067\u3059\u3002 -Commands.mcconvert.Experience.Invalid=\u4e0d\u660e\u306a\u6570\u5f0f\u30bf\u30a4\u30d7\uff01 \u6709\u52b9\u306a\u30bf\u30a4\u30d7: [[GREEN]]LINEAR [[RED]]\u53ca\u3073 [[GREEN]]EXPONENTIAL[[RED]]. -Commands.mcconvert.Experience.Same=\u3059\u3067\u306b\u6570\u5f0f\u30bf\u30a4\u30d7 {0} \u3092\u4f7f\u7528\u3057\u3066\u3044\u307e\u3059\u3002 -Commands.mcconvert.Experience.Start=[[GRAY]]{0} \u304b\u3089 {1} \u66f2\u7dda\u3078\u306e\u5909\u63db\u3092\u958b\u59cb\u3057\u3066\u3044\u307e\u3059 -Commands.mcconvert.Experience.Finish=[[GRAY]]\u6570\u5f0f\u306e\u5909\u63db\u304c\u5b8c\u4e86\u3057\u307e\u3057\u305f\u3002; \u73fe\u5728 {0} XP\u66f2\u7dda\u3092\u4f7f\u7528\u3057\u3066\u3044\u307e\u3059\u3002 -Commands.ModDescription=[[GREEN]]- mod\u306e\u7c21\u5358\u306a\u8aac\u660e\u3092\u8aad\u3080 -Commands.NoConsole=\u3053\u306e\u30b3\u30de\u30f3\u30c9\u306f\u30b3\u30f3\u30bd\u30fc\u30eb\u304b\u3089\u306e\u4f7f\u7528\u3092\u30b5\u30dd\u30fc\u30c8\u3057\u3066\u3044\u307e\u305b\u3093\u3002 -Commands.Notifications.Off=\u30a2\u30d3\u30ea\u30c6\u30a3\u901a\u77e5\u304c[[RED]]\u30aa\u30d5[[WHITE]]\u306b\u5207\u308a\u66ff\u308f\u308a\u307e\u3057\u305f\u3002 -Commands.Notifications.On=\u30a2\u30d3\u30ea\u30c6\u30a3\u901a\u77e5\u304c[[GREEN]]\u30aa\u30f3[[WHITE]]\u306b\u5207\u308a\u66ff\u308f\u308a\u307e\u3057\u305f\u3002 -Commands.Offline=\u3053\u306e\u30b3\u30de\u30f3\u30c9\u306f\u30aa\u30d5\u30e9\u30a4\u30f3\u30d7\u30ec\u30a4\u30e4\u30fc\u306b\u6a5f\u80fd\u3057\u307e\u305b\u3093\u3002 -Commands.NotLoaded=\u30d7\u30ec\u30a4\u30e4\u30fc\u306e\u30d7\u30ed\u30d5\u30a1\u30a4\u30eb\u306f\u307e\u3060\u8aad\u307f\u8fbc\u307e\u308c\u3066\u3044\u307e\u305b\u3093\u3002 -Commands.Party.Status=[[DARK_GRAY]]\u540d\u524d: [[WHITE]]{0} {1} [[DARK_GRAY]]\u30ec\u30d9\u30eb: [[DARK_AQUA]]{2} -Commands.Party.Status.Alliance=[[DARK_GRAY]]\u5473\u65b9: [[WHITE]]{0} -Commands.Party.UnlockedFeatures=[[DARK_GRAY]]\u30ed\u30c3\u30af\u89e3\u9664\u3055\u308c\u305f\u6a5f\u80fd: [[GRAY]][[ITALIC]]{0} -Commands.Party.ShareMode=[[DARK_GRAY]]\u5171\u6709\u30e2\u30fc\u30c9: -Commands.Party.ItemShare=[[GRAY]]\u30a2\u30a4\u30c6\u30e0 [[DARK_AQUA]]({0}) -Commands.Party.ExpShare=[[GRAY]]EXP [[DARK_AQUA]]({0}) -Commands.Party.ItemShareCategories=[[DARK_GRAY]]\u30a2\u30a4\u30c6\u30e0\u5171\u6709: [[GRAY]][[ITALIC]]{0} -Commands.Party.MembersNear=[[DARK_GRAY]]\u3042\u306a\u305f\u306e\u8fd1\u304f\u306b [[DARK_AQUA]]{0}[[DARK_GRAY]]/[[DARK_AQUA]]{1} -Commands.Party.Accept=[[GREEN]]- \u30d1\u30fc\u30c6\u30a3\u30fc\u62db\u5f85\u3092\u8a31\u8afe -Commands.Party.Chat.Off=\u30d1\u30fc\u30c6\u30a3\u30fc\u30c1\u30e3\u30c3\u30c8\u304c[[RED]]\u30aa\u30d5[[WHITE]]\u306b\u5207\u308a\u66ff\u308f\u308a\u307e\u3057\u305f\u3002 -Commands.Party.Chat.On=\u30d1\u30fc\u30c6\u30a3\u30fc\u30c1\u30e3\u30c3\u30c8\u304c[[GREEN]]\u30aa\u30f3[[WHITE]]\u306b\u5207\u308a\u66ff\u308f\u308a\u307e\u3057\u305f\u3002 -Commands.Party.Commands=[[RED]]---[][[GREEN]]\u30d1\u30fc\u30c6\u30a3\u30fc\u30b3\u30de\u30f3\u30c9[[RED]][]--- -Commands.Party.Invite.0=[[RED]]\u901a\u77e5: [[GREEN]]{1}\u304b\u3089{0}\u306e\u30d1\u30fc\u30c6\u30a3\u30fc\u3078\u306e\u62db\u5f85\u3092\u53d7\u3051\u53d6\u308a\u307e\u3057\u305f\u3002 -Commands.Party.Invite.1=[[GREEN]]/party accept[[YELLOW]]\u3092\u5165\u529b\u3057\u3066\u3001\u62db\u5f85\u3092\u53d7\u3051\u5165\u308c\u307e\u3059\u3002 -Commands.Party.Invite=[[GREEN]]- \u30d1\u30fc\u30c6\u30a3\u30fc\u62db\u5f85\u3092\u9001\u4fe1 -Commands.Party.Invite.Accepted=[[GREEN]]\u62db\u5f85\u3092\u53d7\u3051\u5165\u308c\u307e\u3057\u305f\u3002 \u30d1\u30fc\u30c6\u30a3\u30fc {0} \u306b\u53c2\u52a0\u3057\u307e\u3057\u305f\u3002 -Commands.Party.Join=[[GRAY]]\u53c2\u52a0\u30d1\u30fc\u30c6\u30a3\u30fc: {0} -Commands.Party.PartyFull=[[GOLD]]{0}[[RED]] \u306f\u6e80\u54e1\u3067\u3059\uff01 -Commands.Party.PartyFull.Invite=[[GREEN]]{1}[[RED]]\u306b\u306f\u3059\u3067\u306b[[DARK_AQUA]]{2}[[RED]]\u4eba\u304c\u3044\u308b\u305f\u3081\u3001[[GREEN]]{1}[[RED]]\u306b[[YELLOW]]{0}[[RED]]\u3092\u62db\u5f85\u3059\u308b\u3053\u3068\u306f\u3067\u304d\u307e\u305b\u3093\uff01 -Commands.Party.PartyFull.InviteAccept=[[RED]]\u3059\u3067\u306b[[DARK_AQUA]]{1}[[RED]]\u4eba\u306e\u30d7\u30ec\u30a4\u30e4\u30fc\u304c\u5c45\u308b\u305f\u3081\u3001[[GREEN]]{0}[[RED]]\u306b\u306f\u53c2\u52a0\u3067\u304d\u307e\u305b\u3093\u3002 -Commands.Party.Create=[[GRAY]]\u4f5c\u6210\u3055\u308c\u305f\u30d1\u30fc\u30c6\u30a3\u30fc: {0} -Commands.Party.Rename=[[GRAY]]\u30d1\u30fc\u30c6\u30a3\u30fc\u540d\u5909\u66f4: [[WHITE]]{0} -Commands.Party.SetSharing=[[GRAY]]\u30d1\u30fc\u30c6\u30a3\u30fc {0} \u306e\u5171\u6709\u8a2d\u5b9a: [[DARK_AQUA]]{1} -Commands.Party.ToggleShareCategory=[[GOLD]]{0}[[GRAY]]\u306e\u30d1\u30fc\u30c6\u30a3\u30fc\u30a2\u30a4\u30c6\u30e0\u5171\u6709\u306f[[DARK_AQUA]]{1}[[GRAY]]\u306b\u306a\u308a\u307e\u3057\u305f\u3002 -Commands.Party.AlreadyExists=[[DARK_RED]]\u30d1\u30fc\u30c6\u30a3\u30fc {0} \u306f\u3059\u3067\u306b\u5b58\u5728\u3057\u307e\u3059\uff01 -Commands.Party.Kick=[[RED]]\u30d1\u30fc\u30c6\u30a3\u30fc[[GREEN]]{0}[[RED]]\u304b\u3089\u8ffd\u3044\u51fa\u3055\u308c\u307e\u3057\u305f\uff01 -Commands.Party.Leave=[[YELLOW]]\u30d1\u30fc\u30c6\u30a3\u30fc\u304b\u3089\u629c\u3051\u307e\u3057\u305f -Commands.Party.Members.Header=[[RED]]-----[][[GREEN]]\u30e1\u30f3\u30d0\u30fc[[RED]][]----- -Commands.Party.None=[[RED]]\u30d1\u30fc\u30c6\u30a3\u30fc\u306b\u53c2\u52a0\u3057\u3066\u3044\u307e\u305b\u3093\u3002 -Commands.Party.Quit=[[GREEN]]- \u73fe\u5728\u306e\u30d1\u30fc\u30c6\u30a3\u30fc\u3092\u629c\u3051\u308b -Commands.Party.Teleport=[[GREEN]]- \u30d1\u30fc\u30c6\u30a3\u30fc\u30e1\u30f3\u30d0\u30fc\u3078\u30c6\u30ec\u30dd\u30fc\u30c8 -Commands.Party.Toggle=[[GREEN]]- \u30d1\u30fc\u30c6\u30a3\u30fc\u30c1\u30e3\u30c3\u30c8\u3092\u5207\u308a\u66ff\u3048 -Commands.Party1=[[GREEN]]- \u65b0\u3057\u3044\u30d1\u30fc\u30c6\u30a3\u30fc\u3092\u4f5c\u6210 -Commands.Party2=[[GREEN]]- \u30d7\u30ec\u30a4\u30e4\u30fc\u30d1\u30fc\u30c6\u30a3\u30fc\u306b\u53c2\u52a0\u3059\u308b -Commands.Party.Alliance.Header=[[RED]]-----[][[GREEN]]\u30d1\u30fc\u30c6\u30a3\u30fc\u540c\u76df[[RED]][]----- -Commands.Party.Alliance.Ally=[[WHITE]]{0} [[DARK_GRAY]]\u540c\u76df: [[WHITE]]{1} -Commands.Party.Alliance.Members.Header=[[RED]]-----[][[GREEN]]\u540c\u76df\u30e1\u30f3\u30d0\u30fc[[RED]][]----- -Commands.Party.Alliance.Invite.0=\u901a\u77e5: [[GREEN]]{1}\u304b\u3089{0}\u306e\u30d1\u30fc\u30c6\u30a3\u30fc\u540c\u76df\u62db\u5f85\u3092\u53d7\u3051\u53d6\u308a\u307e\u3057\u305f -Commands.Party.Alliance.Invite.1=[[GREEN]]/party alliance accept[[YELLOW]]\u3092\u5165\u529b\u3057\u3066\u62db\u5f85\u3092\u53d7\u3051\u5165\u308c\u307e\u3059 -Commands.Party.Alliance.Invite.Accepted=[[GREEN]]\u540c\u76df\u306e\u62db\u5f85\u3092\u53d7\u3051\u5165\u308c\u3089\u308c\u307e\u3057\u305f\u3002 -Commands.Party.Alliance.None=[[RED]]\u3042\u306a\u305f\u306e\u30d1\u30fc\u30c6\u30a3\u30fc\u306b\u306f\u540c\u76df\u304c\u3044\u307e\u305b\u3093\u3002 -Commands.Party.Alliance.AlreadyAllies=[[RED]]\u3042\u306a\u305f\u306e\u30d1\u30fc\u30c6\u30a3\u30fc\u306b\u306f\u3059\u3067\u306b\u540c\u76df\u304c\u3044\u307e\u3059\u3002[[DARK_AQUA]]/party alliance disband[[RED]]\u3067\u89e3\u6563 -Commands.Party.Alliance.Help.0=[[RED]]\u3053\u306e\u30d1\u30fc\u30c6\u30a3\u30fc\u306f\u540c\u76df\u3092\u7d50\u3093\u3067\u3044\u307e\u305b\u3093\u3002\u30d1\u30fc\u30c6\u30a3\u30fc\u30ea\u30fc\u30c0\u30fc\u3092\u62db\u5f85\u3057\u3066\u540c\u76df\u3092\u7d50\u3076\u3002 -Commands.Party.Alliance.Help.1=[[DARK_AQUA]]/party alliance invite <\u30d7\u30ec\u30a4\u30e4\u30fc> -Commands.ptp.Enabled=\u30d1\u30fc\u30c6\u30a3\u30fc\u30c6\u30ec\u30dd\u30fc\u30c8\u304c[[GREEN]]\u6709\u52b9[[WHITE]]\u306b\u5207\u308a\u66ff\u308f\u308a\u307e\u3057\u305f\u3002 -Commands.ptp.Disabled=\u30d1\u30fc\u30c6\u30a3\u30fc\u30c6\u30ec\u30dd\u30fc\u30c8\u304c[[RED]]\u7121\u52b9[[WHITE]]\u306b\u5207\u308a\u66ff\u308f\u308a\u307e\u3057\u305f\u3002 -Commands.ptp.NoRequests=[[RED]]\u73fe\u5728\u30c6\u30ec\u30dd\u30fc\u30c8\u30ea\u30af\u30a8\u30b9\u30c8\u306f\u3042\u308a\u307e\u305b\u3093\u3002 -Commands.ptp.NoWorldPermissions=[[RED]][mcMMO] \u30ef\u30fc\u30eb\u30c9{0}\u306b\u30c6\u30ec\u30dd\u30fc\u30c8\u3059\u308b\u6a29\u9650\u304c\u3042\u308a\u307e\u305b\u3093\u3002 -Commands.ptp.Request1=[[YELLOW]]{0} [[GREEN]]\u304c\u30c6\u30ec\u30dd\u30fc\u30c8\u3092\u30ea\u30af\u30a8\u30b9\u30c8\u3057\u307e\u3057\u305f\u3002 -Commands.ptp.Request2=[[GREEN]]\u30c6\u30ec\u30dd\u30fc\u30c8\u3059\u308b\u306b\u306f\u3001[[YELLOW]]/ptp accept[[GREEN]]\u3068\u5165\u529b\u3057\u307e\u3059\u3002\u30ea\u30af\u30a8\u30b9\u30c8\u306f[[RED]]{0} [[GREEN]]\u79d2\u3067\u671f\u9650\u5207\u308c\u306b\u306a\u308a\u307e\u3059\u3002 -Commands.ptp.AcceptAny.Enabled=\u30d1\u30fc\u30c6\u30a3\u30fc\u30c6\u30ec\u30dd\u30fc\u30c8\u306e\u78ba\u8a8d\u304c[[GREEN]]\u6709\u52b9[[WHITE]]\u306b\u5207\u308a\u66ff\u308f\u308a\u307e\u3057\u305f\u3002 -Commands.ptp.AcceptAny.Disabled=\u30d1\u30fc\u30c6\u30a3\u30fc\u30c6\u30ec\u30dd\u30fc\u30c8\u306e\u78ba\u8a8d\u304c[[RED]]\u7121\u52b9[[WHITE]]\u306b\u5207\u308a\u66ff\u308f\u308a\u307e\u3057\u305f\u3002 -Commands.ptp.RequestExpired=[[RED]]\u30d1\u30fc\u30c6\u30a3\u30fc\u30c6\u30ec\u30dd\u30fc\u30c8\u306e\u6709\u52b9\u671f\u9650\u304c\u5207\u308c\u307e\u3057\u305f\u3002 -Commands.PowerLevel.Leaderboard=[[YELLOW]]--mcMMO[[BLUE]] \u30d1\u30ef\u30fc\u30ec\u30d9\u30eb [[YELLOW]]\u30ea\u30fc\u30c0\u30fc\u30dc\u30fc\u30c9-- -Commands.PowerLevel.Capped=[[DARK_RED]]\u30d1\u30ef\u30fc\u30ec\u30d9\u30eb: [[GREEN]]{0} [[DARK_RED]]\u6700\u5927\u30ec\u30d9\u30eb: [[YELLOW]]{1} -Commands.PowerLevel=[[DARK_RED]]\u30d1\u30ef\u30fc\u30ec\u30d9\u30eb: [[GREEN]]{0} -Commands.Reset.All=[[GREEN]]\u5168\u3066\u306e\u30b9\u30ad\u30eb\u30ec\u30d9\u30eb\u304c\u6b63\u5e38\u306b\u30ea\u30bb\u30c3\u30c8\u3055\u308c\u307e\u3057\u305f\u3002 -Commands.Reset.Single=[[GREEN]]{0}\u306e\u30b9\u30ad\u30eb\u30ec\u30d9\u30eb\u304c\u6b63\u5e38\u306b\u30ea\u30bb\u30c3\u30c8\u3055\u308c\u307e\u3057\u305f\u3002 -Commands.Reset=[[GREEN]]- \u30b9\u30ad\u30eb\u306e\u30ec\u30d9\u30eb\u30920\u306b\u30ea\u30bb\u30c3\u30c8\u3057\u307e\u3059\u3002 -Commands.Scoreboard.Clear=[[DARK_AQUA]]mcMMO \u30b9\u30b3\u30a2\u30dc\u30fc\u30c9\u304c\u30af\u30ea\u30a2\u3055\u308c\u307e\u3057\u305f\u3002 -Commands.Scoreboard.NoBoard=[[RED]]The mcMMO \u30b9\u30b3\u30a2\u30dc\u30fc\u30c9\u304c\u6709\u52b9\u3067\u306f\u3042\u308a\u307e\u305b\u3093\u3002 -Commands.Scoreboard.Keep=[[DARK_AQUA]]mcMMO \u30b9\u30b3\u30a2\u30dc\u30fc\u30c9\u306f[[GREEN]]/mcscoreboard clear[[DARK_AQUA]]\u3092\u4f7f\u7528\u3059\u308b\u307e\u3067\u66f4\u65b0\u3055\u308c\u307e\u305b\u3093\u3002 -Commands.Scoreboard.Timer=[[DARK_AQUA]]mcMMO\u30b9\u30b3\u30a2\u30dc\u30fc\u30c9\u306f[[GOLD]]{0}[[DARK_AQUA]]\u79d2\u5f8c\u306b\u6d88\u53bb\u3055\u308c\u307e\u3059\u3002 -Commands.Scoreboard.Help.0=[[GOLD]] == [[RED]]/mcscoreboard[[GREEN]]\u306e\u30d8\u30eb\u30d7 [[GOLD]] == -Commands.Scoreboard.Help.1=[[DARK_AQUA]]/mcscoreboard[[AQUA]] clear [[WHITE]] - mcMMO\u30b9\u30b3\u30a2\u30dc\u30fc\u30c9\u3092\u30af\u30ea\u30a8\u3059\u308b -Commands.Scoreboard.Help.2=[[DARK_AQUA]]/mcscoreboard[[AQUA]] keep [[WHITE]] - mcMMO\u30b9\u30b3\u30a2\u30dc\u30fc\u30c9\u3092\u7dad\u6301\u3059\u308b -Commands.Scoreboard.Help.3=[[DARK_AQUA]]/mcscoreboard[[AQUA]] time [n] [[WHITE]] - mcMMO\u30b9\u30b3\u30a2\u30dc\u30fc\u30c9\u3092[[LIGHT_PURPLE]]n[[WHITE]]\u79d2\u5f8c\u306b\u30af\u30ea\u30a2\u3059\u308b -Commands.Scoreboard.Tip.Keep=[[GOLD]]\u30d2\u30f3\u30c8: \u30b9\u30b3\u30a2\u30dc\u30fc\u30c9\u304c\u8868\u793a\u3055\u308c\u3066\u3044\u308b\u9593\u306b[[RED]]/mcscoreboard keep[[GOLD]]\u3092\u4f7f\u7528\u3057\u3066\u6d88\u3048\u306a\u3044\u3088\u3046\u306b\u3059\u308b\u3002 -Commands.Scoreboard.Tip.Clear=[[GOLD]]\u30d2\u30f3\u30c8: [[RED]]/mcscoreboard clear[[GOLD]]\u3092\u4f7f\u7528\u3057\u3066\u30b9\u30b3\u30a2\u30dc\u30fc\u30c9\u3092\u6d88\u53bb\u3059\u308b\u3002 -Commands.Skill.Invalid=\u6709\u52b9\u306a\u30b9\u30ad\u30eb\u540d\u3067\u306f\u3042\u308a\u307e\u305b\u3093\uff01 -Commands.Skill.ChildSkill=\u3053\u306e\u30b3\u30de\u30f3\u30c9\u3067\u306f\u5b50\u30b9\u30ad\u30eb\u306f\u7121\u52b9\u3067\u3059\uff01 -Commands.Skill.Leaderboard=--mcMMO [[BLUE]]{0}[[YELLOW]] \u30ea\u30fc\u30c0\u30fc\u30dc\u30fc\u30c9-- -Commands.SkillInfo=[[GREEN]]- \u30b9\u30ad\u30eb\u306b\u95a2\u3059\u308b\u8a73\u7d30\u60c5\u5831\u3092\u8868\u793a\u3059\u308b -Commands.Stats=[[GREEN]]- mcMMO\u306e\u7d71\u8a08\u3092\u8868\u793a\u3059\u308b -Commands.ToggleAbility=[[GREEN]]- \u53f3\u30af\u30ea\u30c3\u30af\u3067\u30a2\u30d3\u30ea\u30c6\u30a3\u3092\u5207\u308a\u66ff\u3048\u308b -Commands.Usage.0=[[RED]]\u9069\u5207\u306a\u4f7f\u7528\u6cd5\u306f /{0} -Commands.Usage.1=[[RED]]\u9069\u5207\u306a\u4f7f\u7528\u6cd5\u306f /{0} {1} -Commands.Usage.2=[[RED]]\u9069\u5207\u306a\u4f7f\u7528\u6cd5\u306f /{0} {1} {2} -Commands.Usage.3=[[RED]]\u9069\u5207\u306a\u4f7f\u7528\u6cd5\u306f /{0} {1} {2} {3} -Commands.Usage.FullClassName=\u30af\u30e9\u30b9\u540d -Commands.Usage.Level=\u30ec\u30d9\u30eb -Commands.Usage.Message=\u30e1\u30c3\u30bb\u30fc\u30b8 -Commands.Usage.Page=\u30da\u30fc\u30b8 -Commands.Usage.PartyName=\u540d\u79f0 -Commands.Usage.Password=\u30d1\u30b9\u30ef\u30fc\u30c9 -Commands.Usage.Player=\u30d7\u30ec\u30a4\u30e4\u30fc -Commands.Usage.Rate=\u30ec\u30fc\u30c8 -Commands.Usage.Skill=\u30b9\u30ad\u30eb -Commands.Usage.SubSkill=\u30b5\u30d6\u30b9\u30ad\u30eb +mcMMO.Description=&emcMMO&3プロジェクトについて:,&6mcMMOは2011年2月に&9nossr50&6によって開始された&cオープンソースの&6RPG modです。,目標は高品質のRPG体験を提供することです。,&3ヒント:,&6 - &c/mcmmo help&aを使用してコマンドを表示します,&6 - &c/スキル名&aを使用してスキルの詳細情報を表示します,&3開発者:,&6 - &anossr50 &9(作者 & プロジェクトリーダー),&6 - &aelectronicboy &9(開発),&6 - &akashike &9(開発),&6 - &at00thpick1 &9(Classic メンテナー) +mcMMO.Description.FormerDevs=&3元開発者: &aGJ, NuclearW, bm01, TfT_02, Glitchfinder +Commands.addlevels.AwardAll.1=&aすべてのスキルで{0}レベルを獲得しました! +Commands.addlevels.AwardAll.2=すべてのスキルが{0}に変更されました。 +Commands.addlevels.AwardSkill.1=&a{1}で{0}レベルを獲得しました。 +Commands.addlevels.AwardSkill.2={0}が{1}に変更されました。 +Commands.addxp.AwardAll=&aすべてのスキルで{0}経験値を獲得しました! +Commands.addxp.AwardSkill=&a{1}で{0}経験値を獲得しました。 +Commands.Ability.Off=アビリティの使用を&cオフ&fに切り替えました。 +Commands.Ability.On=アビリティの使用を&aオン&fに切り替えました。 +Commands.Ability.Toggle=&e{0}&fのアビリティの使用を切り替えられました。 +Commands.AdminChat.Off=管理用チャットの使用を&cオフ&fに切り替えました。 +Commands.AdminChat.On=管理用チャットの使用を&aオン&fに切り替えました。 +Commands.AdminToggle=&a- 管理用チャットの切り替え +Commands.Chat.Console=*コンソール* +Commands.Cooldowns.Header=&6--= &amcMMO アビリティ クールダウン&6 =-- +Commands.Cooldowns.Row.N=\ &c{0}&f - &6残り {1} 秒 +Commands.Cooldowns.Row.Y=\ &b{0}&f - &2準備完了! +Commands.Database.CooldownMS=このコマンドを再度使用するには{0}ミリ秒待つ必要があります。 +Commands.Database.Cooldown=このコマンドを再度使用する前に {0} 秒待つ必要があります。 +Commands.Database.Processing=前回のコマンドがまだ処理中です。お待ち下さい。 +Commands.Disabled=このコマンドは無効です。 +Commands.DoesNotExist= &cプレイヤーがデータベースに存在しません! +Commands.GodMode.Disabled=mcMMO ゴッドモードが無効 +Commands.GodMode.Enabled=mcMMO ゴッドモードが有効 +Commands.AdminChatSpy.Enabled=mcMMO パーティーチャットSPYを有効 +Commands.AdminChatSpy.Disabled=mcMMO パーティーチャットSPYを無効 +Commands.AdminChatSpy.Toggle=mcMMO パーティーチャットが&e{0}&fに切り替えられました。 +Commands.AdminChatSpy.Chat=&6[SPY: &a{0}&6] &f{1} +Commands.GodMode.Forbidden=[mcMMO] ゴッドモードはこのワールドで許可されていません(権限を参照) +Commands.GodMode.Toggle=ゴッドモードが&e{0}&fに切り替えられました。 +Commands.Healthbars.Changed.HEARTS=[mcMMO] 体力バーの表示が&cHeart&fに切り替えられました。 +Commands.Healthbars.Changed.BAR=[mcMMO] 体力バーの表示が&eBoxed&fに切り替えられました。 +Commands.Healthbars.Changed.DISABLED=[mcMMO] MOBの体力バーが&7無効&f。 +Commands.Healthbars.Invalid=体力バーのタイプが無効! +Commands.Inspect=<プレイヤー> &a- 詳細なプレイヤー情報を見る。 +Commands.Invite.Success=&a招待が正常に送信されました。 +Commands.Leaderboards=<スキル> <ページ> &a- リーダーボード +Commands.mcgod=&a- ゴッドモードを切り替え +Commands.mchud.Invalid=有効なHUDタイプではありません。 +Commands.mcpurge.Success=&aデータベースは正常にパージされました! +Commands.mcrank.Heading=&6-=個人ランキング=- +Commands.mcrank.Overall=全体&a - &6ランク &f#&a{0} +Commands.mcrank.Player=&eランキング &f{0} +Commands.mcrank.Skill=&e{0}&a - &6ランク &f#&a{1} +Commands.mcrank.Unranked=&fランクなし +Commands.mcrefresh.Success={0}のクールダウンが更新されました。 +Commands.mcremove.Success=&a{0}がデータベースから正常に削除されました! +Commands.mctop.Tip=&6ヒント: &c/mcrank&6を使用して全ての個人ランキングを表示! +Commands.mmoedit=[プレイヤー] <スキル> <新しい値> &a - ターゲットを変更 +Commands.mmoedit.AllSkills.1=&a全てのスキルレベルが{0}に設定されました! +Commands.mmoedit.Modified.1=&a{0}のレベルは{1}に設定されました! +Commands.mmoedit.Modified.2={0}は{1}に変更されました。 +Commands.mcconvert.Database.Same=すでに{0}データベースを使用しています! +Commands.mcconvert.Database.InvalidType={0}は有効なデータベースタイプではありません。 +Commands.mcconvert.Database.Start=&7{0}から{1}への変換を開始しています... +Commands.mcconvert.Database.Finish=&7データベースの以降が完了しました。; {1}データベースには{0}データベースの全てのデータが含まれています。 +Commands.mmoshowdb=現在使用しているデータベースは&a{0}&fです。 +Commands.mcconvert.Experience.Invalid=不明な数式タイプ! 有効なタイプ: &aLINEAR &c及び &aEXPONENTIAL&c. +Commands.mcconvert.Experience.Same=すでに数式タイプ {0} を使用しています。 +Commands.mcconvert.Experience.Start=&7{0} から {1} 曲線への変換を開始しています +Commands.mcconvert.Experience.Finish=&7数式の変換が完了しました。; 現在 {0} XP曲線を使用しています。 +Commands.ModDescription=&a- modの簡単な説明を読む +Commands.NoConsole=このコマンドはコンソールからの使用をサポートしていません。 +Commands.Notifications.Off=アビリティ通知が&cオフ&fに切り替わりました。 +Commands.Notifications.On=アビリティ通知が&aオン&fに切り替わりました。 +Commands.Offline=このコマンドはオフラインプレイヤーに機能しません。 +Commands.NotLoaded=プレイヤーのプロファイルはまだ読み込まれていません。 +Commands.Party.Status=&8名前: &f{0} {1} &8レベル: &3{2} +Commands.Party.Status.Alliance=&8味方: &f{0} +Commands.Party.UnlockedFeatures=&8ロック解除された機能: &7&o{0} +Commands.Party.ShareMode=&8共有モード: +Commands.Party.ItemShare=&7アイテム &3({0}) +Commands.Party.ExpShare=&7EXP &3({0}) +Commands.Party.ItemShareCategories=&8アイテム共有: &7&o{0} +Commands.Party.MembersNear=&8あなたの近くに &3{0}&8/&3{1} +Commands.Party.Accept=&a- パーティー招待を許諾 +Commands.Party.Chat.Off=パーティーチャットが&cオフ&fに切り替わりました。 +Commands.Party.Chat.On=パーティーチャットが&aオン&fに切り替わりました。 +Commands.Party.Commands=&c---[]&aパーティーコマンド&c[]--- +Commands.Party.Invite.0=&c通知: &a{1}から{0}のパーティーへの招待を受け取りました。 +Commands.Party.Invite.1=&a/party accept&eを入力して、招待を受け入れます。 +Commands.Party.Invite=&a- パーティー招待を送信 +Commands.Party.Invite.Accepted=&a招待を受け入れました。 パーティー {0} に参加しました。 +Commands.Party.Join=&7参加パーティー: {0} +Commands.Party.PartyFull=&6{0}&c は満員です! +Commands.Party.PartyFull.Invite=&a{1}&cにはすでに&3{2}&c人がいるため、&a{1}&cに&e{0}&cを招待することはできません! +Commands.Party.PartyFull.InviteAccept=&cすでに&3{1}&c人のプレイヤーが居るため、&a{0}&cには参加できません。 +Commands.Party.Create=&7作成されたパーティー: {0} +Commands.Party.Rename=&7パーティー名変更: &f{0} +Commands.Party.SetSharing=&7パーティー {0} の共有設定: &3{1} +Commands.Party.ToggleShareCategory=&6{0}&7のパーティーアイテム共有は&3{1}&7になりました。 +Commands.Party.AlreadyExists=&4パーティー {0} はすでに存在します! +Commands.Party.Kick=&cパーティー&a{0}&cから追い出されました! +Commands.Party.Leave=&eパーティーから抜けました +Commands.Party.Members.Header=&c-----[]&aメンバー&c[]----- +Commands.Party.None=&cパーティーに参加していません。 +Commands.Party.Quit=&a- 現在のパーティーを抜ける +Commands.Party.Teleport=&a- パーティーメンバーへテレポート +Commands.Party.Toggle=&a- パーティーチャットを切り替え +Commands.Party1=&a- 新しいパーティーを作成 +Commands.Party2=&a- プレイヤーパーティーに参加する +Commands.Party.Alliance.Header=&c-----[]&aパーティー同盟&c[]----- +Commands.Party.Alliance.Ally=&f{0} &8同盟: &f{1} +Commands.Party.Alliance.Members.Header=&c-----[]&a同盟メンバー&c[]----- +Commands.Party.Alliance.Invite.0=通知: &a{1}から{0}のパーティー同盟招待を受け取りました +Commands.Party.Alliance.Invite.1=&a/party alliance accept&eを入力して招待を受け入れます +Commands.Party.Alliance.Invite.Accepted=&a同盟の招待を受け入れられました。 +Commands.Party.Alliance.None=&cあなたのパーティーには同盟がいません。 +Commands.Party.Alliance.AlreadyAllies=&cあなたのパーティーにはすでに同盟がいます。&3/party alliance disband&cで解散 +Commands.Party.Alliance.Help.0=&cこのパーティーは同盟を結んでいません。パーティーリーダーを招待して同盟を結ぶ。 +Commands.Party.Alliance.Help.1=&3/party alliance invite <プレイヤー> +Commands.ptp.Enabled=パーティーテレポートが&a有効&fに切り替わりました。 +Commands.ptp.Disabled=パーティーテレポートが&c無効&fに切り替わりました。 +Commands.ptp.NoRequests=&c現在テレポートリクエストはありません。 +Commands.ptp.NoWorldPermissions=&c[mcMMO] ワールド{0}にテレポートする権限がありません。 +Commands.ptp.Request1=&e{0} &aがテレポートをリクエストしました。 +Commands.ptp.Request2=&aテレポートするには、&e/ptp accept&aと入力します。リクエストは&c{0} &a秒で期限切れになります。 +Commands.ptp.AcceptAny.Enabled=パーティーテレポートの確認が&a有効&fに切り替わりました。 +Commands.ptp.AcceptAny.Disabled=パーティーテレポートの確認が&c無効&fに切り替わりました。 +Commands.ptp.RequestExpired=&cパーティーテレポートの有効期限が切れました。 +Commands.PowerLevel.Leaderboard=&e--mcMMO&9 パワーレベル &eリーダーボード-- +Commands.PowerLevel.Capped=&4パワーレベル: &a{0} &4最大レベル: &e{1} +Commands.PowerLevel=&4パワーレベル: &a{0} +Commands.Reset.All=&a全てのスキルレベルが正常にリセットされました。 +Commands.Reset.Single=&a{0}のスキルレベルが正常にリセットされました。 +Commands.Reset=&a- スキルのレベルを0にリセットします。 +Commands.Scoreboard.Clear=&3mcMMO スコアボードがクリアされました。 +Commands.Scoreboard.NoBoard=&cThe mcMMO スコアボードが有効ではありません。 +Commands.Scoreboard.Keep=&3mcMMO スコアボードは&a/mcscoreboard clear&3を使用するまで更新されません。 +Commands.Scoreboard.Timer=&3mcMMOスコアボードは&6{0}&3秒後に消去されます。 +Commands.Scoreboard.Help.0=&6 == &c/mcscoreboard&aのヘルプ &6 == +Commands.Scoreboard.Help.1=&3/mcscoreboard&b clear &f - mcMMOスコアボードをクリエする +Commands.Scoreboard.Help.2=&3/mcscoreboard&b keep &f - mcMMOスコアボードを維持する +Commands.Scoreboard.Help.3=&3/mcscoreboard&b time [n] &f - mcMMOスコアボードを&dn&f秒後にクリアする +Commands.Scoreboard.Tip.Keep=&6ヒント: スコアボードが表示されている間に&c/mcscoreboard keep&6を使用して消えないようにする。 +Commands.Scoreboard.Tip.Clear=&6ヒント: &c/mcscoreboard clear&6を使用してスコアボードを消去する。 +Commands.XPBar.Reset=&6mcMMOのXP Barの設定がリセットされました。 +Commands.XPBar.SettingChanged=&6a{0} &6のXPバー設定を &a{1} に変更しました。 +Commands.Skill.Invalid=有効なスキル名ではありません! +Commands.Skill.ChildSkill=このコマンドでは子スキルは無効です! +Commands.Skill.Leaderboard=--mcMMO &9{0}&e リーダーボード-- +Commands.SkillInfo=&a- スキルに関する詳細情報を表示する +Commands.Stats=&a- mcMMOの統計を表示する +Commands.ToggleAbility=&a- 右クリックでアビリティを切り替える +Commands.Usage.0=&c適切な使用法は /{0} +Commands.Usage.1=&c適切な使用法は /{0} {1} +Commands.Usage.2=&c適切な使用法は /{0} {1} {2} +Commands.Usage.3=&c適切な使用法は /{0} {1} {2} {3} +Commands.Usage.3.XP=&c適切な使用法は /{0} {1} {2} {3} &7(最後に-sを入れることで、プレイヤーに知らせずにコマンドを実行することができます) +Commands.Usage.FullClassName=クラス名 +Commands.Usage.Level=レベル +Commands.Usage.Message=メッセージ +Commands.Usage.Page=ページ +Commands.Usage.PartyName=名称 +Commands.Usage.Password=パスワード +Commands.Usage.Player=プレイヤー +Commands.Usage.Rate=レート +Commands.Usage.Skill=スキル +Commands.Usage.SubSkill=サブスキル Commands.Usage.XP=xp -Commands.Description.mmoinfo=\u30b9\u30ad\u30eb\u307e\u305f\u306f\u30e1\u30ab\u30cb\u30c3\u30af\u306b\u95a2\u3059\u308b\u8a73\u7d30\u3092\u8aad\u3080 -Commands.MmoInfo.Mystery=[[GRAY]]\u3053\u306e\u30b9\u30ad\u30eb\u306e\u30ed\u30c3\u30af\u306f\u307e\u3060\u89e3\u9664\u3055\u308c\u3066\u3044\u307e\u305b\u3093\u304c\u3001\u89e3\u9664\u3059\u308b\u3068\u3053\u3053\u3067\u8a73\u7d30\u3092\u8aad\u3080\u3053\u3068\u304c\u3067\u304d\u307e\u3059\uff01 -Commands.MmoInfo.NoMatch=\u305d\u306e\u30b5\u30d6\u30b9\u30ad\u30eb\u306f\u5b58\u5728\u3057\u307e\u305b\u3093\uff01 -Commands.MmoInfo.Header=[[DARK_AQUA]]-=[]=====[][[GOLD]] MMO \u60c5\u5831 [[DARK_AQUA]][]=====[]=- -Commands.MmoInfo.SubSkillHeader=[[GOLD]]\u540d\u524d:[[YELLOW]] {0} -Commands.MmoInfo.DetailsHeader=[[DARK_AQUA]]-=[]=====[][[GREEN]] \u8a73\u7d30 [[DARK_AQUA]][]=====[]=- -Commands.MmoInfo.OldSkill=[[GRAY]]mcMMO\u30b9\u30ad\u30eb\u306f\u6539\u5584\u3055\u308c\u305f\u3082\u30b8\u30e5\u30fc\u30e9\u30fc\u30b9\u30ad\u30eb\u30b7\u30b9\u30c6\u30e0\u306b\u5909\u63db\u3055\u308c\u3066\u3044\u307e\u3059\u304c\u3001\u6b8b\u5ff5\u306a\u304c\u3089\u3053\u306e\u30b9\u30ad\u30eb\u306f\u307e\u3060\u5909\u63db\u3055\u308c\u3066\u3044\u306a\u3044\u305f\u3081\u8a73\u7d30\u306a\u7d71\u8a08\u60c5\u5831\u304c\u3042\u308a\u307e\u305b\u3093\u3002\u65b0\u3057\u3044\u30b7\u30b9\u30c6\u30e0\u306b\u3088\u308a\u3001\u65b0\u3057\u3044mcMMO\u30b9\u30ad\u30eb\u306e\u30ea\u30ea\u30fc\u30b9\u6642\u9593\u304c\u77ed\u7e2e\u3055\u308c\u3001\u6728\u4f9d\u5b58\u306e\u30b9\u30ad\u30eb\u3068\u306e\u67d4\u8edf\u6027\u304c\u5411\u4e0a\u3057\u307e\u3059\u3002 -Commands.MmoInfo.Mechanics=[[DARK_AQUA]]-=[]=====[][[GOLD]] \u529b\u5b66 [[DARK_AQUA]][]=====[]=- -Commands.MmoInfo.Stats=\u7d71\u8a08: {0} -Commands.Mmodebug.Toggle=mcMMO\u30c7\u30d0\u30c3\u30b0\u30e2\u30fc\u30c9\u306f[0]\u306b\u306a\u308a\u307e\u3057\u305f\u3002\u3053\u306e\u30b3\u30de\u30f3\u30c9\u306f\u518d\u3073\u4f7f\u7528\u3059\u308b\u3053\u3068\u3067\u5207\u308a\u66ff\u3048\u3089\u308c\u307e\u3059\u3002\u30c7\u30d0\u30c3\u30b0\u30e2\u30fc\u30c9\u304ctrue\u306e\u5834\u5408\u3001\u30d6\u30ed\u30c3\u30af\u306e\u53e9\u3044\u3066\u30b5\u30dd\u30fc\u30c8\u306b\u4f7f\u7528\u3055\u308c\u308b\u60c5\u5831\u3092\u51fa\u529b\u3067\u304d\u307e\u3059\u3002 -mcMMO.NoInvites=[[RED]]\u73fe\u5728\u3001\u62db\u5f85\u306f\u3042\u308a\u307e\u305b\u3093\u3002 -mcMMO.NoPermission=[[DARK_RED]]\u6a29\u9650\u304c\u4e0d\u5341\u5206\u3067\u3059\u3002 -mcMMO.NoSkillNote=[[DARK_GRAY]]\u30b9\u30ad\u30eb\u306b\u30a2\u30af\u30bb\u30b9\u3067\u304d\u306a\u3044\u5834\u5408\u306f\u3001\u3053\u3053\u306b\u306f\u8868\u793a\u3055\u308c\u307e\u305b\u3093\u3002 +Commands.Description.mmoinfo=スキルまたはメカニックに関する詳細を読む +Commands.MmoInfo.Mystery=&7このスキルのロックはまだ解除されていませんが、解除するとここで詳細を読むことができます! +Commands.MmoInfo.NoMatch=そのサブスキルは存在しません! +Commands.MmoInfo.Header=&3-=[]=====[]&6 MMO 情報 &3[]=====[]=- +Commands.MmoInfo.SubSkillHeader=&6名前:&e {0} +Commands.MmoInfo.DetailsHeader=&3-=[]=====[]&a 詳細 &3[]=====[]=- +Commands.MmoInfo.OldSkill=&7mcMMOスキルは改善されたもジューラースキルシステムに変換されていますが、残念ながらこのスキルはまだ変換されていないため詳細な統計情報がありません。新しいシステムにより、新しいmcMMOスキルのリリース時間が短縮され、木依存のスキルとの柔軟性が向上します。 +Commands.MmoInfo.Mechanics=&3-=[]=====[]&6 力学 &3[]=====[]=- +Commands.MmoInfo.Stats=統計: {0} +Commands.Mmodebug.Toggle=mcMMOデバッグモードは[0]になりました。このコマンドは再び使用することで切り替えられます。デバッグモードがtrueの場合、ブロックの叩いてサポートに使用される情報を出力できます。 +mcMMO.NoInvites=&c現在、招待はありません。 +mcMMO.NoPermission=&4権限が不十分です。 +mcMMO.NoSkillNote=&8スキルにアクセスできない場合は、ここには表示されません。 ## party -Party.Forbidden=[mcMMO] \u3053\u306e\u30ef\u30fc\u30eb\u30c9\u3067\u306f\u30d1\u30fc\u30c6\u30a3\u30fc\u304c\u8a31\u53ef\u3055\u308c\u3066\u3044\u307e\u305b\u3093\uff08\u6a29\u9650\u3092\u53c2\u7167\uff09 -Party.Help.0=[[RED]]\u9069\u5207\u306a\u4f7f\u7528\u6cd5\u306f [[DARK_AQUA]]{0} <\u30d7\u30ec\u30a4\u30e4\u30fc> [\u30d1\u30b9\u30ef\u30fc\u30c9] \u3067\u3059\u3002 -Party.Help.1=[[RED]]\u30d1\u30fc\u30c6\u30a3\u30fc\u3092\u4f5c\u6210\u3059\u308b\u306b\u306f [[DARK_AQUA]]{0} <\u540d\u79f0> [\u30d1\u30b9\u30ef\u30fc\u30c9] \u3092\u4f7f\u7528\u3057\u307e\u3059\u3002 -Party.Help.2=[[RED]]\u8a73\u7d30\u306f [[DARK_AQUA]]{0} [[RED]] \u306b\u76f8\u8ac7\u3057\u3066\u304f\u3060\u3055\u3044\u3002 -Party.Help.3=[[DARK_AQUA]]{0} <\u30d7\u30ec\u30a4\u30e4\u30fc> [\u30d1\u30b9\u30ef\u30fc\u30c9] [[RED]]\u3092\u4f7f\u7528\u3057\u3066\u53c2\u52a0\u3059\u308b\u304b\u3001[[DARK_AQUA]]{1} [[RED]]\u3092\u4f7f\u7528\u3057\u3066\u629c\u3051\u307e\u3059\u3002 -Party.Help.4=[[RED]]\u30d1\u30fc\u30c6\u30a3\u30fc\u306e\u30ed\u30c3\u30af\u307e\u305f\u306f\u30ed\u30c3\u30af\u89e3\u9664\u306b\u306f\u3001[[DARK_AQUA]]{0} [[RED]]\u3092\u4f7f\u7528\u3057\u307e\u3059\u3002 -Party.Help.5=[[RED]]\u30d1\u30fc\u30c6\u30a3\u30fc\u3092\u30d1\u30b9\u30ef\u30fc\u30c9\u3067\u4fdd\u8b77\u3059\u308b\u306b\u306f\u3001[[DARK_AQUA]]{0} <\u30d1\u30b9\u30ef\u30fc\u30c9> [[RED]]\u3092\u4f7f\u7528\u3057\u307e\u3059\u3002 -Party.Help.6=[[RED]]\u30d1\u30fc\u30c6\u30a3\u30fc\u304b\u3089\u30d7\u30ec\u30a4\u30e4\u30fc\u3092\u30ad\u30c3\u30af\u3059\u308b\u306b\u306f\u3001[[DARK_AQUA]]{0} <\u30d7\u30ec\u30a4\u30e4\u30fc> [[RED]]\u3092\u4f7f\u7528\u3057\u307e\u3059\u3002 -Party.Help.7=[[RED]]\u30d1\u30fc\u30c6\u30a3\u30fc\u306e\u6240\u6709\u6a29\u3092\u8b72\u6e21\u3059\u308b\u306b\u306f\u3001[[DARK_AQUA]]{0} <\u30d7\u30ec\u30a4\u30e4\u30fc> [[RED]]\u3092\u4f7f\u7528\u3057\u307e\u3059\u3002 -Party.Help.8=[[RED]]\u30d1\u30fc\u30c6\u30a3\u30fc\u3092\u89e3\u6563\u3059\u308b\u306b\u306f\u3001[[DARK_AQUA]]{0} [[RED]]\u3092\u4f7f\u7528\u3057\u307e\u3059\u3002 -Party.Help.9=[[DARK_AQUA]]{0} [[RED]]\u3092\u4f7f\u7528\u3057\u3066\u3001\u30d1\u30fc\u30c6\u30a3\u30fc\u30e1\u30f3\u30d0\u30fc\u3068\u30a2\u30a4\u30c6\u30e0\u3092\u5171\u6709\u3057\u307e\u3059\u3002 -Party.Help.10=[[DARK_AQUA]]{0} [[RED]]\u3092\u4f7f\u7528\u3057\u3066\u3001\u30d1\u30fc\u30c6\u30a3\u30fc\u30e1\u30f3\u30d0\u30fc\u3068\u306eXP\u5171\u6709\u3092\u6709\u52b9\u306b\u3057\u307e\u3059\u3002 -Party.InformedOnJoin={0} [[GREEN]]\u304c\u30d1\u30fc\u30c6\u30a3\u30fc\u306b\u53c2\u52a0\u3057\u307e\u3057\u305f\u3002 -Party.InformedOnQuit={0} [[GREEN]]\u304c\u30d1\u30fc\u30c6\u30a3\u30fc\u304b\u3089\u96e2\u8131\u3057\u307e\u3057\u305f\u3002 -Party.InformedOnNameChange=[[GOLD]]{0}\u304c\u30d1\u30fc\u30c6\u30a3\u30fc\u540d\u3092[[WHITE]]{1}[[GREEN]]\u306b\u8a2d\u5b9a\u3057\u307e\u3057\u305f\u3002 -Party.InvalidName=[[DARK_RED]]\u6709\u52b9\u306a\u30d1\u30fc\u30c6\u30a3\u30fc\u540d\u3067\u306f\u3042\u308a\u307e\u305b\u3093\u3002 -Party.Invite.Self=[[RED]]\u81ea\u5206\u81ea\u8eab\u3092\u62db\u5f85\u3059\u308b\u3053\u3068\u306f\u3067\u304d\u307e\u305b\u3093\u3002 -Party.IsLocked=[[RED]]\u3053\u306e\u30d1\u30fc\u30c6\u30a3\u30fc\u306f\u3059\u3067\u306b\u30ed\u30c3\u30af\u3055\u308c\u3066\u3044\u307e\u3059\uff01 -Party.IsntLocked=[[RED]]\u3053\u306e\u30d1\u30fc\u30c6\u30a3\u30fc\u306f\u30ed\u30c3\u30af\u3055\u308c\u3066\u3044\u307e\u305b\u3093\uff01 -Party.Locked=[[RED]]\u30d1\u30fc\u30c6\u30a3\u30fc\u306f\u30ed\u30c3\u30af\u3055\u308c\u3066\u304a\u308a\u3001\u30d1\u30fc\u30c6\u30a3\u30fc\u30ea\u30fc\u30c0\u30fc\u3060\u3051\u304c\u62db\u5f85\u3067\u304d\u307e\u3059\u3002 -Party.NotInYourParty=[[DARK_RED]]{0}\u306f\u3042\u306a\u305f\u306e\u30d1\u30fc\u30c6\u30a3\u306b\u3044\u307e\u305b\u3093\u3002 -Party.NotOwner=[[DARK_RED]]\u3042\u306a\u305f\u306f\u30d1\u30fc\u30c6\u30a3\u30fc\u30ea\u30fc\u30c0\u30fc\u3067\u306f\u3042\u308a\u307e\u305b\u3093\u3002 -Party.Target.NotOwner=[[DARK_RED]]{0}\u306f\u30d1\u30fc\u30c6\u30a3\u30fc\u30ea\u30fc\u30c0\u30fc\u3067\u306f\u3042\u308a\u307e\u305b\u3093\u3002 -Party.Owner.New=[[GREEN]]{0}\u304c\u65b0\u3057\u3044\u30d1\u30fc\u30c6\u30a3\u30fc\u30ea\u30fc\u30c0\u30fc\u306b\u306a\u308a\u307e\u3057\u305f\u3002 -Party.Owner.NotLeader=[[DARK_RED]]\u3042\u306a\u305f\u306f\u3082\u306f\u3084\u30d1\u30fc\u30c6\u30a3\u30fc\u30ea\u30fc\u30c0\u30fc\u3067\u306f\u3042\u308a\u307e\u305b\u3093\u3002 -Party.Owner.Player =[[GREEN]]\u3042\u306a\u305f\u306f\u73fe\u5728\u30d1\u30fc\u30c6\u30a3\u30fc\u30ea\u30fc\u30c0\u30fc\u3067\u3059\u3002 -Party.Password.None=[[RED]]\u3053\u306e\u30d1\u30fc\u30c6\u30a3\u30fc\u306f\u30d1\u30b9\u30ef\u30fc\u30c9\u3067\u4fdd\u8b77\u3055\u308c\u3066\u3044\u307e\u3059\u3002\u53c2\u52a0\u3059\u308b\u305f\u3081\u306b\u306f\u30d1\u30b9\u30ef\u30fc\u30c9\u3092\u5165\u529b\u3057\u3066\u304f\u3060\u3055\u3044\u3002 -Party.Password.Incorrect=[[RED]]\u30d1\u30fc\u30c6\u30a3\u30fc\u306e\u30d1\u30b9\u30ef\u30fc\u30c9\u304c\u6b63\u3057\u304f\u3042\u308a\u307e\u305b\u3093\u3002 -Party.Password.Set=[[GREEN]]\u30d1\u30fc\u30c6\u30a3\u30fc\u30d1\u30b9\u30ef\u30fc\u30c9\u304c{0}\u306b\u8a2d\u5b9a\u3055\u308c\u307e\u3057\u305f -Party.Password.Removed=[[GREEN]]\u30d1\u30fc\u30c6\u30a3\u306e\u30d1\u30b9\u30ef\u30fc\u30c9\u304c\u6d88\u53bb\u3055\u308c\u307e\u3057\u305f\u3002 -Party.Player.Invalid=[[RED]]\u6709\u52b9\u306a\u30d7\u30ec\u30a4\u30e4\u30fc\u3067\u306f\u3042\u308a\u307e\u305b\u3093\u3002 -Party.NotOnline=[[DARK_RED]]{0}\u306f\u30aa\u30f3\u30e9\u30a4\u30f3\u3067\u306f\u3042\u308a\u307e\u305b\u3093\uff01 -Party.Player.InSameParty=[[RED]]{0}\u306f\u65e2\u306b\u30d1\u30fc\u30c6\u30a3\u30fc\u306b\u53c2\u52a0\u3057\u3066\u3044\u307e\u3059\uff01 -Party.PlayerNotInParty=[[DARK_RED]]{0}\u306f\u30d1\u30fc\u30c6\u30a3\u30fc\u306b\u53c2\u52a0\u3057\u3066\u3044\u307e\u305b\u3093\u3002 -Party.Specify=[[RED]]\u3042\u306a\u305f\u306f\u30d1\u30fc\u30c6\u30a3\u30fc\u3092\u6307\u5b9a\u3059\u308b\u5fc5\u8981\u304c\u3042\u308a\u307e\u3059\u3002 -Party.Teleport.Dead=[[RED]]\u6b7b\u4ea1\u3057\u305f\u30d7\u30ec\u30a4\u30e4\u30fc\u306b\u30c6\u30ec\u30dd\u30fc\u30c8\u3059\u308b\u3053\u3068\u306f\u3067\u304d\u307e\u305b\u3093\u3002 -Party.Teleport.Hurt=[[RED]]{0}\u79d2\u4ee5\u5185\u306b\u30c0\u30e1\u30fc\u30b8\u3092\u53d7\u3051\u3066\u3044\u308b\u305f\u3081\u3001\u30c6\u30ec\u30dd\u30fc\u30c8\u3059\u308b\u3053\u3068\u306f\u3067\u304d\u307e\u305b\u3093\u3002 -Party.Teleport.Player=[[GREEN]]{0}\u306b\u30c6\u30ec\u30dd\u30fc\u30c8\u3057\u307e\u3057\u305f\u3002 -Party.Teleport.Self=[[RED]]\u81ea\u5206\u81ea\u8eab\u306b\u30c6\u30ec\u30dd\u30fc\u30c8\u3067\u304d\u307e\u305b\u3093\uff01 -Party.Teleport.Target=[[GREEN]]{0}\u304c\u3042\u306a\u305f\u306b\u30c6\u30ec\u30dd\u30fc\u30c8\u3057\u307e\u3057\u305f\u3002 -Party.Teleport.Disabled=[[RED]]{0}\u306f\u30d1\u30fc\u30c6\u30a3\u30fc\u30c6\u30ec\u30dd\u30fc\u30c8\u3092\u8a31\u53ef\u3057\u3066\u3044\u307e\u305b\u3093\u3002 -Party.Rename.Same=[[RED]]\u305d\u308c\u306f\u65e2\u306b\u3042\u306a\u305f\u306e\u30d1\u30fc\u30c6\u30a3\u540d\u3067\u3059\u3002 -Party.Join.Self=[[RED]]\u3042\u306a\u305f\u306f\u81ea\u5206\u81ea\u8eab\u306b\u53c2\u52a0\u3059\u308b\u3053\u3068\u306f\u3067\u304d\u307e\u305b\u3093\uff01 -Party.Unlocked=[[GRAY]]\u30d1\u30fc\u30c6\u30a3\u30fc\u306f\u30a2\u30f3\u30ed\u30c3\u30af\u3055\u308c\u3066\u3044\u307e\u3059 -Party.Disband=[[GRAY]]\u30d1\u30fc\u30c6\u30a3\u30fc\u306f\u89e3\u6563\u3055\u308c\u307e\u3057\u305f -Party.Alliance.Formed=[[GRAY]]\u3042\u306a\u305f\u306e\u30d1\u30fc\u30c6\u30a3\u30fc\u306f\u73fe\u5728[[GREEN]]{0}[[GRAY]]\u3068\u540c\u76df\u4e2d\u3067\u3059\u3002 -Party.Alliance.Disband=\u3042\u306a\u305f\u306e\u30d1\u30fc\u30c6\u30a3\u30fc\u306f[[RED]]{0}[[GRAY]]\u3068\u540c\u76df\u95a2\u4fc2\u3067\u306f\u306a\u304f\u306a\u308a\u307e\u3057\u305f\u3002 -Party.Status.Locked=[[DARK_RED]](\u62db\u5f85\u306e\u307f) -Party.Status.Unlocked=[[DARK_GREEN]](\u30aa\u30fc\u30d7\u30f3) -Party.LevelUp=[[YELLOW]]\u30d1\u30fc\u30c6\u30a3\u30fc\u30ec\u30d9\u30eb\u306f{0}\u5897\u52a0\u3057\u307e\u3057\u305f\u3002\u5408\u8a08({1}) -Party.Feature.Chat=\u30d1\u30fc\u30c6\u30a3\u30fc\u30c1\u30e3\u30c3\u30c8 -Party.Feature.Teleport=\u30d1\u30fc\u30c6\u30a3\u30fc\u30c6\u30ec\u30dd\u30fc\u30c8 -Party.Feature.Alliance=\u540c\u76df -Party.Feature.ItemShare=\u30a2\u30a4\u30c6\u30e0\u5171\u6709 -Party.Feature.XpShare=XP\u5171\u6709 -Party.Feature.Locked.Chat=\u30ed\u30c3\u30af\u3055\u308c\u308b\u307e\u3067 {0}+ (\u30d1\u30fc\u30c6\u30a3\u30fc\u30c1\u30e3\u30c3\u30c8) -Party.Feature.Locked.Teleport=\u30ed\u30c3\u30af\u3055\u308c\u308b\u307e\u3067 {0}+ (\u30d1\u30fc\u30c6\u30a3\u30fc\u30c6\u30ec\u30dd\u30fc\u30c8) -Party.Feature.Locked.Alliance=\u30ed\u30c3\u30af\u3055\u308c\u308b\u307e\u3067 {0}+ (\u540c\u76df) -Party.Feature.Locked.ItemShare=\u30ed\u30c3\u30af\u3055\u308c\u308b\u307e\u3067 {0}+ (\u30a2\u30a4\u30c6\u30e0\u5171\u6709) -Party.Feature.Locked.XpShare=\u30ed\u30c3\u30af\u3055\u308c\u308b\u307e\u3067 {0}+ (XP\u5171\u6709) -Party.Feature.Disabled.1=[[RED]]\u30d1\u30fc\u30c6\u30a3\u30fc\u30c1\u30e3\u30c3\u30c8\u306f\u307e\u3060\u958b\u653e\u3055\u308c\u3066\u3044\u307e\u305b\u3093\u3002 -Party.Feature.Disabled.2=[[RED]]\u30d1\u30fc\u30c6\u30a3\u30fc\u30c6\u30ec\u30dd\u30fc\u30c8\u306f\u307e\u3060\u958b\u653e\u3055\u308c\u3066\u3044\u307e\u305b\u3093\u3002 -Party.Feature.Disabled.3=[[RED]]\u540c\u76df\u306f\u307e\u3060\u958b\u653e\u3055\u308c\u3066\u3044\u307e\u305b\u3093\u3002 -Party.Feature.Disabled.4=[[RED]]\u30a2\u30a4\u30c6\u30e0\u5171\u6709\u306f\u307e\u3060\u958b\u653e\u3055\u308c\u3066\u3044\u307e\u305b\u3093\u3002 -Party.Feature.Disabled.5=[[RED]]XP\u5171\u6709\u306f\u307e\u3060\u958b\u653e\u3055\u308c\u3066\u3044\u307e\u305b\u3093\u3002 +Party.Forbidden=[mcMMO] このワールドではパーティーが許可されていません(権限を参照) +Party.Help.0=&c適切な使用法は &3{0} <プレイヤー> [パスワード] です。 +Party.Help.1=&cパーティーを作成するには &3{0} <名称> [パスワード] を使用します。 +Party.Help.2=&c詳細は &3{0} &c に相談してください。 +Party.Help.3=&3{0} <プレイヤー> [パスワード] &cを使用して参加するか、&3{1} &cを使用して抜けます。 +Party.Help.4=&cパーティーのロックまたはロック解除には、&3{0} &cを使用します。 +Party.Help.5=&cパーティーをパスワードで保護するには、&3{0} <パスワード> &cを使用します。 +Party.Help.6=&cパーティーからプレイヤーをキックするには、&3{0} <プレイヤー> &cを使用します。 +Party.Help.7=&cパーティーの所有権を譲渡するには、&3{0} <プレイヤー> &cを使用します。 +Party.Help.8=&cパーティーを解散するには、&3{0} &cを使用します。 +Party.Help.9=&3{0} &cを使用して、パーティーメンバーとアイテムを共有します。 +Party.Help.10=&3{0} &cを使用して、パーティーメンバーとのXP共有を有効にします。 +Party.InformedOnJoin={0} &aがパーティーに参加しました。 +Party.InformedOnQuit={0} &aがパーティーから離脱しました。 +Party.InformedOnNameChange=&6{0}がパーティー名を&f{1}&aに設定しました。 +Party.InvalidName=&4有効なパーティー名ではありません。 +Party.Invite.Self=&c自分自身を招待することはできません。 +Party.IsLocked=&cこのパーティーはすでにロックされています! +Party.IsntLocked=&cこのパーティーはロックされていません! +Party.Locked=&cパーティーはロックされており、パーティーリーダーだけが招待できます。 +Party.NotInYourParty=&4{0}はあなたのパーティにいません。 +Party.NotOwner=&4あなたはパーティーリーダーではありません。 +Party.Target.NotOwner=&4{0}はパーティーリーダーではありません。 +Party.Owner.New=&a{0}が新しいパーティーリーダーになりました。 +Party.Owner.NotLeader=&4あなたはもはやパーティーリーダーではありません。 +Party.Owner.Player =&aあなたは現在パーティーリーダーです。 +Party.Password.None=&cこのパーティーはパスワードで保護されています。参加するためにはパスワードを入力してください。 +Party.Password.Incorrect=&cパーティーのパスワードが正しくありません。 +Party.Password.Set=&aパーティーパスワードが{0}に設定されました +Party.Password.Removed=&aパーティのパスワードが消去されました。 +Party.Player.Invalid=&c有効なプレイヤーではありません。 +Party.NotOnline=&4{0}はオンラインではありません! +Party.Player.InSameParty=&c{0}は既にパーティーに参加しています! +Party.PlayerNotInParty=&4{0}はパーティーに参加していません。 +Party.Specify=&cあなたはパーティーを指定する必要があります。 +Party.Teleport.Dead=&c死亡したプレイヤーにテレポートすることはできません。 +Party.Teleport.Hurt=&c{0}秒以内にダメージを受けているため、テレポートすることはできません。 +Party.Teleport.Player=&a{0}にテレポートしました。 +Party.Teleport.Self=&c自分自身にテレポートできません! +Party.Teleport.Target=&a{0}があなたにテレポートしました。 +Party.Teleport.Disabled=&c{0}はパーティーテレポートを許可していません。 +Party.Rename.Same=&cそれは既にあなたのパーティ名です。 +Party.Join.Self=&cあなたは自分自身に参加することはできません! +Party.Unlocked=&7パーティーはアンロックされています +Party.Disband=&7パーティーは解散されました +Party.Alliance.Formed=&7あなたのパーティーは現在&a{0}&7と同盟中です。 +Party.Alliance.Disband=あなたのパーティーは&c{0}&7と同盟関係ではなくなりました。 +Party.Status.Locked=&4(招待のみ) +Party.Status.Unlocked=&2(オープン) +Party.LevelUp=&eパーティーレベルは{0}増加しました。合計({1}) +Party.Feature.Chat=パーティーチャット +Party.Feature.Teleport=パーティーテレポート +Party.Feature.Alliance=同盟 +Party.Feature.ItemShare=アイテム共有 +Party.Feature.XpShare=XP共有 +Party.Feature.Locked.Chat=ロックされるまで {0}+ (パーティーチャット) +Party.Feature.Locked.Teleport=ロックされるまで {0}+ (パーティーテレポート) +Party.Feature.Locked.Alliance=ロックされるまで {0}+ (同盟) +Party.Feature.Locked.ItemShare=ロックされるまで {0}+ (アイテム共有) +Party.Feature.Locked.XpShare=ロックされるまで {0}+ (XP共有) +Party.Feature.Disabled.1=&cパーティーチャットはまだ開放されていません。 +Party.Feature.Disabled.2=&cパーティーテレポートはまだ開放されていません。 +Party.Feature.Disabled.3=&c同盟はまだ開放されていません。 +Party.Feature.Disabled.4=&cアイテム共有はまだ開放されていません。 +Party.Feature.Disabled.5=&cXP共有はまだ開放されていません。 Party.ShareType.Xp=XP -Party.ShareType.Item=\u30a2\u30a4\u30c6\u30e0 -Party.ShareMode.None=\u7121\u3057 -Party.ShareMode.Equal=\u5e73\u7b49 -Party.ShareMode.Random=\u30e9\u30f3\u30c0\u30e0 -Party.ItemShare.Category.Loot=\u6226\u5229\u54c1 -Party.ItemShare.Category.Mining=\u63a1\u6398 -Party.ItemShare.Category.Herbalism=\u8fb2\u696d -Party.ItemShare.Category.Woodcutting=\u6728\u3053\u308a -Party.ItemShare.Category.Misc=\u305d\u306e\u4ed6 +Party.ShareType.Item=アイテム +Party.ShareMode.None=無し +Party.ShareMode.Equal=平等 +Party.ShareMode.Random=ランダム +Party.ItemShare.Category.Loot=戦利品 +Party.ItemShare.Category.Mining=採掘 +Party.ItemShare.Category.Herbalism=農業 +Party.ItemShare.Category.Woodcutting=木こり +Party.ItemShare.Category.Misc=その他 ## xp -Commands.XPGain.Acrobatics=\u843d\u4e0b -Commands.XPGain.Alchemy=\u30dd\u30fc\u30b7\u30e7\u30f3\u91b8\u9020 -Commands.XPGain.Archery=\u30e2\u30f3\u30b9\u30bf\u30fc\u3078\u306e\u653b\u6483 -Commands.XPGain.Axes=\u30e2\u30f3\u30b9\u30bf\u30fc\u3078\u306e\u653b\u6483 -Commands.XPGain.Child=\u89aa\u30b9\u30ad\u30eb\u304b\u3089\u30ec\u30d9\u30eb\u7372\u5f97 -Commands.XPGain.Excavation=\u5b9d\u7269\u3092\u5800\u308a\u3001\u63a2\u3059 -Commands.XPGain.Fishing=\u91e3\u308a -Commands.XPGain.Herbalism=\u30cf\u30fc\u30d6\u306e\u53ce\u7a6b -Commands.XPGain.Mining=\u9271\u77f3\u3068\u77f3\u306e\u63a1\u6398 -Commands.XPGain.Repair=\u4fee\u7406 -Commands.XPGain.Swords=\u30e2\u30f3\u30b9\u30bf\u30fc\u3078\u306e\u653b\u6483 -Commands.XPGain.Taming=\u52d5\u7269\u3092\u98fc\u3044\u306a\u3089\u3059\u3001\u307e\u305f\u306f\u72fc\u3068\u5171\u306b\u6226\u3046 -Commands.XPGain.Unarmed=\u30e2\u30f3\u30b9\u30bf\u30fc\u3078\u306e\u653b\u6483 -Commands.XPGain.Woodcutting=\u6728\u3092\u5207\u308a\u5012\u3059 -Commands.XPGain=[[DARK_GRAY]]XP\u7372\u5f97: [[WHITE]]{0} -Commands.xplock.locked=[[GOLD]]\u3042\u306a\u305f\u306eXP\u30d0\u30fc\u306f\u73fe\u5728{0}\u3067\u30ed\u30c3\u30af\u3055\u308c\u3066\u3044\u307e\u3059\uff01 -Commands.xplock.unlocked=[[GOLD]]\u3042\u306a\u305f\u306eXP\u30d0\u30fc\u306f\u73fe\u5728[[GREEN]]\u30ed\u30c3\u30af\u89e3\u9664[[GOLD]]\u3055\u308c\u3066\u3044\u307e\u3059\uff01 -Commands.xprate.modified=[[RED]]XP\u30ec\u30fc\u30c8\u306f{0}\u306b\u5909\u66f4\u3055\u308c\u307e\u3057\u305f -Commands.xprate.over=[[RED]]mcMMO XP\u30ec\u30fc\u30c8\u30a4\u30d9\u30f3\u30c8\u304c\u7d42\u308f\u308a\u307e\u3057\u305f\uff01 -Commands.xprate.proper.0=[[RED]]XP\u30ec\u30fc\u30c8\u3092\u5909\u66f4\u3059\u308b\u305f\u3081\u306e\u6b63\u3057\u3044\u65b9\u6cd5\u306f\/xprate \u3067\u3059\u3002 -Commands.xprate.proper.1=[[RED]]XP\u30ec\u30fc\u30c8\u3092\u30c7\u30d5\u30a9\u30eb\u30c8\u306b\u623b\u3059\u6b63\u3057\u3044\u65b9\u6cd5\u306f\/xprate reset \u3067\u3059\u3002 -Commands.xprate.proper.2=[[RED]]XP\u30ec\u30fc\u30c8\u3092\u30c7\u30d5\u30a9\u30eb\u30c8\u306b\u623b\u3059\u6b63\u3057\u3044\u65b9\u6cd5\u306f\/xprate reset \u3067\u3059\u3002 -Commands.NegativeNumberWarn=\u8ca0\u306e\u5024\u3092\u4f7f\u308f\u306a\u3044\u3067\u304f\u3060\u3055\u3044\u3002 -Commands.Event.Start=[[GREEN]]mcMMO[[GOLD]] \u30a4\u30d9\u30f3\u30c8\uff01 -Commands.Event.Stop=[[GREEN]]mcMMO[[DARK_AQUA]] \u30a4\u30d9\u30f3\u30c8\u7d42\u4e86\uff01 -Commands.Event.Stop.Subtitle=[[GREEN]]\u697d\u3057\u3093\u3067\u304f\u308c\u305f\u3053\u3068\u3092\u9858\u3063\u3066\u307e\u3059\uff01 -Commands.Event.XP=[[DARK_AQUA]]XP\u30ec\u30fc\u30c8\u306f\u73fe\u5728[[GOLD]]{0}[[DARK_AQUA]]x -Commands.xprate.started.0=[[GOLD]]mcMMO\u306eXP\u30a4\u30d9\u30f3\u30c8\u304c\u958b\u59cb\u3055\u308c\u307e\u3057\u305f\uff01 -Commands.xprate.started.1=[[GOLD]]mcMMO\u306eXP\u30ec\u30fc\u30c8\u306f3\u500d\u306b\u306a\u308a\u307e\u3057\u305f\uff01 +Commands.XPGain.Acrobatics=落下 +Commands.XPGain.Alchemy=ポーション醸造 +Commands.XPGain.Archery=モンスターへの攻撃 +Commands.XPGain.Axes=モンスターへの攻撃 +Commands.XPGain.Child=親スキルからレベル獲得 +Commands.XPGain.Excavation=宝物を堀り、探す +Commands.XPGain.Fishing=釣り +Commands.XPGain.Herbalism=ハーブの収穫 +Commands.XPGain.Mining=鉱石と石の採掘 +Commands.XPGain.Repair=修理 +Commands.XPGain.Swords=モンスターへの攻撃 +Commands.XPGain.Taming=動物を飼いならす、または狼と共に戦う +Commands.XPGain.Unarmed=モンスターへの攻撃 +Commands.XPGain.Woodcutting=木を切り倒す +Commands.XPGain=&8XP獲得: &f{0} +Commands.xplock.locked=&6あなたのXPバーは現在{0}でロックされています! +Commands.xplock.unlocked=&6あなたのXPバーは現在&aロック解除&6されています! +Commands.xprate.modified=&cXPレートは{0}に変更されました +Commands.xprate.over=&cmcMMO XPレートイベントが終わりました! +Commands.xprate.proper.0=&cXPレートを変更するための正しい方法は/xprate です。 +Commands.xprate.proper.1=&cXPレートをデフォルトに戻す正しい方法は/xprate reset です。 +Commands.xprate.proper.2=&cxpイベントかを示すためにtrueまたはfalseを指定してください。 +Commands.NegativeNumberWarn=負の値を使わないでください。 +Commands.Event.Start=&amcMMO&6 イベント! +Commands.Event.Stop=&amcMMO&3 イベント終了! +Commands.Event.Stop.Subtitle=&a楽しんでくれたことを願ってます! +Commands.Event.XP=&3XPレートは現在&6{0}&3x +Commands.xprate.started.0=&6mcMMOのXPイベントが開始されました! +Commands.xprate.started.1=&6mcMMOのXPレートは3倍になりました! # Admin Notifications -Server.ConsoleName=[[YELLOW]][Server] -Notifications.Admin.XPRate.Start.Self=[[GRAY]]\u3042\u306a\u305f\u306f[[GOLD]]{0}x[[GRAY]]\u306b\u30b0\u30ed\u30fc\u30d0\u30ebXP\u30ec\u30fc\u30c8\u3092\u8a2d\u5b9a\u3057\u307e\u3057\u305f\u3002 -Notifications.Admin.XPRate.End.Self=[[GRAY]]XP\u30ec\u30fc\u30c8\u30a4\u30d9\u30f3\u30c8\u3092\u7d42\u4e86\u3057\u307e\u3057\u305f\u3002 -Notifications.Admin.XPRate.End.Others={0}[[GRAY]]\u306fXP\u30ec\u30fc\u30c8\u30a4\u30d9\u30f3\u30c8\u3092\u7d42\u4e86\u3057\u307e\u3057\u305f -Notifications.Admin.XPRate.Start.Others={0}[[GRAY]]\u304c{1}x\u3067\u30b0\u30ed\u30fc\u30d0\u30ebXP\u30ec\u30fc\u30c8\u30a4\u30d9\u30f3\u30c8\u3092\u958b\u59cb\u307e\u305f\u306f\u5909\u66f4\u3057\u307e\u3057\u305f -Notifications.Admin.Format.Others=[[GOLD]]([[GREEN]]mcMMO [[DARK_AQUA]]\u7ba1\u7406\u8005[[GOLD]]) [[GRAY]]{0} -Notifications.Admin.Format.Self=[[GOLD]]([[GREEN]]mcMMO[[GOLD]]) [[GRAY]]{0} +Server.ConsoleName=&e[Server] +Notifications.Admin.XPRate.Start.Self=&7あなたは&6{0}x&7にグローバルXPレートを設定しました。 +Notifications.Admin.XPRate.End.Self=&7XPレートイベントを終了しました。 +Notifications.Admin.XPRate.End.Others={0}&7はXPレートイベントを終了しました +Notifications.Admin.XPRate.Start.Others={0}&7が{1}xでグローバルXPレートイベントを開始または変更しました +Notifications.Admin.Format.Others=&6(&amcMMO &3管理者&6) &7{0} +Notifications.Admin.Format.Self=&6(&amcMMO&6) &7{0} # Event -XPRate.Event=[[GOLD]]mcMMO\u306f\u73fe\u5728XP\u30ec\u30fc\u30c8\u30a4\u30d9\u30f3\u30c8\u4e2d\u3067\u3059\uff01XP\u30ec\u30fc\u30c8\u306f{0}x\u3067\u3059\uff01 +XPRate.Event=&6mcMMOは現在XPレートイベント中です!XPレートは{0}xです! # GUIDES -Guides.Available=[[GRAY]]\u5229\u7528\u53ef\u80fd\u306a{0}\u306e\u30ac\u30a4\u30c9 - /{1} ? [\u30da\u30fc\u30b8] -Guides.Header=[[GOLD]]-=[[GREEN]]{0} \u30ac\u30a4\u30c9[[GOLD]]=- -Guides.Page.Invalid=\u6709\u52b9\u306a\u30da\u30fc\u30b8\u756a\u53f7\u3067\u306f\u3042\u308a\u307e\u305b\u3093\u3002 -Guides.Page.OutOfRange=\u305d\u306e\u30da\u30fc\u30b8\u306f\u5b58\u5728\u3057\u307e\u305b\u3093\u3002\u5408\u8a08\u30da\u30fc\u30b8\u6570\u306f{0}\u306e\u307f\u3067\u3059\u3002 -Guides.Usage=\u4f7f\u3044\u65b9\u306f /{0} ? [\u30da\u30fc\u30b8] \u3067\u3059\u3002 +Guides.Available=&7利用可能な{0}のガイド - /{1} ? [ページ] +Guides.Header=&6-=&a{0} ガイド&6=- +Guides.Page.Invalid=有効なページ番号ではありません。 +Guides.Page.OutOfRange=そのページは存在しません。合計ページ数は{0}のみです。 +Guides.Usage=使い方は /{0} ? [ページ] です。 ## Acrobatics -Guides.Acrobatics.Section.0=[[DARK_AQUA]]\u30a2\u30af\u30ed\u30d0\u30c6\u30a3\u30c3\u30af\u306b\u3064\u3044\u3066\uff1a\n[[YELLOW]]\u30a2\u30af\u30ed\u30d0\u30c6\u30a3\u30c3\u30af\u306f\u3001mcMMO\u3067\u512a\u96c5\u306b\u52d5\u304f\u82b8\u8853\u3067\u3059\u3002\n[[YELLOW]]\u30a2\u30af\u30ed\u30d0\u30c6\u30a3\u30c3\u30af\u306f\u3001mcMMO\u3067\u512a\u96c5\u306b\u52d5\u304f\u82b8\u8853\u3067\u3059\u3002\n\n[[DARK_AQUA]]XP\u7372\u5f97\uff1a\n[[YELLOW]]\u3053\u306e\u30b9\u30ad\u30eb\u3067XP\u3092\u7372\u5f97\u3059\u308b\u306b\u306f\u3001\u6226\u95d8\u3067\u8eb1\u3059\u304b\\[[YELLOW]]n\u30c0\u30e1\u30fc\u30b8\u3092\u53d7\u3051\u308b\u9ad8\u3055\u304b\u3089\u843d\u4e0b\u3057\u3066\u751f\u304d\u6b8b\u308b\u5fc5\u8981\u304c\u3042\u308a\u307e\u3059\u3002 -Guides.Acrobatics.Section.1=[[DARK_AQUA]]\u53d7\u3051\u8eab\u306f\u3069\u306e\u3088\u3046\u306b\u6a5f\u80fd\u3057\u307e\u3059\u304b\uff1f\r\n[[YELLOW]]\u843d\u4e0b\u30c0\u30e1\u30fc\u30b8\u3092\u53d7\u3051\u305f\u3068\u304d\u306b\u53d7\u3051\u305f\u30c0\u30e1\u30fc\u30b8\u3092\u6253\u3061\u6d88\u3059\u30c1\u30e3\u30f3\u30b9\u304c\u3042\u308a\u307e\u3059\u3002\\n[[YELLOW]]\u843d\u4e0b\u4e2d\u306b\u30b9\u30cb\u30fc\u30af\u3059\u308b\u3053\u3068\u3067\u30c1\u30e3\u30f3\u30b9\u3092\u500d\u5897\u3059\u308b\u3053\u3068\u304c\u3067\u304d\u307e\u3059\u3002 -Guides.Acrobatics.Section.2=[[DARK_AQUA]]\u8eb1\u3059\u306f\u3069\u306e\u3088\u3046\u306b\u6a5f\u80fd\u3057\u307e\u3059\u304b\uff1f\n[[YELLOW]]\u8eb1\u3059\u306f\u78ba\u7387\u3067\u6226\u95d8\u3067\u8ca0\u50b7\u3057\u305f\u3068\u304d\u306b\\n[[YELLOW]]\u53d7\u3051\u305f\u30c0\u30e1\u30fc\u30b8\u3092\u534a\u5206\u306b\u3057\u307e\u3059\u3002\\n[[YELLOW]]\u30b9\u30ad\u30eb\u30ec\u30d9\u30eb\u306b\u95a2\u4fc2\u3057\u3066\u3044\u307e\u3059\u3002 +Guides.Acrobatics.Section.0=&3アクロバティックについて:\n&eアクロバティックは、mcMMOで優雅に動く芸術です。\n&eアクロバティックは、mcMMOで優雅に動く芸術です。\n\n&3XP獲得:\n&eこのスキルでXPを獲得するには、戦闘で躱すか\\&enダメージを受ける高さから落下して生き残る必要があります。 +Guides.Acrobatics.Section.1=&3受け身はどのように機能しますか?\n&e落下ダメージを受けたときに受けたダメージを打ち消すチャンスがあります。\n&e落下中にスニークすることで確率を倍増することができます。 +Guides.Acrobatics.Section.2=&3躱すはどのように機能しますか?\n&e躱すは確率で戦闘で負傷したときに\\n&e受けたダメージを半分にします。\\n&eスキルレベルに関係しています。 ## Alchemy -Guides.Alchemy.Section.0=[[DARK_AQUA]]\u932c\u91d1\u8853\u306b\u3064\u3044\u3066\uff1a\n[[YELLOW]]\u932c\u91d1\u8853\u306f\u30dd\u30fc\u30b7\u30e7\u30f3\u306e\u91b8\u9020\u306b\u95a2\u3059\u308b\u3082\u306e\u3067\u3059\u3002\n[[YELLOW]]\u30dd\u30fc\u30b7\u30e7\u30f3\u306e\u91b8\u9020\u6642\u9593\u3092\u77ed\u7e2e\u3057\u3066\u3001\n[[YELLOW]]\u65b0\u3057\u3044\u8ffd\u52a0\u3055\u308c\u305f\u30dd\u30fc\u30b7\u30e7\u30f3\u3092\u5165\u624b\u3067\u304d\u307e\u3059\u3002\n\n\n[[DARK_AQUA]]XP \u7372\u5f97:\n[[YELLOW]]\u3053\u306e\u30b9\u30ad\u30eb\u3067XP\u3092\u7372\u5f97\u3059\u308b\u306b\u306f\u3001\u30dd\u30fc\u30b7\u30e7\u30f3\u3092\u91b8\u9020\u3059\u308b\u5fc5\u8981\u304c\u3042\u308a\u307e\u3059\u3002 -Guides.Alchemy.Section.1=[[DARK_AQUA]]How does Catalysis work?\n[[YELLOW]]Catalysis speeds of the brewing process, with a\n[[YELLOW]]max speed of 4x at level 1000.\n[[YELLOW]]This ability is unlocked at level 100 by default. -Guides.Alchemy.Section.2=[[DARK_AQUA]]How does Concoctions work?\n[[YELLOW]]Concoctions allows brewing of more potions with custom ingredients.\n[[YELLOW]]Which special ingredients are unlocked is determined\n[[YELLOW]]by your Rank. There are 8 ranks to unlock. -Guides.Alchemy.Section.3=[[DARK_AQUA]]Concoctions tier 1 ingredients:\n[[YELLOW]]Blaze Powder, Fermented Spider Eye, Ghast Tear, Redstone,\n[[YELLOW]]Glowstone Dust, Sugar, Glistering Melon, Golden Carrot,\n[[YELLOW]]Magma Cream, Nether Wart, Spider Eye, Suplhur, Water Lily,\n[[YELLOW]]Pufferfish\n[[YELLOW]](Vanilla Potions) -Guides.Alchemy.Section.4=[[DARK_AQUA]]Concoctions tier 2 ingredients:\n[[YELLOW]]Carrot (Potion of Haste)\n[[YELLOW]]Slimeball (Potion of Dullness)\n\n[[DARK_AQUA]]Concoctions tier 3 ingredients:\n[[YELLOW]]Quartz (Potion of Absorption)\n[[YELLOW]]Red Mushroom (Potion of Leaping) -Guides.Alchemy.Section.5=[[DARK_AQUA]]Concoctions tier 4 ingredients:\n[[YELLOW]]Apple (Potion of Health Boost)\n[[YELLOW]]Rotten Flesh (Potion of Hunger)\n\n[[DARK_AQUA]]Concoctions tier 5 ingredients:\n[[YELLOW]]Brown Mushroom (Potion of Nausea)\n[[YELLOW]]Ink Sack (Potion of Blindness) -Guides.Alchemy.Section.6=[[DARK_AQUA]]Concoctions tier 6 ingredients:\n[[YELLOW]]Fern (Potion of Saturation)\n\n[[DARK_AQUA]]Concoctions tier 7 ingredients:\n[[YELLOW]]Poisonous Potato (Potion of Decay)\n\n[[DARK_AQUA]]Concoctions tier 8 ingredients:\n[[YELLOW]]Regular Golden Apple (Potion of Resistance) +Guides.Alchemy.Section.0=&3錬金術について:\n&eAlchemy is about brewing potions.\n&eIt provides a speed increase in the potion brew time, as well\n&eas the addition of new (previously) unobtainable potions.\n\n\n&3XP GAIN:\n&eTo gain XP in this skill you need to brew potions. +Guides.Alchemy.Section.1=&3触媒の効果は?\n&e触媒は醸造の速度を速め、\n&eレベル1000で最大4倍の速度になります。\n&eこのアビリティはデフォルトではレベル100でアンロックされる。 +Guides.Alchemy.Section.2=&3調合の効果は?\n&e調合では材料を使って、より多くのポーションを作ることができます。\n&eどの材料がアンロックされるかは、ランクによって決定されます。\n&e解除できるランクは8つです。 +Guides.Alchemy.Section.3=&3調合 ティア1の材料:\n&eBlaze Powder, Fermented Spider Eye, Ghast Tear, Redstone,\n&eGlowstone Dust, Sugar, Glistering Melon, Golden Carrot,\n&eMagma Cream, Nether Wart, Spider Eye, Suplhur, Water Lily,\n&ePufferfish\n&e(Vanilla Potions) +Guides.Alchemy.Section.4=&3調合 ティア2の材料:\n&eCarrot (Potion of Haste)\n&eSlimeball (Potion of Dullness)\n\n&3Concoctions tier 3 ingredients:\n&eQuartz (Potion of Absorption)\n&eRed Mushroom (Potion of Leaping) +Guides.Alchemy.Section.5=&3調合 ティア4の材料:\n&eApple (Potion of Health Boost)\n&eRotten Flesh (Potion of Hunger)\n\n&3Concoctions tier 5 ingredients:\n&eBrown Mushroom (Potion of Nausea)\n&eInk Sack (Potion of Blindness) +Guides.Alchemy.Section.6=&3調合 ティア6の材料:\n&eFern (Potion of Saturation)\n\n&3Concoctions tier 7 ingredients:\n&ePoisonous Potato (Potion of Decay)\n\n&3Concoctions tier 8 ingredients:\n&eRegular Golden Apple (Potion of Resistance) ## Archery -Guides.Archery.Section.0=[[DARK_AQUA]]\u5f13\u306b\u3064\u3044\u3066\uff1a\n[[YELLOW]]Archery is about shooting with your bow and arrow.\n[[YELLOW]]It provides various combat bonuses, such as a damage boost\n[[YELLOW]]that scales with your level and the ability to daze your\n[[YELLOW]]opponents in PvP. In addition to this, you can retrieve\n[[YELLOW]]some of your spent arrows from the corpses of your foes.\n\n\n[[DARK_AQUA]]XP GAIN:\n[[YELLOW]]To gain XP in this skill you need to shoot mobs or\n[[YELLOW]]other players. -Guides.Archery.Section.1=[[DARK_AQUA]]How does Skill Shot work?\n[[YELLOW]]Skill Shot provides additional damage to your shots.\n[[YELLOW]]The bonus damage from Skill Shot increases as you\n[[YELLOW]]level in Archery.\n[[YELLOW]]With the default settings, your archery damage increases 10%\n[[YELLOW]]every 50 levels, to a maximum of 200% bonus damage. -Guides.Archery.Section.2=[[DARK_AQUA]]How does Daze work?\n[[YELLOW]]You have a passive chance to daze other players when\n[[YELLOW]]you shoot them. When Daze triggers it forces your opponents\n[[YELLOW]]to look straight up for a short duration.\n[[YELLOW]]A Daze shot also deals an additional 4 damage (2 hearts). -Guides.Archery.Section.3=[[DARK_AQUA]]How does Arrow Retrieval work?\n[[YELLOW]]You have a passive chance to retrieve some of your arrows\n[[YELLOW]]when you kill a mob with your bow.\n[[YELLOW]]This chance increases as you level in Archery.\n[[YELLOW]]By default, this ability increases by 0.1% per level, up to 100%\n[[YELLOW]]at level 1000. +Guides.Archery.Section.0=&3弓について:\n&eArchery is about shooting with your bow and arrow.\n&eIt provides various combat bonuses, such as a damage boost\nðat scales with your level and the ability to daze your\n&eopponents in PvP. In addition to this, you can retrieve\n&esome of your spent arrows from the corpses of your foes.\n\n\n&3XP GAIN:\n&eTo gain XP in this skill you need to shoot mobs or\n&eother players. +Guides.Archery.Section.1=&3スキルショットの効果は?\n&eSkill Shot provides additional damage to your shots.\n&eThe bonus damage from Skill Shot increases as you\n&elevel in Archery.\n&eWith the default settings, your archery damage increases 10%\n&eevery 50 levels, to a maximum of 200% bonus damage. +Guides.Archery.Section.2=&3幻惑の効果は?\n&eYou have a passive chance to daze other players when\n&eyou shoot them. When Daze triggers it forces your opponents\n&eto look straight up for a short duration.\n&eA Daze shot also deals an additional 4 damage (2 hearts). +Guides.Archery.Section.3=&3アローリトリーブの効果は?\n&eYou have a passive chance to retrieve some of your arrows\n&ewhen you kill a mob with your bow.\n&eThis chance increases as you level in Archery.\n&eBy default, this ability increases by 0.1% per level, up to 100%\n&eat level 1000. ## Axes -Guides.Axes.Section.0=[[DARK_AQUA]]\u65a7\u306b\u3064\u3044\u3066\uff1a\n[[YELLOW]]With the Axes skill you can use your axe for much more then\n[[YELLOW]]just deforesting! You can hack and chop away at mobs\n[[YELLOW]]and players to gain XP, hitting mobs with the effect of\n[[YELLOW]]knockback and inflicting DEADLY criticals on mobs and players.\n[[YELLOW]]Your axe also becomes a hand-held woodchipper,\n[[YELLOW]]breaking down the enemy's armor with ease as your level\n[[YELLOW]]increases.\n[[DARK_AQUA]]XP GAIN:\n[[YELLOW]]To gain XP in this skill you need hit other mobs or players\n[[YELLOW]]with an Axe. -Guides.Axes.Section.1=[[DARK_AQUA]]How does Skull Splitter work?\n[[YELLOW]]This ability allows you to deal an AoE (Area of Effect) hit.\n[[YELLOW]]This AoE hit will deal half as much damage as you did to the\n[[YELLOW]]main target, so it's great for clearing out large piles of mobs. -Guides.Axes.Section.2=[[DARK_AQUA]]How does Critical Strikes work?\n[[YELLOW]]Critical Strikes is a passive ability which gives players a\n[[YELLOW]]chance to deal additional damage.\n[[YELLOW]]With the default settings, every 2 skill levels in Axes awards a\n[[YELLOW]]0.1% chance to deal a Critical Strike, causing 2.0 times damage\n[[YELLOW]]to mobs or 1.5 times damage against other players. -Guides.Axes.Section.3=[[DARK_AQUA]]How does Axe Mastery work?\n[[YELLOW]]Axe Mastery is a passive ability that will add additional damage\n[[YELLOW]]to your hits when using Axes.\n[[YELLOW]]By default, the bonus damage increases by 1 every 50 levels,\n[[YELLOW]]up to a cap of 4 extra damage at level 200. -Guides.Axes.Section.4=[[DARK_AQUA]]How does Armor Impact work?\n[[YELLOW]]Strike with enough force to shatter armor!\n[[YELLOW]]Armor Impact has a passive chance to damage your\n[[YELLOW]]opponent's armor. This damage increases as you level in Axes. -Guides.Axes.Section.5=[[DARK_AQUA]]How does Greater Impact work?\n[[YELLOW]]You have a passive chance to achieve a greater impact when\n[[YELLOW]]hitting mobs or players with your axe.\n[[YELLOW]]By default this chance is 25%. This passive ability has an\n[[YELLOW]]extreme knockback effect, similar to the Knockback II\n[[YELLOW]]enchantment. In addition, it deals bonus damage to the target. +Guides.Axes.Section.0=&3斧について:\n&eWith the Axes skill you can use your axe for much more then\n&ejust deforesting! You can hack and chop away at mobs\n&eand players to gain XP, hitting mobs with the effect of\n&eknockback and inflicting DEADLY criticals on mobs and players.\n&eYour axe also becomes a hand-held woodchipper,\n&ebreaking down the enemy's armor with ease as your level\n&eincreases.\n&3XP GAIN:\n&eTo gain XP in this skill you need hit other mobs or players\n&ewith an Axe. +Guides.Axes.Section.1=&3スカルスプリッターの効果は?\n&eThis ability allows you to deal an AoE (Area of Effect) hit.\n&eThis AoE hit will deal half as much damage as you did to the\n&emain target, so it's great for clearing out large piles of mobs. +Guides.Axes.Section.2=&3クリティカルストライクの効果は?\n&eCritical Strikes is a passive ability which gives players a\n&echance to deal additional damage.\n&eWith the default settings, every 2 skill levels in Axes awards a\n&e0.1% chance to deal a Critical Strike, causing 2.0 times damage\n&eto mobs or 1.5 times damage against other players. +Guides.Axes.Section.3=&3アックスマスタリーの効果は?\n&eAxe Mastery is a passive ability that will add additional damage\n&eto your hits when using Axes.\n&eBy default, the bonus damage increases by 1 every 50 levels,\n&eup to a cap of 4 extra damage at level 200. +Guides.Axes.Section.4=&3アーマーインパクトの効果は?\n&eStrike with enough force to shatter armor!\n&eArmor Impact has a passive chance to damage your\n&eopponent's armor. This damage increases as you level in Axes. +Guides.Axes.Section.5=&3グレーターインパクトの効果は?\n&eYou have a passive chance to achieve a greater impact when\n&ehitting mobs or players with your axe.\n&eBy default this chance is 25%. This passive ability has an\n&eextreme knockback effect, similar to the Knockback II\n&eenchantment. In addition, it deals bonus damage to the target. ## Excavation -Guides.Excavation.Section.0=[[DARK_AQUA]]\u6398\u524a\u306b\u3064\u3044\u3066\uff1a\n[[YELLOW]]Excavation is the act of digging up dirt to find treasures.\n[[YELLOW]]By excavating the land you will find treasures.\n[[YELLOW]]The more you do this the more treasures you can find.\n\n[[DARK_AQUA]]XP GAIN:\n[[YELLOW]]To gain XP in this skill you must dig with a shovel in hand.\n[[YELLOW]]Only certain materials can be dug up for treasures and XP. -Guides.Excavation.Section.1=[[DARK_AQUA]]Compatible Materials:\n[[YELLOW]]Grass, Dirt, Sand, Clay, Gravel, Mycelium, Soul Sand, Snow -Guides.Excavation.Section.2=[[DARK_AQUA]]How to use Giga Drill Breaker:\n[[YELLOW]]With a shovel in hand right click to ready your tool.\n[[YELLOW]]Once in this state you have about 4 seconds to make\n[[YELLOW]]contact with Excavation compatible materials this will\n[[YELLOW]]activate Giga Drill Breaker. -Guides.Excavation.Section.3=[[DARK_AQUA]]What is Giga Drill Breaker?\n[[YELLOW]]Giga Drill Breaker is an ability with a cooldown\n[[YELLOW]]tied to Excavation skill. It triples your chance\n[[YELLOW]]of finding treasures and enables instant break\n[[YELLOW]]on Excavation materials. -Guides.Excavation.Section.4=[[DARK_AQUA]]How does Archaeology work?\n[[YELLOW]]Every possible treasure for Excavation has its own\n[[YELLOW]]skill level requirement for it to drop, as a result it's\n[[YELLOW]]difficult to say how much it is helping you.\n[[YELLOW]]Just keep in mind that the higher your Excavation skill\n[[YELLOW]]is, the more treasures that can be found.\n[[YELLOW]]And also keep in mind that each type of Excavation\n[[YELLOW]]compatible material has its own unique list of treasures.\n[[YELLOW]]In other words you will find different treasures in Dirt\n[[YELLOW]]than you would in Gravel. -Guides.Excavation.Section.5=[[DARK_AQUA]]Notes about Excavation:\n[[YELLOW]]Excavation drops are completely customizeable\n[[YELLOW]]So results vary server to server. +Guides.Excavation.Section.0=&3掘削について:\n&eExcavation is the act of digging up dirt to find treasures.\n&eBy excavating the land you will find treasures.\n&eThe more you do this the more treasures you can find.\n\n&3XP GAIN:\n&eTo gain XP in this skill you must dig with a shovel in hand.\n&eOnly certain materials can be dug up for treasures and XP. +Guides.Excavation.Section.1=&3互換性のあるブロック:\n&eGrass, Dirt, Sand, Clay, Gravel, Mycelium, Soul Sand, Snow +Guides.Excavation.Section.2=&3ギガドリルブレーカーを使うにはどうすればいいですか?:\n&eWith a shovel in hand right click to ready your tool.\n&eOnce in this state you have about 4 seconds to make\n&econtact with Excavation compatible materials this will\n&eactivate Giga Drill Breaker. +Guides.Excavation.Section.3=&3ギガドリルブレーカーとは?\n&eGiga Drill Breaker is an ability with a cooldown\n&etied to Excavation skill. It triples your chance\n&eof finding treasures and enables instant break\n&eon Excavation materials. +Guides.Excavation.Section.4=&3考古学の効果は?\n&eEvery possible treasure for Excavation has its own\n&eskill level requirement for it to drop, as a result it's\n&edifficult to say how much it is helping you.\n&eJust keep in mind that the higher your Excavation skill\n&eis, the more treasures that can be found.\n&eAnd also keep in mind that each type of Excavation\n&ecompatible material has its own unique list of treasures.\n&eIn other words you will find different treasures in Dirt\nðan you would in Gravel. +Guides.Excavation.Section.5=&3掘削についての注意事項:\n&eExcavation drops are completely customizeable\n&eSo results vary server to server. ## Fishing -Guides.Fishing.Section.0=[[DARK_AQUA]]\u91e3\u308a\u306b\u3064\u3044\u3066\uff1a\n[[YELLOW]]With the Fishing skill, Fishing is exciting again!\n[[YELLOW]]Find hidden treasures, and shake items off mobs.\n\n[[DARK_AQUA]]XP GAIN:\n[[YELLOW]]Catch fish. -Guides.Fishing.Section.1=[[DARK_AQUA]]How does Treasure Hunter work?\n[[YELLOW]]This ability allows you to find treasure from fishing \n[[YELLOW]]with a small chance of the items being enchanted.\n[[YELLOW]]Every possible treasure for Fishing has a chance\n[[YELLOW]]to drop on any level. It depends however\n[[YELLOW]]what the rarity of the item is how often it will drop.\n[[YELLOW]]The higher your Fishing skill is, the better\n[[YELLOW]]your chances are to find better treasures. -Guides.Fishing.Section.2=[[DARK_AQUA]]How does Ice Fishing work?\n[[YELLOW]]This passive skill allows you to fish in ice lakes!\n[[YELLOW]]Cast your fishing rod in an ice lake and the ability will\n[[YELLOW]]create a small hole in the ice to fish in. -Guides.Fishing.Section.3=[[DARK_AQUA]]How does Master Angler work?\n[[YELLOW]]This passive skill increases the bite chance while fishing.\n[[YELLOW]]When you've unlocked this ability, fishing while in\n[[YELLOW]]a boat or when an ocean biome doubles the bite chance. -Guides.Fishing.Section.4=[[DARK_AQUA]]How does Shake work?\n[[YELLOW]]This active ability allows you to shake items loose from mobs\n[[YELLOW]]by hooking them with the fishing rod. \n[[YELLOW]]Mobs will drop items they would normally drop on death.\n[[YELLOW]]It is also possible to acquire mob skulls, which are normally \n[[YELLOW]]unobtainable in survival mode. -Guides.Fishing.Section.5=[[DARK_AQUA]]How does Fisherman's Diet work?\n[[YELLOW]]This passive skill increases the amount of hunger restored \n[[YELLOW]]from eating fish. -Guides.Fishing.Section.6=[[DARK_AQUA]]Notes about Fishing:\n[[YELLOW]]Fishing drops are completely customizable,\n[[YELLOW]]so results vary server to server. +Guides.Fishing.Section.0=&3釣りについて:\n&eWith the Fishing skill, Fishing is exciting again!\n&eFind hidden treasures, and shake items off mobs.\n\n&3XP GAIN:\n&eCatch fish. +Guides.Fishing.Section.1=&3トレジャーハンターの効果は?\n&eThis ability allows you to find treasure from fishing \n&ewith a small chance of the items being enchanted.\n&eEvery possible treasure for Fishing has a chance\n&eto drop on any level. It depends however\n&ewhat the rarity of the item is how often it will drop.\n&eThe higher your Fishing skill is, the better\n&eyour chances are to find better treasures. +Guides.Fishing.Section.2=&3アイスフィッシングの効果は?\n&eThis passive skill allows you to fish in ice lakes!\n&eCast your fishing rod in an ice lake and the ability will\n&ecreate a small hole in the ice to fish in. +Guides.Fishing.Section.3=&3マスターアングラーの効果は?\n&eThis passive skill increases the bite chance while fishing.\n&eWhen you've unlocked this ability, fishing while in\n&ea boat or when an ocean biome doubles the bite chance. +Guides.Fishing.Section.4=&3シェイクはどのように動作しますか?\n&eThis active ability allows you to shake items loose from mobs\n&eby hooking them with the fishing rod. \n&eMobs will drop items they would normally drop on death.\n&eIt is also possible to acquire mob skulls, which are normally \n&eunobtainable in survival mode. +Guides.Fishing.Section.5=&3漁師の食事の効果は?\n&eThis passive skill increases the amount of hunger restored \n&efrom eating fish. +Guides.Fishing.Section.6=&3釣りに関する注意事項:\n&eFishing drops are completely customizable,\n&eso results vary server to server. ## Herbalism -Guides.Herbalism.Section.0=[[DARK_AQUA]]\u8fb2\u696d\u306b\u3064\u3044\u3066\uff1a\n[[YELLOW]]Herbalism is about collecting herbs and plants.\n\n\n[[DARK_AQUA]]XP GAIN:\n[[YELLOW]]Collect plants and herbs. -Guides.Herbalism.Section.1=[[DARK_AQUA]]Compatible Blocks\n[[YELLOW]]Wheat, Potatoes, Carrots, Melons, \n[[YELLOW]]Pumpkins, Sugar Canes, Cocoa Beans, Flowers, Cacti, Mushrooms,\n[[YELLOW]]Nether Wart, Lily Pads, and Vines. -Guides.Herbalism.Section.2=[[DARK_AQUA]]How does Green Terra work?\n[[YELLOW]]Green Terra is an active ability, you can right-click\n[[YELLOW]]while holding a hoe to activate Green Terra.\n[[YELLOW]]Green Terra grants players a chance to get 3x drops from\n[[YELLOW]]harvesting plants. It also gives players the ability to\n[[YELLOW]]spread life into blocks and transform them using seeds\n[[YELLOW]]from your inventory. -Guides.Herbalism.Section.3=[[DARK_AQUA]]How does Green Thumb (Crops) work?\n[[YELLOW]]This passive ability will automatically replant crops when\n[[YELLOW]]harvesting.\n[[YELLOW]]Your chance of success depends on your Herbalism skill. -Guides.Herbalism.Section.4=[[DARK_AQUA]]How does Green Thumb (Cobble/Stone Brick/Dirt) work?\n[[YELLOW]]This active ability allows you to turn blocks into their\n[[YELLOW]]"plant-related" counterparts. You can do this by right-clicking\n[[YELLOW]]a block, while holding seeds. This will consume 1 seed. -Guides.Herbalism.Section.5=[[DARK_AQUA]]How does Farmer's Diet work?\n[[YELLOW]]This passive skill increases the amount of hunger restored \n[[YELLOW]]when eating Bread, Cookies, Melons, Mushroom Soup, Carrots,\n[[YELLOW]]and Potatoes. -Guides.Herbalism.Section.6=[[DARK_AQUA]]How does Hylian Luck work?\n[[YELLOW]]This passive ability gives you a chance to find rare items\n[[YELLOW]]when certain blocks are broken with a sword. -Guides.Herbalism.Section.7=[[DARK_AQUA]]How do Double Drops work?\n[[YELLOW]]This passive ability gives players more yield from their\n[[YELLOW]]harvests. +Guides.Herbalism.Section.0=&3農業について:\n&eHerbalism is about collecting herbs and plants.\n\n\n&3XP GAIN:\n&eCollect plants and herbs. +Guides.Herbalism.Section.1=&3互換性のあるブロック\n&eWheat, Potatoes, Carrots, Melons, \n&ePumpkins, Sugar Canes, Cocoa Beans, Flowers, Cacti, Mushrooms,\n&eNether Wart, Lily Pads, and Vines. +Guides.Herbalism.Section.2=&3グリーンテラの効果は?\n&eGreen Terra is an active ability, you can right-click\n&ewhile holding a hoe to activate Green Terra.\n&eGreen Terra grants players a chance to get 3x drops from\n&eharvesting plants. It also gives players the ability to\n&espread life into blocks and transform them using seeds\n&efrom your inventory. +Guides.Herbalism.Section.3=&3グリーンサム(作物)の効果は?\n&eThis passive ability will automatically replant crops when\n&eharvesting.\n&eYour chance of success depends on your Herbalism skill. +Guides.Herbalism.Section.4=&3グリーンサム(丸石/石レンガ/土)の効果は?\n&eThis active ability allows you to turn blocks into their\n&e"plant-related" counterparts. You can do this by right-clicking\n&ea block, while holding seeds. This will consume 1 seed. +Guides.Herbalism.Section.5=&3農家の食事の効果は?\n&eThis passive skill increases the amount of hunger restored \n&ewhen eating Bread, Cookies, Melons, Mushroom Soup, Carrots,\n&eand Potatoes. +Guides.Herbalism.Section.6=&3ハイリアンラックの効果は?\n&eThis passive ability gives you a chance to find rare items\n&ewhen certain blocks are broken with a sword. +Guides.Herbalism.Section.7=&3ドロップ二倍の効果は?\n&eThis passive ability gives players more yield from their\n&eharvests. ## Mining -Guides.Mining.Section.0=[[DARK_AQUA]]\u63a1\u6398\u306b\u3064\u3044\u3066\uff1a\n[[YELLOW]]Mining consists of mining stone and ores. It provides bonuses\n[[YELLOW]]to the amount of materials dropped while mining.\n\n[[DARK_AQUA]]XP GAIN:\n[[YELLOW]]To gain XP in this skill, you must mine with a pickaxe in hand.\n[[YELLOW]]Only certain blocks award XP. -Guides.Mining.Section.1=[[DARK_AQUA]]Compatible Materials:\n[[YELLOW]]Stone, Coal Ore, Iron Ore, Gold Ore, Diamond Ore, Redstone Ore,\n[[YELLOW]]Lapis Ore, Obsidian, Mossy Cobblestone, Ender Stone,\n[[YELLOW]]Glowstone, and Netherrack. -Guides.Mining.Section.2=[[DARK_AQUA]]How to use Super Breaker:\n[[YELLOW]]With a pickaxe in your hand, right click to ready your tool.\n[[YELLOW]]Once in this state, you have about 4 seconds to make contact\n[[YELLOW]]with Mining compatible materials, which will activate Super\n[[YELLOW]]Breaker. -Guides.Mining.Section.3=[[DARK_AQUA]]What is Super Breaker?\n[[YELLOW]]Super Breaker is an ability with a cooldown tied to the Mining\n[[YELLOW]]skill. It triples your chance of extra items dropping and\n[[YELLOW]]enables instant break on Mining materials. -Guides.Mining.Section.4=[[DARK_AQUA]]How to use Blast Mining:\n[[YELLOW]]With a pickaxe in hand,\n[[YELLOW]]crouch and right-click on TNT from a distance. This will cause the TNT\n[[YELLOW]]to instantly explode. -Guides.Mining.Section.5=[[DARK_AQUA]]How does Blast Mining work?\n[[YELLOW]]Blast Mining is an ability with a cooldown tied to the Mining\n[[YELLOW]]skill. It gives bonuses when mining with TNT and allows you\n[[YELLOW]]to remote detonate TNT. There are three parts to Blast Mining.\n[[YELLOW]]The first part is Bigger Bombs, which increases blast radius.\n[[YELLOW]]The second is Demolitions Expert, which decreases damage\n[[YELLOW]]from TNT explosions. The third part simply increases the\n[[YELLOW]]amount of ores dropped from TNT and decreases the\n[[YELLOW]]debris dropped. +Guides.Mining.Section.0=&3採掘について:\n&eMining consists of mining stone and ores. It provides bonuses\n&eto the amount of materials dropped while mining.\n\n&3XP GAIN:\n&eTo gain XP in this skill, you must mine with a pickaxe in hand.\n&eOnly certain blocks award XP. +Guides.Mining.Section.1=&3互換性のあるブロック:\n&eStone, Coal Ore, Iron Ore, Gold Ore, Diamond Ore, Redstone Ore,\n&eLapis Ore, Obsidian, Mossy Cobblestone, Ender Stone,\n&eGlowstone, and Netherrack. +Guides.Mining.Section.2=&3スーパーブレイカーを使うにはどうすればいいですか?:\n&eWith a pickaxe in your hand, right click to ready your tool.\n&eOnce in this state, you have about 4 seconds to make contact\n&ewith Mining compatible materials, which will activate Super\n&eBreaker. +Guides.Mining.Section.3=&3スーパーブレイカーとは?\n&eSuper Breaker is an ability with a cooldown tied to the Mining\n&eskill. It triples your chance of extra items dropping and\n&eenables instant break on Mining materials. +Guides.Mining.Section.4=&3ブラストマイニングを使うにはどうすればいいですか?:\n&eWith a pickaxe in hand,\n&ecrouch and right-click on TNT from a distance. This will cause the TNT\n&eto instantly explode. +Guides.Mining.Section.5=&3ブラストマイニングの効果は?\n&eBlast Mining is an ability with a cooldown tied to the Mining\n&eskill. It gives bonuses when mining with TNT and allows you\n&eto remote detonate TNT. There are three parts to Blast Mining.\n&eThe first part is Bigger Bombs, which increases blast radius.\n&eThe second is Demolitions Expert, which decreases damage\n&efrom TNT explosions. The third part simply increases the\n&eamount of ores dropped from TNT and decreases the\n&edebris dropped. ## Repair -Guides.Repair.Section.0=[[DARK_AQUA]]\u4fee\u7406\u306b\u3064\u3044\u3066\uff1a\n[[YELLOW]]Repair allows you to use an iron block to repair armor and\n[[YELLOW]]tools.\n\n[[DARK_AQUA]]XP GAIN:\n[[YELLOW]]Repair tools or armor using the mcMMO Anvil. This is an\n[[YELLOW]]iron block by default and should not be confused with\n[[YELLOW]]the Vanilla Minecraft Anvil. -Guides.Repair.Section.1=[[DARK_AQUA]]How can I use Repair?\n[[YELLOW]]Place down a mcMMO Anvil and right-click to repair the item \n[[YELLOW]]you're currently holding. This consumes 1 item on every use. -Guides.Repair.Section.2=[[DARK_AQUA]]How does Repair Mastery work?\n[[YELLOW]]Repair Mastery increases the repair amount. The extra amount\n[[YELLOW]]repaired is influenced by your Repair skill level. -Guides.Repair.Section.3=[[DARK_AQUA]]How does Super Repair work?\n[[YELLOW]]Super Repair is a passive ability. When repairing an item,\n[[YELLOW]]it grants players a chance to repair an item with\n[[YELLOW]]double effectiveness. -Guides.Repair.Section.4=[[DARK_AQUA]]How does Arcane Forging work?\n[[YELLOW]]This passive ability allows you to repair items with a certain\n[[YELLOW]]chance of maintaining its enchantments. The enchants may be\n[[YELLOW]]kept at their existing levels, downgraded to a lower level,\n[[YELLOW]]or lost entirely. +Guides.Repair.Section.0=&3修理について:\n&eRepair allows you to use an iron block to repair armor and\n&etools.\n\n&3XP GAIN:\n&eRepair tools or armor using the mcMMO Anvil. This is an\n&eiron block by default and should not be confused with\nðe Vanilla Minecraft Anvil. +Guides.Repair.Section.1=&3修理を使うにはどうすればいいですか?:\n&ePlace down a mcMMO Anvil and right-click to repair the item \n&eyou're currently holding. This consumes 1 item on every use. +Guides.Repair.Section.2=&3リペアマスタリーの効果は?\n&eRepair Mastery increases the repair amount. The extra amount\n&erepaired is influenced by your Repair skill level. +Guides.Repair.Section.3=&3スーパーリペアの効果は?\n&eSuper Repair is a passive ability. When repairing an item,\n&eit grants players a chance to repair an item with\n&edouble effectiveness. +Guides.Repair.Section.4=&3アルカンフォージングの効果は?\n&eThis passive ability allows you to repair items with a certain\n&echance of maintaining its enchantments. The enchants may be\n&ekept at their existing levels, downgraded to a lower level,\n&eor lost entirely. ## Salvage -Guides.Salvage.Section.0=[[DARK_AQUA]]\u30b5\u30eb\u30d9\u30fc\u30b8\u306b\u3064\u3044\u3066\uff1a\n[[YELLOW]]Salvage allows you to use an gold block to salvage armor and\n[[YELLOW]]tools.\n\n[[DARK_AQUA]]XP GAIN:\n[[YELLOW]]Salvage is a child skill of Repair and Fishing, your Salvage\n[[YELLOW]]skill level is based on your Fishing and Repair skill levels. -Guides.Salvage.Section.1=[[DARK_AQUA]]How can I use Salvage?\n[[YELLOW]]Place down a mcMMO Salvage Anvil and right-click to salvage\n[[YELLOW]]the item you're currently holding. This will break apart the item,\n[[YELLOW]]and give back materials used to craft the item.\n\n[[YELLOW]]For example, salvaging an iron pickaxe will give you iron bars. -Guides.Salvage.Section.2=[[DARK_AQUA]]How does Advanced Salvage work?\n[[YELLOW]]When unlocked, this ability allows you to salvage damaged items.\n[[YELLOW]]The yield percentage increases as you level up. A higher yield\n[[YELLOW]]means that you can get more materials back.\n[[YELLOW]]With advanced salvage you will always get 1 material back,\n[[YELLOW]]unless the item is too damaged. So you don't have to worry\n[[YELLOW]]about destroying items without getting anything in return. -Guides.Salvage.Section.3=[[DARK_AQUA]]To illustrate how this works, here's an example:\n[[YELLOW]]Let's say we salvage a gold pickaxe which is damaged for 20%,\n[[YELLOW]]this means that the maximum amount you could get is only 2\n[[YELLOW]](because the pick is crafted with 3 ingots - each worth\n[[YELLOW]]33,33% durability) which is equal to 66%. If your yield\n[[YELLOW]]percentage is below 66% you are not able to get 2 ingots.\n[[YELLOW]]If it is above this value you are able to gain the "full amount",\n[[YELLOW]]which means that you will get 2 ingots. -Guides.Salvage.Section.4=[[DARK_AQUA]]How does Arcane Salvage work?\n[[YELLOW]]This ability allows you to get enchanted books when salvaging\n[[YELLOW]]enchanted items. Depending on your level the chance of\n[[YELLOW]]successfully extracting a full or partial enchantment varies.\n\n[[YELLOW]]When an enchantment is partially extracted, the enchantment\n[[YELLOW]]book will have a lower level enchantment compared to what\n[[YELLOW]]it was on the item. +Guides.Salvage.Section.0=&3サルベージについて:\n&eSalvage allows you to use an gold block to salvage armor and\n&etools.\n\n&3XP GAIN:\n&eSalvage is a child skill of Repair and Fishing, your Salvage\n&eskill level is based on your Fishing and Repair skill levels. +Guides.Salvage.Section.1=&3サルベージを使うにはどうすればいいですか?:\n&ePlace down a mcMMO Salvage Anvil and right-click to salvage\nðe item you're currently holding. This will break apart the item,\n&eand give back materials used to craft the item.\n\n&eFor example, salvaging an iron pickaxe will give you iron bars. +Guides.Salvage.Section.2=&3アドバンスドサルベージの効果は?\n&eWhen unlocked, this ability allows you to salvage damaged items.\n&eThe yield percentage increases as you level up. A higher yield\n&emeans that you can get more materials back.\n&eWith advanced salvage you will always get 1 material back,\n&eunless the item is too damaged. So you don't have to worry\n&eabout destroying items without getting anything in return. +Guides.Salvage.Section.3=&3これがどのように動作するかを説明するために、以下に例を示します:\n&eLet's say we salvage a gold pickaxe which is damaged for 20%,\nðis means that the maximum amount you could get is only 2\n&e(because the pick is crafted with 3 ingots - each worth\n&e33,33% durability) which is equal to 66%. If your yield\n&epercentage is below 66% you are not able to get 2 ingots.\n&eIf it is above this value you are able to gain the "full amount",\n&ewhich means that you will get 2 ingots. +Guides.Salvage.Section.4=&3アルカンサルベージの効果は?\n&eThis ability allows you to get enchanted books when salvaging\n&eenchanted items. Depending on your level the chance of\n&esuccessfully extracting a full or partial enchantment varies.\n\n&eWhen an enchantment is partially extracted, the enchantment\n&ebook will have a lower level enchantment compared to what\n&eit was on the item. ## Smelting Guides.Smelting.Section.0=Coming soon... ## Swords -Guides.Swords.Section.0=[[DARK_AQUA]]\u5263\u306b\u3064\u3044\u3066\uff1a\n[[YELLOW]]This skill awards combat bonuses to anyone fighting with a\n[[YELLOW]]sword.\n\n[[DARK_AQUA]]XP GAIN:\n[[YELLOW]]XP is gained based on the amount of damage dealt to mobs or \n[[YELLOW]]other players when wielding a sword. -Guides.Swords.Section.1=[[DARK_AQUA]]How does Serrated Strikes work?\n[[YELLOW]]Serrated Strikes is an active ability, you can activate it by\n[[YELLOW]]right-clicking with a sword. This ability allows you to deal \n[[YELLOW]]an AoE (Area of Effect) hit. This AoE will do a bonus 25%\n[[YELLOW]]damage and will inflict a bleed effect that lasts for 5 ticks. -Guides.Swords.Section.2=[[DARK_AQUA]]How does Counter Attack work?\n[[YELLOW]]Counter Attack is an active ability. When blocking and taking\n[[YELLOW]]hits from mobs, you will have a chance to reflect 50% of \n[[YELLOW]]the damage that was taken. -Guides.Swords.Section.3=[[DARK_AQUA]]How does Rupture work?\n[[YELLOW]]Rupture causes enemies to take damage every two seconds. The \n[[YELLOW]]target will bleed until the effect wears off, or death, \n[[YELLOW]]whichever comes first.\n[[YELLOW]]The duration of the bleed is increased by your sword skill. +Guides.Swords.Section.0=&3剣について:\n&eThis skill awards combat bonuses to anyone fighting with a\n&esword.\n\n&3XP GAIN:\n&eXP is gained based on the amount of damage dealt to mobs or \n&eother players when wielding a sword. +Guides.Swords.Section.1=&3セレーションストライクの効果は?\n&eSerrated Strikes is an active ability, you can activate it by\n&eright-clicking with a sword. This ability allows you to deal \n&ean AoE (Area of Effect) hit. This AoE will do a bonus 25%\n&edamage and will inflict a bleed effect that lasts for 5 ticks. +Guides.Swords.Section.2=&3カウンター攻撃の効果は?\n&eCounter Attack is an active ability. When blocking and taking\n&ehits from mobs, you will have a chance to reflect 50% of \nðe damage that was taken. +Guides.Swords.Section.3=&3破裂の効果は?\n&eRupture causes enemies to take damage every two seconds. The \n&etarget will bleed until the effect wears off, or death, \n&ewhichever comes first.\n&eThe duration of the bleed is increased by your sword skill. ## Taming -Guides.Taming.Section.0=[[DARK_AQUA]]\u8abf\u6559\u306b\u3064\u3044\u3066\uff1a\n[[YELLOW]]Taming will give players various combat bonuses when using\n[[YELLOW]]tamed wolves.\n\n[[DARK_AQUA]]XP GAIN:\n[[YELLOW]]To gain XP in this skill, you need to tame wolves/ocelots or\n[[YELLOW]]get into combat with your wolves. -Guides.Taming.Section.1=[DARK_AQUA]]How does Call of the Wild work?\n[[YELLOW]]Call of the Wild is an active ability that will allow you to summon\n[[YELLOW]]a wolf or an ocelot by your side. You can do this by\n[[YELLOW]]sneaking + left-clicking while holding bones or fish. -Guides.Taming.Section.2=[[DARK_AQUA]]How does Beast Lore work?\n[[YELLOW]]Beast Lore allows players to inspect pets and to check the\n[[YELLOW]]stats of wolves and ocelots. Left-click a wolf or ocelot to use\n[[YELLOW]]Beast Lore. -Guides.Taming.Section.3=[[DARK_AQUA]]How does Gore work?\n[[YELLOW]]Gore is a passive ability that has a chance of inflicting a\n[[YELLOW]]bleeding effect on your wolves' targets. -Guides.Taming.Section.4=[[DARK_AQUA]]How does Sharpened Claws work?\n[[YELLOW]]Sharpened Claws provides a damage bonus to damage dealt\n[[YELLOW]]by wolves. The damage bonus depends on your Taming level. -Guides.Taming.Section.5=[[DARK_AQUA]]How does Environmentally Aware work?\n[[YELLOW]]This passive ability will allow wolves to teleport to you when\n[[YELLOW]]they get near hazards, such as Cacti/Lava. It will also give\n[[YELLOW]]wolves fall damage immunity. -Guides.Taming.Section.6=[[DARK_AQUA]]How does Thick Fur work?\n[[YELLOW]]This passive ability will reduce damage and make wolves\n[[YELLOW]]fire resistant. -Guides.Taming.Section.7=[[DARK_AQUA]]How does Shock Proof work?\n[[YELLOW]]This passive ability reduces damage done to wolves\n[[YELLOW]]from explosions. -Guides.Taming.Section.8=[[DARK_AQUA]]How does Fast Food Service work?\n[[YELLOW]]This passive ability gives wolves a chance to heal whenever\n[[YELLOW]]they perform an attack. +Guides.Taming.Section.0=&3調教について:\n&eTaming will give players various combat bonuses when using\n&etamed wolves.\n\n&3XP GAIN:\n&eTo gain XP in this skill, you need to tame wolves/ocelots or\n&eget into combat with your wolves. +Guides.Taming.Section.1=&3コールオブザワイルドの効果は?\n&eCall of the Wild is an active ability that will allow you to summon\n&ea wolf or an ocelot by your side. You can do this by\n&esneaking + left-clicking while holding bones or fish. +Guides.Taming.Section.2=&3ビーストロアの効果は?\n&eBeast Lore allows players to inspect pets and to check the\n&estats of wolves and ocelots. Left-click a wolf or ocelot to use\n&eBeast Lore. +Guides.Taming.Section.3=&3流血の効果は?\n&eGore is a passive ability that has a chance of inflicting a\n&ebleeding effect on your wolves' targets. +Guides.Taming.Section.4=&3鋭い爪の効果は?\n&eSharpened Claws provides a damage bonus to damage dealt\n&eby wolves. The damage bonus depends on your Taming level. +Guides.Taming.Section.5=&3環境配慮の効果は?\n&eThis passive ability will allow wolves to teleport to you when\nðey get near hazards, such as Cacti/Lava. It will also give\n&ewolves fall damage immunity. +Guides.Taming.Section.6=&3厚い毛皮の効果は?\n&eThis passive ability will reduce damage and make wolves\n&efire resistant. +Guides.Taming.Section.7=&3衝撃耐性の効果は?\n&eThis passive ability reduces damage done to wolves\n&efrom explosions. +Guides.Taming.Section.8=&3ファーストフードサービスの効果は?\n&eThis passive ability gives wolves a chance to heal whenever\nðey perform an attack. ## Unarmed -Guides.Unarmed.Section.0=[[DARK_AQUA]]\u7d20\u624b\u306b\u3064\u3044\u3066\uff1a\n[[YELLOW]]Unarmed will give players various combat bonuses when using\n[[YELLOW]]your fists as a weapon. \n\n[[DARK_AQUA]]XP GAIN:\n[[YELLOW]]XP is gained based on the amount of damage dealt to mobs \n[[YELLOW]]or other players when unarmed. -Guides.Unarmed.Section.1=[[DARK_AQUA]]How does Berserk work?\n[[YELLOW]]Beserk is an active ability that is activated by\n[[YELLOW]]right-clicking. While in Beserk mode, you deal 50% more\n[[YELLOW]]damage and you can break weak materials instantly, such as\n[[YELLOW]]Dirt and Grass. -Guides.Unarmed.Section.2=[[DARK_AQUA]]How does Iron Arm work?\n[[YELLOW]]Iron Arm increases the damage dealt when hitting mobs or\n[[YELLOW]]players with your fists. -Guides.Unarmed.Section.3=[[DARK_AQUA]]How does Arrow Deflect work?\n[[YELLOW]]Arrow Deflect is a passive ability that gives you a chance\n[[YELLOW]]to deflect arrows shot by Skeletons or other players.\n[[YELLOW]]The arrow will fall harmlessly to the ground. -Guides.Unarmed.Section.4=[[DARK_AQUA]]How does Iron Grip work?\n[[YELLOW]]Iron Grip is a passive ability that counters disarm. As your\n[[YELLOW]]unarmed level increases, the chance of preventing a disarm increases. -Guides.Unarmed.Section.5=[[DARK_AQUA]]How does Disarm work?\n[[YELLOW]]This passive ability allows players to disarm other players,\n[[YELLOW]]causing the target's equipped item to fall to the ground. +Guides.Unarmed.Section.0=&3素手について:\n&eUnarmed will give players various combat bonuses when using\n&eyour fists as a weapon. \n\n&3XP GAIN:\n&eXP is gained based on the amount of damage dealt to mobs \n&eor other players when unarmed. +Guides.Unarmed.Section.1=&3バーサーカーの効果は?\n&eBeserk is an active ability that is activated by\n&eright-clicking. While in Beserk mode, you deal 50% more\n&edamage and you can break weak materials instantly, such as\n&eDirt and Grass. +Guides.Unarmed.Section.2=&3スチールアームスタイルの効果は?\n&eSteel Arm Style increases the damage dealt when hitting mobs or\n&eplayers with your fists. +Guides.Unarmed.Section.3=&3アローディフレクションの効果は?\n&eArrow Deflect is a passive ability that gives you a chance\n&eto deflect arrows shot by Skeletons or other players.\n&eThe arrow will fall harmlessly to the ground. +Guides.Unarmed.Section.4=&3アイアングリップの効果は?\n&eIron Grip is a passive ability that counters disarm. As your\n&eunarmed level increases, the chance of preventing a disarm increases. +Guides.Unarmed.Section.5=&3武装解除の効果は?\n&eThis passive ability allows players to disarm other players,\n&ecausing the target's equipped item to fall to the ground. ## Woodcutting -Guides.Woodcutting.Section.0=[[DARK_AQUA]]\u6728\u3053\u308a\u306b\u3064\u3044\u3066\uff1a\n[[YELLOW]]Woodcutting is all about chopping down trees.\n\n[[DARK_AQUA]]XP GAIN:\n[[YELLOW]]XP is gained whenever you break log blocks. -Guides.Woodcutting.Section.1=[[DARK_AQUA]]How does Tree Feller work?\n[[YELLOW]]Tree Feller is an active ability, you can right-click\n[[YELLOW]]while holding an ax to activate Tree Feller. This will\n[[YELLOW]]cause the entire tree to break instantly, dropping all\n[[YELLOW]]of its logs at once. -Guides.Woodcutting.Section.2=[[DARK_AQUA]]How does Leaf Blower work?\n[[YELLOW]]Leaf Blower is a passive ability that will cause leaf\n[[YELLOW]]blocks to break instantly when hit with an axe. By default,\n[[YELLOW]]this ability unlocks at level 100. -Guides.Woodcutting.Section.3=[[DARK_AQUA]]How do Double Drops work?\n[[YELLOW]]This passive ability gives you a chance to obtain an extra\n[[YELLOW]]block for every log you chop. +Guides.Woodcutting.Section.0=&3木こりについて:\n&eWoodcutting is all about chopping down trees.\n\n&3XP GAIN:\n&eXP is gained whenever you break log blocks. +Guides.Woodcutting.Section.1=&3ツリーフェラーの効果は?\n&eTree Feller is an active ability, you can right-click\n&ewhile holding an ax to activate Tree Feller. This will\n&ecause the entire tree to break instantly, dropping all\n&eof its logs at once. +Guides.Woodcutting.Section.2=&3リーフブロワーの効果は?\n&eLeaf Blower is a passive ability that will cause leaf\n&eblocks to break instantly when hit with an axe. By default,\nðis ability unlocks at level 100. +Guides.Woodcutting.Section.3=&3ドロップ二倍の効果は?\n&eThis passive ability gives you a chance to obtain an extra\n&eblock for every log you chop. # INSPECT -Inspect.Offline= [[RED]]\u3042\u306a\u305f\u306f\u30aa\u30d5\u30e9\u30a4\u30f3\u30d7\u30ec\u30a4\u30e4\u30fc\u3092\u8abf\u3079\u308b\u6a29\u9650\u3092\u6301\u3063\u3066\u3044\u307e\u305b\u3093\uff01 -Inspect.OfflineStats=\u30aa\u30d5\u30e9\u30a4\u30f3\u30d7\u30ec\u30fc\u30e4\u30fc\u306emcMMO\u7d71\u8a08[[YELLOW]]{0} -Inspect.Stats=[[YELLOW]]{0}[[GREEN]]\u306emcMMO\u7d71\u8a08 -Inspect.TooFar=\u305d\u306e\u30d7\u30ec\u30a4\u30e4\u30fc\u3092\u8abf\u3079\u308b\u306b\u306f\u9060\u3059\u304e\u307e\u3059\uff01 +Inspect.Offline= &cあなたはオフラインプレイヤーを調べる権限を持っていません! +Inspect.OfflineStats=オフラインプレーヤーのmcMMO統計&e{0} +Inspect.Stats=&e{0}&aのmcMMO統計 +Inspect.TooFar=そのプレイヤーを調べるには遠すぎます! # ITEMS -Item.ChimaeraWing.Fail=[[RED]]**\u30ad\u30e1\u30e9\u306e\u7ffc \u5931\u6557\uff01** -Item.ChimaeraWing.Pass=**\u30ad\u30e1\u30e9\u306e\u7ffc** -Item.ChimaeraWing.Name=\u30ad\u30e1\u30e9\u306e\u7ffc -Item.ChimaeraWing.Lore=[[GRAY]]\u3042\u306a\u305f\u3092\u30d9\u30c3\u30c9\u306b\u30c6\u30ec\u30dd\u30fc\u30c8\u3057\u307e\u3059\u3002 -Item.ChimaeraWing.NotEnough=\u3055\u3089\u306b[[GOLD]]{1}[[RED]]\u306e[[YELLOW]]{0}[[RED]]\u304c\u5fc5\u8981\u3067\u3059\uff01 -Item.NotEnough=\u3055\u3089\u306b[[GOLD]]{1}[[RED]]\u306e[[YELLOW]]{0}[[RED]]\u304c\u5fc5\u8981\u3067\u3059\uff01 -Item.Generic.Wait=\u518d\u3073\u4f7f\u7528\u3059\u308b\u524d\u306b\u5f85\u3064\u5fc5\u8981\u304c\u3042\u308a\u307e\u3059\uff01[[YELLOW]]({0}\u79d2) -Item.Injured.Wait=\u6700\u8fd1\u8ca0\u50b7\u3057\u305f\u305f\u3081\u3001\u4f7f\u7528\u307e\u3067\u5f85\u3064\u5fc5\u8981\u304c\u3042\u308a\u307e\u3059\u3002[[YELLOW]]({0}\u79d2) -Item.FluxPickaxe.Name=\u30d5\u30e9\u30c3\u30af\u30b9\u30c4\u30eb\u30cf\u30b7 -Item.FluxPickaxe.Lore.1=[[GRAY]]\u9271\u77f3\u304c\u88fd\u932c\u3055\u308c\u3066\u30c9\u30ed\u30c3\u30d7\u3059\u308b\u53ef\u80fd\u6027\u304c\u3042\u308a\u307e\u3059\u3002 -Item.FluxPickaxe.Lore.2=[[GRAY]]\u88fd\u932c\u30ec\u30d9\u30eb {0}+ \u304c\u5fc5\u8981 +Item.ChimaeraWing.Fail=&c**キメラの翼 失敗!** +Item.ChimaeraWing.Pass=**キメラの翼** +Item.ChimaeraWing.Name=キメラの翼 +Item.ChimaeraWing.Lore=&7あなたをベッドにテレポートします。 +Item.ChimaeraWing.NotEnough=さらに&6{1}&cの&e{0}&cが必要です! +Item.NotEnough=さらに&6{1}&cの&e{0}&cが必要です! +Item.Generic.Wait=再び使用する前に待つ必要があります!&e({0}秒) +Item.Injured.Wait=最近負傷したため、使用まで待つ必要があります。&e({0}秒) +Item.FluxPickaxe.Name=フラックスツルハシ +Item.FluxPickaxe.Lore.1=&7鉱石が製錬されてドロップする可能性があります。 +Item.FluxPickaxe.Lore.2=&7製錬レベル {0}+ が必要 # TELEPORTATION -Teleport.Commencing=[[GOLD]]({0})[[GREY]]\u79d2\u3067\u30c6\u30ec\u30dd\u30fc\u30c8\u3092\u958b\u59cb\u3057\u3066\u307e\u3059\u3002\u3057\u3070\u3089\u304f\u304a\u5f85\u3061\u304f\u3060\u3055\u3044... -Teleport.Cancelled=[[DARK_RED]]\u30c6\u30ec\u30dd\u30fc\u30c8\u306f\u30ad\u30e3\u30f3\u30bb\u30eb\u3055\u308c\u307e\u3057\u305f\u3002 +Teleport.Commencing=&6({0})&7秒でテレポートを開始してます。しばらくお待ちください... +Teleport.Cancelled=&4テレポートはキャンセルされました。 # SKILLS -Skills.Child=[[GOLD]](\u5b50\u30b9\u30ad\u30eb) -Skills.Disarmed=[[DARK_RED]]\u3042\u306a\u305f\u306f\u6b66\u88c5\u89e3\u9664\u3055\u308c\u307e\u3057\u305f\uff01 -Skills.Header=-----[] [[GREEN]]{0}[[RED]] []----- -Skills.NeedMore=[[DARK_RED]]\u3082\u3063\u3068[[GRAY]]{0}[[DARK_RED]]\u304c\u5fc5\u8981\u3067\u3059 -Skills.NeedMore.Extra=[[DARK_RED]]\u3082\u3063\u3068[[GRAY]]{0}{1}[[DARK_RED]]\u304c\u5fc5\u8981\u3067\u3059 +Skills.Child=&6(子スキル) +Skills.Disarmed=&4あなたは武装解除されました! +Skills.Header=-----[] &a{0}&c []----- +Skills.NeedMore=&4もっと&7{0}&4が必要です +Skills.NeedMore.Extra=&4もっと&7{0}{1}&4が必要です 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.MaxXP=\u6700\u5927 -Skills.TooTired=\u305d\u306e\u30a2\u30d3\u30ea\u30c6\u30a3\u3092\u518d\u3073\u4f7f\u3046\u306e\u306b\u306f\u75b2\u308c\u904e\u304e\u3066\u3044\u307e\u3059\u3002 [[YELLOW]]({0}\u79d2) -Skills.Cancelled=[[GOLD]]{0} [[RED]]\u30ad\u30e3\u30f3\u30bb\u30eb\uff01 -Skills.ConfirmOrCancel=[[GREEN]]\u3082\u3046\u4e00\u5ea6\u53f3\u30af\u30ea\u30c3\u30af\u3057\u3066[[GOLD]]{0}[[GREEN]]\u3092\u78ba\u8a8d\u3057\u3066\u304f\u3060\u3055\u3044\u3002 \u30ad\u30e3\u30f3\u30bb\u30eb\u3059\u308b\u306b\u306f\u5de6\u30af\u30ea\u30c3\u30af\u3057\u3066\u304f\u3060\u3055\u3044\u3002 -Skills.AbilityGateRequirementFail=[[GRAY]]\u3053\u306e\u30a2\u30d3\u30ea\u30c6\u30a3\u3092\u4f7f\u3046\u305f\u3081\u306b\u306f[[YELLOW]]{0}[[GRAY]]\u30ec\u30d9\u30eb\u306e[[DARK_AQUA]]{1}[[GRAY]]\u304c\u5fc5\u8981\u3067\u3059\u3002 +Skills.Stats={0}&a{1}&3 XP(&7{2}&3/&7{3}&3) +Skills.ChildStats={0}&a{1} +Skills.MaxXP=最大 +Skills.TooTired=そのアビリティを再び使うのには疲れ過ぎています。 &e({0}秒) +Skills.TooTired.Named=&7(&6{0}&e {1}秒&7) +Skills.TooTired.Extra=&6{0} &eスーパーアビリティCD - {1} +Skills.Cancelled=&6{0} &cキャンセル! +Skills.ConfirmOrCancel=&aもう一度右クリックして&6{0}&aを確認してください。 キャンセルするには左クリックしてください。 +Skills.AbilityGateRequirementFail=&7このアビリティを使うためには&e{0}&7レベルの&3{1}&7が必要です。 # STATISTICS -Stats.Header.Combat=[[GOLD]]-=\u6226\u95d8\u30b9\u30ad\u30eb=- -Stats.Header.Gathering=[[GOLD]]-=\u53ce\u96c6\u30b9\u30ad\u30eb=- -Stats.Header.Misc=[[GOLD]]-=\u305d\u306e\u4ed6\u306e\u30b9\u30ad\u30eb=- -Stats.Own.Stats=[[GREEN]][mcMMO] \u7d71\u8a08 +Stats.Header.Combat=&6-=戦闘スキル=- +Stats.Header.Gathering=&6-=収集スキル=- +Stats.Header.Misc=&6-=その他のスキル=- +Stats.Own.Stats=&a[mcMMO] 統計 # PERKS -Perks.XP.Name=\u7d4c\u9a13\u5024 -Perks.XP.Desc=\u7279\u5b9a\u306e\u30b9\u30ad\u30eb\u306e\u30d6\u30fc\u30b9\u30c8XP\u3092\u53d7\u3051\u53d6\u308b\u3002 -Perks.Lucky.Name=\u30e9\u30c3\u30ad\u30fc -Perks.Lucky.Desc={0}\u306e\u30b9\u30ad\u30eb\u3068\u80fd\u529b\u306b\u300133.3\uff05\u306e\u30a2\u30af\u30c6\u30a3\u30d9\u30fc\u30c8\u306e\u78ba\u7387\u3092\u4e0e\u3048\u307e\u3059\u3002 -Perks.Lucky.Desc.Login=\u7279\u5b9a\u306e\u30b9\u30ad\u30eb\u3084\u80fd\u529b\u306b33.3\uff05\u306e\u30a2\u30af\u30c6\u30a3\u30d9\u30fc\u30c8\u306e\u78ba\u7387\u3092\u4e0e\u3048\u308b\u3002 -Perks.Lucky.Bonus=[[GOLD]] ({0} \u30e9\u30c3\u30ad\u30fc\u30d1\u30fc\u30af) -Perks.Cooldowns.Name=\u65e9\u3044\u56de\u5fa9 -Perks.Cooldowns.Desc=\u30af\u30fc\u30eb\u30c0\u30a6\u30f3\u3092{0}\u77ed\u7e2e\u3057\u307e\u3059\u3002 -Perks.ActivationTime.Name=\u8010\u4e45 -Perks.ActivationTime.Desc=\u80fd\u529b\u306e\u6709\u52b9\u6642\u9593\u3092{0}\u79d2\u5897\u3084\u3057\u307e\u3059\u3002 -Perks.ActivationTime.Bonus=[[GOLD]] ({0}\u79d2 \u8010\u4e45\u30d1\u30fc\u30af) +Perks.XP.Name=経験値 +Perks.XP.Desc=特定のスキルのブーストXPを受け取る。 +Perks.Lucky.Name=ラッキー +Perks.Lucky.Desc={0}のスキルと能力に、33.3%のアクティベートの確率を与えます。 +Perks.Lucky.Desc.Login=特定のスキルや能力に33.3%のアクティベートの確率を与える。 +Perks.Lucky.Bonus=&6 ({0} ラッキーパーク) +Perks.Cooldowns.Name=早い回復 +Perks.Cooldowns.Desc=クールダウンを{0}短縮します。 +Perks.ActivationTime.Name=耐久 +Perks.ActivationTime.Desc=能力の有効時間を{0}秒増やします。 +Perks.ActivationTime.Bonus=&6 ({0}秒 耐久パーク) # HARDCORE -Hardcore.Mode.Disabled=[[GOLD]][mcMMO] \u30cf\u30fc\u30c9\u30b3\u30a2\u30e2\u30fc\u30c9 {0} \u304c{1}\u3067\u7121\u52b9\u306b\u306a\u308a\u307e\u3057\u305f\u3002 -Hardcore.Mode.Enabled=[[GOLD]][mcMMO] \u30cf\u30fc\u30c9\u30b3\u30a2\u30e2\u30fc\u30c9 {0} \u304c{1}\u3067\u6709\u52b9\u306b\u306a\u308a\u307e\u3057\u305f\u3002 -Hardcore.DeathStatLoss.Name=\u30b9\u30ad\u30eb \u30c7\u30b9\u30da\u30ca\u30eb\u30c6\u30a3 -Hardcore.DeathStatLoss.PlayerDeath=[[GOLD]][mcMMO] [[DARK_RED]]\u6b7b\u4ea1\u306b\u3088\u308a[[BLUE]]{0}[[DARK_RED]]\u30ec\u30d9\u30eb\u3092\u5931\u3044\u307e\u3057\u305f\u3002 -Hardcore.DeathStatLoss.PercentageChanged=[[GOLD]][mcMMO] \u30ed\u30b9\u30c8\u30d1\u30fc\u30bb\u30f3\u30c6\u30fc\u30b8\u304c{0}\u306b\u5909\u66f4\u3055\u308c\u307e\u3057\u305f\u3002 -Hardcore.Vampirism.Name=\u5438\u8840\u9b3c -Hardcore.Vampirism.Killer.Failure=[[GOLD]][mcMMO] [[YELLOW]]{0}[[GRAY]] \u306f\u77e5\u8b58\u304c\u672a\u719f\u3067\u3057\u305f\u3002 -Hardcore.Vampirism.Killer.Success=[[GOLD]][mcMMO] [[YELLOW]]{1}\u304b\u3089[[BLUE]]{0}[[DARK_AQUA]]\u30ec\u30d9\u30eb\u3092\u76d7\u307f\u307e\u3057\u305f\u3002 -Hardcore.Vampirism.Victim.Failure=[[GOLD]][mcMMO] [[YELLOW]]{0}[[GRAY]]\u306f\u3042\u306a\u305f\u304b\u3089\u77e5\u8b58\u3092\u76d7\u3080\u3053\u3068\u304c\u3067\u304d\u307e\u305b\u3093\u3067\u3057\u305f\uff01 -Hardcore.Vampirism.Victim.Success=[[GOLD]][mcMMO] [[YELLOW]]{0}[[DARK_RED]]\u306f\u3042\u306a\u305f\u304b\u3089[[BLUE]]{1}[[DARK_RED]]\u30ec\u30d9\u30eb\u3092\u76d7\u307f\u307e\u3057\u305f\uff01 -Hardcore.Vampirism.PercentageChanged=[[GOLD]][mcMMO] \u30ed\u30b9\u30c8\u30d1\u30fc\u30bb\u30f3\u30c6\u30fc\u30b8\u304c{0}\u306b\u5909\u66f4\u3055\u308c\u307e\u3057\u305f\u3002 +Hardcore.Mode.Disabled=&6[mcMMO] ハードコアモード {0} が{1}で無効になりました。 +Hardcore.Mode.Enabled=&6[mcMMO] ハードコアモード {0} が{1}で有効になりました。 +Hardcore.DeathStatLoss.Name=スキル デスペナルティ +Hardcore.DeathStatLoss.PlayerDeath=&6[mcMMO] &4死亡により&9{0}&4レベルを失いました。 +Hardcore.DeathStatLoss.PercentageChanged=&6[mcMMO] ロストパーセンテージが{0}に変更されました。 +Hardcore.Vampirism.Name=吸血鬼 +Hardcore.Vampirism.Killer.Failure=&6[mcMMO] &e{0}&7 は知識が未熟でした。 +Hardcore.Vampirism.Killer.Success=&6[mcMMO] &e{1}から&9{0}&3レベルを盗みました。 +Hardcore.Vampirism.Victim.Failure=&6[mcMMO] &e{0}&7はあなたから知識を盗むことができませんでした! +Hardcore.Vampirism.Victim.Success=&6[mcMMO] &e{0}&4はあなたから&9{1}&4レベルを盗みました! +Hardcore.Vampirism.PercentageChanged=&6[mcMMO] ロストパーセンテージが{0}に変更されました。 # MOTD -MOTD.Donate=[[DARK_AQUA]]\u5bc4\u4ed8\u60c5\u5831: -MOTD.Hardcore.Enabled=[[GOLD]][mcMMO] [[DARK_AQUA]]\u30cf\u30fc\u30c9\u30b3\u30a2\u30e2\u30fc\u30c9\u6709\u52b9: [[DARK_RED]]{0} -MOTD.Hardcore.DeathStatLoss.Stats=[[GOLD]][mcMMO] [[DARK_AQUA]]\u30b9\u30ad\u30eb\u30c7\u30b9\u30da\u30ca\u30eb\u30c6\u30a3: [[DARK_RED]]{0}% -MOTD.Hardcore.Vampirism.Stats=[[GOLD]][mcMMO] [[DARK_AQUA]]\u30f4\u30a1\u30f3\u30d1\u30a4\u30a2\u5438\u8840\u7d71\u8a08: [[DARK_RED]]{0}% -MOTD.PerksPrefix=[[GOLD]][mcMMO \u30d1\u30fc\u30af] -MOTD.Version=[[GOLD]][mcMMO] \u5b9f\u884c\u4e2d\u306e\u30d0\u30fc\u30b8\u30e7\u30f3 [[DARK_AQUA]]{0} -MOTD.Website=[[GOLD]][mcMMO] [[GREEN]]{0}[[YELLOW]] - mcMMO \u30a6\u30a7\u30d6\u30b5\u30a4\u30c8 +MOTD.Donate=&3寄付情報: +MOTD.Hardcore.Enabled=&6[mcMMO] &3ハードコアモード有効: &4{0} +MOTD.Hardcore.DeathStatLoss.Stats=&6[mcMMO] &3スキルデスペナルティ: &4{0}% +MOTD.Hardcore.Vampirism.Stats=&6[mcMMO] &3ヴァンパイア吸血統計: &4{0}% +MOTD.PerksPrefix=&6[mcMMO パーク] +MOTD.Version=&6[mcMMO] 実行中のバージョン &3{0} +MOTD.Website=&6[mcMMO] &a{0}&e - mcMMO ウェブサイト # SMELTING -Smelting.SubSkill.UnderstandingTheArt.Name=\u82b8\u8853\u3092\u7406\u89e3\u3059\u308b -Smelting.SubSkill.UnderstandingTheArt.Description=\u6d1e\u7a9f\u306e\u4e2d\u3067\u88fd\u932c\u306b\u6642\u9593\u3092\u304b\u3051\u904e\u304e\u3066\u3044\u308b\u304b\u3082\u3057\u308c\u307e\u305b\u3093\u3002\n\u88fd\u932c\u306e\u3055\u307e\u3056\u307e\u306a\u7279\u6027\u3092\u5f37\u5316\u3057\u307e\u3059\u3002 -Smelting.SubSkill.UnderstandingTheArt.Stat=\u30d0\u30cb\u30e9XP Multiplier: [[YELLOW]]{0}x -Smelting.Ability.Locked.0=\u30ed\u30c3\u30af\u3055\u308c\u308b\u307e\u3067 {0}+ \u30b9\u30ad\u30eb (\u30d0\u30cb\u30e9XP\u30d6\u30fc\u30b9\u30c8) -Smelting.Ability.Locked.1=\u30ed\u30c3\u30af\u3055\u308c\u308b\u307e\u3067 {0}+ \u30b9\u30ad\u30eb (\u30d5\u30e9\u30c3\u30af\u30b9\u30de\u30a4\u30cb\u30f3\u30b0) -Smelting.SubSkill.FuelEfficiency.Name=\u71c3\u6599\u52b9\u7387 -Smelting.SubSkill.FuelEfficiency.Description=\u88fd\u932c\u6642\u306b\u7ac8\u3067\u4f7f\u7528\u3059\u308b\u71c3\u6599\u306e\u71c3\u713c\u6642\u9593\u3092\u9577\u304f\u3059\u308b\u3002 -Smelting.SubSkill.FuelEfficiency.Stat=\u71c3\u6599\u52b9\u7387 \u4e57\u6570: [[YELLOW]]{0}x -Smelting.SubSkill.SecondSmelt.Name=\u7b2c\u4e8c\u7cbe\u932c -Smelting.SubSkill.SecondSmelt.Description=\u88fd\u932c\u304b\u3089\u5f97\u305f\u30a2\u30a4\u30c6\u30e0\u30922\u500d\u306b\u3059\u308b\u3002 -Smelting.SubSkill.SecondSmelt.Stat=\u7b2c\u4e8c\u7cbe\u932c \u78ba\u7387 -Smelting.Effect.4=\u30d0\u30cb\u30e9XP\u30d6\u30fc\u30b9\u30c8 -Smelting.Effect.5=\u88fd\u932c\u4e2d\u306b\u5f97\u3089\u308c\u308b\u30d0\u30cb\u30e9XP\u3092\u5897\u3084\u3059\u3002 -Smelting.SubSkill.FluxMining.Name=\u30d5\u30e9\u30c3\u30af\u30b9\u30de\u30a4\u30cb\u30f3\u30b0 -Smelting.SubSkill.FluxMining.Description=\u78ba\u7387\u3067\u63a1\u6398\u3057\u305f\u9271\u7269\u304c\u751f\u7523\u3055\u308c\u307e\u3059\u3002 -Smelting.SubSkill.FluxMining.Stat=\u30d5\u30e9\u30c3\u30af\u30b9\u30de\u30a4\u30cb\u30f3\u30b0 \u78ba\u7387 -Smelting.Listener=\u7cbe\u932c: -Smelting.SkillName=\u7cbe\u932c +Smelting.SubSkill.UnderstandingTheArt.Name=芸術を理解する +Smelting.SubSkill.UnderstandingTheArt.Description=洞窟の中で製錬に時間をかけ過ぎているかもしれません。\n製錬のさまざまな特性を強化します。 +Smelting.SubSkill.UnderstandingTheArt.Stat=バニラXP Multiplier: &e{0}x +Smelting.Ability.Locked.0=ロックされるまで {0}+ スキル (バニラXPブースト) +Smelting.Ability.Locked.1=ロックされるまで {0}+ スキル (フラックスマイニング) +Smelting.SubSkill.FuelEfficiency.Name=燃料効率 +Smelting.SubSkill.FuelEfficiency.Description=製錬時に竈で使用する燃料の燃焼時間を長くする。 +Smelting.SubSkill.FuelEfficiency.Stat=燃料効率 乗数: &e{0}x +Smelting.SubSkill.SecondSmelt.Name=第二精錬 +Smelting.SubSkill.SecondSmelt.Description=製錬から得たアイテムを2倍にする。 +Smelting.SubSkill.SecondSmelt.Stat=第二精錬の確率 +Smelting.Effect.4=バニラXPブースト +Smelting.Effect.5=製錬中に得られるバニラXPを増やす。 +Smelting.SubSkill.FluxMining.Name=フラックスマイニング +Smelting.SubSkill.FluxMining.Description=確率で採掘した鉱物が生産されます。 +Smelting.SubSkill.FluxMining.Stat=フラックスマイニングの確率 +Smelting.Listener=精錬: +Smelting.SkillName=精錬 # COMMAND DESCRIPTIONS -Commands.Description.addlevels=\u30e6\u30fc\u30b6\u30fc\u306bmcMMO\u30ec\u30d9\u30eb\u3092\u8ffd\u52a0\u3059\u308b -Commands.Description.adminchat=mcMMO\u7ba1\u7406\u8005\u30c1\u30e3\u30c3\u30c8\u306e\u30aa\u30f3\/\u30aa\u30d5\u306e\u5207\u308a\u66ff\u3048\u3001\u307e\u305f\u306f\u7ba1\u7406\u8005\u30c1\u30e3\u30c3\u30c8\u30e1\u30c3\u30bb\u30fc\u30b8\u306e\u9001\u4fe1 -Commands.Description.addxp=\u30e6\u30fc\u30b6\u30fc\u306bmcMMO XP\u3092\u8ffd\u52a0\u3059\u308b -Commands.Description.hardcore=mcMMO\u30cf\u30fc\u30c9\u30b3\u30a2\u306e\u30d1\u30fc\u30bb\u30f3\u30c6\u30fc\u30b8\u3092\u5909\u66f4\u3059\u308b\u304b\u3001\u30cf\u30fc\u30c9\u30b3\u30a2\u30e2\u30fc\u30c9\u306e\u30aa\u30f3\/\u30aa\u30d5\u3092\u5207\u308a\u66ff\u3048\u307e\u3059 -Commands.Description.inspect=\u4ed6\u306e\u30d7\u30ec\u30a4\u30e4\u30fc\u306e\u8a73\u7d30\u306amcMMO\u60c5\u5831\u3092\u898b\u308b -Commands.Description.mcability=\u53f3\u30af\u30ea\u30c3\u30af\u3067mcMMO\u30a2\u30d3\u30ea\u30c6\u30a3\u306e\u6709\u52b9\u306b\u3064\u3044\u3066\u30aa\u30f3\/\u30aa\u30d5\u3092\u5207\u308a\u66ff\u3048\u307e\u3059 -Commands.Description.mccooldown=mcMMO\u30a2\u30d3\u30ea\u30c6\u30a3\u306e\u30af\u30fc\u30eb\u30c0\u30a6\u30f3\u3092\u3059\u3079\u3066\u898b\u308b -Commands.Description.mcchatspy=mcMMO\u30d1\u30fc\u30c6\u30a3\u30fc\u30c1\u30e3\u30c3\u30c8\u306e\u30b9\u30d1\u30a4\u306b\u3064\u3044\u3066\u30aa\u30f3\/\u30aa\u30d5\u3092\u5207\u308a\u66ff\u3048\u307e\u3059 -Commands.Description.mcgod=mcMMO\u306e\u30b4\u30c3\u30c9\u30e2\u30fc\u30c9\u306e\u30aa\u30f3\/\u30aa\u30d5\u3092\u5207\u308a\u66ff\u3048\u307e\u3059 -Commands.Description.mchud=mcMMO HUD\u30b9\u30bf\u30a4\u30eb\u3092\u5909\u66f4\u3059\u308b -Commands.Description.mcmmo=mcMMO\u306e\u7c21\u5358\u306a\u8aac\u660e\u3092\u8868\u793a\u3059\u308b -Commands.Description.mcnotify=mcMMO\u30a2\u30d3\u30ea\u30c6\u30a3\u306e\u30c1\u30e3\u30c3\u30c8\u8868\u793a\u901a\u77e5\u306b\u3064\u3044\u3066\u30aa\u30f3\/\u30aa\u30d5\u3092\u5207\u308a\u66ff\u3048\u307e\u3059 -Commands.Description.mcpurge=mcMMO\u30ec\u30d9\u30eb\u306e\u306a\u3044\u30e6\u30fc\u30b6\u30fc\u304a\u3088\u3073{0}\u30f6\u6708\u4ee5\u4e0a\u63a5\u7d9a\u3057\u3066\u3044\u306a\u3044\u30e6\u30fc\u30b6\u30fc\u3092mcMMO\u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u304b\u3089\u524a\u9664\u3057\u307e\u3059\u3002 -Commands.Description.mcrank=\u30d7\u30ec\u30a4\u30e4\u30fc\u306emcMMO\u30e9\u30f3\u30ad\u30f3\u30b0\u3092\u8868\u793a\u3059\u308b -Commands.Description.mcrefresh=mcMMO\u306e\u3059\u3079\u3066\u306e\u30af\u30fc\u30eb\u30c0\u30a6\u30f3\u3092\u66f4\u65b0\u3059\u308b -Commands.Description.mcremove=mcMMO\u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u304b\u3089\u30e6\u30fc\u30b6\u30fc\u3092\u524a\u9664\u3059\u308b -Commands.Description.mcscoreboard=mcMMO\u30b9\u30b3\u30a2\u30dc\u30fc\u30c9\u3092\u7ba1\u7406\u3059\u308b -Commands.Description.mcstats=mcMMO\u30ec\u30d9\u30eb\u3068XP\u3092\u8868\u793a -Commands.Description.mctop=mcMMO\u30ea\u30fc\u30c0\u30fc\u30dc\u30fc\u30c9\u3092\u8868\u793a -Commands.Description.mmoedit=\u30e6\u30fc\u30b6\u30fc\u306emcMMO\u30ec\u30d9\u30eb\u3092\u7de8\u96c6 -Commands.Description.mmodebug=\u30d6\u30ed\u30c3\u30af\u3092\u53e9\u3044\u305f\u3068\u304d\u306b\u6709\u7528\u306a\u60c5\u5831\u3092\u51fa\u529b\u3059\u308b\u30c7\u30d0\u30c3\u30b0\u30e2\u30fc\u30c9\u3092\u5207\u308a\u66ff\u3048\u307e\u3059\u3002 -Commands.Description.mmoupdate=mcMMO\u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u3092\u53e4\u3044\u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u304b\u3089\u73fe\u5728\u306e\u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u306b\u79fb\u884c\u3057\u307e\u3059\u3002 -Commands.Description.mcconvert=\u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u306e\u7a2e\u985e\u307e\u305f\u306f\u7d4c\u9a13\u5024\u5f0f\u306e\u7a2e\u985e\u3092\u5909\u63db\u3059\u308b -Commands.Description.mmoshowdb=\u73fe\u5728\u306e\u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u30bf\u30a4\u30d7\u306e\u540d\u524d\u3092\u8868\u793a\u3057\u307e\u3059\uff08\u5f8c\u3067\/mmoupdate\u3067\u4f7f\u7528\u3059\u308b\u305f\u3081\uff09 -Commands.Description.party=\u3055\u307e\u3056\u307e\u306amcMMO\u30d1\u30fc\u30c6\u30a3\u306e\u8a2d\u5b9a\u3092\u7ba1\u7406\u3059\u308b -Commands.Description.partychat=mcMMO\u30d1\u30fc\u30c6\u30a3\u30c1\u30e3\u30c3\u30c8\u306e\u30aa\u30f3\/\u30aa\u30d5\u3092\u5207\u308a\u66ff\u3048\u305f\u308a\u3001\u30d1\u30fc\u30c6\u30a3\u30c1\u30e3\u30c3\u30c8\u30e1\u30c3\u30bb\u30fc\u30b8\u3092\u9001\u4fe1\u3057\u305f\u308a\u3057\u307e\u3059 -Commands.Description.ptp=mcMMO\u30d1\u30fc\u30c6\u30a3\u30fc\u30e1\u30f3\u30d0\u30fc\u306b\u30c6\u30ec\u30dd\u30fc\u30c8\u3059\u308b -Commands.Description.Skill={0}\u306e\u8a73\u7d30\u306amcMMO\u30b9\u30ad\u30eb\u60c5\u5831\u3092\u8868\u793a\u3057\u307e\u3059 -Commands.Description.skillreset=\u30e6\u30fc\u30b6\u30fc\u306emcMMO\u30ec\u30d9\u30eb\u3092\u30ea\u30bb\u30c3\u30c8\u3059\u308b -Commands.Description.vampirism=mcMMO\u306e\u30f4\u30a1\u30f3\u30d1\u30a4\u30a2\u306e\u5272\u5408\u3092\u5909\u66f4\u3059\u308b\u304b\u3001\u307e\u305f\u306f\u30f4\u30a1\u30f3\u30d1\u30a4\u30a2\u30e2\u30fc\u30c9\u306e\u30aa\u30f3\/\u30aa\u30d5\u306b\u5207\u308a\u66ff\u3048\u307e\u3059 -Commands.Description.xplock=mcMMO XP\u30d0\u30fc\u3092\u7279\u5b9a\u306emcMMO\u30b9\u30ad\u30eb\u306b\u56fa\u5b9a\u3059\u308b -Commands.Description.xprate=mcMMO XP\u306e\u30ec\u30fc\u30c8\u3092\u5909\u66f4\u3059\u308b\u304b\u3001mcMMO XP\u306e\u30a4\u30d9\u30f3\u30c8\u3092\u958b\u59cb\u3059\u308b +Commands.Description.addlevels=ユーザーにmcMMOレベルを追加する +Commands.Description.adminchat=mcMMO管理者チャットのオン/オフの切り替え、または管理者チャットメッセージの送信 +Commands.Description.addxp=ユーザーにmcMMO XPを追加する +Commands.Description.hardcore=mcMMOハードコアのパーセンテージを変更するか、ハードコアモードのオン/オフを切り替えます +Commands.Description.inspect=他のプレイヤーの詳細なmcMMO情報を見る +Commands.Description.mcability=右クリックでmcMMOアビリティの有効についてオン/オフを切り替えます +Commands.Description.mccooldown=mcMMOアビリティのクールダウンをすべて見る +Commands.Description.mcchatspy=mcMMOパーティーチャットのスパイについてオン/オフを切り替えます +Commands.Description.mcgod=mcMMOのゴッドモードのオン/オフを切り替えます +Commands.Description.mchud=mcMMO HUDスタイルを変更する +Commands.Description.mcmmo=mcMMOの簡単な説明を表示する +Commands.Description.mcnotify=mcMMOアビリティのチャット表示通知についてオン/オフを切り替えます +Commands.Description.mcpurge=mcMMOレベルのないユーザーおよび{0}ヶ月以上接続していないユーザーをmcMMOデータベースから削除します。 +Commands.Description.mcrank=プレイヤーのmcMMOランキングを表示する +Commands.Description.mcrefresh=mcMMOのすべてのクールダウンを更新する +Commands.Description.mcremove=mcMMOデータベースからユーザーを削除する +Commands.Description.mcscoreboard=mcMMOスコアボードを管理する +Commands.Description.mcstats=mcMMOレベルとXPを表示 +Commands.Description.mctop=mcMMOリーダーボードを表示 +Commands.Description.mmoedit=ユーザーのmcMMOレベルを編集 +Commands.Description.mmodebug=ブロックを叩いたときに有用な情報を出力するデバッグモードを切り替えます。 +Commands.Description.mmoupdate=mcMMOデータベースを古いデータベースから現在のデータベースに移行します。 +Commands.Description.mcconvert=データベースの種類または経験値式の種類を変換する +Commands.Description.mmoshowdb=現在のデータベースタイプの名前を表示します(後で/mmoupdateで使用するため) +Commands.Description.party=さまざまなmcMMOパーティの設定を管理する +Commands.Description.partychat=mcMMOパーティチャットのオン/オフを切り替えたり、パーティチャットメッセージを送信したりします +Commands.Description.ptp=mcMMOパーティーメンバーにテレポートする +Commands.Description.Skill={0}の詳細なmcMMOスキル情報を表示します +Commands.Description.skillreset=ユーザーのmcMMOレベルをリセットする +Commands.Description.vampirism=mcMMOのヴァンパイアの割合を変更するか、またはヴァンパイアモードのオン/オフに切り替えます +Commands.Description.xplock=mcMMO XPバーを特定のmcMMOスキルに固定する +Commands.Description.xprate=mcMMO XPのレートを変更するか、mcMMO XPのイベントを開始する # UPDATE CHECKER -UpdateChecker.Outdated=\u3042\u306a\u305f\u306f\u53e4\u3044mcMMO\u306e\u30d0\u30fc\u30b8\u30e7\u30f3\u3092\u4f7f\u3063\u3066\u3044\u307e\u3059\uff01 -UpdateChecker.NewAvailable=Spigot\u306b\u65b0\u3057\u3044\u30d0\u30fc\u30b8\u30e7\u30f3\u304c\u516c\u958b\u3055\u308c\u3066\u3044\u307e\u3059\u3002 +UpdateChecker.Outdated=あなたは古いmcMMOのバージョンを使っています! +UpdateChecker.NewAvailable=Spigotに新しいバージョンが公開されています。 # SCOREBOARD HEADERS -Scoreboard.Header.PlayerStats=[[YELLOW]]mcMMO \u7d71\u8a08 -Scoreboard.Header.PlayerCooldowns=[[YELLOW]]mcMMO \u30af\u30fc\u30eb\u30c0\u30a6\u30f3 -Scoreboard.Header.PlayerRank=[[YELLOW]]mcMMO \u30e9\u30f3\u30ad\u30f3\u30b0 -Scoreboard.Header.PlayerInspect=[[YELLOW]]mcMMO \u7d71\u8a08: {0} -Scoreboard.Header.PowerLevel=[[RED]]\u30d1\u30ef\u30fc\u30ec\u30d9\u30eb -Scoreboard.Misc.PowerLevel=[[GOLD]]\u30d1\u30ef\u30fc\u30ec\u30d9\u30eb -Scoreboard.Misc.Level=[[DARK_AQUA]]\u30ec\u30d9\u30eb -Scoreboard.Misc.CurrentXP=[[GREEN]]\u73fe\u5728\u306eXP -Scoreboard.Misc.RemainingXP=[[YELLOW]]\u6b8b\u308aXP -Scoreboard.Misc.Cooldown=[[LIGHT_PURPLE]]\u30af\u30fc\u30eb\u30c0\u30a6\u30f3 -Scoreboard.Misc.Overall=[[GOLD]]\u5408\u8a08 -Scoreboard.Misc.Ability=\u30a2\u30d3\u30ea\u30c6\u30a3 +Scoreboard.Header.PlayerStats=&emcMMO 統計 +Scoreboard.Header.PlayerCooldowns=&emcMMO クールダウン +Scoreboard.Header.PlayerRank=&emcMMO ランキング +Scoreboard.Header.PlayerInspect=&emcMMO 統計: {0} +Scoreboard.Header.PowerLevel=&cパワーレベル +Scoreboard.Misc.PowerLevel=&6パワーレベル +Scoreboard.Misc.Level=&3レベル +Scoreboard.Misc.CurrentXP=&a現在のXP +Scoreboard.Misc.RemainingXP=&e残りXP +Scoreboard.Misc.Cooldown=&dクールダウン +Scoreboard.Misc.Overall=&6合計 +Scoreboard.Misc.Ability=アビリティ # DATABASE RECOVERY -Profile.PendingLoad=[[RED]]mcMMO\u30d7\u30ec\u30a4\u30e4\u30fc\u30c7\u30fc\u30bf\u306f\u307e\u3060\u8aad\u307f\u8fbc\u307e\u308c\u3066\u3044\u307e\u305b\u3093\u3002 -Profile.Loading.Success=[[GREEN]]\u3042\u306a\u305f\u306emcMMO\u30d7\u30ed\u30d5\u30a3\u30fc\u30eb\u304c\u8aad\u307f\u8fbc\u307e\u308c\u307e\u3057\u305f\u3002 -Profile.Loading.FailurePlayer=[[RED]]mcMMO\u306e\u30c7\u30fc\u30bf\u306e\u8aad\u307f\u8fbc\u307f\u306b\u554f\u984c\u304c\u3042\u308a\u307e\u3059\u3002[[GREEN]]{0}[[RED]]\u56de\u8aad\u307f\u8fbc\u307f\u3092\u8a66\u3057\u307e\u3057\u305f\u3002[[LIGHT_GRAY]] \u3053\u306e\u554f\u984c\u306b\u3064\u3044\u3066\u30b5\u30fc\u30d0\u30fc\u7ba1\u7406\u8005\u306b\u9023\u7d61\u3057\u3066\u304f\u3060\u3055\u3044\u3002mcMMO\u306f\u3042\u306a\u305f\u304c\u5207\u65ad\u3059\u308b\u307e\u3067\u30c7\u30fc\u30bf\u306e\u8aad\u307f\u8fbc\u307f\u3092\u7e70\u308a\u8fd4\u3057\u307e\u3059\u3002\u30c7\u30fc\u30bf\u304c\u8aad\u307f\u8fbc\u307e\u308c\u3066\u3044\u306a\u3044\u9593XP\u3092\u7372\u5f97\u3067\u304d\u306a\u3044\u304b\u3001\u30b9\u30ad\u30eb\u3092\u4f7f\u3046\u3053\u3068\u304c\u51fa\u6765\u307e\u305b\u3093\u3002 -Profile.Loading.FailureNotice=[[DARK_RED]][A][[RED]] mcMMO\u306f[[YELLOW]]{0}[[RED]]\u306e\u30d7\u30ec\u30fc\u30e4\u30fc\u30c7\u30fc\u30bf\u3092\u8aad\u307f\u8fbc\u3081\u307e\u305b\u3093\u3067\u3057\u305f\u3002 [[LIGHT_PURPLE]]\u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u306e\u8a2d\u5b9a\u3092\u78ba\u8a8d\u3057\u3066\u304f\u3060\u3055\u3044\u3002\u3053\u308c\u307e\u3067\u306e\u8a66\u884c\u56de\u6570\u306f{1}\u56de\u3067\u3059\u3002 +Profile.PendingLoad=&cmcMMOプレイヤーデータはまだ読み込まれていません。 +Profile.Loading.Success=&aあなたのmcMMOプロフィールが読み込まれました。 +Profile.Loading.FailurePlayer=&cmcMMOのデータの読み込みに問題があります。&a{0}&c回読み込みを試しました。&7 この問題についてサーバー管理者に連絡してください。mcMMOはあなたが切断するまでデータの読み込みを繰り返します。データが読み込まれていない間XPを獲得できないか、スキルを使うことが出来ません。 +Profile.Loading.FailureNotice=&4[A]&c mcMMOは&e{0}&cのプレーヤーデータを読み込めませんでした。 &dデータベースの設定を確認してください。これまでの試行回数は{1}回です。 # Holiday -Holiday.AprilFools.Levelup=[[GOLD]]{0}\u306f\u30ec\u30d9\u30eb[[GREEN]]{1}[[GOLD]]\u306b\u306a\u308a\u307e\u3057\u305f\u3002 -Holiday.Anniversary=[[BLUE]]{0}\u5468\u5e74\u8a18\u5ff5\uff01\n[[BLUE]]nossr50\u306e\u5168\u3066\u306e\u4ed5\u4e8b\u3068\u5168\u3066\u306e\u958b\u767a\u3092\u8a18\u5ff5\u3057\u3066\uff01 +Holiday.AprilFools.Levelup=&6{0}はレベル&a{1}&6になりました。 +Holiday.Anniversary=&9{0}周年記念!\n&9nossr50の全ての仕事と全ての開発を記念して! # Reminder Messages -Reminder.Squelched=[[GRAY]]\u30ea\u30de\u30a4\u30f3\u30c0\u30fc: \u3042\u306a\u305f\u306f\u73fe\u5728mcMMO\u304b\u3089\u901a\u77e5\u3092\u53d7\u3051\u53d6\u3063\u3066\u3044\u307e\u305b\u3093\u3002\u901a\u77e5\u3092\u6709\u52b9\u306b\u3059\u308b\u305f\u3081\u306b\u306f\/mcnotify\u30b3\u30de\u30f3\u30c9\u3092\u3082\u3046\u4e00\u5ea6\u5b9f\u884c\u3057\u3066\u304f\u3060\u3055\u3044\u3002\u3053\u308c\u306f\u81ea\u52d5\u5316\u3055\u308c\u305f1\u6642\u9593\u3054\u3068\u306e\u901a\u77e5\u3067\u3059\u3002 +Reminder.Squelched=&7リマインダー: あなたは現在mcMMOから通知を受け取っていません。通知を有効にするためには/mcnotifyコマンドをもう一度実行してください。これは自動化された1時間ごとの通知です。 # Locale -Locale.Reloaded=[[GREEN]]\u30ed\u30b1\u30fc\u30eb \u30ea\u30ed\u30fc\u30c9\uff01 +Locale.Reloaded=&aロケール リロード! # Player Leveling Stuff -LevelCap.PowerLevel=[[GOLD]]([[GREEN]]mcMMO[[GOLD]]) [[RED]]{0}[[YELLOW]]\u306e\u30d1\u30ef\u30fc\u30ec\u30d9\u30eb\u306e\u30ec\u30d9\u30eb\u30ad\u30e3\u30c3\u30d7\u306b\u9054\u3057\u307e\u3057\u305f\u3002\u3053\u308c\u4ee5\u964d\u30b9\u30ad\u30eb\u306e\u30ec\u30d9\u30eb\u30a2\u30c3\u30d7\u306f\u3057\u307e\u305b\u3093\u3002 -LevelCap.Skill=[[GOLD]]([[GREEN]]mcMMO[[GOLD]]) [[GOLD]]{1}[[YELLOW]]\u306e\u30ec\u30d9\u30eb\u30ad\u30e3\u30c3\u30d7[[RED]]{0}[[YELLOW]]\u306b\u9054\u3057\u307e\u3057\u305f\u3002\u3053\u308c\u4ee5\u964d\u30b9\u30ad\u30eb\u306e\u30ec\u30d9\u30eb\u30a2\u30c3\u30d7\u306f\u3057\u307e\u305b\u3093\u3002 \ No newline at end of file +LevelCap.PowerLevel=&6(&amcMMO&6) &c{0}&eのパワーレベルのレベルキャップに達しました。これ以降スキルのレベルアップはしません。 +LevelCap.Skill=&6(&amcMMO&6) &6{1}&eのレベルキャップ&c{0}&eに達しました。これ以降スキルのレベルアップはしません。 +Commands.XPBar.Usage=使い方は /mmoxpbar +Commands.Description.mmoxpbar=mcMMO XPバーのプレイヤー設定 +Commands.Description.mmocompat=mcMMOについての情報と、互換性モードか完全に機能しているかどうかの情報。 +Compatibility.Layer.Unsupported=&a{0}&6の互換性は、このバージョンのMinecraftではサポートされていません。 +Compatibility.Layer.PartialSupport=&a{0}&6の互換性はこのバージョンのMinecraftでは完全にはサポートされていませんが、mcMMOは不足している機能の一部をエミュレートするためにセカンダリシステムを実行しています。 +Commands.XPBar.DisableAll=&6 すべてのmcMMO XPバーが無効になったので、/mmoxpbar resetを使用してデフォルト設定を復元。 +#Modern Chat Settings +Chat.Style.Admin=&b(A) &r{0} &b→ &r{1} +Chat.Style.Party=&a(P) &r{0} &a→ &r{1} +Chat.Style.Party.Leader=&a(P) &r{0} &6→ &r{1} +Chat.Identity.Console=&6* コンソール * +Chat.Channel.On=&6(&amcMMO-チャット&6) &eチャットメッセージが自動的に &a{0} &eチャットチャンネルに送信されるようになりました。 +Chat.Channel.Off=&6(&amcMMO-チャット&6) &7あなたのチャットメッセージは、特定のチャットチャンネルに自動的に送信されなくなります。 +Chat.Spy.Party=&6[&eSPY&6-&a{2}&6] &r{0} &b→ &r{1} +Broadcasts.LevelUpMilestone=&6(&amcMMO&6) {0} &7が &3{2} でレベル &a{1} &7に到達しました! +Broadcasts.PowerLevelUpMilestone=&6(&amcMMO&6) {0}&7 のパワーレベルが &a{1} &7に到達しました! +Scoreboard.Recovery=mcMMOのスコアボードを復元しようとしています... \ No newline at end of file diff --git a/src/main/resources/locale/locale_ko.properties b/src/main/resources/locale/locale_ko.properties index a06114f3b..aa37dac39 100644 --- a/src/main/resources/locale/locale_ko.properties +++ b/src/main/resources/locale/locale_ko.properties @@ -16,956 +16,996 @@ # --wolfwork #ACROBATICS -Acrobatics.Ability.Proc=[[GREEN]]**\uC6B0\uC544\uD55C \uAD6C\uB974\uAE30** -Acrobatics.Combat.Proc=[[GREEN]]**\uD68C\uD53C** -Acrobatics.DodgeChance=\uD68C\uD53C \uD655\uB960: [[YELLOW]]{0} -Acrobatics.SubSkill.Roll.Name=\uAD6C\uB974\uAE30 -Acrobatics.SubSkill.Roll.Description=\uCD94\uB77D \uB370\uBBF8\uC9C0 \uAC10\uC18C \uB610\uB294 \uBB34\uD6A8 -Acrobatics.SubSkill.GracefulRoll.Name=\uC6B0\uC544\uD55C \uAD6C\uB974\uAE30 -Acrobatics.SubSkill.GracefulRoll.Description=\uAD6C\uB974\uAE30 2\uBC30 \uD6A8\uACFC -Acrobatics.SubSkill.Dodge.Name=\uD68C\uD53C -Acrobatics.SubSkill.Dodge.Description=\uB099\uD558 \uB370\uBBF8\uC9C0 \uC808\uBC18 \uAC10\uC18C -Acrobatics.Listener=\uACE1\uC608(ACROBATICS): -Acrobatics.SubSkill.Roll.Chance=\uAD6C\uB974\uAE30 \uD655\uB960: [[YELLOW]]{0} -Acrobatics.SubSkill.Roll.GraceChance=\uC6B0\uC544\uD55C \uAD6C\uB974\uAE30 \uD655\uB960: [[YELLOW]]{0} -Acrobatics.Roll.Text=**\uAD6C\uB974\uAE30** -Acrobatics.SkillName=\uACE1\uC608 -Acrobatics.Skillup=\uB099\uBC95 \uAE30\uC220\uC774 {0} \uC62C\uB77C \uCD1D {1} \uB808\uBCA8\uC774 \uB418\uC5C8\uC2B5\uB2C8\uB2E4 +Acrobatics.Ability.Proc=&a**우아한 구르기** +Acrobatics.Combat.Proc=&a**회피** +Acrobatics.DodgeChance=회피 확률: &e{0} +Acrobatics.SubSkill.Roll.Name=구르기 +Acrobatics.SubSkill.Roll.Description=추락 데미지 감소 또는 무효 +Acrobatics.SubSkill.GracefulRoll.Name=우아한 구르기 +Acrobatics.SubSkill.GracefulRoll.Description=구르기 2배 효과 +Acrobatics.SubSkill.Dodge.Name=회피 +Acrobatics.SubSkill.Dodge.Description=낙하 데미지 절반 감소 +Acrobatics.Listener=곡예(ACROBATICS): +Acrobatics.SubSkill.Roll.Chance=구르기 확률: &e{0} +Acrobatics.SubSkill.Roll.GraceChance=우아한 구르기 확률: &e{0} +Acrobatics.Roll.Text=**구르기** +Acrobatics.SkillName=곡예 +Acrobatics.Skillup=낙법 기술이 {0} 올라 총 {1} 레벨이 되었습니다 #ALCHEMY -Alchemy.SubSkill.Catalysis.Name=\uCD09\uB9E4 -Alchemy.SubSkill.Catalysis.Description=\uD3EC\uC158 \uC591\uC870 \uC18D\uB3C4 \uC99D\uAC00 -Alchemy.SubSkill.Concoctions.Name=\uD63C\uD569 -Alchemy.SubSkill.Concoctions.Description=\uB354 \uB9CE\uC740 \uC131\uBD84\uC758 \uD3EC\uC158 \uC591\uC870 -Alchemy.Listener=\uC5F0\uAE08\uC220(ALCHEMY): -Alchemy.Ability.Locked.0={0}\uB808\uBCA8 \uB54C \uAE30\uC220\uD574\uC81C (\uCD09\uB9E4) -Alchemy.Catalysis.Speed=\uC591\uC870 \uC18D\uB3C4: [[YELLOW]]{0} -Alchemy.Concoctions.Rank=\uD63C\uD569 \uB7AD\uD06C: [[YELLOW]]{0}/{1} -Alchemy.Concoctions.Ingredients=\uC131\uBD84 [[[YELLOW]]{0}[[RED]]]: [[YELLOW]]{1} -Alchemy.SkillName=\uC5F0\uAE08\uC220 -Alchemy.Skillup=\uC5F0\uAE08\uC220 \uAE30\uC220\uC774 {0} \uC62C\uB77C \uCD1D {1} \uB808\uBCA8\uC774 \uB418\uC5C8\uC2B5\uB2C8\uB2E4 +Alchemy.SubSkill.Catalysis.Name=촉매 +Alchemy.SubSkill.Catalysis.Description=포션 양조 속도 증가 +Alchemy.SubSkill.Concoctions.Name=혼합 +Alchemy.SubSkill.Concoctions.Description=더 많은 성분의 포션 양조 +Alchemy.Listener=연금술(ALCHEMY): +Alchemy.Ability.Locked.0={0}레벨 때 기술해제 (촉매) +Alchemy.Catalysis.Speed=양조 속도: &e{0} +Alchemy.Concoctions.Rank=혼합 랭크: &e{0}/{1} +Alchemy.Concoctions.Ingredients=성분 [&e{0}&c]: &e{1} +Alchemy.SkillName=연금술 +Alchemy.Skillup=연금술 기술이 {0} 올라 총 {1} 레벨이 되었습니다 #ARCHERY -Archery.Combat.DazeChance=\uD604\uD639 \uD655\uB960: [[YELLOW]]{0} -Archery.Combat.RetrieveChance=\uD654\uC0B4 \uD68C\uC218 \uD655\uB960: [[YELLOW]]{0} -Archery.Combat.SkillshotBonus=\uC3D8\uAE30 \uC19C\uC528 \uCD94\uAC00 \uD53C\uD574 \uD655\uB960: [[YELLOW]]{0} -Archery.SubSkill.SkillShot.Name=\uC3D8\uAE30 \uC19C\uC528 -Archery.SubSkill.SkillShot.Description=\uD65C \uD53C\uD574 \uC601\uAD6C \uC99D\uAC00 -Archery.SubSkill.Daze.Name=\uD604\uD639 (\uD50C\uB808\uC774\uC5B4) -Archery.SubSkill.Daze.Description=\uC801\uC5D0\uAC8C \uD63C\uB780, {0} \uD53C\uD574 \uCD94\uAC00 -Archery.SubSkill.ArrowRetrieval.Name=\uD654\uC0B4 \uD68C\uC218 -Archery.SubSkill.ArrowRetrieval.Description=\uC2DC\uCCB4\uC5D0\uC11C \uD654\uC0B4 \uD68C\uC218 \uD655\uB960 \uC99D\uAC00 -Archery.Listener=\uAD81\uC220(ARCHERY): -Archery.SkillName=\uAD81\uC220 -Archery.Skillup=\uAD81\uC220 \uAE30\uC220\uC774 {0} \uC62C\uB77C \uCD1D {1} \uB808\uBCA8\uC774 \uB418\uC5C8\uC2B5\uB2C8\uB2E4 +Archery.Combat.DazeChance=현혹 확률: &e{0} +Archery.Combat.RetrieveChance=화살 회수 확률: &e{0} +Archery.Combat.SkillshotBonus=쏘기 솜씨 추가 피해 확률: &e{0} +Archery.SubSkill.SkillShot.Name=쏘기 솜씨 +Archery.SubSkill.SkillShot.Description=활 피해 영구 증가 +Archery.SubSkill.Daze.Name=현혹 (플레이어) +Archery.SubSkill.Daze.Description=적에게 혼란, {0} 피해 추가 +Archery.SubSkill.ArrowRetrieval.Name=화살 회수 +Archery.SubSkill.ArrowRetrieval.Description=시체에서 화살 회수 확률 증가 +Archery.Listener=궁술(ARCHERY): +Archery.SkillName=궁술 +Archery.Skillup=궁술 기술이 {0} 올라 총 {1} 레벨이 되었습니다 #AXES -Axes.Ability.Bonus.0=\uB3C4\uB07C \uB9C8\uC2A4\uD130\uB9AC -Axes.Ability.Bonus.1={0} \uCD94\uAC00 \uD53C\uD574 -Axes.Ability.Bonus.2=\uAC11\uC637 \uCDA9\uACA9 -Axes.Ability.Bonus.3=\uBC29\uC5B4\uAD6C \uCD94\uAC00 \uD53C\uD574: {0} -Axes.Ability.Bonus.4=\uC5C4\uCCAD\uB09C \uCDA9\uACA9 -Axes.Ability.Bonus.5=\uBE44\uBB34\uC7A5 \uCD94\uAC00 \uD53C\uD574: {0} -Axes.Ability.Lower=[[GRAY]]**\uB3C4\uB07C \uC900\uBE44 \uD574\uC81C** -Axes.Ability.Ready=[[GREEN]]**\uB3C4\uB07C \uC900\uBE44 \uC644\uB8CC** -Axes.Combat.CritStruck=[[DARK_RED]]\uD06C\uB9AC\uD2F0\uCEEC \uD788\uD2B8\uC5D0 \uB9DE\uC558\uC2B5\uB2C8\uB2E4! -Axes.Combat.CritChance=\uD06C\uB9AC\uD2F0\uCEEC \uD788\uD2B8 \uD655\uB960: [[YELLOW]]{0} -Axes.Combat.CriticalHit=\uD06C\uB9AC\uD2F0\uCEEC \uD788\uD2B8! -Axes.Combat.GI.Proc=[[GREEN]]**\uCD5C\uACE0\uC758 \uAC15\uD0C0\uB97C \uB54C\uB838\uC2B5\uB2C8\uB2E4** -Axes.Combat.GI.Struck=**\uC5C4\uCCAD\uB09C \uCDA9\uACA9\uC744 \uBC1B\uC558\uC2B5\uB2C8\uB2E4** -Axes.Combat.SS.Struck=[[DARK_RED]]\uBF08 \uCABC\uAC1C\uAE30\uC5D0 \uB9DE\uC558\uC2B5\uB2C8\uB2E4! -Axes.Combat.SS.Length=\uBF08 \uCABC\uAC1C\uAE30 \uC9C0\uC18D\uC2DC\uAC04: [[YELLOW]]{0}\uCD08 -Axes.SubSkill.SkullSplitter.Name=\uBF08 \uCABC\uAC1C\uAE30 (\uB2A5\uB825) -Axes.SubSkill.SkullSplitter.Description=\uAD11\uC5ED \uCD94\uAC00 \uD53C\uD574 -Axes.SubSkill.CriticalStrikes.Name=\uD06C\uB9AC\uD2F0\uCEEC \uC2A4\uD2B8\uB77C\uC774\uD06C -Axes.SubSkill.CriticalStrikes.Description=\uD53C\uD574 2\uBC30 -Axes.SubSkill.AxeMastery.Name=\uB3C4\uB07C \uB9C8\uC2A4\uD130\uB9AC -Axes.SubSkill.AxeMastery.Description=\uCD94\uAC00 \uD2B9\uD61C \uD53C\uD574 -Axes.SubSkill.ArmorImpact.Name=\uAC11\uC637 \uCDA9\uACA9 -Axes.SubSkill.ArmorImpact.Description=\uAC11\uC637 \uD30C\uAD34 \uACF5\uACA9 -Axes.SubSkill.GreaterImpact.Name=\uC5C4\uCCAD\uB09C \uCDA9\uACA9 -Axes.SubSkill.GreaterImpact.Description=\uBE44\uBB34\uC7A5 \uCD94\uAC00 \uD53C\uD574 -Axes.Listener=\uBD80\uC220(AXES): -Axes.SkillName=\uBD80\uC220 -Axes.Skills.SS.Off=**\uBF08 \uCABC\uAC1C\uAE30 \uBC1C\uB3D9 \uD574\uC81C** -Axes.Skills.SS.On=[[GREEN]]**\uBF08 \uCABC\uAC1C\uAE30 \uBC1C\uB3D9** -Axes.Skills.SS.Refresh=[[GREEN]]\uB2F9\uC2E0\uC758 [[YELLOW]]\uBF08 \uCABC\uAC1C\uAE30 [[GREEN]]\uAE30\uC220\uC740 \uC774\uC81C \uC0AC\uC6A9 \uAC00\uB2A5\uD569\uB2C8\uB2E4! -Axes.Skills.SS.Other.Off={0}\uB2D8\uC774 [[RED]]\uBF08 \uCABC\uAC1C\uAE30\uB97C[[GREEN]] \uC900\uBE44 \uD574\uC81C\uD588\uC2B5\uB2C8\uB2E4 -Axes.Skills.SS.Other.On=[[GREEN]]{0}[[DARK_GREEN]]\uB2D8\uC774 [[RED]]\uBF08 \uCABC\uAC1C\uAE30\uB97C \uC0AC\uC6A9\uD588\uC2B5\uB2C8\uB2E4! -Axes.Skillup=\uBD80\uC220 \uAE30\uC220\uC774 {0} \uC62C\uB77C \uCD1D ({1}) \uB808\uBCA8\uC774 \uB418\uC5C8\uC2B5\uB2C8\uB2E4 +Axes.Ability.Bonus.0=도끼 마스터리 +Axes.Ability.Bonus.1={0} 추가 피해 +Axes.Ability.Bonus.2=갑옷 충격 +Axes.Ability.Bonus.3=방어구 추가 피해: {0} +Axes.Ability.Bonus.4=엄청난 충격 +Axes.Ability.Bonus.5=비무장 추가 피해: {0} +Axes.Ability.Lower=&7**도끼 준비 해제** +Axes.Ability.Ready=&a**도끼 준비 완료** +Axes.Combat.CritStruck=&4크리티컬 히트에 맞았습니다! +Axes.Combat.CritChance=크리티컬 히트 확률: &e{0} +Axes.Combat.CriticalHit=크리티컬 히트! +Axes.Combat.GI.Proc=&a**최고의 강타를 때렸습니다** +Axes.Combat.GI.Struck=**엄청난 충격을 받았습니다** +Axes.Combat.SS.Struck=&4뼈 쪼개기에 맞았습니다! +Axes.Combat.SS.Length=뼈 쪼개기 지속시간: &e{0}초 +Axes.SubSkill.SkullSplitter.Name=뼈 쪼개기 (능력) +Axes.SubSkill.SkullSplitter.Description=광역 추가 피해 +Axes.SubSkill.CriticalStrikes.Name=크리티컬 스트라이크 +Axes.SubSkill.CriticalStrikes.Description=피해 2배 +Axes.SubSkill.AxeMastery.Name=도끼 마스터리 +Axes.SubSkill.AxeMastery.Description=추가 특혜 피해 +Axes.SubSkill.ArmorImpact.Name=갑옷 충격 +Axes.SubSkill.ArmorImpact.Description=갑옷 파괴 공격 +Axes.SubSkill.GreaterImpact.Name=엄청난 충격 +Axes.SubSkill.GreaterImpact.Description=비무장 추가 피해 +Axes.Listener=부술(AXES): +Axes.SkillName=부술 +Axes.Skills.SS.Off=**뼈 쪼개기 발동 해제** +Axes.Skills.SS.On=&a**뼈 쪼개기 발동** +Axes.Skills.SS.Refresh=&a당신의 &e뼈 쪼개기 &a기술은 이제 사용 가능합니다! +Axes.Skills.SS.Other.Off={0}님이 &c뼈 쪼개기를&a 준비 해제했습니다 +Axes.Skills.SS.Other.On=&a{0}&2님이 &c뼈 쪼개기를 사용했습니다! +Axes.Skillup=부술 기술이 {0} 올라 총 ({1}) 레벨이 되었습니다 #EXCAVATION -Excavation.Ability.Lower=[[GRAY]]**\uC0BD \uC900\uBE44 \uD574\uC81C** -Excavation.Ability.Ready=[[GREEN]]**\uC0BD \uC900\uBE44 \uC644\uB8CC** -Excavation.SubSkill.GigaDrillBreaker.Name=\uAE30\uAC00 \uB4DC\uB9B4 \uBC84\uC11C\uCEE4 (\uB2A5\uB825) -Excavation.SubSkill.GigaDrillBreaker.Description=\uB4DC\uB86D \uC18D\uB3C4 3\uBC30, \uACBD\uD5D8\uCE58 3\uBC30, \uC18D\uB3C4 \uC99D\uAC00 -Excavation.SubSkill.TreasureHunter.Name=\uBCF4\uBB3C \uC0AC\uB0E5\uAFBC -Excavation.SubSkill.TreasureHunter.Description=\uBCF4\uBB3C \uBC1C\uAD74 \uB2A5\uB825 -Excavation.Effect.Length=\uAE30\uAC00 \uB4DC\uB9B4 \uBC84\uC11C\uCEE4 \uC9C0\uC18D\uC2DC\uAC04: [[YELLOW]]{0}\uCD08 -Excavation.Listener=\uBC1C\uAD74(EXCAVATION): -Excavation.SkillName=\uBC1C\uAD74 -Excavation.Skills.GigaDrillBreaker.Off=**\uAE30\uAC00 \uB4DC\uB9B4 \uBC84\uC11C\uCEE4 \uBC1C\uB3D9 \uD574\uC81C** -Excavation.Skills.GigaDrillBreaker.On=[[GREEN]]**\uAE30\uAC00 \uB4DC\uB9B4 \uBC84\uC11C\uCEE4 \uBC1C\uB3D9** -Excavation.Skills.GigaDrillBreaker.Refresh=[[GREEN]]\uB2F9\uC2E0\uC758 [[YELLOW]]\uAE30\uAC00 \uB4DC\uB9B4 \uBC84\uC11C\uCEE4 [[GREEN]]\uAE30\uC220\uC740 \uC774\uC81C \uC0AC\uC6A9 \uAC00\uB2A5\uD569\uB2C8\uB2E4! -Excavation.Skills.GigaDrillBreaker.Other.Off={0}[[DARK_GREEN]]\uB2D8\uC740 [[RED]]\uAE30\uAC00 \uB4DC\uB9B4 \uBC84\uC11C\uCEE4\uB97C \uC0AC\uC6A9\uD588\uC2B5\uB2C8\uB2E4! -Excavation.Skills.GigaDrillBreaker.Other.On=[[GREEN]]{0}[[DARK_GREEN]]\uB2D8\uC740 [[RED]]\uAE30\uAC00 \uB4DC\uB9B4 \uBC84\uC11C\uCEE4\uB97C \uC0AC\uC6A9 \uD588\uC2B5\uB2C8\uB2E4! -Excavation.Skillup=\uBC1C\uAD74 \uAE30\uC220\uC774 {0} \uC62C\uB77C \uCD1D {1} \uB808\uBCA8\uC774 \uB418\uC5C8\uC2B5\uB2C8\uB2E4 +Excavation.Ability.Lower=&7**삽 준비 해제** +Excavation.Ability.Ready=&a**삽 준비 완료** +Excavation.SubSkill.GigaDrillBreaker.Name=기가 드릴 버서커 (능력) +Excavation.SubSkill.GigaDrillBreaker.Description=드롭 속도 3배, 경험치 3배, 속도 증가 +Excavation.SubSkill.TreasureHunter.Name=보물 사냥꾼 +Excavation.SubSkill.TreasureHunter.Description=보물 발굴 능력 +Excavation.Effect.Length=기가 드릴 버서커 지속시간: &e{0}초 +Excavation.Listener=발굴(EXCAVATION): +Excavation.SkillName=발굴 +Excavation.Skills.GigaDrillBreaker.Off=**기가 드릴 버서커 발동 해제** +Excavation.Skills.GigaDrillBreaker.On=&a**기가 드릴 버서커 발동** +Excavation.Skills.GigaDrillBreaker.Refresh=&a당신의 &e기가 드릴 버서커 &a기술은 이제 사용 가능합니다! +Excavation.Skills.GigaDrillBreaker.Other.Off={0}&2님은 &c기가 드릴 버서커를 사용했습니다! +Excavation.Skills.GigaDrillBreaker.Other.On=&a{0}&2님은 &c기가 드릴 버서커를 사용 했습니다! +Excavation.Skillup=발굴 기술이 {0} 올라 총 {1} 레벨이 되었습니다 #FISHING -Fishing.Ability.Chance=\uC785\uC9C8 \uD655\uB960: [[YELLOW]]{0} -Fishing.Ability.Info=\uB9E4\uC9C1 \uD5CC\uD130: [[GRAY]] **\uD2B8\uB808\uC838 \uD5CC\uD130 \uB7AD\uD06C \uD5A5\uC0C1** -Fishing.Ability.Locked.0={0}\uB808\uBCA8 \uB54C \uAE30\uC220 \uD574\uC81C (\uD754\uB4E4\uAE30) -Fishing.Ability.Locked.1={0}\uB808\uBCA8 \uB54C \uAE30\uC220 \uD574\uC81C (\uC5BC\uC74C \uB09A\uC2DC) -Fishing.Ability.Locked.2={0}\uB808\uBCA8 \uB54C \uAE30\uC220 \uD574\uC81C (\uB09A\uC2DC\uAFBC \uC7A5\uC778) -Fishing.Ability.Rank=\uD2B8\uB808\uC838 \uD5CC\uD130 \uB7AD\uD06C: [[YELLOW]]{0}/5\uB7AD\uD06C -Fishing.Ability.TH.DropRate= \uB4DC\uB86D \uBE44\uC728: [[DARK_RED]]\uD568\uC815: [[YELLOW]]{0} [[GRAY]]\uACF5\uD1B5: [[YELLOW]]{1} [[GREEN]]\uBE44\uACF5\uD1B5: [[YELLOW]]{2}\n[[BLUE]]\uB808\uC5B4: [[YELLOW]]{3} [[LIGHT_PURPLE]]\uC5D0\uD53D: [[YELLOW]]{4} [[GOLD]]\uB808\uC804\uB4DC\uB9AC: [[YELLOW]]{5} [[AQUA]]\uB808\uCF54\uB4DC: [[YELLOW]]{6} -Fishing.Ability.TH.MagicRate=\uB9E4\uC9C1 \uD5CC\uD130 \uD655\uB960: [[YELLOW]]{0} -Fishing.Ability.Shake=\uD754\uB4E4\uAE30 \uD655\uB960: [[YELLOW]]{0} -Fishing.Ability.IceFishing=\uC5BC\uC74C \uB09A\uC2DC: \uC5BC\uC74C\uC5D0\uC11C \uB09A\uC2DC -Fishing.Ability.FD=\uC5B4\uBD80\uC758 \uB2E4\uC774\uC5B4\uD2B8 \uB7AD\uD06C: [[YELLOW]]{0}\uB7AD\uD06C -Fishing.SubSkill.TreasureHunter.Name=\uD2B8\uB808\uC838 \uD5CC\uD130 (\uD328\uC2DC\uBE0C) -Fishing.SubSkill.TreasureHunter.Description=\uBB3C\uAC74(\uADF8\uC678) \uB09A\uC2DC -Fishing.SubSkill.MagicHunter.Name=\uB9E4\uC9C1 \uD5CC\uD130 -Fishing.SubSkill.MagicHunter.Description=\uC778\uCC48\uD2B8 \uC544\uC774\uD15C \uBC1C\uACAC -Fishing.SubSkill.Shake.Name=\uD754\uB4E4\uAE30 (vs. \uB3C5\uB9BD\uCCB4) -Fishing.SubSkill.Shake.Description=\uC544\uC774\uD15C\uC744 \uBAB9\uC774\uB098 \uB09A\uC2DC\uC5D0\uC11C \uC5BB\uC74C -Fishing.SubSkill.FishermansDiet.Name=\uC5B4\uBD80\uC758 \uB2E4\uC774\uC5B4\uD2B8 -Fishing.SubSkill.FishermansDiet.Description=\uC5B4\uB958 \uC74C\uC2DD \uD5C8\uAE30 \uD68C\uBCF5 \uC99D\uAC00 -Fishing.SubSkill.MasterAngler.Name=\uB09A\uC2DC\uAFBC \uC7A5\uC778 -Fishing.SubSkill.MasterAngler.Description=\uB09A\uC2DC\uC911 \uC785\uC9C8 \uD655\uB960 \uC99D\uAC00 -Fishing.SubSkill.IceFishing.Name=\uC5BC\uC74C \uB09A\uC2DC -Fishing.SubSkill.IceFishing.Description=\uC5BC\uC74C\uC774 \uB36E\uD600\uC788\uB294 \uD658\uACBD\uC5D0\uC11C \uB09A\uC2DC \uAC00\uB2A5 -Fishing.Chance.Raining=[[BLUE]] \uBE44 \uD2B9\uD61C -Fishing.Listener=\uB09A\uC2DC(FISHING): -Fishing.Ability.TH.MagicFound=[[GRAY]]\uC774 \uC785\uC9C8\uC5D0\uC11C \uB9C8\uBC95\uC774 \uB290\uAEF4\uC9D1\uB2C8\uB2E4... -Fishing.Ability.TH.Boom=[[GRAY]]\uD3ED\uBC1C \uC2DC\uAC04!!! -Fishing.Ability.TH.Poison=[[GRAY]]\uB08C\uC0C8\uAC00 \uC88B\uC9C0 \uC54A\uC2B5\uB2C8\uB2E4... -Fishing.SkillName=\uB09A\uC2DC -Fishing.Skillup=\uB09A\uC2DC \uAE30\uC220\uC774 {0} \uC62C\uB77C \uCD1D {1} \uB808\uBCA8\uC774 \uB418\uC5C8\uC2B5\uB2C8\uB2E4 +Fishing.Ability.Chance=입질 확률: &e{0} +Fishing.Ability.Info=매직 헌터: &7 **트레져 헌터 랭크 향상** +Fishing.Ability.Locked.0={0}레벨 때 기술 해제 (흔들기) +Fishing.Ability.Locked.1={0}레벨 때 기술 해제 (얼음 낚시) +Fishing.Ability.Locked.2={0}레벨 때 기술 해제 (낚시꾼 장인) +Fishing.Ability.Rank=트레져 헌터 랭크: &e{0}/5랭크 +Fishing.Ability.TH.DropRate= 드롭 비율: &4함정: &e{0} &7공통: &e{1} &a비공통: &e{2}\n&9레어: &e{3} &d에픽: &e{4} &6레전드리: &e{5} &b레코드: &e{6} +Fishing.Ability.TH.MagicRate=매직 헌터 확률: &e{0} +Fishing.Ability.Shake=흔들기 확률: &e{0} +Fishing.Ability.IceFishing=얼음 낚시: 얼음에서 낚시 +Fishing.Ability.FD=어부의 다이어트 랭크: &e{0}랭크 +Fishing.SubSkill.TreasureHunter.Name=트레져 헌터 (패시브) +Fishing.SubSkill.TreasureHunter.Description=물건(그외) 낚시 +Fishing.SubSkill.MagicHunter.Name=매직 헌터 +Fishing.SubSkill.MagicHunter.Description=인챈트 아이템 발견 +Fishing.SubSkill.Shake.Name=흔들기 (vs. 독립체) +Fishing.SubSkill.Shake.Description=아이템을 몹이나 낚시에서 얻음 +Fishing.SubSkill.FishermansDiet.Name=어부의 다이어트 +Fishing.SubSkill.FishermansDiet.Description=어류 음식 허기 회복 증가 +Fishing.SubSkill.MasterAngler.Name=낚시꾼 장인 +Fishing.SubSkill.IceFishing.Name=얼음 낚시 +Fishing.SubSkill.IceFishing.Description=얼음이 덮혀있는 환경에서 낚시 가능 +Fishing.Chance.Raining=&9 비 특혜 +Fishing.Listener=낚시(FISHING): +Fishing.Ability.TH.MagicFound=&7이 입질에서 마법이 느껴집니다... +Fishing.Ability.TH.Boom=&7폭발 시간!!! +Fishing.Ability.TH.Poison=&7낌새가 좋지 않습니다... +Fishing.SkillName=낚시 +Fishing.Skillup=낚시 기술이 {0} 올라 총 {1} 레벨이 되었습니다 #HERBALISM -Herbalism.Ability.DoubleDropChance=2\uBC30 \uB4DC\uB86D \uD655\uB960: [[YELLOW]]{0} -Herbalism.Ability.FD=\uB18D\uBD80\uC758 \uB2E4\uC774\uC5B4\uD2B8: [[YELLOW]]{0}\uB7AD\uD06C -Herbalism.Ability.GTe.Length=\uC7AC\uBC30\uC758 \uB300\uC9C0 \uC9C0\uC18D\uC2DC\uAC04: [[YELLOW]]{0}\uCD08 -Herbalism.Ability.GTe.NeedMore=\uC7AC\uBC30\uC758 \uB300\uC9C0\uC5D0 \uBFCC\uB9B4 \uC528\uAC00 \uC880\uB354 \uD544\uC694\uD569\uB2C8\uB2E4. -Herbalism.Ability.GTh.Chance=\uC7AC\uBC30\uC758 \uC7AC\uB2A5 \uD655\uB960: [[YELLOW]]{0} -Herbalism.Ability.GTh.Fail=**\uC7AC\uBC30\uC758 \uC7AC\uB2A5 \uC2E4\uD328** -Herbalism.Ability.GTh.Stage=\uC7AC\uBC30\uC758 \uC7AC\uB2A5 \uB2E8\uACC4: [[YELLOW]] \uC791\uBB3C \uC7AC\uBC30 {0}\uB2E8\uACC4 -Herbalism.Ability.GTh=[[GREEN]]**\uC7AC\uBC30\uC758 \uC7AC\uB2A5** -Herbalism.Ability.HylianLuck=\uD558\uC77C\uB9AC\uC548\uC758 \uD589\uC6B4 \uD655\uB960: [[YELLOW]]{0} -Herbalism.Ability.Lower=[[GRAY]]**\uD638\uBBF8 \uC900\uBE44 \uD574\uC81C** -Herbalism.Ability.Ready=[[GREEN]]**\uD638\uBBF8 \uC900\uBE44 \uC644\uB8CC** -Herbalism.Ability.ShroomThumb.Chance=\uBC84\uC12F\uC7AC\uBC30\uC790\uC758 \uC228\uACB0 \uD655\uB960: [[YELLOW]]{0} -Herbalism.Ability.ShroomThumb.Fail=**\uBC84\uC12F\uC7AC\uBC30\uC790\uC758 \uC228\uACB0 \uC2E4\uD328** -Herbalism.SubSkill.GreenTerra.Name=\uC7AC\uBC30\uC758 \uB300\uC9C0 (\uB2A5\uB825) -Herbalism.SubSkill.GreenTerra.Description=\uB300\uC9C0 \uBFCC\uB9AC\uAE30, \uB4DC\uB86D 3\uBC30 -Herbalism.SubSkill.GreenThumb.Name=\uC7AC\uBC30\uC758 \uC7AC\uB2A5 (\uBC00) -Herbalism.SubSkill.GreenThumb.Description=\uC218\uD655\uC2DC \uC790\uB3D9 \uC528 \uC2EC\uAE30 -Herbalism.Effect.4=\uC7AC\uBC30\uC758 \uC7AC\uB2A5 (\uBE14\uB85D\uB4E4) -Herbalism.SubSkill.GreenThumb.Description.2=\uC774\uB07C\uB080 \uBE14\uB85D \uB9CC\uB4E4\uAE30, \uC794\uB514 \uC790\uB77C\uAC8C\uD558\uAE30 -Herbalism.SubSkill.FarmersDiet.Name=\uB18D\uBD80\uC758 \uB2E4\uC774\uC5B4\uD2B8 -Herbalism.SubSkill.FarmersDiet.Description=\uB18D\uC791\uBB3C \uBC30\uACE0\uD488 \uD68C\uBCF5 \uD5A5\uC0C1 -Herbalism.SubSkill.DoubleDrops.Name=2\uBC30 \uB4DC\uB86D (\uBAA8\uB4E0 \uC791\uBB3C) -Herbalism.SubSkill.DoubleDrops.Description=\uD56D\uC0C1 \uB4DC\uB86D 2\uBC30 -Herbalism.SubSkill.HylianLuck.Name=\uD558\uC77C\uB9AC\uC548\uC758 \uD589\uC6B4 -Herbalism.SubSkill.HylianLuck.Description=\uC801\uC740 \uD655\uB960\uB85C \uB808\uC5B4\uC544\uC774\uD15C \uC5BB\uC74C -Herbalism.SubSkill.ShroomThumb.Name=\uBC84\uC12F\uC7AC\uBC30\uC790\uC758 \uC228\uACB0 -Herbalism.SubSkill.ShroomThumb.Description=\uD759 & \uC794\uB514\uC5D0 \uADE0\uC0AC\uCCB4 \uC0B4\uD3EC -Herbalism.HylianLuck=[[GREEN]]\uD558\uC774\uB784\uC758 \uD589\uC6B4\uC774 \uC624\uB298 \uB108\uC5D0\uAC8C \uB530\uB974\uB294\uAD6C\uB098! -Herbalism.Listener=\uC57D\uCD08\uD559(HERBALISM): -Herbalism.SkillName=\uC57D\uCD08\uD559 -Herbalism.Skills.GTe.Off=**\uC7AC\uBC30\uC758 \uB300\uC9C0 \uBE44\uD65C\uC131\uD654\uB428** -Herbalism.Skills.GTe.On=[[GREEN]]**\uC7AC\uBC30\uC758 \uB300\uC9C0 \uD65C\uC131\uD654\uB428** -Herbalism.Skills.GTe.Refresh=[[GREEN]]\uB2F9\uC2E0\uC758 [[YELLOW]]\uC7AC\uBC30\uC758 \uB300\uC9C0 [[GREEN]]\uAE30\uC220\uC740 \uC774\uC81C \uC0AC\uC6A9 \uAC00\uB2A5\uD569\uB2C8\uB2E4! -Herbalism.Skills.GTe.Other.Off={0}[[DARK_GREEN]]\uB2D8\uC740 [[RED]]\uC7AC\uBC30\uC758 \uB300\uC9C0\uB97C \uC0AC\uC6A9\uD588\uC2B5\uB2C8\uB2E4! -Herbalism.Skills.GTe.Other.On=[[GREEN]]{0}[[DARK_GREEN]]\uB2D8\uC740 [[RED]]\uC7AC\uBC30\uC758 \uB300\uC9C0\uB97C \uC0AC\uC6A9\uD588\uC2B5\uB2C8\uB2E4! -Herbalism.Skillup=\uC57D\uCD08\uD559 \uAE30\uC220\uC774 {0} \uC62C\uB77C \uCD1D {1} \uB808\uBCA8\uC774 \uB418\uC5C8\uC2B5\uB2C8\uB2E4 +Herbalism.Ability.DoubleDropChance=2배 드롭 확률: &e{0} +Herbalism.Ability.FD=농부의 다이어트: &e{0}랭크 +Herbalism.Ability.GTe.Length=재배의 대지 지속시간: &e{0}초 +Herbalism.Ability.GTe.NeedMore=재배의 대지에 뿌릴 씨가 좀더 필요합니다. +Herbalism.Ability.GTh.Chance=재배의 재능 확률: &e{0} +Herbalism.Ability.GTh.Fail=**재배의 재능 실패** +Herbalism.Ability.GTh.Stage=재배의 재능 단계: &e 작물 재배 {0}단계 +Herbalism.Ability.GTh=&a**재배의 재능** +Herbalism.Ability.HylianLuck=하일리안의 행운 확률: &e{0} +Herbalism.Ability.Lower=&7**호미 준비 해제** +Herbalism.Ability.Ready=&a**호미 준비 완료** +Herbalism.Ability.ShroomThumb.Chance=버섯재배자의 숨결 확률: &e{0} +Herbalism.Ability.ShroomThumb.Fail=**버섯재배자의 숨결 실패** +Herbalism.SubSkill.GreenTerra.Name=재배의 대지 (능력) +Herbalism.SubSkill.GreenTerra.Description=대지 뿌리기, 드롭 3배 +Herbalism.SubSkill.GreenThumb.Name=재배의 재능 (밀) +Herbalism.SubSkill.GreenThumb.Description=수확시 자동 씨 심기 +Herbalism.Effect.4=재배의 재능 (블록들) +Herbalism.SubSkill.GreenThumb.Description.2=이끼낀 블록 만들기, 잔디 자라게하기 +Herbalism.SubSkill.FarmersDiet.Name=농부의 다이어트 +Herbalism.SubSkill.FarmersDiet.Description=농작물 배고품 회복 향상 +Herbalism.SubSkill.DoubleDrops.Name=2배 드롭 (모든 작물) +Herbalism.SubSkill.DoubleDrops.Description=항상 드롭 2배 +Herbalism.SubSkill.HylianLuck.Name=하일리안의 행운 +Herbalism.SubSkill.HylianLuck.Description=적은 확률로 레어아이템 얻음 +Herbalism.SubSkill.ShroomThumb.Name=버섯재배자의 숨결 +Herbalism.SubSkill.ShroomThumb.Description=흙 & 잔디에 균사체 살포 +Herbalism.HylianLuck=&a하이랄의 행운이 오늘 너에게 따르는구나! +Herbalism.Listener=약초학(HERBALISM): +Herbalism.SkillName=약초학 +Herbalism.Skills.GTe.Off=**재배의 대지 비활성화됨** +Herbalism.Skills.GTe.On=&a**재배의 대지 활성화됨** +Herbalism.Skills.GTe.Refresh=&a당신의 &e재배의 대지 &a기술은 이제 사용 가능합니다! +Herbalism.Skills.GTe.Other.Off={0}&2님은 &c재배의 대지를 사용했습니다! +Herbalism.Skills.GTe.Other.On=&a{0}&2님은 &c재배의 대지를 사용했습니다! +Herbalism.Skillup=약초학 기술이 {0} 올라 총 {1} 레벨이 되었습니다 #MINING -Mining.Ability.Length=\uD30C\uAD34\uC790 \uC9C0\uC18D\uC2DC\uAC04: [[YELLOW]]{0}s -Mining.Ability.Locked.0={0}\uB808\uBCA8 \uB54C \uAE30\uC220 \uD574\uC81C (\uD3ED\uBC1C \uCC44\uAD74) -Mining.Ability.Locked.1={0}\uB808\uBCA8 \uB54C \uAE30\uC220 \uD574\uC81C (\uAC70\uB300 \uD3ED\uBC1C) -Mining.Ability.Locked.2={0}\uB808\uBCA8 \uB54C \uAE30\uC220 \uD574\uC81C (\uC804\uBB38 \uD3ED\uD30C) -Mining.Ability.Lower=[[GRAY]]**\uACE1\uAD2D\uC774 \uC900\uBE44 \uD574\uC81C** -Mining.Ability.Ready=[[GREEN]]**\uACE1\uAD2D\uC774 \uC900\uBE44 \uC644\uB8CC** -Mining.SubSkill.SuperBreaker.Name=\uD30C\uAD34\uC790 (\uB2A5\uB825) -Mining.SubSkill.SuperBreaker.Description=\uC18D\uB3C4 \uD5A5\uC0C1, \uB4DC\uB86D \uD655\uB960 3\uBC30 -Mining.SubSkill.DoubleDrops.Name=\uB4DC\uB86D 2\uBC30 -Mining.SubSkill.DoubleDrops.Description=\uD56D\uC0C1 \uB4DC\uB86D 2\uBC30 -Mining.SubSkill.BlastMining.Name=\uD3ED\uBC1C \uCC44\uAD74 -Mining.SubSkill.BlastMining.Description=TNT\uB85C \uCC44\uAD74\uC2DC \uCD94\uAC00 \uAD11\uBB3C -Mining.SubSkill.BiggerBombs.Name=\uAC70\uB300 \uD3ED\uBC1C -Mining.SubSkill.BiggerBombs.Description=TNT \uD3ED\uBC1C\uAC70\uB9AC \uC99D\uAC00 -Mining.SubSkill.DemolitionsExpertise.Name=\uC804\uBB38 \uD3ED\uD30C -Mining.SubSkill.DemolitionsExpertise.Description=TNT \uD3ED\uBC1C \uD53C\uD574 \uAC10\uC18C -Mining.Effect.Decrease=\uC804\uBB38 \uD3ED\uD30C \uD53C\uD574 \uAC10\uC18C: [[YELLOW]]{0} -Mining.Effect.DropChance=\uB4DC\uB86D 2\uBC30 \uD655\uB960: [[YELLOW]]{0} -Mining.Listener=\uCC44\uAD11(MINING): -Mining.SkillName=\uCC44\uAD11 -Mining.Skills.SuperBreaker.Off=**\uD30C\uAD34\uC790 \uBC1C\uB3D9 \uD574\uC81C** -Mining.Skills.SuperBreaker.On=[[GREEN]]**\uD30C\uAD34\uC790 \uBC1C\uB3D9** -Mining.Skills.SuperBreaker.Other.Off={0}[[DARK_GREEN]]\uB2D8\uC740 [[RED]]\uD30C\uAD34\uC790\uB97C \uC0AC\uC6A9\uD588\uC2B5\uB2C8\uB2E4! -Mining.Skills.SuperBreaker.Other.On=[[GREEN]]{0}[[DARK_GREEN]]\uB2D8\uC740 [[RED]]\uD30C\uAD34\uC790\uB97C \uC0AC\uC6A9\uD588\uC2B5\uB2C8\uB2E4! -Mining.Skills.SuperBreaker.Refresh=[[GREEN]]\uB2F9\uC2E0\uC758 [[YELLOW]]\uD30C\uAD34\uC790\uB294 [[GREEN]]\uC774\uC81C \uC0AC\uC6A9 \uAC00\uB2A5\uD569\uB2C8\uB2E4! -Mining.Skillup=\uCC44\uAD11 \uAE30\uC220\uC774 {0} \uC62C\uB77C \uCD1D {1} \uB808\uBCA8\uC774 \uB418\uC5C8\uC2B5\uB2C8\uB2E4 +Mining.Ability.Length=파괴자 지속시간: &e{0}s +Mining.Ability.Locked.0={0}레벨 때 기술 해제 (폭발 채굴) +Mining.Ability.Locked.1={0}레벨 때 기술 해제 (거대 폭발) +Mining.Ability.Locked.2={0}레벨 때 기술 해제 (전문 폭파) +Mining.Ability.Lower=&7**곡괭이 준비 해제** +Mining.Ability.Ready=&a**곡괭이 준비 완료** +Mining.SubSkill.SuperBreaker.Name=파괴자 (능력) +Mining.SubSkill.SuperBreaker.Description=속도 향상, 드롭 확률 3배 +Mining.SubSkill.DoubleDrops.Name=드롭 2배 +Mining.SubSkill.DoubleDrops.Description=항상 드롭 2배 +Mining.SubSkill.BlastMining.Name=폭발 채굴 +Mining.SubSkill.BlastMining.Description=TNT로 채굴시 추가 광물 +Mining.SubSkill.BiggerBombs.Name=거대 폭발 +Mining.SubSkill.BiggerBombs.Description=TNT 폭발거리 증가 +Mining.SubSkill.DemolitionsExpertise.Name=전문 폭파 +Mining.SubSkill.DemolitionsExpertise.Description=TNT 폭발 피해 감소 +Mining.Effect.Decrease=전문 폭파 피해 감소: &e{0} +Mining.Effect.DropChance=드롭 2배 확률: &e{0} +Mining.Listener=채광(MINING): +Mining.SkillName=채광 +Mining.Skills.SuperBreaker.Off=**파괴자 발동 해제** +Mining.Skills.SuperBreaker.On=&a**파괴자 발동** +Mining.Skills.SuperBreaker.Other.Off={0}&2님은 &c파괴자를 사용했습니다! +Mining.Skills.SuperBreaker.Other.On=&a{0}&2님은 &c파괴자를 사용했습니다! +Mining.Skills.SuperBreaker.Refresh=&a당신의 &e파괴자는 &a이제 사용 가능합니다! +Mining.Skillup=채광 기술이 {0} 올라 총 {1} 레벨이 되었습니다 #Blast Mining -Mining.Blast.Boom=[[GRAY]]**\uD3ED\uBC1C** -Mining.Blast.Effect=+{0} \uAD11\uBB3C \uC774\uC775, {1}x \uB4DC\uB86D -Mining.Blast.Radius.Increase=\uD3ED\uBC1C \uBC18\uACBD \uC99D\uAC00: [[YELLOW]]+{0} -Mining.Blast.Rank=\uD3ED\uBC1C \uCC44\uAD74: [[YELLOW]]{0}/8\uB7AD\uD06C [[GRAY]]({1}) -Mining.Blast.Other.On=[[GREEN]]{0}[[DARK_GREEN]]\uB2D8\uC740 [[RED]]\uD3ED\uBC1C \uCC44\uAD74\uC744 \uC0AC\uC6A9\uD558\uC168\uC2B5\uB2C8\uB2E4! -Mining.Blast.Refresh=[[GREEN]]\uB2F9\uC2E0\uC758 [[YELLOW]]\uD3ED\uBC1C \uCC44\uAD74 [[GREEN]]\uAE30\uC220\uC740 \uC774\uC81C \uC0AC\uC6A9 \uAC00\uB2A5\uD569\uB2C8\uB2E4! +Mining.Blast.Boom=&7**폭발** +Mining.Blast.Effect=+{0} 광물 이익, {1}x 드롭 +Mining.Blast.Radius.Increase=폭발 반경 증가: &e+{0} +Mining.Blast.Rank=폭발 채굴: &e{0}/8랭크 &7({1}) +Mining.Blast.Other.On=&a{0}&2님은 &c폭발 채굴을 사용하셨습니다! +Mining.Blast.Refresh=&a당신의 &e폭발 채굴 &a기술은 이제 사용 가능합니다! #REPAIR -Repair.SubSkill.Repair.Name=\uC218\uB9AC -Repair.SubSkill.Repair.Description=\uB3C4\uAD6C & \uBC29\uC5B4\uAD6C \uC218\uB9AC -Repair.SubSkill.GoldRepair.Name=\uAE08 \uC218\uB9AC ({0}\uB808\uBCA8 \uC774\uC0C1) -Repair.SubSkill.GoldRepair.Description=\uAE08 \uB3C4\uAD6C & \uBC29\uC5B4\uAD6C \uC218\uB9AC -Repair.SubSkill.IronRepair.Name=\uCCA0 \uC218\uB9AC ({0}\uB808\uBCA8 \uC774\uC0C1) -Repair.SubSkill.IronRepair.Description=\uCCA0 \uB3C4\uAD6C & \uBC29\uC5B4\uAD6C \uC218\uB9AC -Repair.SubSkill.StoneRepair.Name=\uB3CC \uC218\uB9AC ({0}\uB808\uBCA8 \uC774\uC0C1) -Repair.SubSkill.StoneRepair.Description=\uB3CC \uB3C4\uAD6C \uC218\uB9AC -Repair.SubSkill.RepairMastery.Name=\uC218\uB9AC \uB9C8\uC2A4\uD130\uB9AC -Repair.SubSkill.RepairMastery.Description=\uC218\uB9AC \uC591 \uC99D\uAC00 -Repair.SubSkill.SuperRepair.Name=\uC288\uD37C \uC218\uB9AC -Repair.SubSkill.SuperRepair.Description=\uD6A8\uC728 2\uBC30 -Repair.SubSkill.DiamondRepair.Name=\uB2E4\uC774\uC544\uBAAC\uB4DC \uC218\uB9AC ({0} \uB808\uBCA8) -Repair.SubSkill.DiamondRepair.Description=\uB2E4\uC774\uC544\uBAAC\uB4DC \uB3C4\uAD6C & \uBC29\uC5B4\uAD6C \uC218\uB9AC -Repair.SubSkill.ArcaneForging.Name=\uC778\uCC48\uD2B8 \uC544\uC774\uD15C \uC218\uB9AC -Repair.SubSkill.ArcaneForging.Description=\uB9C8\uBC95 \uC544\uC774\uD15C \uC218\uB9AC -Repair.Error=[[DARK_RED]]mcMMO\uC774 \uC544\uC774\uD15C\uC744 \uC218\uB9AC\uD558\uB824\uACE0 \uC2DC\uB3C4\uD558\uB294 \uB3D9\uC548 \uC624\uB958\uAC00 \uBC1C\uC0DD\uD588\uC2B5\uB2C8\uB2E4! -Repair.Listener.Anvil=[[DARK_RED]]\uB2F9\uC2E0\uC740 \uBAA8\uB8E8\uB97C \uB193\uC558\uC2B5\uB2C8\uB2E4, \uBAA8\uB8E8\uB294 \uB3C4\uAD6C\uB4E4\uACFC \uBC29\uC5B4\uAD6C\uB97C \uC218\uB9AC\uD560 \uC218 \uC788\uC2B5\uB2C8\uB2E4. -Repair.Listener=\uC218\uB9AC(REPAIR): -Repair.SkillName=\uC218\uB9AC -Repair.Skills.AdeptDiamond=[[DARK_RED]]\uB2F9\uC2E0\uC740 \uC544\uC9C1 \uB2E4\uC774\uC544\uBAAC\uB4DC\uB97C \uC218\uB9AC\uD560 \uC218 \uC788\uB294 \uAE30\uC220\uC744 \uBC30\uC6B0\uC9C0 \uC54A\uC558\uC2B5\uB2C8\uB2E4. -Repair.Skills.AdeptGold=[[DARK_RED]]\uB2F9\uC2E0\uC740 \uC544\uC9C1 \uAE08\uC744 \uC218\uB9AC\uD560 \uC218 \uC788\uB294 \uAE30\uC220\uC744 \uBC30\uC6B0\uC9C0 \uC54A\uC558\uC2B5\uB2C8\uB2E4. -Repair.Skills.AdeptIron=[[DARK_RED]]\uB2F9\uC2E0\uC740 \uC544\uC9C1 \uCCA0\uC744 \uC218\uB9AC\uD560 \uC218 \uC788\uB294 \uAE30\uC220\uC744 \uBC30\uC6B0\uC9C0 \uC54A\uC558\uC2B5\uB2C8\uB2E4. -Repair.Skills.AdeptStone=[[DARK_RED]]\uB2F9\uC2E0\uC740 \uC544\uC9C1 \uB3CC\uC744 \uC218\uB9AC\uD560 \uC218 \uC788\uB294 \uAE30\uC220\uC744 \uBC30\uC6B0\uC9C0 \uC54A\uC558\uC2B5\uB2C8\uB2E4. -Repair.Skills.Adept=\uB2F9\uC2E0\uC740 [[YELLOW]]{1}\uC744/\uB97C \uC218\uB9AC\uD560\uB824\uBA74 [[YELLOW]]{0}[[RED]]\uB808\uBCA8\uC774 \uD544\uC694\uD569\uB2C8\uB2E4 -Repair.Skills.FeltEasy=[[GRAY]]\uC26C\uC6B4 \uB290\uB08C~ -Repair.Skills.FullDurability=[[GRAY]]\uB0B4\uAD6C\uB3C4\uAC00 \uAF49 \uCC3C\uC2B5\uB2C8\uB2E4. -Repair.Skills.Mastery=\uC218\uB9AC \uB9C8\uC2A4\uD130\uB9AC: [[YELLOW]]\uCD94\uAC00 \uB0B4\uAD6C\uC131 \uBCF5\uAD6C: {0} -Repair.Skills.StackedItems=[[DARK_RED]]\uD55C\uBC88\uC5D0 \uB9CE\uC740 \uC544\uC774\uD15C\uC744 \uC218\uB9AC\uD560 \uC218 \uC5C6\uC2B5\uB2C8\uB2E4. -Repair.Skills.Super.Chance=\uC288\uD37C \uC218\uB9AC \uD655\uB960: [[YELLOW]]{0} -Repair.Skillup=\uC218\uB9AC \uAE30\uC220\uC774 {0} \uC62C\uB77C \uCD1D {1} \uB808\uBCA8\uC774 \uB418\uC5C8\uC2B5\uB2C8\uB2E4 -Repair.Pretty.Name=\uC218\uB9AC +Repair.SubSkill.Repair.Name=수리 +Repair.SubSkill.Repair.Description=도구 & 방어구 수리 +Repair.SubSkill.GoldRepair.Name=금 수리 ({0}레벨 이상) +Repair.SubSkill.GoldRepair.Description=금 도구 & 방어구 수리 +Repair.SubSkill.IronRepair.Name=철 수리 ({0}레벨 이상) +Repair.SubSkill.IronRepair.Description=철 도구 & 방어구 수리 +Repair.SubSkill.StoneRepair.Name=돌 수리 ({0}레벨 이상) +Repair.SubSkill.StoneRepair.Description=돌 도구 수리 +Repair.SubSkill.RepairMastery.Name=수리 마스터리 +Repair.SubSkill.RepairMastery.Description=수리 양 증가 +Repair.SubSkill.SuperRepair.Name=슈퍼 수리 +Repair.SubSkill.SuperRepair.Description=효율 2배 +Repair.SubSkill.DiamondRepair.Name=다이아몬드 수리 ({0} 레벨) +Repair.SubSkill.DiamondRepair.Description=다이아몬드 도구 & 방어구 수리 +Repair.SubSkill.ArcaneForging.Name=인챈트 아이템 수리 +Repair.SubSkill.ArcaneForging.Description=마법 아이템 수리 +Repair.Error=&4mcMMO이 아이템을 수리하려고 시도하는 동안 오류가 발생했습니다! +Repair.Listener.Anvil=&4당신은 모루를 놓았습니다, 모루는 도구들과 방어구를 수리할 수 있습니다. +Repair.Listener=수리(REPAIR): +Repair.SkillName=수리 +Repair.Skills.AdeptDiamond=&4당신은 아직 다이아몬드를 수리할 수 있는 기술을 배우지 않았습니다. +Repair.Skills.AdeptGold=&4당신은 아직 금을 수리할 수 있는 기술을 배우지 않았습니다. +Repair.Skills.AdeptIron=&4당신은 아직 철을 수리할 수 있는 기술을 배우지 않았습니다. +Repair.Skills.AdeptStone=&4당신은 아직 돌을 수리할 수 있는 기술을 배우지 않았습니다. +Repair.Skills.Adept=당신은 &e{1}을/를 수리할려면 &e{0}&c레벨이 필요합니다 +Repair.Skills.FeltEasy=&7쉬운 느낌~ +Repair.Skills.FullDurability=&7내구도가 꽉 찼습니다. +Repair.Skills.Mastery=수리 마스터리: &e추가 내구성 복구: {0} +Repair.Skills.StackedItems=&4한번에 많은 아이템을 수리할 수 없습니다. +Repair.Skills.Super.Chance=슈퍼 수리 확률: &e{0} +Repair.Skillup=수리 기술이 {0} 올라 총 {1} 레벨이 되었습니다 +Repair.Pretty.Name=수리 #Arcane Forging -Repair.Arcane.Chance.Downgrade=[[GRAY]]\uC778\uCC48\uD2B8 \uC218\uB9AC \uACA9\uD558 \uD655\uB960: [[YELLOW]]{0}% -Repair.Arcane.Chance.Success=[[GRAY]]\uC778\uCC48\uD2B8 \uC218\uB9AC \uC131\uACF5 \uD655\uB960: [[YELLOW]]{0}% -Repair.Arcane.Downgrade=\uC774 \uC544\uC774\uD15C\uC758 \uC778\uCC48\uD2B8\uB294 \uAC10\uC18C\uD588\uC2B5\uB2C8\uB2E4. -Repair.Arcane.Fail=\uC774 \uC544\uC774\uD15C\uC758 \uC778\uCC48\uD2B8\uB294 \uC601\uAD6C\uC801\uC73C\uB85C \uC18C\uBA78\uB418\uC5C8\uC2B5\uB2C8\uB2E4. -Repair.Arcane.Lost=\uB2F9\uC2E0\uC740 \uBAA8\uB4E0 \uC778\uCC48\uD2B8\uB97C \uC720\uC9C0\uD560 \uAE30\uC220\uC774 \uCDA9\uBD84\uCE58 \uC54A\uC2B5\uB2C8\uB2E4. -Repair.Arcane.Perfect=[[GREEN]]\uC774 \uC544\uC774\uD15C\uC758 \uC778\uCC48\uD2B8\uB97C \uC9C0\uC18D\uC2DC\uCF30\uC2B5\uB2C8\uB2E4. -Repair.Arcane.Rank=\uC778\uCC48\uD2B8 \uC218\uB9AC: [[YELLOW]]{0}/{1}\uB7AD\uD06C +Repair.Arcane.Chance.Downgrade=&7인챈트 수리 격하 확률: &e{0}% +Repair.Arcane.Chance.Success=&7인챈트 수리 성공 확률: &e{0}% +Repair.Arcane.Downgrade=이 아이템의 인챈트는 감소했습니다. +Repair.Arcane.Fail=이 아이템의 인챈트는 영구적으로 소멸되었습니다. +Repair.Arcane.Lost=당신은 모든 인챈트를 유지할 기술이 충분치 않습니다. +Repair.Arcane.Perfect=&a이 아이템의 인챈트를 지속시켰습니다. +Repair.Arcane.Rank=인챈트 수리: &e{0}/{1}랭크 #SALVAGE -Salvage.Pretty.Name=\uD68C\uC218 -Salvage.SubSkill.AdvancedSalvage.Name=\uC804\uBB38\uC801\uC778 \uD68C\uC218 -Salvage.SubSkill.AdvancedSalvage.Description=\uC190\uC0C1\uB41C \uC544\uC774\uD15C \uD68C\uC218 -Salvage.SubSkill.ArcaneSalvaging.Name=\uC2E0\uBE44\uB85C\uC6B4 \uD68C\uC218 -Salvage.SubSkill.ArcaneSalvaging.Description=\uC544\uC774\uD15C\uC758 \uC778\uCC48\uD2B8 \uCD94\uCD9C -Salvage.Ability.Locked.0={0} \uB808\uBCA8 \uB54C \uAE30\uC220\uD574\uC81C (\uC804\uBB38\uC801\uC778 \uD68C\uC218) -Salvage.Ability.Bonus.0=\uC804\uBB38\uC801\uC778 \uD68C\uC218 -Salvage.Ability.Bonus.1=\uBD80\uC154\uC9C4 \uC544\uC774\uD15C\uC758 \uCD5C\uB300 \uCD94\uCD9C\uB7C9 {0} -Salvage.Arcane.Rank=\uC2E0\uBE44\uB85C\uC6B4 \uD68C\uC218: [[YELLOW]]Rank {0}/{1} -Salvage.Arcane.ExtractFull=[[GRAY]]\uCD5C\uB300-\uC778\uCC48\uD2B8 \uAE30\uD68C \uBD80\uACFC -Salvage.Arcane.ExtractPartial=[[GRAY]]\uC77C\uBD80-\uC778\uCC48\uD2B8 \uAE30\uD68C \uBD80\uACFC -Salvage.Skills.Success=[[GREEN]]\uC544\uC774\uD15C \uD68C\uC218\uB428! -Salvage.Skills.Adept.Damaged=[[DARK_RED]]\uC190\uC0C1\uB41C \uC544\uC774\uD15C\uC744 \uD68C\uC218\uD560 \uB2A5\uB825\uC774 \uC5C6\uC2B5\uB2C8\uB2E4. -Salvage.Skills.Adept.Level={1}\uB97C [[RED]]\uD68C\uC218\uD558\uB824\uBA74 [[YELLOW]]{0}[[RED]] \uB808\uBCA8\uC774 \uB418\uC57C\uD569\uB2C8\uB2E4 -Salvage.Skills.TooDamaged=[[DARK_RED]]\uC774 \uC544\uC774\uD15C\uC740 \uC2EC\uD558\uAC8C \uC190\uC0C1\uB418\uC5B4 \uD68C\uC218\uD560 \uC218 \uC5C6\uC2B5\uB2C8\uB2E4. -Salvage.Skills.ArcaneFailed=\uB2F9\uC2E0\uC740 \uC774 \uC544\uC774\uD15C \uC18D\uC758 \uC9C0\uC2DD\uC744 \uCD94\uCD9C\uD560 \uC218 \uC5C6\uC2B5\uB2C8\uB2E4. -Salvage.Skills.ArcanePartial=\uB2F9\uC2E0\uC740 \uC774 \uC544\uC774\uD15C \uC18D\uC758 \uC9C0\uC2DD\uC758 \uC77C\uBD80\uB9CC \uCD94\uCD9C\uD560 \uC218 \uC788\uC5C8\uC2B5\uB2C8\uB2E4. -Salvage.Skills.ArcaneSuccess=[[GREEN]]\uB2F9\uC2E0\uC740 \uC774 \uC544\uC774\uD15C\uC758 \uBAA8\uB4E0 \uC9C0\uC2DD\uC744 \uCD94\uCD9C\uD560 \uC218 \uC788\uC2B5\uB2C8\uB2E4! -Salvage.Listener.Anvil=[[DARK_RED]]\uB2F9\uC2E0\uC740 \uD68C\uC218 \uBAA8\uB8E8\uB97C \uB193\uC558\uC2B5\uB2C8\uB2E4, \uB3C4\uAD6C\uB098 \uBC29\uC5B4\uAD6C \uD68C\uC218\uC5D0 \uC4F0\uC785\uB2C8\uB2E4. -Salvage.Listener=\uD68C\uC218(SALVAGE): -Salvage.SkillName=\uD68C\uC218 +Salvage.Pretty.Name=회수 +Salvage.SubSkill.AdvancedSalvage.Name=전문적인 회수 +Salvage.SubSkill.AdvancedSalvage.Description=손상된 아이템 회수 +Salvage.SubSkill.ArcaneSalvaging.Name=신비로운 회수 +Salvage.SubSkill.ArcaneSalvaging.Description=아이템의 인챈트 추출 +Salvage.Ability.Locked.0={0} 레벨 때 기술해제 (전문적인 회수) +Salvage.Ability.Bonus.0=전문적인 회수 +Salvage.Ability.Bonus.1=부셔진 아이템의 최대 추출량 {0} +Salvage.Arcane.Rank=신비로운 회수: &eRank {0}/{1} +Salvage.Arcane.ExtractFull=&7최대-인챈트 기회 부과 +Salvage.Arcane.ExtractPartial=&7일부-인챈트 기회 부과 +Salvage.Skills.Success=&a아이템 회수됨! +Salvage.Skills.Adept.Damaged=&4손상된 아이템을 회수할 능력이 없습니다. +Salvage.Skills.Adept.Level={1}를 &c회수하려면 &e{0}&c 레벨이 되야합니다 +Salvage.Skills.TooDamaged=&4이 아이템은 심하게 손상되어 회수할 수 없습니다. +Salvage.Skills.ArcaneFailed=당신은 이 아이템 속의 지식을 추출할 수 없습니다. +Salvage.Skills.ArcanePartial=당신은 이 아이템 속의 지식의 일부만 추출할 수 있었습니다. +Salvage.Skills.ArcaneSuccess=&a당신은 이 아이템의 모든 지식을 추출할 수 있습니다! +Salvage.Listener.Anvil=&4당신은 회수 모루를 놓았습니다, 도구나 방어구 회수에 쓰입니다. +Salvage.Listener=회수(SALVAGE): +Salvage.SkillName=회수 #SWORDS -Swords.Ability.Lower=[[GRAY]]**\uAC80 \uC900\uBE44 \uD574\uC81C** -Swords.Ability.Ready=[[GREEN]]**\uAC80 \uC900\uBE44 \uC644\uB8CC** -Swords.Combat.Bleed.Chance=\uCD9C\uD608 \uD655\uB960: [[YELLOW]]{0} -Swords.Combat.Bleed.Length=\uCD9C\uD608 \uC9C0\uC18D\uC2DC\uAC04: [[YELLOW]]{0} \uD2F1 -Swords.Combat.Bleed.Note=[[GRAY]]\uC54C\uB9BC: [[YELLOW]]1 \uD2F1\uC740 2\uCD08\uC785\uB2C8\uB2E4 -Swords.Combat.Bleeding.Started=[[DARK_RED]] \uB2F9\uC2E0\uC740 \uD53C\uB97C \uD758\uB9AC\uACE0 \uC788\uC2B5\uB2C8\uB2E4! -Swords.Combat.Bleeding.Stopped=[[GRAY]]\uCD9C\uD608\uC774 [[GREEN]]\uBA48\uCDC4\uC2B5\uB2C8\uB2E4[[GRAY]]! -Swords.Combat.Bleeding=[[GREEN]]**\uCD9C\uD608** -Swords.Combat.Counter.Chance=\uCE74\uC6B4\uD130 \uC5B4\uD0DD \uD655\uB960: [[YELLOW]]{0} -Swords.Combat.Counter.Hit=[[DARK_RED]]\uCE74\uC6B4\uD130 \uC5B4\uD0DD\uC5D0 \uB9DE\uC558\uC2B5\uB2C8\uB2E4! -Swords.Combat.Countered=[[GREEN]]**\uCE74\uC6B4\uD130-\uC5B4\uD0DD** -Swords.Combat.SS.Struck=[[DARK_RED]]\uD1B1\uB0A0 \uACF5\uACA9\uC5D0 \uB9DE\uC558\uC2B5\uB2C8\uB2E4! -Swords.SubSkill.CounterAttack.Name=\uCE74\uC6B4\uD130 \uC5B4\uD0DD -Swords.SubSkill.CounterAttack.Description={0} \uD53C\uD574 \uBC18\uC0AC -Swords.SubSkill.SerratedStrikes.Name=\uD1B1\uB0A0 \uACF5\uACA9 (\uB2A5\uB825) -Swords.SubSkill.SerratedStrikes.Description=\uD53C\uD574 {0} \uC99D\uAC00, \uCD9C\uD608 \uC99D\uAC00 -Swords.Effect.4=\uD1B1\uB0A0 \uACF5\uACA9 \uCD9C\uD608 \uC99D\uAC00 -Swords.Effect.5={0} \uD2F1 \uCD9C\uD608 -Swords.SubSkill.Bleed.Name=\uCD9C\uD608 -Swords.SubSkill.Bleed.Description=\uACFC\uB2E4 \uCD9C\uD608 -Swords.Listener=\uAC80\uC220(SWORDS): -Swords.SkillName=\uAC80\uC220 -Swords.Skills.SS.Off=**\uD1B1\uB0A0 \uACF5\uACA9 \uBC1C\uB3D9 \uD574\uC81C** -Swords.Skills.SS.On=[[GREEN]]**\uD1B1\uB0A0 \uACF5\uACA9 \uBC1C\uB3D9** -Swords.Skills.SS.Refresh=[[GREEN]]\uB2F9\uC2E0\uC758 [[YELLOW]]\uD1B1\uB0A0 \uACF5\uACA9 [[GREEN]]\uC2A4\uD0AC\uC740 \uC774\uC81C \uC0AC\uC6A9 \uAC00\uB2A5\uD569\uB2C8\uB2E4! -Swords.Skills.SS.Other.Off={0}[[DARK_GREEN]]\uB2D8\uC740 [[RED]]\uD1B1\uB0A0 \uACF5\uACA9 \uC2A4\uD0AC\uC744 \uC0AC\uC6A9 \uD574\uC81C\uD588\uC2B5\uB2C8\uB2E4! -Swords.Skills.SS.Other.On=[[GREEN]]{0}[[DARK_GREEN]]\uB2D8\uC740 [[RED]]\uD1B1\uB0A0 \uACF5\uACA9 \uC2A4\uD0AC\uC744 \uC0AC\uC6A9\uD588\uC2B5\uB2C8\uB2E4! -Swords.Skillup=\uAC80\uC220 \uC2A4\uD0AC\uC774 {0} \uC62C\uB77C \uCD1D {1} \uB808\uBCA8\uC774 \uB418\uC5C8\uC2B5\uB2C8\uB2E4 -Swords.SS.Length=\uD1B1\uB0A0 \uACF5\uACA9 \uC9C0\uC18D\uC2DC\uAC04: [[YELLOW]]{0}\uCD08 +Swords.Ability.Lower=&7**검 준비 해제** +Swords.Ability.Ready=&a**검 준비 완료** +Swords.Combat.Bleed.Chance=출혈 확률: &e{0} +Swords.Combat.Bleed.Length=출혈 지속시간: &e{0} 틱 +Swords.Combat.Bleed.Note=&7알림: &e1 틱은 2초입니다 +Swords.Combat.Bleeding.Started=&4 당신은 피를 흘리고 있습니다! +Swords.Combat.Bleeding.Stopped=&7출혈이 &a멈췄습니다&7! +Swords.Combat.Bleeding=&a**출혈** +Swords.Combat.Counter.Chance=카운터 어택 확률: &e{0} +Swords.Combat.Counter.Hit=&4카운터 어택에 맞았습니다! +Swords.Combat.Countered=&a**카운터-어택** +Swords.Combat.SS.Struck=&4톱날 공격에 맞았습니다! +Swords.SubSkill.CounterAttack.Name=카운터 어택 +Swords.SubSkill.CounterAttack.Description={0} 피해 반사 +Swords.SubSkill.SerratedStrikes.Name=톱날 공격 (능력) +Swords.SubSkill.SerratedStrikes.Description=피해 {0} 증가, 출혈 증가 +Swords.Effect.4=톱날 공격 출혈 증가 +Swords.Effect.5={0} 틱 출혈 +Swords.SubSkill.Bleed.Name=출혈 +Swords.SubSkill.Bleed.Description=과다 출혈 +Swords.Listener=검술(SWORDS): +Swords.SkillName=검술 +Swords.Skills.SS.Off=**톱날 공격 발동 해제** +Swords.Skills.SS.On=&a**톱날 공격 발동** +Swords.Skills.SS.Refresh=&a당신의 &e톱날 공격 &a스킬은 이제 사용 가능합니다! +Swords.Skills.SS.Other.Off={0}&2님은 &c톱날 공격 스킬을 사용 해제했습니다! +Swords.Skills.SS.Other.On=&a{0}&2님은 &c톱날 공격 스킬을 사용했습니다! +Swords.Skillup=검술 스킬이 {0} 올라 총 {1} 레벨이 되었습니다 +Swords.SS.Length=톱날 공격 지속시간: &e{0}초 #TAMING -Taming.Ability.Bonus.0=\uD658\uACBD \uC778\uC2DD -Taming.Ability.Bonus.1=\uB291\uB300 \uC704\uD5D8 \uD68C\uD53C -Taming.Ability.Bonus.2=\uB450\uAEBC\uC6B4 \uD138 -Taming.Ability.Bonus.3=1/{0} \uD53C\uD574, \uB0B4\uD654\uC131(\uBD88\uC800\uD56D\uB825) -Taming.Ability.Bonus.4=\uCDA9\uACA9 \uC99D\uBA85 -Taming.Ability.Bonus.5=\uD56D\uC0C1 1/{0} \uD3ED\uBC1C \uD53C\uD574 -Taming.Ability.Bonus.6=\uB0A0\uCE74\uB85C\uC6B4 \uBC1C\uD1B1 -Taming.Ability.Bonus.7=+{0} \uD53C\uD574 -Taming.Ability.Bonus.8=\uBE60\uB978 \uC74C\uC2DD \uC81C\uACF5 -Taming.Ability.Bonus.9={0} \uD655\uB960\uB85C \uACF5\uACA9\uC2DC \uD68C\uBCF5 -Taming.Ability.Bonus.10=\uC2E0\uC131\uD55C \uC0AC\uB0E5\uAC1C -Taming.Ability.Bonus.11=\uB9C8\uBC95\uC774\uB098 \uB3C5\uC73C\uB85C \uC778\uD55C \uC190\uC0C1 \uD68C\uBCF5 -Taming.Ability.Locked.0={0}\uB808\uBCA8 \uB54C \uC2A4\uD0AC\uD574\uC81C (\uD658\uACBD \uC778\uC2DD) -Taming.Ability.Locked.1={0}\uB808\uBCA8 \uB54C \uC2A4\uD0AC\uD574\uC81C (\uB450\uAEBC\uC6B4 \uD138) -Taming.Ability.Locked.2={0}\uB808\uBCA8 \uB54C \uC2A4\uD0AC\uD574\uC81C (\uCDA9\uACA9 \uC99D\uBA85) -Taming.Ability.Locked.3={0}\uB808\uBCA8 \uB54C \uC2A4\uD0AC\uD574\uC81C (\uB0A0\uCE74\uB85C\uC6B4 \uBC1C\uD1B1) -Taming.Ability.Locked.4={0}\uB808\uBCA8 \uB54C \uC2A4\uD0AC\uD574\uC81C (\uBE60\uB978 \uC74C\uC2DD \uC81C\uACF5) -Taming.Ability.Locked.5={0}\uB808\uBCA8 \uB54C \uC2A4\uD0AC\uD574\uC81C (\uC2E0\uC131\uD55C \uC0AC\uB0E5\uAC1C) -Taming.Combat.Chance.Gore=\uB3CC\uC9C4 \uD655\uB960: [[YELLOW]]{0} -Taming.SubSkill.BeastLore.Name=\uC9D0\uC2B9\uC758 \uD3EC\uD6A8 -Taming.SubSkill.BeastLore.Description=\uBF08\uB85C \uB291\uB300/\uC624\uC140\uB86F \uAC80\uC0AC -Taming.SubSkill.ShockProof.Name=\uCDA9\uACA9 \uC99D\uBA85 -Taming.SubSkill.ShockProof.Description=\uD3ED\uBC1C \uD53C\uD574 \uC808\uAC10 -Taming.SubSkill.CallOfTheWild.Name=\uC9D0\uC2B9\uC758 \uD3EC\uD6A8 -Taming.SubSkill.CallOfTheWild.Description=\uC606\uC5D0 \uB3D9\uBB3C \uC18C\uD658 -Taming.SubSkill.CallOfTheWild.Description.2=[[GRAY]]COTW (\uC624\uC140\uB86F): \uCB48\uADF8\uB9AC\uBA74\uC11C \uBB3C\uACE0\uAE30\uB97C \uB4E4\uACE0 {0}\uBC88 \uC88C \uD074\uB9AD -Taming.Effect.15=[[GRAY]]COTW (\uB291\uB300): \uCB48\uADF8\uB9AC\uBA74\uC11C \uBF08\uB97C \uB4E4\uACE0 {0}\uBC88 \uC88C \uD074\uB9AD -Taming.SubSkill.Gore.Name0=[[GRAY]]COTW (\uB9D0): \uCB48\uADF8\uB9AC\uBA74\uC11C \uC0AC\uACFC\uB97C \uB4E4\uACE0 {0}\uBC88 \uC88C \uD074\uB9AD -Taming.SubSkill.FastFoodService.Name=\uBE60\uB978 \uC74C\uC2DD \uC81C\uACF5 -Taming.SubSkill.FastFoodService.Description=\uACF5\uACA9\uC2DC \uCE58\uB8CC \uAE30\uD68C -Taming.SubSkill.HolyHound.Name=\uC2E0\uC131\uD55C \uC0AC\uB0E5\uAC1C -Taming.SubSkill.HolyHound.Description=\uB9C8\uBC95 & \uB3C5 \uD53C\uD574 \uCE58\uB8CC -Taming.SubSkill.Gore.Name=\uB3CC\uC9C4 -Taming.SubSkill.Gore.Description=\uD06C\uB9AC\uD2F0\uCEEC \uC2A4\uD06C\uB77C\uC774\uD06C \uCD9C\uD608 \uC801\uC6A9 -Taming.SubSkill.SharpenedClaws.Name=\uB0A0\uCE74\uB85C\uC6B4 \uBC1C\uD1B1 -Taming.SubSkill.SharpenedClaws.Description=\uCD94\uAC00 \uD53C\uD574 -Taming.SubSkill.EnvironmentallyAware.Name=\uD658\uACBD \uC778\uC2DD -Taming.SubSkill.EnvironmentallyAware.Description=\uC120\uC778\uC7A5/\uC6A9\uC554 \uACF5\uD3EC\uC99D, \uB099\uC0AC \uD53C\uD574 \uAC10\uC18C -Taming.SubSkill.ThickFur.Name=\uB450\uAEBC\uC6B4 \uD138 -Taming.SubSkill.ThickFur.Description=\uD53C\uD574 \uAC10\uC18C, \uB0B4\uD654\uC131(\uBD88\uC800\uD56D\uB825) -Taming.Listener.Wolf=[[DARK_GRAY]]\uB291\uB300\uAC00 \uB2F9\uC2E0\uC5D0\uAC8C \uB418\uB3CC\uC544\uAC10... -Taming.Listener=\uC870\uB828(TAMING): -Taming.SkillName=\uC870\uB828 -Taming.Skillup=\uC870\uB828 \uC2A4\uD0AC\uC774 {0} \uC62C\uB77C \uCD1D {1} \uB808\uBCA8\uC774 \uB418\uC5C8\uC2B5\uB2C8\uB2E4 -Taming.Summon.Complete=[[GREEN]]\uC18C\uD658 \uC644\uB8CC -Taming.Summon.Fail.Ocelot=\uB2F9\uC2E0 \uADFC\uCC98\uC5D0 \uC774\uBBF8 \uB9CE\uC740 \uC624\uC140\uB86F\uC774 \uC788\uC5B4 \uB354\uB294 \uC18C\uD658\uC2DC\uD0AC \uC218 \uC5C6\uC2B5\uB2C8\uB2E4. -Taming.Summon.Fail.Wolf=\uB2F9\uC2E0 \uADFC\uCC98\uC5D0 \uC774\uBBF8 \uB9CE\uC740 \uB291\uB300\uAC00 \uC788\uC5B4 \uB354\uB294 \uC18C\uD658\uC2DC\uD0AC \uC218 \uC5C6\uC2B5\uB2C8\uB2E4. -Taming.Summon.Fail.Horse=\uB2F9\uC2E0 \uADFC\uCC98\uC5D0 \uC774\uBBF8 \uB9CE\uC740 \uB9D0\uC774 \uC788\uC5B4 \uB354\uB294 \uC18C\uD658\uC2DC\uD0AC \uC218 \uC5C6\uC2B5\uB2C8\uB2E4. -Taming.Summon.Name.Format={0}\uC758 {1} +Taming.Ability.Bonus.0=환경 인식 +Taming.Ability.Bonus.1=늑대 위험 회피 +Taming.Ability.Bonus.2=두꺼운 털 +Taming.Ability.Bonus.3=1/{0} 피해, 내화성(불저항력) +Taming.Ability.Bonus.4=충격 증명 +Taming.Ability.Bonus.5=항상 1/{0} 폭발 피해 +Taming.Ability.Bonus.6=날카로운 발톱 +Taming.Ability.Bonus.7=+{0} 피해 +Taming.Ability.Bonus.8=빠른 음식 제공 +Taming.Ability.Bonus.9={0} 확률로 공격시 회복 +Taming.Ability.Bonus.10=신성한 사냥개 +Taming.Ability.Bonus.11=마법이나 독으로 인한 손상 회복 +Taming.Ability.Locked.0={0}레벨 때 스킬해제 (환경 인식) +Taming.Ability.Locked.1={0}레벨 때 스킬해제 (두꺼운 털) +Taming.Ability.Locked.2={0}레벨 때 스킬해제 (충격 증명) +Taming.Ability.Locked.3={0}레벨 때 스킬해제 (날카로운 발톱) +Taming.Ability.Locked.4={0}레벨 때 스킬해제 (빠른 음식 제공) +Taming.Ability.Locked.5={0}레벨 때 스킬해제 (신성한 사냥개) +Taming.Combat.Chance.Gore=돌진 확률: &e{0} +Taming.SubSkill.BeastLore.Name=짐승의 포효 +Taming.SubSkill.BeastLore.Description=뼈로 늑대/오셀롯 검사 +Taming.SubSkill.ShockProof.Name=충격 증명 +Taming.SubSkill.ShockProof.Description=폭발 피해 절감 +Taming.SubSkill.CallOfTheWild.Name=짐승의 포효 +Taming.SubSkill.CallOfTheWild.Description=옆에 동물 소환 +Taming.SubSkill.CallOfTheWild.Description.2=&7COTW (오셀롯): 쭈그리면서 물고기를 들고 {0}번 좌 클릭 +Taming.Effect.15=&7COTW (늑대): 쭈그리면서 뼈를 들고 {0}번 좌 클릭 +Taming.SubSkill.Gore.Name0=&7COTW (말): 쭈그리면서 사과를 들고 {0}번 좌 클릭 +Taming.SubSkill.FastFoodService.Name=빠른 음식 제공 +Taming.SubSkill.FastFoodService.Description=공격시 치료 기회 +Taming.SubSkill.HolyHound.Name=신성한 사냥개 +Taming.SubSkill.HolyHound.Description=마법 & 독 피해 치료 +Taming.SubSkill.Gore.Name=돌진 +Taming.SubSkill.Gore.Description=크리티컬 스크라이크 출혈 적용 +Taming.SubSkill.SharpenedClaws.Name=날카로운 발톱 +Taming.SubSkill.SharpenedClaws.Description=추가 피해 +Taming.SubSkill.EnvironmentallyAware.Name=환경 인식 +Taming.SubSkill.EnvironmentallyAware.Description=선인장/용암 공포증, 낙사 피해 감소 +Taming.SubSkill.ThickFur.Name=두꺼운 털 +Taming.SubSkill.ThickFur.Description=피해 감소, 내화성(불저항력) +Taming.Listener.Wolf=&8늑대가 당신에게 되돌아감... +Taming.Listener=조련(TAMING): +Taming.SkillName=조련 +Taming.Skillup=조련 스킬이 {0} 올라 총 {1} 레벨이 되었습니다 +Taming.Summon.Complete=&a소환 완료 +Taming.Summon.Fail.Ocelot=당신 근처에 이미 많은 오셀롯이 있어 더는 소환시킬 수 없습니다. +Taming.Summon.Fail.Wolf=당신 근처에 이미 많은 늑대가 있어 더는 소환시킬 수 없습니다. +Taming.Summon.Fail.Horse=당신 근처에 이미 많은 말이 있어 더는 소환시킬 수 없습니다. +Taming.Summon.Name.Format={0}의 {1} #UNARMED -Unarmed.Ability.Berserk.Length=\uBC84\uC11C\uCEE4 \uC9C0\uC18D\uC2DC\uAC04: [[YELLOW]]{0}\uCD08 -Unarmed.Ability.Bonus.0=\uC544\uC774\uC5B8 \uC554 \uC2A4\uD0C0\uC77C -Unarmed.Ability.Bonus.1=+{0} \uD53C\uD574 \uC5C5\uADF8\uB808\uC774\uB4DC -Unarmed.Ability.Chance.ArrowDeflect=\uD654\uC0B4 \uD68C\uD53C \uD655\uB960: [[YELLOW]]{0} -Unarmed.Ability.Chance.Disarm=\uBE44\uBB34\uC7A5 \uD655\uB960: [[YELLOW]]{0} -Unarmed.Ability.Chance.IronGrip=\uAC15\uCCA0 \uC8FC\uBA39 \uD655\uB960: [[YELLOW]]{0} -Unarmed.Ability.IronGrip.Attacker=\uC0C1\uB300\uB294 \uAC15\uCCA0 \uC8FC\uBA39\uC744 \uAC00\uC9C0\uACE0 \uC788\uC2B5\uB2C8\uB2E4! -Unarmed.Ability.IronGrip.Defender=[[GREEN]]\uAC15\uCCA0 \uC8FC\uBA39\uC758 \uBE44\uBB34\uC7A5\uC744 \uC77C\uC2DC\uC801\uC73C\uB85C \uBC29\uC5B4\uD588\uC2B5\uB2C8\uB2E4! -Unarmed.Ability.Lower=[[GRAY]]**\uC190 \uC900\uBE44 \uD574\uC81C** -Unarmed.Ability.Ready=[[GREEN]]**\uC190 \uC900\uBE44 \uC644\uB8CC** -Unarmed.SubSkill.Berserk.Name=\uBC84\uC11C\uCEE4 (\uB2A5\uB825) -Unarmed.SubSkill.Berserk.Description=+50% \uD53C\uD574, \uC57D\uD55C \uAD11\uBB3C\uB4E4\uC744 \uBD80\uC228 -Unarmed.SubSkill.Disarm.Name=\uBE44\uBB34\uC7A5 (\uD50C\uB808\uC774\uC5B4) -Unarmed.SubSkill.Disarm.Description=\uC801\uC774 \uB4E4\uACE0\uC788\uB294 \uC544\uC774\uD15C \uB4DC\uB86D -Unarmed.SubSkill.IronArmStyle.Name=\uAC15\uCCA0 \uD314 \uD615\uD0DC -Unarmed.SubSkill.IronArmStyle.Description=\uACAC\uACE0\uD574\uC9C0\uB294 \uD314 -Unarmed.SubSkill.ArrowDeflect.Name=\uD654\uC0B4 \uD68C\uD53C -Unarmed.SubSkill.ArrowDeflect.Description=\uD68C\uD53C \uD654\uC0B4 -Unarmed.SubSkill.IronGrip.Name=\uC544\uC774\uC5B8 \uADF8\uB9BD -Unarmed.SubSkill.IronGrip.Description=\uBE44\uBB34\uC7A5 \uC0C1\uD0DC \uBC29\uC9C0 -Unarmed.Listener=\uBE44\uBB34\uC7A5(UNARMED): -Unarmed.SkillName=\uBE44\uBB34\uC7A5 -Unarmed.Skills.Berserk.Off=**\uBC84\uC11C\uCEE4 \uBC1C\uB3D9 \uD574\uC81C** -Unarmed.Skills.Berserk.On=[[GREEN]]**\uBC84\uC11C\uCEE4 \uBC1C\uB3D9** -Unarmed.Skills.Berserk.Other.Off={0}[[DARK_GREEN]]\uB2D8\uC740 [[RED]]\uBC84\uC11C\uCEE4\uB97C \uC0AC\uC6A9\uD588\uC2B5\uB2C8\uB2E4! -Unarmed.Skills.Berserk.Other.On=[[GREEN]]{0}[[DARK_GREEN]]\uB2D8\uC740 [[RED]]\uBC84\uC11C\uCEE4\uB97C \uC0AC\uC6A9\uD569\uB2C8\uB2E4! -Unarmed.Skills.Berserk.Refresh=[[GREEN]]\uB2F9\uC2E0\uC758 [[YELLOW]]\uBC84\uC11C\uCEE4 [[GREEN]]\uC2A4\uD0AC\uC740 \uC774\uC81C \uC0AC\uC6A9 \uAC00\uB2A5\uD569\uB2C8\uB2E4! -Unarmed.Skillup=\uBE44\uBB34\uC7A5 \uC2A4\uD0AC\uC774 {0} \uC62C\uB77C \uCD1D {1} \uB808\uBCA8\uC774 \uB418\uC5C8\uC2B5\uB2C8\uB2E4 +Unarmed.Ability.Berserk.Length=버서커 지속시간: &e{0}초 +Unarmed.Ability.Bonus.0=아이언 암 스타일 +Unarmed.Ability.Bonus.1=+{0} 피해 업그레이드 +Unarmed.Ability.Chance.ArrowDeflect=화살 회피 확률: &e{0} +Unarmed.Ability.Chance.Disarm=비무장 확률: &e{0} +Unarmed.Ability.Chance.IronGrip=강철 주먹 확률: &e{0} +Unarmed.Ability.IronGrip.Attacker=상대는 강철 주먹을 가지고 있습니다! +Unarmed.Ability.IronGrip.Defender=&a강철 주먹의 비무장을 일시적으로 방어했습니다! +Unarmed.Ability.Lower=&7**손 준비 해제** +Unarmed.Ability.Ready=&a**손 준비 완료** +Unarmed.SubSkill.Berserk.Name=버서커 (능력) +Unarmed.SubSkill.Berserk.Description=+50% 피해, 약한 광물들을 부숨 +Unarmed.SubSkill.Disarm.Name=비무장 (플레이어) +Unarmed.SubSkill.Disarm.Description=적이 들고있는 아이템 드롭 +Unarmed.SubSkill.IronArmStyle.Name=강철 팔 형태 +Unarmed.SubSkill.IronArmStyle.Description=견고해지는 팔 +Unarmed.SubSkill.ArrowDeflect.Name=화살 회피 +Unarmed.SubSkill.ArrowDeflect.Description=회피 화살 +Unarmed.SubSkill.IronGrip.Name=아이언 그립 +Unarmed.SubSkill.IronGrip.Description=비무장 상태 방지 +Unarmed.Listener=비무장(UNARMED): +Unarmed.SkillName=비무장 +Unarmed.Skills.Berserk.Off=**버서커 발동 해제** +Unarmed.Skills.Berserk.On=&a**버서커 발동** +Unarmed.Skills.Berserk.Other.Off={0}&2님은 &c버서커를 사용했습니다! +Unarmed.Skills.Berserk.Other.On=&a{0}&2님은 &c버서커를 사용합니다! +Unarmed.Skills.Berserk.Refresh=&a당신의 &e버서커 &a스킬은 이제 사용 가능합니다! +Unarmed.Skillup=비무장 스킬이 {0} 올라 총 {1} 레벨이 되었습니다 #WOODCUTTING -Woodcutting.Ability.0=\uB098\uBB47\uC78E \uB5A8\uC5B4\uD2B8\uB9AC\uAE30 -Woodcutting.Ability.1=\uB098\uBB47\uC78E \uCCAD\uC18C -Woodcutting.Ability.Chance.DDrop=\uB4DC\uB86D 2\uBC30 \uD655\uB960: [[YELLOW]]{0} -Woodcutting.Ability.Length=\uB098\uBB34\uAFBC \uC9C0\uC18D\uC2DC\uAC04: [[YELLOW]]{0}\uCD08 -Woodcutting.Ability.Locked.0={0}\uB808\uBCA8 \uB54C \uC2A4\uD0AC\uC774 \uD574\uC81C\uB429\uB2C8\uB2E4 (\uB098\uBB47\uC78E \uBC14\uB78C) -Woodcutting.SubSkill.TreeFeller.Name=\uB098\uBB34\uAFBC (\uB2A5\uB825) -Woodcutting.SubSkill.TreeFeller.Description=\uB098\uBB34 \uD3ED\uBC1C\uC2DC\uD0A4\uAE30 -Woodcutting.SubSkill.LeafBlower.Name=\uB098\uBB47\uC78E \uB5A8\uC5B4\uD2B8\uB9AC\uAE30 -Woodcutting.SubSkill.LeafBlower.Description=\uB098\uBB47\uC78E \uCCAD\uC18C -Woodcutting.SubSkill.HarvestLumber.Name=\uB4DC\uB86D 2\uBC30 -Woodcutting.SubSkill.HarvestLumber.Description=\uD56D\uC0C1 \uB4DC\uB86D 2\uBC30 -Woodcutting.Listener=\uBC8C\uBAA9(WOODCUTTING): -Woodcutting.SkillName=\uBC8C\uBAA9 -Woodcutting.Skills.TreeFeller.Off=**\uB098\uBB34\uAFBC \uBC1C\uB3D9 \uD574\uC81C** -Woodcutting.Skills.TreeFeller.On=[[GREEN]]**\uB098\uBB34\uAFBC \uBC1C\uB3D9** -Woodcutting.Skills.TreeFeller.Refresh=[[GREEN]]\uB2F9\uC2E0\uC758 [[YELLOW]]\uB098\uBB34\uAFBC [[GREEN]]\uC2A4\uD0AC\uC740 \uC774\uC81C \uC0AC\uC6A9 \uAC00\uB2A5\uD569\uB2C8\uB2E4! -Woodcutting.Skills.TreeFeller.Other.Off={0}[[DARK_GREEN]]\uB2D8\uC740 [[RED]]\uB098\uBB34\uAFBC \uC2A4\uD0AC\uC744 \uC0AC\uC6A9 \uD574\uC81C\uD588\uC2B5\uB2C8\uB2E4! -Woodcutting.Skills.TreeFeller.Other.On=[[GREEN]]{0}[[DARK_GREEN]]\uB2D8\uC740 [[RED]]\uB098\uBB34\uAFBC \uC2A4\uD0AC\uC744 \uC0AC\uC6A9\uD588\uC2B5\uB2C8\uB2E4! -Woodcutting.Skills.TreeFeller.Splinter=\uB3C4\uB07C \uD30C\uD3B8 \uC870\uAC01 \uC218\uC9D1! -Woodcutting.Skills.TreeFeller.Threshold=\uADF8 \uB098\uBB34\uB294 \uB108\uBB34 \uD07D\uB2C8\uB2E4! -Woodcutting.Skillup=\uBC8C\uBAA9 \uC2A4\uD0AC\uC774 {0} \uC62C\uB77C \uCD1D {1} \uB808\uBCA8\uC774 \uB418\uC5C8\uC2B5\uB2C8\uB2E4 +Woodcutting.Ability.0=나뭇잎 떨어트리기 +Woodcutting.Ability.1=나뭇잎 청소 +Woodcutting.Ability.Chance.DDrop=드롭 2배 확률: &e{0} +Woodcutting.Ability.Length=나무꾼 지속시간: &e{0}초 +Woodcutting.Ability.Locked.0={0}레벨 때 스킬이 해제됩니다 (나뭇잎 바람) +Woodcutting.SubSkill.TreeFeller.Name=나무꾼 (능력) +Woodcutting.SubSkill.TreeFeller.Description=나무 폭발시키기 +Woodcutting.SubSkill.LeafBlower.Name=나뭇잎 떨어트리기 +Woodcutting.SubSkill.LeafBlower.Description=나뭇잎 청소 +Woodcutting.SubSkill.HarvestLumber.Name=드롭 2배 +Woodcutting.SubSkill.HarvestLumber.Description=항상 드롭 2배 +Woodcutting.Listener=벌목(WOODCUTTING): +Woodcutting.SkillName=벌목 +Woodcutting.Skills.TreeFeller.Off=**나무꾼 발동 해제** +Woodcutting.Skills.TreeFeller.On=&a**나무꾼 발동** +Woodcutting.Skills.TreeFeller.Refresh=&a당신의 &e나무꾼 &a스킬은 이제 사용 가능합니다! +Woodcutting.Skills.TreeFeller.Other.Off={0}&2님은 &c나무꾼 스킬을 사용 해제했습니다! +Woodcutting.Skills.TreeFeller.Other.On=&a{0}&2님은 &c나무꾼 스킬을 사용했습니다! +Woodcutting.Skills.TreeFeller.Splinter=도끼 파편 조각 수집! +Woodcutting.Skills.TreeFeller.Threshold=그 나무는 너무 큽니다! +Woodcutting.Skillup=벌목 스킬이 {0} 올라 총 {1} 레벨이 되었습니다 #ABILITIY ##generic -Ability.Generic.Refresh=[[GREEN]]**\uB2A5\uB825\uC774 \uC7AC \uACF5\uAE09 \uB418\uC5C8\uC2B5\uB2C8\uB2E4!** -Ability.Generic.Template.Lock=[[GRAY]]{0} -Ability.Generic.Template=[[GOLD]]{0}: [[DARK_AQUA]]{1} +Ability.Generic.Refresh=&a**능력이 재 공급 되었습니다!** +Ability.Generic.Template.Lock=&7{0} +Ability.Generic.Template=&6{0}: &3{1} #COMBAT -Combat.ArrowDeflect=[[WHITE]]**\uD654\uC0B4 \uD68C\uD53C** -Combat.BeastLore=[[GREEN]]**\uC9D0\uC2B9\uC758 \uD3EC\uD6A8** -Combat.BeastLoreHealth=[[DARK_AQUA]]\uCCB4\uB825: ([[GREEN]]{0}[[DARK_AQUA]]/{1}) -Combat.BeastLoreOwner=[[DARK_AQUA]]\uC8FC\uC778: ([[RED]]{0}[[DARK_AQUA]]) -Combat.Gore=[[GREEN]]**\uB3CC\uC9C4** -Combat.StruckByGore=**\uB3CC\uC9C4\uC5D0 \uB9DE\uC558\uC2B5\uB2C8\uB2E4** -Combat.TargetDazed=\uBAA9\uD45C\uAC00 [[DARK_RED]]\uD63C\uB780\uC2A4\uB7EC\uC6CC\uD569\uB2C8\uB2E4 -Combat.TouchedFuzzy=[[DARK_RED]]\uD63C\uB780\uC774 \uC77C\uC5B4\uB0AC\uC2B5\uB2C8\uB2E4. \uC544~ \uC5B4\uC9C0\uB7EC\uC6CC. +Combat.ArrowDeflect=&f**화살 회피** +Combat.BeastLore=&a**짐승의 포효** +Combat.BeastLoreHealth=&3체력: (&a{0}&3/{1}) +Combat.BeastLoreOwner=&3주인: (&c{0}&3) +Combat.Gore=&a**돌진** +Combat.StruckByGore=**돌진에 맞았습니다** +Combat.TargetDazed=목표가 &4혼란스러워합니다 +Combat.TouchedFuzzy=&4혼란이 일어났습니다. 아~ 어지러워. #COMMANDS ##generic -mcMMO.Description=mcMMO[[DARK_AQUA]] \uD504\uB85C\uC81D\uD2B8\uC5D0 \uB300\uD574\uC11C:,[[GOLD]]mcMMO\uB294 \uD55C [[RED]]\uC624\uD508 \uC18C\uC2A4[[GOLD]] RPG \uBAA8\uB4DC\uB85C 2011\uB144 2\uC6D4\uC5D0 [[BLUE]]nossr50[[GOLD]]\uB2D8\uC774 \uB9CC\uB4E4\uC5C8\uC2B5\uB2C8\uB2E4. \uBAA9\uD45C\uB294 \uC9C8\uC88B\uC740 RPG \uACBD\uD5D8\uC744 \uC81C\uACF5\uD558\uB294 \uAC83 \uC785\uB2C8\uB2E4.,[[DARK_AQUA]]\uD301:,[[GOLD]] - [[RED]]/mcmmo help[[GREEN]] \uBA85\uB839\uC5B4\uB4E4\uC744 \uBD05\uB2C8\uB2E4,[[GOLD]] - [[GREEN]]\uD0C0\uC785 [[RED]]/\uC2A4\uD0AC\uC774\uB984[[GREEN]] \uC790\uC138\uD55C \uC2A4\uD0AC \uC815\uBCF4\uB97C \uBD05\uB2C8\uB2E4,[[DARK_AQUA]]\uAC1C\uBC1C\uC790\uB4E4:,[[GOLD]] - [[GREEN]]nossr50 [[BLUE]](\uC81C\uC791\uC790),[[GOLD]] - [[GREEN]]GJ [[BLUE]](\uD504\uB85C\uC81D\uD2B8 \uC8FC\uC7A5),[[GOLD]] - [[GREEN]]NuclearW [[BLUE]](\uAC1C\uBC1C\uC790),[[GOLD]] - [[GREEN]]bm01 [[BLUE]](\uAC1C\uBC1C\uC790),[[GOLD]] - [[GREEN]]TfT_02 [[BLUE]](\uAC1C\uBC1C\uC790),[[GOLD]] - [[GREEN]]Glitchfinder [[BLUE]](\uAC1C\uBC1C\uC790),[[GOLD]] - [[GREEN]]t00thpick1 [[BLUE]](\uAC1C\uBC1C\uC790),[[DARK_AQUA]]\uC720\uC6A9\uD55C \uB9C1\uD06C:,[[GOLD]] - [[GREEN]]https://github.com/mcMMO-Dev/mcMMO/issues[[GOLD]] \uBC84\uADF8 \uBCF4\uACE0,[[GOLD]] - [[GREEN]]#mcmmo @ irc.esper.net[[GOLD]] IRC \uCC44\uD305, -Commands.addlevels.AwardAll.1=[[GREEN]]\uB2F9\uC2E0\uC740 \uBAA8\uB4E0 \uC2A4\uD0AC\uC5D0 {0} \uB808\uBCA8\uC744 \uC9C0\uAE09\uD588\uC2B5\uB2C8\uB2E4! -Commands.addlevels.AwardAll.2=\uBAA8\uB4E0 \uC2A4\uD0AC\uC774 {0}\uB85C \uBCC0\uACBD\uB418\uC5C8\uC2B5\uB2C8\uB2E4 -Commands.addlevels.AwardSkill.1=[[GREEN]]\uB2F9\uC2E0\uC740 {0} \uB808\uBCA8\uC744 {1}\uC5D0 \uC9C0\uAE09\uD558\uC600\uC2B5\uB2C8\uB2E4! -Commands.addlevels.AwardSkill.2={1} \uB2D8\uC740 {0}\uC744/\uB97C \uC218\uC815\uD558\uC600\uC2B5\uB2C8\uB2E4 -Commands.addxp.AwardAll=[[GREEN]]\uB2F9\uC2E0\uC740 \uBAA8\uB4E0 \uC2A4\uD0AC\uC5D0 {0} \uACBD\uD5D8\uCE58\uB97C \uC9C0\uAE09\uD588\uC2B5\uB2C8\uB2E4! -Commands.addxp.AwardSkill=[[GREEN]]\uB2F9\uC2E0\uC740 {0} \uACBD\uD5D8\uCE58\uB97C {1}\uC5D0 \uC9C0\uAE09\uD558\uC600\uC2B5\uB2C8\uB2E4! -Commands.Ability.Off=\uB2A5\uB825 \uC0AC\uC6A9\uC774 [[RED]]\uAEBC\uC84C\uC2B5\uB2C8\uB2E4 -Commands.Ability.On=\uB2A5\uB825 \uC0AC\uC6A9\uC774 [[GREEN]]\uCF1C\uC84C\uC2B5\uB2C8\uB2E4 -Commands.Ability.Toggle=\uB2A5\uB825 \uC0AC\uC6A9\uC740 [[YELLOW]]{0}(\uC73C)\uB85C \uC804\uD658\uB418\uC5C8\uC2B5\uB2C8\uB2E4 -Commands.AdminChat.Off=\uAD00\uB9AC\uC790 \uCC44\uD305\uC774 [[RED]]\uAEBC\uC84C\uC2B5\uB2C8\uB2E4 -Commands.AdminChat.On=\uAD00\uB9AC\uC790 \uCC44\uD305\uC774 [[GREEN]]\uCF1C\uC84C\uC2B5\uB2C8\uB2E4 -Commands.AdminToggle=[[GREEN]]- \uAD00\uB9AC\uC790 \uCC44\uD305\uC744 \uCF1C\uAE30/\uB044\uAE30\uD569\uB2C8\uB2E4 -Commands.Chat.Console=*\uC2DC\uC2A4\uD15C* -Commands.Cooldowns.Header=[[GOLD]]--= [[GREEN]]mcMMO \uB2A5\uB825 \uC7AC \uC0AC\uC6A9 \uB300\uAE30\uC2DC\uAC04[[GOLD]] =-- -Commands.Cooldowns.Row.N=\ [[RED]]{0}[[WHITE]] - [[GOLD]]{1}\uCD08 \uB0A8\uC74C -Commands.Cooldowns.Row.Y=\ [[AQUA]]{0}[[WHITE]] - [[DARK_GREEN]]\uC900\uBE44! -Commands.Database.Cooldown=\uC774 \uBA85\uB839\uC5B4\uB97C \uB2E4\uC2DC \uCE58\uAE30\uC804\uC5D0 1\uCD08\uB97C \uAE30\uB2EC\uB824\uC57C\uB9CC \uD569\uB2C8\uB2E4. -Commands.Database.Processing=\uB2F9\uC2E0\uC758 \uC774\uC804 \uBA85\uB839\uC5B4\uB294 \uC5EC\uC804\uD788 \uC791\uC5C5\uC911\uC785\uB2C8\uB2E4. \uAE30\uB2E4\uB824\uC8FC\uC138\uC694. -Commands.Disabled=\uC774 \uBA85\uB839\uC5B4\uB294 \uBE44\uD65C\uC131\uD654 \uB418\uC788\uC2B5\uB2C8\uB2E4. -Commands.DoesNotExist= [[RED]]\uD50C\uB808\uC774\uC5B4\uB294 \uB370\uC774\uD130\uBCA0\uC774\uC2A4\uC5D0 \uC874\uC7AC\uD558\uC9C0 \uC54A\uC2B5\uB2C8\uB2E4! -Commands.GodMode.Disabled=mcMMO \uBD88\uC0AC\uC2E0 \uBAA8\uB4DC \uBE44\uD65C\uC131\uD654 -Commands.GodMode.Enabled=mcMMO \uBD88\uC0AC\uC2E0 \uBAA8\uB4DC \uD65C\uC131\uD654 -Commands.GodMode.Forbidden=[mcMMO] \uC774 \uC6D4\uB4DC\uC5D0\uC11C \uBD88\uC0AC\uC2E0 \uBAA8\uB4DC\uB294 \uD5C8\uC6A9 \uAE08\uC9C0\uC785\uB2C8\uB2E4 (\uD384\uBBF8\uC120 \uD655\uC778) -Commands.GodMode.Toggle=\uBD88\uC0AC\uC2E0 \uBAA8\uB4DC\uB294 [[YELLOW]]{0}[[WHITE]](\uC73C)\uB85C \uC804\uD658\uB418\uC5C8\uC2B5\uB2C8\uB2E4 -Commands.Healthbars.Changed.HEARTS=[mcMMO] \uB2F9\uC2E0\uC758 \uCCB4\uB825\uBC14 \uBCF4\uAE30 \uBC29\uC2DD\uC740 [[RED]]\uD558\uD2B8[[WHITE]]\uB85C \uBCC0\uACBD\uB418\uC5C8\uC2B5\uB2C8\uB2E4. -Commands.Healthbars.Changed.BAR=[mcMMO] \uB2F9\uC2E0\uC758 \uCCB4\uB825\uBC14 \uBCF4\uAE30 \uBC29\uC2DD\uC740 [[YELLOW]]\uBC15\uC2A4[[WHITE]]\uB85C \uBCC0\uACBD\uB418\uC5C8\uC2B5\uB2C8\uB2E4. -Commands.Healthbars.Changed.DISABLED=[mcMMO] \uB2F9\uC2E0\uC758 \uBAB9 \uCCB4\uB825\uBC14\uB294 [[GRAY]]\uBE44\uD65C\uC131\uD654[[WHITE]] \uB418\uC5C8\uC2B5\uB2C8\uB2E4. -Commands.Healthbars.Invalid=\uC798\uBABB\uB41C \uCCB4\uB825\uBC14 \uD0C0\uC785! -Commands.Inspect=<\uD50C\uB808\uC774\uC5B4> [[GREEN]]- \uC0C1\uC138\uD55C \uD50C\uB808\uC774\uC5B4 \uC815\uBCF4\uB97C \uBD05\uB2C8\uB2E4 -Commands.Invite.Success=[[GREEN]]\uCD08\uB300\uB97C \uC131\uACF5\uC801\uC73C\uB85C \uBCF4\uB0C8\uC2B5\uB2C8\uB2E4. -Commands.Leaderboards=<\uC2A4\uD0AC> <\uD398\uC774\uC9C0> [[GREEN]]- mcMMO \uC2A4\uD0AC \uC815\uBCF4 -Commands.mcc.Header=---[][[GREEN]]mcMMO \uBA85\uB839\uC5B4[[RED]][]--- -Commands.mcgod=[[GREEN]]- \uBD88\uC0AC\uC2E0 \uBAA8\uB4DC \uCF1C\uAE30/\uB044\uAE30 -Commands.mchud.Invalid=HUD \uD0C0\uC785\uC774 \uC62C\uBC14\uB974\uC9C0 \uC54A\uC2B5\uB2C8\uB2E4. -Commands.mcpurge.Success=[[GREEN]]\uB370\uC774\uD130\uBCA0\uC774\uC2A4\uAC00 \uC131\uACF5\uC801\uC73C\uB85C \uCD08\uAE30\uD654\uB42C\uC2B5\uB2C8\uB2E4! -Commands.mcrank.Heading=[[GOLD]]-=\uAC1C\uC778 \uC21C\uC704=- -Commands.mcrank.Overall=\uC885\uD569[[GREEN]] - [[GOLD]]\uB7AD\uD06C [[WHITE]]#[[GREEN]]{0} -Commands.mcrank.Player=\uD0C0\uAC9F: [[WHITE]]{0} -Commands.mcrank.Skill={0}[[GREEN]] - [[GOLD]]\uB7AD\uD06C [[WHITE]]#[[GREEN]]{1} -Commands.mcrank.Unranked=[[WHITE]]\uB7AD\uD06C\uC5C6\uC74C -Commands.mcrefresh.Success={0}\uC758 \uCFE8\uB2E4\uC6B4\uC774 \uCD08\uAE30\uD654\uB418\uC5C8\uC2B5\uB2C8\uB2E4. -Commands.mcremove.Success=[[GREEN]]{0}\uB2D8\uC758 \uB370\uC774\uD130\uBCA0\uC774\uC2A4\uAC00 \uC131\uACF5\uC801\uC73C\uB85C \uC0AD\uC81C\uB418\uC5C8\uC2B5\uB2C8\uB2E4! -Commands.mctop.Tip=[[GOLD]]\uD301: [[RED]]/mcrank[[GOLD]] \uBA85\uB839\uC5B4\uB97C \uC0AC\uC6A9\uD558\uBA74 \uBAA8\uB4E0 \uAC1C\uC778 \uC21C\uC704\uB97C \uBCFC\uC218 \uC788\uC2B5\uB2C8\uB2E4! -Commands.mmoedit=[\uD50C\uB808\uC774\uC5B4] <\uC2A4\uD0AC> <\uC0C8\uAC12> [[GREEN]] - \uB300\uC0C1\uC744 \uC218\uC815\uD569\uB2C8\uB2E4 -Commands.mmoedit.AllSkills.1=[[GREEN]]\uB2F9\uC2E0\uC758 \uBAA8\uB4E0 \uC2A4\uD0AC \uB808\uBCA8\uC774 {0}\uB85C \uC124\uC815\uB418\uC5C8\uC2B5\uB2C8\uB2E4! -Commands.mmoedit.Modified.1=[[GREEN]]\uB2F9\uC2E0\uC758 {0} \uB808\uBCA8\uC774 {1}\uB85C \uC124\uC815\uB418\uC5C8\uC2B5\uB2C8\uB2E4! -Commands.mmoedit.Modified.2={0}\uB2D8\uC740 {1}\uB97C \uC218\uC815\uD588\uC2B5\uB2C8\uB2E4. -Commands.mcconvert.Database.Same=\uB2F9\uC2E0\uC740 \uC774\uBBF8 {0} \uB370\uC774\uD130\uBCA0\uC774\uC2A4\uB97C \uC0AC\uC6A9\uC911\uC785\uB2C8\uB2E4! -Commands.mcconvert.Database.InvalidType={0} \uC740/\uB294 \uC798\uBABB\uB41C \uB370\uC774\uD130\uBCA0\uC774\uC2A4 \uD0C0\uC785\uC785\uB2C8\uB2E4. -Commands.mcconvert.Database.Start=[[GRAY]]{0}\uC5D0\uC11C {1}(\uC73C)\uB85C \uC804\uD658 \uC2DC\uC791\uC911... -Commands.mcconvert.Database.Finish=[[GRAY]]\uB370\uC774\uD130\uBCA0\uC774\uC2A4 \uC774\uB3D9 \uC644\uB8CC; {1} \uB370\uC774\uD130\uBCA0\uC774\uC2A4\uB294 \uC774\uC81C {0} \uB370\uC774\uD130\uBCA0\uC774\uC2A4\uB85C\uBD80\uD130 \uBAA8\uB4E0 \uC790\uB8CC\uB97C \uAC00\uC9D1\uB2C8\uB2E4. -Commands.mmoshowdb=\uD604\uC7AC \uC0AC\uC6A9\uD558\uB294 \uB370\uC774\uD130\uBCA0\uC774\uC2A4: [[GREEN]]{0} -Commands.mcconvert.Experience.Invalid=\uC798\uBABB\uB41C \uACF5\uC2DD \uD0C0\uC785! \uC62C\uBC14\uB978 \uD0C0\uC785: [[GREEN]]LINEAR [[RED]]\uADF8\uB9AC\uACE0 [[GREEN]]EXPONENTIAL. -Commands.mcconvert.Experience.Same=\uC774\uBBF8 {0} \uACF5\uC2DD\uC744 \uC0AC\uC6A9\uC911\uC785\uB2C8\uB2E4 -Commands.mcconvert.Experience.Start=[[GRAY]]{0} \uC5D0\uC11C {1} \uACE1\uC120\uC73C\uB85C \uBCC0\uD658 \uC2DC\uC791 -Commands.mcconvert.Experience.Finish=[[GRAY]]\uACF5\uC2DD \uBCC0\uD658 \uC644\uB8CC; \uC774\uC81C {0} XP \uACE1\uC120\uC785\uB2C8\uB2E4. -Commands.ModDescription=[[GREEN]]- \uD50C\uB7EC\uADF8\uC778\uC5D0 \uB300\uD55C \uC815\uBCF4\uB97C \uBD05\uB2C8\uB2E4 -Commands.NoConsole=\uC774 \uBA85\uB839\uC5B4\uB294 \uCF58\uC194\uC5D0\uC11C\uC758 \uC0AC\uC6A9\uC744 \uC9C0\uC6D0\uD558\uC9C0 \uC54A\uC2B5\uB2C8\uB2E4. -Commands.Notifications.Off=\uB2A5\uB825 \uC54C\uB9BC\uC774 [[RED]]\uCF1C\uC84C\uC2B5\uB2C8\uB2E4 -Commands.Notifications.On=\uB2A5\uB825 \uC54C\uB9BC\uC774 [[GREEN]]\uAEBC\uC84C\uC2B5\uB2C8\uB2E4 -Commands.Offline=\uC774 \uBA85\uB839\uC5B4\uB294 \uC624\uD504\uB77C\uC778 \uD50C\uB808\uC774\uC5B4\uC5D0\uAC8C \uB3D9\uC791\uD558\uC9C0 \uC54A\uC2B5\uB2C8\uB2E4. -Commands.NotLoaded=\uD50C\uB808\uC774\uC5B4 \uD504\uB85C\uD30C\uC77C\uC740 \uBD88\uB7EC\uC640\uC9C0\uC9C0 \uC54A\uC558\uC2B5\uB2C8\uB2E4Player profile is not loaded yet. -Commands.Other=---[][[GREEN]]\uAE30\uD0C0 \uBA85\uB839\uC5B4[[RED]][]--- -Commands.Party.Header=-----[][[GREEN]]\uD30C\uD2F0[[RED]][]----- -Commands.Party.Features.Header=-----[][[GREEN]]\uD2B9\uC9D5[[RED]][]----- -Commands.Party.Status=[[DARK_GRAY]]\uC774\uB984: [[WHITE]]{0} {1} [[DARK_GRAY]]\uB808\uBCA8: [[DARK_AQUA]]{2} -Commands.Party.Status.Alliance=[[DARK_GRAY]]\uB3D9\uB9F9: [[WHITE]]{0} -Commands.Party.UnlockedFeatures=[[DARK_GRAY]]\uD574\uC81C\uB41C \uD2B9\uC9D5: [[GRAY]][[ITALIC]]{0} -Commands.Party.ShareMode=[[DARK_GRAY]]\uACF5\uC720 \uBAA8\uB4DC: -Commands.Party.ItemShare=[[GRAY]]\uC544\uC774\uD15C [[DARK_AQUA]]({0}) -Commands.Party.ExpShare=[[GRAY]]EXP [[DARK_AQUA]]({0}) -Commands.Party.ItemShareCategories=[[DARK_GRAY]]\uACF5\uC720\uC911\uC778 \uC544\uC774\uD15C: [[GRAY]][[ITALIC]]{0} -Commands.Party.MembersNear=[[DARK_GRAY]]\uB2F9\uC2E0\uC758 \uADFC\uCC98 [[DARK_AQUA]]{0}[[DARK_GRAY]]/[[DARK_AQUA]]{1} -Commands.Party.Accept=[[GREEN]]- \uD30C\uD2F0 \uCD08\uB300 \uD5C8\uC6A9 -Commands.Party.Chat.Off=\uD30C\uD2F0 \uCC44\uD305\uC744 [[RED]]\uB055\uB2C8\uB2E4 -Commands.Party.Chat.On=\uD30C\uD2F0 \uCC44\uD305\uC744 [[GREEN]]\uCF2D\uB2C8\uB2E4 -Commands.Party.Commands=---[][[GREEN]]\uD30C\uD2F0 \uBA85\uB839\uC5B4[[RED]][]--- -Commands.Party.Invite.0=\uC54C\uB9BC: [[GREEN]]\uB2F9\uC2E0\uC740 {1} \uB2D8\uC73C\uB85C\uBD80\uD130 {0} \uD30C\uD2F0 \uCD08\uB300\uC5D0 \uAD8C\uC720\uBC1B\uC558\uC2B5\uB2C8\uB2E4 -Commands.Party.Invite.1=\uD0C0\uC785 [[GREEN]]/party accept[[YELLOW]] \uBA85\uB839\uC5B4\uB97C \uCE58\uBA74 \uD30C\uD2F0 \uCD08\uB300\uC5D0 \uC2B9\uB099\uB429\uB2C8\uB2E4 -Commands.Party.Invite=<\uD50C\uB808\uC774\uC5B4> [[GREEN]]- \uD30C\uD2F0 \uCD08\uB300\uB97C \uBCF4\uB0C5\uB2C8\uB2E4 -Commands.Party.Invite.Accepted=[[GREEN]]\uCD08\uB300 \uC218\uB77D\uB428. \uB2F9\uC2E0\uC740 {0} \uD30C\uD2F0\uC5D0 \uAC00\uC785\uB418\uC5C8\uC2B5\uB2C8\uB2E4 -Commands.Party.Join=\uCC38\uC5EC\uB41C \uD30C\uD2F0: {0} -Commands.Party.Create=[[GRAY]]\uB9CC\uB4E4\uC5B4\uC9C4 \uD30C\uD2F0: {0} -Commands.Party.Rename=[[GRAY]]\uBCC0\uACBD\uB41C \uD30C\uD2F0 \uC774\uB984: [[WHITE]]{0} -Commands.Party.SetSharing=[[GRAY]]\uD30C\uD2F0 {0} \uACF5\uC720 \uC124\uC815: [[DARK_AQUA]]{1} -Commands.Party.ToggleShareCategory=[[GRAY]]\uD30C\uD2F0 \uC544\uC774\uD15C \uACF5\uC720 [[GOLD]]{0} [[GRAY]]\uAC00 [[DARK_AQUA]]{1}\uB418\uC5C8\uC2B5\uB2C8\uB2E4 -Commands.Party.AlreadyExists=[[DARK_RED]]{0} \uD30C\uD2F0\uC740/\uB294 \uC774\uBBF8 \uC874\uC7AC\uD569\uB2C8\uB2E4! -Commands.Party.Kick=\uB2F9\uC2E0\uC740 {0} \uD30C\uD2F0\uC5D0\uC11C \uCD94\uBC29 \uB2F9\uD558\uC600\uC2B5\uB2C8\uB2E4. -Commands.Party.Leave=\uD30C\uD2F0\uB97C \uB5A0\uB0AC\uC2B5\uB2C8\uB2E4 -Commands.Party.Members.Header=-----[][[GREEN]]\uB9F4\uBC84\uB4E4[[RED]][]----- -Commands.Party.None=\uB2F9\uC2E0\uC740 \uD30C\uD2F0\uC5D0 \uCC38\uC5EC\uB418\uC5B4 \uC788\uC9C0 \uC54A\uC2B5\uB2C8\uB2E4. -Commands.Party.Quit=[[GREEN]]- \uD604\uC7AC \uCC38\uC5EC \uB418\uC5B4\uC788\uB294 \uD30C\uD2F0\uB97C \uB098\uAC11\uB2C8\uB2E4 -Commands.Party.Teleport=[[GREEN]]- \uD30C\uD2F0 \uB9F4\uBC84\uD55C\uD14C \uD154\uB808\uD3EC\uD2B8\uD569\uB2C8\uB2E4 -Commands.Party.Toggle=[[GREEN]]- \uD30C\uD2F0 \uCC44\uD305\uC744 \uCF1C\uAE30/\uB044\uAE30 \uD569\uB2C8\uB2E4 -Commands.Party1=[[GREEN]]- \uC0C8 \uD30C\uD2F0\uB97C \uB9CC\uB4ED\uB2C8\uB2E4 -Commands.Party2=[[GREEN]]- \uD50C\uB808\uC774\uC5B4\uAC00 \uD30C\uD2F0\uC5D0 \uAC00\uC785\uD569\uB2C8\uB2E4 -Commands.Party.Alliance.Header=-----[][[GREEN]]\uD30C\uD2F0 \uB3D9\uB9F9[[RED]][]----- -Commands.Party.Alliance.Ally=[[WHITE]]{0} [[DARK_GRAY]]\uD30C\uD2F0\uC758 \uB3D9\uB9F9: [[WHITE]]{1} -Commands.Party.Alliance.Members.Header=-----[][[GREEN]]\uB3D9\uB9F9 \uAD6C\uC131\uC6D0[[RED]][]----- -Commands.Party.Alliance.Invite.0=\uC54C\uB9BC: [[GREEN]]{1} \uD30C\uD2F0\uB85C\uBD80\uD130 {0} \uD30C\uD2F0\uC640\uC758 \uB3D9\uB9F9 \uCD08\uB300\uB97C \uBC1B\uC558\uC2B5\uB2C8\uB2E4 -Commands.Party.Alliance.Invite.1=\uD0C0\uC785 [[GREEN]]/party alliance accept[[YELLOW]] \uCD08\uB300\uC5D0 \uC218\uB77D\uD569\uB2C8\uB2E4 -Commands.Party.Alliance.Invite.Accepted=[[GREEN]]\uB3D9\uB9F9 \uCD08\uB300 \uC218\uB77D\uB428. -Commands.Party.Alliance.None=\uB2F9\uC2E0\uC740 \uB3D9\uB9F9\uC744 \uAC00\uC9C0\uACE0 \uC788\uC9C0 \uC54A\uC2B5\uB2C8\uB2E4. -Commands.Party.Alliance.AlreadyAllies=\uB2F9\uC2E0\uC758 \uD30C\uD2F0\uB294 \uC774\uBBF8 \uB3D9\uB9F9\uC744 \uAC00\uC9C0\uACE0 \uC788\uC2B5\uB2C8\uB2E4. \uAD00\uACC4\uB97C \uD574\uC9C0\uD558\uB824\uBA74 [[DARK_AQUA]]/party alliance disband -Commands.Party.Alliance.Help.0=\uC774 \uD30C\uD2F0\uB294 \uB3D9\uB9F9 \uD615\uD0DC\uB97C \uAC00\uC9C0\uACE0 \uC788\uC9C0 \uC54A\uC2B5\uB2C8\uB2E4. \uD30C\uD2F0\uC7A5\uC744 \uCD08\uB300\uD558\uC138\uC694 -Commands.Party.Alliance.Help.1= \uB3D9\uB9F9\uC744 \uD558\uB824\uBA74 [[DARK_AQUA]]/party alliance invite [[RED]]. -Commands.ptp.Enabled=\uD30C\uD2F0 \uD154\uB808\uD3EC\uD2B8 [[GREEN]]\uD65C\uC131\uD654\uB428 -Commands.ptp.Disabled=\uD30C\uD2F0 \uD154\uB808\uD3EC\uD2B8 [[RED]]\uBE44\uD65C\uC131\uD654\uB428 -Commands.ptp.NoRequests=\uB2F9\uC2E0\uC740 \uC774 \uC2DC\uAC04\uC5D0 \uD154\uB808\uD3EC\uD2B8 \uC694\uCCAD\uC744 \uD558\uC2E4 \uC218 \uC5C6\uC2B5\uB2C8\uB2E4 -Commands.ptp.NoWorldPermissions=[mcMMO] \uB2F9\uC2E0\uC740 \uC6D4\uB4DC {0}(\uC73C)\uB85C \uD154\uB808\uD3EC\uD2B8\uD560 \uAD8C\uD55C\uC774 \uC5C6\uC2B5\uB2C8\uB2E4. -Commands.ptp.Request1={0} [[GREEN]]\uB2D8\uC774 \uB2F9\uC2E0\uC5D0\uAC8C \uD154\uB808\uD3EC\uD2B8\uB97C \uC2E0\uCCAD\uD588\uC2B5\uB2C8\uB2E4. -Commands.ptp.Request2=[[GREEN]]\uD154\uB808\uD3EC\uD2B8\uD558\uB824\uBA74, \uD0C0\uC785 [[YELLOW]]/ptp accept[[GREEN]]. [[RED]]{0}[[GREEN]]\uCD08\uC5D0 \uC694\uCCAD\uC774 \uB9CC\uAE30\uB429\uB2C8\uB2E4. -Commands.ptp.AcceptAny.Enabled=\uD30C\uD2F0 \uD154\uB808\uD3EC\uD2B8 \uC694\uCCAD \uD655\uC778 [[GREEN]]\uD65C\uC131\uD654\uB428 -Commands.ptp.AcceptAny.Disabled=\uD30C\uD2F0 \uD154\uB808\uD3EC\uD2B8 \uC694\uCCAD \uD655\uC778 [[RED]]\uBE44\uD65C\uC131\uD654\uB428 -Commands.ptp.RequestExpired=\uD30C\uD2F0 \uD154\uB808\uD3EC\uD2B8 \uC694\uCCAD\uC774 \uB9CC\uAE30\uB428! -Commands.PowerLevel.Leaderboard=--mcMMO[[BLUE]] \uCD1D \uB808\uBCA8 [[YELLOW]]\uC810\uC218\uD45C-- -Commands.PowerLevel.Capped=[[DARK_RED]]\uCD1D \uB808\uBCA8: [[GREEN]]{0} [[DARK_RED]]\uCD5C\uB300 \uB808\uBCA8: [[YELLOW]]{1} -Commands.PowerLevel=[[DARK_RED]]\uCD1D \uB808\uBCA8: [[GREEN]]{0} -Commands.Reset.All=[[GREEN]]\uB2F9\uC2E0\uC758 \uBAA8\uB4E0 \uC2A4\uD0AC\uC774 \uC131\uACF5\uC801\uC73C\uB85C \uCD08\uAE30\uD654\uB418\uC5C8\uC2B5\uB2C8\uB2E4. -Commands.Reset.Single=[[GREEN]]\uB2F9\uC2E0\uC758 {0} \uC2A4\uD0AC\uC774 \uC131\uACF5\uC801\uC73C\uB85C \uCD08\uAE30\uD654\uB418\uC5C8\uC2B5\uB2C8\uB2E4. -Commands.Reset=[[GREEN]]\uC2A4\uD0AC \uB808\uBCA8\uC744 0\uC73C\uB85C \uCD08\uAE30\uD654 \uC2DC\uD0B5\uB2C8\uB2E4 -Commands.Scoreboard.Clear=[[DARK_AQUA]]mcMMO \uC810\uC218\uD310 \uCCAD\uC18C\uB428. -Commands.Scoreboard.NoBoard=mcMMO \uC810\uC218\uD310\uC774 \uD65C\uC131\uD654 \uB418\uC5B4\uC788\uC9C0 \uC54A\uC74C. -Commands.Scoreboard.Keep=[[DARK_AQUA]]mcMMO \uC810\uC218\uD310\uC740 \uB2F9\uC2E0\uC774 [[GREEN]]/mcscoreboard clear[[DARK_AQUA]]\uB97C \uC0AC\uC6A9\uD560 \uB54C\uAE4C\uC9C0 \uC720\uC9C0\uB420 \uAC83\uC784. -Commands.Scoreboard.Timer=[[DARK_AQUA]]mcMMO \uC810\uC218\uD310\uC740 \uC9C0\uAE08\uC73C\uB85C\uBD80\uD130 [[GOLD]]{0}[[DARK_AQUA]]\uCD08 \uB0B4\uC5D0 \uCCAD\uC18C\uB420 \uC608\uC815\uC784. -Commands.Scoreboard.Help.0=[[GOLD]] == [[RED]]/mcscoreboard [[GREEN]]\uB3C4\uC6C0\uB9D0[[GOLD]] == -Commands.Scoreboard.Help.1=[[DARK_AQUA]]/mcscoreboard[[AQUA]] clear [[WHITE]] - McMMO \uC810\uC218\uD310\uC744 \uCCAD\uC18C\uD568 -Commands.Scoreboard.Help.2=[[DARK_AQUA]]/mcscoreboard[[AQUA]] keep [[WHITE]] - McMMO \uC810\uC218\uD310\uC744 \uC720\uC9C0\uD568 -Commands.Scoreboard.Help.3=[[DARK_AQUA]]/mcscoreboard[[AQUA]] time [n] [[WHITE]] - McMMO \uC810\uC218\uD310\uC744 [[LIGHT_PURPLE]]n[[WHITE]]\uCD08 \uD6C4\uC5D0 \uCCAD\uC18C\uD568 -Commands.Scoreboard.Tip.Keep=[[GOLD]]\uD301: [[RED]]/mcscoreboard keep[[GOLD]] \uC810\uC218\uD310\uC744 \uBCF4\uC774\uAC8C \uD56D\uC0C1 \uC720\uC9C0. -Commands.Scoreboard.Tip.Clear=[[GOLD]]\uD301: [[RED]]/mcscoreboard clear[[GOLD]] \uC810\uC218\uD310 \uAC10\uCDA4. -Commands.Skill.Invalid=\uC798\uBABB\uB41C \uC2A4\uD0AC \uC774\uB984 \uC785\uB2C8\uB2E4! -Commands.Skill.Leaderboard=--mcMMO [[BLUE]]{0}[[YELLOW]] \uC810\uC218\uD45C-- -Commands.SkillInfo=[[GREEN]]- \uC2A4\uD0AC\uC5D0 \uB300\uD55C \uC790\uC138\uD55C \uC815\uBCF4\uB97C \uBD05\uB2C8\uB2E4 -Commands.Stats.Self=\uB2F9\uC2E0\uC758 \uD1B5\uACC4 -Commands.Stats=[[GREEN]]- \uB2F9\uC2E0\uC758 mcMMO \uD1B5\uACC4 \uBCF4\uAE30 -Commands.ToggleAbility=[[GREEN]]- \uC6B0\uD074\uB9AD\uC2DC \uC0AC\uC6A9\uB418\uB294 \uC2A4\uD0AC\uB4E4\uC744 \uCF1C\uAE30/\uB044\uAE30 \uD569\uB2C8\uB2E4 -Commands.Usage.0=\uC62C\uBC14\uB978 \uC0AC\uC6A9\uBC95 /{0} -Commands.Usage.1=\uC62C\uBC14\uB978 \uC0AC\uC6A9\uBC95 /{0} {1} -Commands.Usage.2=\uC62C\uBC14\uB978 \uC0AC\uC6A9\uBC95 /{0} {1} {2} -Commands.Usage.3=\uC62C\uBC14\uB978 \uC0AC\uC6A9\uBC95 /{0} {1} {2} {3} -Commands.Usage.FullClassName=\uD074\uB808\uC2A4\uC774\uB984 -Commands.Usage.Level=\uB808\uBCA8 -Commands.Usage.Message=\uBA54\uC138\uC9C0 -Commands.Usage.Page=\uD398\uC774\uC9C0 -Commands.Usage.PartyName=\uC774\uB984 -Commands.Usage.Password=\uBE44\uBC00\uBC88\uD638 -Commands.Usage.Player=\uD50C\uB808\uC774\uC5B4 -Commands.Usage.Rate=\uBC30\uC728 -Commands.Usage.Skill=\uC2A4\uD0AC +mcMMO.Description=mcMMO&3 프로젝트에 대해서:,&6mcMMO는 한 &c오픈 소스&6 RPG 모드로 2011년 2월에 &9nossr50&6님이 만들었습니다. 목표는 질좋은 RPG 경험을 제공하는 것 입니다.,&3팁:,&6 - &c/mcmmo help&a 명령어들을 봅니다,&6 - &a타입 &c/스킬이름&a 자세한 스킬 정보를 봅니다,&3개발자들:,&6 - &anossr50 &9(제작자),&6 - &aGJ &9(프로젝트 주장),&6 - &aNuclearW &9(개발자),&6 - &abm01 &9(개발자),&6 - &aTfT_02 &9(개발자),&6 - &aGlitchfinder &9(개발자),&6 - &at00thpick1 &9(개발자),&3유용한 링크:,&6 - &ahttps://github.com/mcMMO-Dev/mcMMO/issues&6 버그 보고,&6 - &a#mcmmo @ irc.esper.net&6 IRC 채팅, +Commands.addlevels.AwardAll.1=&a당신은 모든 스킬에 {0} 레벨을 지급했습니다! +Commands.addlevels.AwardAll.2=모든 스킬이 {0}로 변경되었습니다 +Commands.addlevels.AwardSkill.1=&a당신은 {0} 레벨을 {1}에 지급하였습니다! +Commands.addlevels.AwardSkill.2={1} 님은 {0}을/를 수정하였습니다 +Commands.addxp.AwardAll=&a당신은 모든 스킬에 {0} 경험치를 지급했습니다! +Commands.addxp.AwardSkill=&a당신은 {0} 경험치를 {1}에 지급하였습니다! +Commands.Ability.Off=능력 사용이 &c꺼졌습니다 +Commands.Ability.On=능력 사용이 &a켜졌습니다 +Commands.Ability.Toggle=능력 사용은 &e{0}(으)로 전환되었습니다 +Commands.AdminChat.Off=관리자 채팅이 &c꺼졌습니다 +Commands.AdminChat.On=관리자 채팅이 &a켜졌습니다 +Commands.AdminToggle=&a- 관리자 채팅을 켜기/끄기합니다 +Commands.Chat.Console=*시스템* +Commands.Cooldowns.Header=&6--= &amcMMO 능력 재 사용 대기시간&6 =-- +Commands.Cooldowns.Row.N=\ &c{0}&f - &6{1}초 남음 +Commands.Cooldowns.Row.Y=\ &b{0}&f - &2준비! +Commands.Database.Cooldown=이 명령어를 다시 치기전에 1초를 기달려야만 합니다. +Commands.Database.Processing=당신의 이전 명령어는 여전히 작업중입니다. 기다려주세요. +Commands.Disabled=이 명령어는 비활성화 되있습니다. +Commands.DoesNotExist= &c플레이어는 데이터베이스에 존재하지 않습니다! +Commands.GodMode.Disabled=mcMMO 불사신 모드 비활성화 +Commands.GodMode.Enabled=mcMMO 불사신 모드 활성화 +Commands.GodMode.Forbidden=[mcMMO] 이 월드에서 불사신 모드는 허용 금지입니다 (펄미선 확인) +Commands.GodMode.Toggle=불사신 모드는 &e{0}&f(으)로 전환되었습니다 +Commands.Healthbars.Changed.HEARTS=[mcMMO] 당신의 체력바 보기 방식은 &c하트&f로 변경되었습니다. +Commands.Healthbars.Changed.BAR=[mcMMO] 당신의 체력바 보기 방식은 &e박스&f로 변경되었습니다. +Commands.Healthbars.Changed.DISABLED=[mcMMO] 당신의 몹 체력바는 &7비활성화&f 되었습니다. +Commands.Healthbars.Invalid=잘못된 체력바 타입! +Commands.Inspect=<플레이어> &a- 상세한 플레이어 정보를 봅니다 +Commands.Invite.Success=&a초대를 성공적으로 보냈습니다. +Commands.Leaderboards=<스킬> <페이지> &a- mcMMO 스킬 정보 +Commands.mcc.Header=---[]&amcMMO 명령어&c[]--- +Commands.mcgod=&a- 불사신 모드 켜기/끄기 +Commands.mchud.Invalid=HUD 타입이 올바르지 않습니다. +Commands.mcpurge.Success=&a데이터베이스가 성공적으로 초기화됬습니다! +Commands.mcrank.Heading=&6-=개인 순위=- +Commands.mcrank.Overall=종합&a - &6랭크 &f#&a{0} +Commands.mcrank.Player=타겟: &f{0} +Commands.mcrank.Skill={0}&a - &6랭크 &f#&a{1} +Commands.mcrank.Unranked=&f랭크없음 +Commands.mcrefresh.Success={0}의 쿨다운이 초기화되었습니다. +Commands.mcremove.Success=&a{0}님의 데이터베이스가 성공적으로 삭제되었습니다! +Commands.mctop.Tip=&6팁: &c/mcrank&6 명령어를 사용하면 모든 개인 순위를 볼수 있습니다! +Commands.mmoedit=[플레이어] <스킬> <새값> &a - 대상을 수정합니다 +Commands.mmoedit.AllSkills.1=&a당신의 모든 스킬 레벨이 {0}로 설정되었습니다! +Commands.mmoedit.Modified.1=&a당신의 {0} 레벨이 {1}로 설정되었습니다! +Commands.mmoedit.Modified.2={0}님은 {1}를 수정했습니다. +Commands.mcconvert.Database.Same=당신은 이미 {0} 데이터베이스를 사용중입니다! +Commands.mcconvert.Database.InvalidType={0} 은/는 잘못된 데이터베이스 타입입니다. +Commands.mcconvert.Database.Start=&7{0}에서 {1}(으)로 전환 시작중... +Commands.mcconvert.Database.Finish=&7데이터베이스 이동 완료; {1} 데이터베이스는 이제 {0} 데이터베이스로부터 모든 자료를 가집니다. +Commands.mmoshowdb=현재 사용하는 데이터베이스: &a{0} +Commands.mcconvert.Experience.Invalid=잘못된 공식 타입! 올바른 타입: &aLINEAR &c그리고 &aEXPONENTIAL. +Commands.mcconvert.Experience.Same=이미 {0} 공식을 사용중입니다 +Commands.mcconvert.Experience.Start=&7{0} 에서 {1} 곡선으로 변환 시작 +Commands.mcconvert.Experience.Finish=&7공식 변환 완료; 이제 {0} XP 곡선입니다. +Commands.ModDescription=&a- 플러그인에 대한 정보를 봅니다 +Commands.NoConsole=이 명령어는 콘솔에서의 사용을 지원하지 않습니다. +Commands.Notifications.Off=능력 알림이 &c켜졌습니다 +Commands.Notifications.On=능력 알림이 &a꺼졌습니다 +Commands.Offline=이 명령어는 오프라인 플레이어에게 동작하지 않습니다. +Commands.NotLoaded=플레이어 프로파일은 불러와지지 않았습니다Player profile is not loaded yet. +Commands.Other=---[]&a기타 명령어&c[]--- +Commands.Party.Header=-----[]&a파티&c[]----- +Commands.Party.Features.Header=-----[]&a특징&c[]----- +Commands.Party.Status=&8이름: &f{0} {1} &8레벨: &3{2} +Commands.Party.Status.Alliance=&8동맹: &f{0} +Commands.Party.UnlockedFeatures=&8해제된 특징: &7&o{0} +Commands.Party.ShareMode=&8공유 모드: +Commands.Party.ItemShare=&7아이템 &3({0}) +Commands.Party.ExpShare=&7EXP &3({0}) +Commands.Party.ItemShareCategories=&8공유중인 아이템: &7&o{0} +Commands.Party.MembersNear=&8당신의 근처 &3{0}&8/&3{1} +Commands.Party.Accept=&a- 파티 초대 허용 +Commands.Party.Chat.Off=파티 채팅을 &c끕니다 +Commands.Party.Chat.On=파티 채팅을 &a켭니다 +Commands.Party.Commands=---[]&a파티 명령어&c[]--- +Commands.Party.Invite.0=알림: &a당신은 {1} 님으로부터 {0} 파티 초대에 권유받았습니다 +Commands.Party.Invite.1=타입 &a/party accept&e 명령어를 치면 파티 초대에 승낙됩니다 +Commands.Party.Invite=<플레이어> &a- 파티 초대를 보냅니다 +Commands.Party.Invite.Accepted=&a초대 수락됨. 당신은 {0} 파티에 가입되었습니다 +Commands.Party.Join=참여된 파티: {0} +Commands.Party.Create=&7만들어진 파티: {0} +Commands.Party.Rename=&7변경된 파티 이름: &f{0} +Commands.Party.SetSharing=&7파티 {0} 공유 설정: &3{1} +Commands.Party.ToggleShareCategory=&7파티 아이템 공유 &6{0} &7가 &3{1}되었습니다 +Commands.Party.AlreadyExists=&4{0} 파티은/는 이미 존재합니다! +Commands.Party.Kick=당신은 {0} 파티에서 추방 당하였습니다. +Commands.Party.Leave=파티를 떠났습니다 +Commands.Party.Members.Header=-----[]&a맴버들&c[]----- +Commands.Party.None=당신은 파티에 참여되어 있지 않습니다. +Commands.Party.Quit=&a- 현재 참여 되어있는 파티를 나갑니다 +Commands.Party.Teleport=&a- 파티 맴버한테 텔레포트합니다 +Commands.Party.Toggle=&a- 파티 채팅을 켜기/끄기 합니다 +Commands.Party1=&a- 새 파티를 만듭니다 +Commands.Party2=&a- 플레이어가 파티에 가입합니다 +Commands.Party.Alliance.Header=-----[]&a파티 동맹&c[]----- +Commands.Party.Alliance.Ally=&f{0} &8파티의 동맹: &f{1} +Commands.Party.Alliance.Members.Header=-----[]&a동맹 구성원&c[]----- +Commands.Party.Alliance.Invite.0=알림: &a{1} 파티로부터 {0} 파티와의 동맹 초대를 받았습니다 +Commands.Party.Alliance.Invite.1=타입 &a/party alliance accept&e 초대에 수락합니다 +Commands.Party.Alliance.Invite.Accepted=&a동맹 초대 수락됨. +Commands.Party.Alliance.None=당신은 동맹을 가지고 있지 않습니다. +Commands.Party.Alliance.AlreadyAllies=당신의 파티는 이미 동맹을 가지고 있습니다. 관계를 해지하려면 &3/party alliance disband +Commands.Party.Alliance.Help.0=이 파티는 동맹 형태를 가지고 있지 않습니다. 파티장을 초대하세요 +Commands.Party.Alliance.Help.1= 동맹을 하려면 &3/party alliance invite &c. +Commands.ptp.Enabled=파티 텔레포트 &a활성화됨 +Commands.ptp.Disabled=파티 텔레포트 &c비활성화됨 +Commands.ptp.NoRequests=당신은 이 시간에 텔레포트 요청을 하실 수 없습니다 +Commands.ptp.NoWorldPermissions=[mcMMO] 당신은 월드 {0}(으)로 텔레포트할 권한이 없습니다. +Commands.ptp.Request1={0} &a님이 당신에게 텔레포트를 신청했습니다. +Commands.ptp.Request2=&a텔레포트하려면, 타입 &e/ptp accept&a. &c{0}&a초에 요청이 만기됩니다. +Commands.ptp.AcceptAny.Enabled=파티 텔레포트 요청 확인 &a활성화됨 +Commands.ptp.AcceptAny.Disabled=파티 텔레포트 요청 확인 &c비활성화됨 +Commands.ptp.RequestExpired=파티 텔레포트 요청이 만기됨! +Commands.PowerLevel.Leaderboard=--mcMMO&9 총 레벨 &e점수표-- +Commands.PowerLevel.Capped=&4총 레벨: &a{0} &4최대 레벨: &e{1} +Commands.PowerLevel=&4총 레벨: &a{0} +Commands.Reset.All=&a당신의 모든 스킬이 성공적으로 초기화되었습니다. +Commands.Reset.Single=&a당신의 {0} 스킬이 성공적으로 초기화되었습니다. +Commands.Reset=&a스킬 레벨을 0으로 초기화 시킵니다 +Commands.Scoreboard.Clear=&3mcMMO 점수판 청소됨. +Commands.Scoreboard.NoBoard=mcMMO 점수판이 활성화 되어있지 않음. +Commands.Scoreboard.Keep=&3mcMMO 점수판은 당신이 &a/mcscoreboard clear&3를 사용할 때까지 유지될 것임. +Commands.Scoreboard.Timer=&3mcMMO 점수판은 지금으로부터 &6{0}&3초 내에 청소될 예정임. +Commands.Scoreboard.Help.0=&6 == &c/mcscoreboard &a도움말&6 == +Commands.Scoreboard.Help.1=&3/mcscoreboard&b clear &f - McMMO 점수판을 청소함 +Commands.Scoreboard.Help.2=&3/mcscoreboard&b keep &f - McMMO 점수판을 유지함 +Commands.Scoreboard.Help.3=&3/mcscoreboard&b time [n] &f - McMMO 점수판을 &dn&f초 후에 청소함 +Commands.Scoreboard.Tip.Keep=&6팁: &c/mcscoreboard keep&6 점수판을 보이게 항상 유지. +Commands.Scoreboard.Tip.Clear=&6팁: &c/mcscoreboard clear&6 점수판 감춤. +Commands.Skill.Invalid=잘못된 스킬 이름 입니다! +Commands.Skill.Leaderboard=--mcMMO &9{0}&e 점수표-- +Commands.SkillInfo=&a- 스킬에 대한 자세한 정보를 봅니다 +Commands.Stats.Self=당신의 통계 +Commands.Stats=&a- 당신의 mcMMO 통계 보기 +Commands.ToggleAbility=&a- 우클릭시 사용되는 스킬들을 켜기/끄기 합니다 +Commands.Usage.0=올바른 사용법 /{0} +Commands.Usage.1=올바른 사용법 /{0} {1} +Commands.Usage.2=올바른 사용법 /{0} {1} {2} +Commands.Usage.3=올바른 사용법 /{0} {1} {2} {3} +Commands.Usage.FullClassName=클레스이름 +Commands.Usage.Level=레벨 +Commands.Usage.Message=메세지 +Commands.Usage.Page=페이지 +Commands.Usage.PartyName=이름 +Commands.Usage.Password=비밀번호 +Commands.Usage.Player=플레이어 +Commands.Usage.Rate=배율 +Commands.Usage.Skill=스킬 Commands.Usage.XP=xp -mcMMO.NoInvites=\uC774 \uC2DC\uAC04\uC5D0 \uB2F9\uC2E0\uC740 \uCD08\uB300\uD558\uC9C0 \uBABB\uD569\uB2C8\uB2E4 -mcMMO.NoPermission=[[DARK_RED]]\uAD8C\uD55C\uC774 \uBD80\uC871\uD569\uB2C8\uB2E4. -mcMMO.NoSkillNote=[[DARK_GRAY]]\uB9CC\uC57D \uB2F9\uC2E0\uC774 \uC2A4\uD0AC\uC744 \uC0AC\uC6A9\uD560 \uC218 \uC5C6\uB2E4\uBA74 \uC5EC\uAE30\uC5D0 \uD45C\uC2DC\uB418\uC9C0 \uC54A\uC2B5\uB2C8\uB2E4. +mcMMO.NoInvites=이 시간에 당신은 초대하지 못합니다 +mcMMO.NoPermission=&4권한이 부족합니다. +mcMMO.NoSkillNote=&8만약 당신이 스킬을 사용할 수 없다면 여기에 표시되지 않습니다. ##party -Party.Forbidden=[mcMMO] \uC774 \uC6D4\uB4DC\uC5D0\uC11C \uD30C\uD2F0\uB97C \uD558\uC2E4 \uC218 \uC5C6\uC2B5\uB2C8\uB2E4 (\uD384\uBBF8\uC120 \uD655\uC778) -Party.Help.0=\uC62C\uBC14\uB978 \uC0AC\uC6A9\uBC95 [[DARK_AQUA]]{0} <\uD50C\uB808\uC774\uC5B4> [\uBE44\uBC00\uBC88\uD638]. -Party.Help.1=\uD30C\uD2F0\uB97C \uB9CC\uB4E4\uB824\uBA74, [[DARK_AQUA]]{0} <\uC774\uB984> [\uBE44\uBC00\uBC88\uD638]. -Party.Help.2=\uD30C\uD2F0 \uC815\uBCF4\uB97C \uBCFC\uB824\uBA74 [[DARK_AQUA]]{0} -Party.Help.3=\uD30C\uD2F0\uC5D0 \uAC00\uC785\uD560\uB824\uBA74 [[DARK_AQUA]]{0} <\uD50C\uB808\uC774\uC5B4> [\uBE44\uBC00\uBC88\uD638] [[RED]]\uB098\uAC08\uB824\uBA74 [[DARK_AQUA]]{1} -Party.Help.4=\uD30C\uD2F0\uB97C \uC7A0\uAE08/\uC7A0\uAE08\uD574\uC81C \uD560\uB824\uBA74, [[DARK_AQUA]]{0} -Party.Help.5=\uBE44\uBC00\uBC88\uD638\uB85C \uD30C\uD2F0\uB97C \uBCF4\uD638\uD560\uB824\uBA74, [[DARK_AQUA]]{0} <\uBE44\uBC00\uBC88\uD638> -Party.Help.6=\uD30C\uD2F0\uC5D0\uC11C \uD50C\uB808\uC774\uC5B4\uB97C \uCD94\uBC29\uC2DC\uD0AC\uB824\uBA74, [[DARK_AQUA]]{0} <\uD50C\uB808\uC774\uC5B4> -Party.Help.7=\uD30C\uD2F0\uC7A5\uC744 \uAD50\uCCB4\uD560\uB824\uBA74, [[DARK_AQUA]]{0} <\uD50C\uB808\uC774\uC5B4> -Party.Help.8=\uD30C\uD2F0\uB97C \uD574\uCCB4\uD560\uB824\uBA74, [[DARK_AQUA]]{0} -Party.Help.9=\uD30C\uD2F0 \uB9F4\uBC84\uB4E4\uACFC \uC544\uC774\uD15C\uC744 \uACF5\uC720\uD558\uB824\uBA74 [[DARK_AQUA]]{0} -Party.Help.10=\uD30C\uD2F0 \uB9F4\uBC84\uB4E4\uACFC \uACBD\uD5D8\uCE58 \uACF5\uC720\uB97C \uD65C\uC131\uD654\uD654\uB824\uBA74 [[DARK_AQUA]]{0} -Party.InformedOnJoin={0} [[GREEN]]\uB2D8\uC774 \uB2F9\uC2E0\uC758 \uD30C\uD2F0\uC5D0 \uCC38\uC5EC\uD588\uC2B5\uB2C8\uB2E4 -Party.InformedOnQuit={0} [[GREEN]]\uB2D8\uC774 \uB2F9\uC2E0\uC758 \uD30C\uD2F0\uC5D0\uC11C \uB5A0\uB0AC\uC2B5\uB2C8\uB2E4 -Party.InformedOnNameChange=[[GOLD]]{0} [[GREEN]]\uB2D8\uC774 \uD30C\uD2F0 \uC774\uB984\uC744 [[WHITE]]{1}\uB85C \uC124\uC815\uD588\uC2B5\uB2C8\uB2E4 -Party.InvalidName=[[DARK_RED]]\uC798\uBABB\uB41C \uD30C\uD2F0 \uC774\uB984\uC785\uB2C8\uB2E4. -Party.Invite.Self=\uC790\uAE30\uC790\uC2E0\uC744 \uCD08\uB300\uD560 \uC218\uB294 \uC5C6\uC2B5\uB2C8\uB2E4! -Party.IsLocked=\uC774 \uD30C\uD2F0\uB294 \uC774\uBBF8 \uC7A0\uACA8\uC838 \uC788\uC2B5\uB2C8\uB2E4! -Party.IsntLocked=\uC774 \uD30C\uD2F0\uB294 \uC7A0\uACA8\uC838 \uC788\uC9C0 \uC54A\uC2B5\uB2C8\uB2E4! -Party.Locked=\uD30C\uD2F0\uAC00 \uC7A0\uACBC\uC2B5\uB2C8\uB2E4, \uC624\uC9C1 \uD30C\uD2F0\uC7A5\uB9CC\uC774 \uCD08\uB300\uB97C \uD560 \uC218 \uC788\uC2B5\uB2C8\uB2E4. -Party.NotInYourParty=[[DARK_RED]]{0}\uB2D8\uC740 \uB2F9\uC2E0\uC758 \uD30C\uD2F0\uC5D0 \uC5C6\uC2B5\uB2C8\uB2E4 -Party.NotOwner=[[DARK_RED]]\uB2F9\uC2E0\uC740 \uD30C\uD2F0\uC7A5\uC774 \uC544\uB2D9\uB2C8\uB2E4. -Party.Target.NotOwner=[[DARK_RED]]{0}\uB2D8\uC740 \uD30C\uD2F0\uC7A5\uC774 \uC544\uB2D9\uB2C8\uB2E4. -Party.Owner.New=[[GREEN]]{0}\uB2D8\uC774 \uC0C8 \uD30C\uD2F0\uC7A5\uC774 \uB418\uC5C8\uC2B5\uB2C8\uB2E4. -Party.Owner.NotLeader=[[DARK_RED]]\uB2F9\uC2E0\uC740 \uC774\uC81C \uD30C\uD2F0\uC7A5\uC774 \uC544\uB2D9\uB2C8\uB2E4. -Party.Owner.Player =[[GREEN]]\uB2F9\uC2E0\uC740 \uC774\uC81C \uD30C\uD2F0\uC7A5\uC785\uB2C8\uB2E4. -Party.Password.None=\uC774 \uD30C\uD2F0\uB294 \uBE44\uBC00\uBC88\uD638\uB85C \uBCF4\uD638\uB418\uACE0 \uC788\uC2B5\uB2C8\uB2E4. \uAC00\uC785\uD560\uB54C \uBE44\uBC00\uBC88\uD638\uB97C \uC81C\uACF5\uD574\uC8FC\uC138\uC694. -Party.Password.Incorrect=\uD30C\uD2F0 \uBE44\uBC00\uBC88\uD638\uAC00 \uC62C\uBC14\uB974\uC9C0 \uC54A\uC2B5\uB2C8\uB2E4. -Party.Password.Set=[[GREEN]]\uC124\uC815\uD55C \uD30C\uD2F0 \uBE44\uBC00\uBC88\uD638\uB294 {0} \uC785\uB2C8\uB2E4 -Party.Password.Removed=[[GREEN]]\uD30C\uD2F0 \uBE44\uBC00\uBC88\uD638\uAC00 \uCCAD\uC18C\uB418\uC5C8\uC2B5\uB2C8\uB2E4. -Party.Player.Invalid=\uADF8 \uD50C\uB808\uC774\uC5B4\uB294 \uC62C\uBC14\uB974\uC9C0 \uC54A\uC2B5\uB2C8\uB2E4. -Party.NotOnline=[[DARK_RED]]{0}\uB2D8\uC740 \uC811\uC18D\uC911\uC774 \uC544\uB2D9\uB2C8\uB2E4! -Party.Player.InSameParty={0}\uB2D8\uC740 \uC774\uBBF8 \uB2F9\uC2E0\uC758 \uD30C\uD2F0\uC5D0 \uC788\uC2B5\uB2C8\uB2E4! -Party.PlayerNotInParty=[[DARK_RED]]{0}\uB2D8\uC740 \uD30C\uD2F0\uC5D0 \uC5C6\uC2B5\uB2C8\uB2E4 -Party.Specify=\uB2F9\uC2E0\uC740 \uD30C\uD2F0\uB97C \uBA85\uAE30\uD574\uC57C\uD569\uB2C8\uB2E4. -Party.Teleport.Dead=\uB2F9\uC2E0\uC740 \uC8FD\uC740 \uD50C\uB808\uC774\uC5B4\uC5D0\uAC8C\uB85C \uD154\uB808\uD3EC\uD2B8 \uD560 \uC218 \uC5C6\uC2B5\uB2C8\uB2E4. -Party.Teleport.Hurt=\uB2F9\uC2E0\uC740 \uB9C8\uC9C0\uB9C9\uC73C\uB85C {0}\uCD08\uC5D0 \uB2E4\uCCD0 \uD154\uB808\uD3EC\uD2B8 \uD560 \uC218 \uC5C6\uC2B5\uB2C8\uB2E4. -Party.Teleport.Player=[[GREEN]]\uB2F9\uC2E0\uC740 {0}\uB85C \uD154\uB808\uD3EC\uD2B8\uD588\uC2B5\uB2C8\uB2E4. -Party.Teleport.Self=\uC790\uAE30\uC790\uC2E0\uD55C\uD14C \uD154\uB808\uD3EC\uD2B8 \uD560 \uC218 \uC5C6\uC2B5\uB2C8\uB2E4! -Party.Teleport.Target=[[GREEN]]{0}\uB2D8\uC774 \uB2F9\uC2E0\uC5D0\uAC8C\uB85C \uD154\uB808\uD3EC\uD2B8\uD588\uC2B5\uB2C8\uB2E4. -Party.Teleport.Disabled={0}\uB2D8\uC740 \uD30C\uD2F0 \uD154\uB808\uD3EC\uD2B8\uB97C \uD5C8\uC6A9\uD558\uACE0 \uC788\uC9C0 \uC54A\uC2B5\uB2C8\uB2E4. -Party.Rename.Same=\uC774\uBBF8 \uB2F9\uC2E0\uC758 \uD30C\uD2F0 \uC774\uB984\uC785\uB2C8\uB2E4! -Party.Join.Self=\uC790\uAE30\uC790\uC2E0\uC744 \uAC00\uC785\uC2DC\uD0AC\uC218 \uC5C6\uC2B5\uB2C8\uB2E4! -Party.Unlocked=[[GRAY]]\uD30C\uD2F0\uAC00 \uC7A0\uAE08\uD574\uC81C \uB418\uC5C8\uC2B5\uB2C8\uB2E4 -Party.Disband=[[GRAY]]\uADF8 \uD30C\uD2F0\uAC00 \uD574\uCCB4\uB418\uC5C8\uC2B5\uB2C8\uB2E4 -Party.Alliance.Formed=[[GRAY]]\uB2F9\uC2E0\uC758 \uD30C\uD2F0\uB294 \uC774\uC81C [[GREEN]]{0} \uD30C\uD2F0\uC640 \uB3D9\uB9F9\uC785\uB2C8\uB2E4 -Party.Alliance.Disband=[[GRAY]]\uB2F9\uC2E0\uC758 \uD30C\uD2F0\uB294 \uB354 \uC774\uC0C1 [[RED]]{0} \uD30C\uD2F0\uC640 \uB3D9\uB9F9\uC774 \uC544\uB2D9\uB2C8\uB2E4 -Party.Status.Locked=[[DARK_RED]](\uCD08\uB300\uB9CC-\uD5C8\uC6A9) -Party.Status.Unlocked=[[DARK_GREEN]](\uAC1C\uBC29) -Party.LevelUp=\uD30C\uD2F0 \uB808\uBCA8\uC774 {0} \uC62C\uB77C \uCD1D {1} \uB808\uBCA8\uC774 \uB418\uC5C8\uC2B5\uB2C8\uB2E4 -Party.Feature.Chat=\uD30C\uD2F0 \uCC44\uD305 -Party.Feature.Teleport=\uD30C\uD2F0 \uD154\uB808\uD3EC\uD2B8 -Party.Feature.Alliance=\uB3D9\uB9F9 -Party.Feature.ItemShare=\uC544\uC774\uD15C \uACF5\uC720 -Party.Feature.XpShare=\uACBD\uD5D8\uCE58 \uACF5\uC720 -Party.Feature.Locked.Chat={0}\uB808\uBCA8 \uB54C \uC2A4\uD0AC\uD574\uC81C (\uD30C\uD2F0 \uCC44\uD305) -Party.Feature.Locked.Teleport={0}\uB808\uBCA8 \uB54C \uC2A4\uD0AC\uD574\uC81C (\uD30C\uD2F0 \uD154\uB808\uD3EC\uD2B8) -Party.Feature.Locked.Alliance={0}\uB808\uBCA8 \uB54C \uC2A4\uD0AC\uD574\uC81C (\uB3D9\uB9F9) -Party.Feature.Locked.ItemShare={0}\uB808\uBCA8 \uB54C \uC2A4\uD0AC\uD574\uC81C (\uC544\uC774\uD15C \uACF5\uC720) -Party.Feature.Locked.XpShare={0}\uB808\uBCA8 \uB54C \uC2A4\uD0AC\uD574\uC81C (\uACBD\uD5D8\uCE58 \uACF5\uC720) -Party.Feature.Disabled.1=\uD30C\uD2F0 \uCC44\uD305\uC740 \uC544\uC9C1 \uD574\uC81C\uB418\uC9C0 \uC54A\uC558\uC2B5\uB2C8\uB2E4. -Party.Feature.Disabled.2=\uD30C\uD2F0 \uD154\uB808\uD3EC\uD2B8\uB294 \uC544\uC9C1 \uD574\uC81C\uB418\uC9C0 \uC54A\uC558\uC2B5\uB2C8\uB2E4. -Party.Feature.Disabled.3=\uD30C\uD2F0 \uB3D9\uB9F9\uC740 \uC544\uC9C1 \uD574\uC81C\uB418\uC9C0 \uC54A\uC558\uC2B5\uB2C8\uB2E4. -Party.Feature.Disabled.4=\uC544\uC774\uD15C \uACF5\uC720\uB294 \uC544\uC9C1 \uD574\uC81C\uB418\uC9C0 \uC54A\uC558\uC2B5\uB2C8\uB2E4. -Party.Feature.Disabled.5=\uACBD\uD5D8\uCE58 \uACF5\uC720\uB294 \uC544\uC9C1 \uD574\uC81C\uB418\uC9C0 \uC54A\uC558\uC2B5\uB2C8\uB2E4. -Party.ShareType.Xp=\uACBD\uD5D8\uCE58 -Party.ShareType.Item=\uC544\uC774\uD15C -Party.ShareMode.None=\uC5C6\uC74C -Party.ShareMode.Equal=\uADE0\uB4F1 -Party.ShareMode.Random=\uBB34\uC791\uC704 -Party.ItemShare.Category.Loot=\uAC15\uD0C8 -Party.ItemShare.Category.Mining=\uCC44\uAD11 -Party.ItemShare.Category.Herbalism=\uC57D\uCD08\uD559 -Party.ItemShare.Category.Woodcutting=\uBC8C\uBAA9 -Party.ItemShare.Category.Misc=\uAE30\uD0C0 +Party.Forbidden=[mcMMO] 이 월드에서 파티를 하실 수 없습니다 (펄미선 확인) +Party.Help.0=올바른 사용법 &3{0} <플레이어> [비밀번호]. +Party.Help.1=파티를 만들려면, &3{0} <이름> [비밀번호]. +Party.Help.2=파티 정보를 볼려면 &3{0} +Party.Help.3=파티에 가입할려면 &3{0} <플레이어> [비밀번호] &c나갈려면 &3{1} +Party.Help.4=파티를 잠금/잠금해제 할려면, &3{0} +Party.Help.5=비밀번호로 파티를 보호할려면, &3{0} <비밀번호> +Party.Help.6=파티에서 플레이어를 추방시킬려면, &3{0} <플레이어> +Party.Help.7=파티장을 교체할려면, &3{0} <플레이어> +Party.Help.8=파티를 해체할려면, &3{0} +Party.Help.9=파티 맴버들과 아이템을 공유하려면 &3{0} +Party.Help.10=파티 맴버들과 경험치 공유를 활성화화려면 &3{0} +Party.InformedOnJoin={0} &a님이 당신의 파티에 참여했습니다 +Party.InformedOnQuit={0} &a님이 당신의 파티에서 떠났습니다 +Party.InformedOnNameChange=&6{0} &a님이 파티 이름을 &f{1}로 설정했습니다 +Party.InvalidName=&4잘못된 파티 이름입니다. +Party.Invite.Self=자기자신을 초대할 수는 없습니다! +Party.IsLocked=이 파티는 이미 잠겨져 있습니다! +Party.IsntLocked=이 파티는 잠겨져 있지 않습니다! +Party.Locked=파티가 잠겼습니다, 오직 파티장만이 초대를 할 수 있습니다. +Party.NotInYourParty=&4{0}님은 당신의 파티에 없습니다 +Party.NotOwner=&4당신은 파티장이 아닙니다. +Party.Target.NotOwner=&4{0}님은 파티장이 아닙니다. +Party.Owner.New=&a{0}님이 새 파티장이 되었습니다. +Party.Owner.NotLeader=&4당신은 이제 파티장이 아닙니다. +Party.Owner.Player =&a당신은 이제 파티장입니다. +Party.Password.None=이 파티는 비밀번호로 보호되고 있습니다. 가입할때 비밀번호를 제공해주세요. +Party.Password.Incorrect=파티 비밀번호가 올바르지 않습니다. +Party.Password.Set=&a설정한 파티 비밀번호는 {0} 입니다 +Party.Password.Removed=&a파티 비밀번호가 청소되었습니다. +Party.Player.Invalid=그 플레이어는 올바르지 않습니다. +Party.NotOnline=&4{0}님은 접속중이 아닙니다! +Party.Player.InSameParty={0}님은 이미 당신의 파티에 있습니다! +Party.PlayerNotInParty=&4{0}님은 파티에 없습니다 +Party.Specify=당신은 파티를 명기해야합니다. +Party.Teleport.Dead=당신은 죽은 플레이어에게로 텔레포트 할 수 없습니다. +Party.Teleport.Hurt=당신은 마지막으로 {0}초에 다쳐 텔레포트 할 수 없습니다. +Party.Teleport.Player=&a당신은 {0}로 텔레포트했습니다. +Party.Teleport.Self=자기자신한테 텔레포트 할 수 없습니다! +Party.Teleport.Target=&a{0}님이 당신에게로 텔레포트했습니다. +Party.Teleport.Disabled={0}님은 파티 텔레포트를 허용하고 있지 않습니다. +Party.Rename.Same=이미 당신의 파티 이름입니다! +Party.Join.Self=자기자신을 가입시킬수 없습니다! +Party.Unlocked=&7파티가 잠금해제 되었습니다 +Party.Disband=&7그 파티가 해체되었습니다 +Party.Alliance.Formed=&7당신의 파티는 이제 &a{0} 파티와 동맹입니다 +Party.Alliance.Disband=&7당신의 파티는 더 이상 &c{0} 파티와 동맹이 아닙니다 +Party.Status.Locked=&4(초대만-허용) +Party.Status.Unlocked=&2(개방) +Party.LevelUp=파티 레벨이 {0} 올라 총 {1} 레벨이 되었습니다 +Party.Feature.Chat=파티 채팅 +Party.Feature.Teleport=파티 텔레포트 +Party.Feature.Alliance=동맹 +Party.Feature.ItemShare=아이템 공유 +Party.Feature.XpShare=경험치 공유 +Party.Feature.Locked.Chat={0}레벨 때 스킬해제 (파티 채팅) +Party.Feature.Locked.Teleport={0}레벨 때 스킬해제 (파티 텔레포트) +Party.Feature.Locked.Alliance={0}레벨 때 스킬해제 (동맹) +Party.Feature.Locked.ItemShare={0}레벨 때 스킬해제 (아이템 공유) +Party.Feature.Locked.XpShare={0}레벨 때 스킬해제 (경험치 공유) +Party.Feature.Disabled.1=파티 채팅은 아직 해제되지 않았습니다. +Party.Feature.Disabled.2=파티 텔레포트는 아직 해제되지 않았습니다. +Party.Feature.Disabled.3=파티 동맹은 아직 해제되지 않았습니다. +Party.Feature.Disabled.4=아이템 공유는 아직 해제되지 않았습니다. +Party.Feature.Disabled.5=경험치 공유는 아직 해제되지 않았습니다. +Party.ShareType.Xp=경험치 +Party.ShareType.Item=아이템 +Party.ShareMode.None=없음 +Party.ShareMode.Equal=균등 +Party.ShareMode.Random=무작위 +Party.ItemShare.Category.Loot=강탈 +Party.ItemShare.Category.Mining=채광 +Party.ItemShare.Category.Herbalism=약초학 +Party.ItemShare.Category.Woodcutting=벌목 +Party.ItemShare.Category.Misc=기타 ##xp -Commands.XPGain.Acrobatics=\uB5A8\uC5B4\uC9C0\uAE30 -Commands.XPGain.Alchemy=\uD3EC\uC158 \uC591\uC870\uD558\uAE30 -Commands.XPGain.Archery=\uBAAC\uC2A4\uD130 \uACF5\uACA9\uD558\uAE30 -Commands.XPGain.Axes=\uBAAC\uC2A4\uD130 \uACF5\uACA9\uD558\uAE30 -Commands.XPGain.Child=\uC0C1\uC704 \uC2A4\uD0AC\uB4E4\uB85C \uBD80\uD130 \uB808\uBCA8\uB4E4\uC744 \uC5BB\uC2B5\uB2C8\uB2E4 -Commands.XPGain.Excavation=\uB545 \uD30C\uAC70\uB098 \uBCF4\uBB3C \uBC1C\uACAC\uD558\uAE30 -Commands.XPGain.Fishing=\uB09A\uC2DC\uD558\uAE30 -Commands.XPGain.Herbalism=\uC2DD\uBB3C \uC218\uC9D1\uD558\uAE30 -Commands.XPGain.Mining=\uB3CC\uC774\uB098 \uAD11\uC11D \uCE90\uAE30 -Commands.XPGain.Repair=\uC218\uB9AC\uD558\uAE30 -Commands.XPGain.Swords=\uBAAC\uC2A4\uD130 \uACF5\uACA9\uD558\uAE30 -Commands.XPGain.Taming=\uB3D9\uBB3C\uC744 \uC870\uB828\uD558\uAC70\uB098, \uC870\uB828\uB41C \uB3D9\uBB3C\uB85C \uC0AC\uB0E5\uD558\uAE30 -Commands.XPGain.Unarmed=\uBAAC\uC2A4\uD130 \uACF5\uACA9\uD558\uAE30 -Commands.XPGain.Woodcutting=\uB098\uBB34 \uC790\uB974\uAE30 -Commands.XPGain=[[DARK_GRAY]]\uACBD\uD5D8\uCE58 \uC5BB\uB294 \uBC29\uBC95: [[WHITE]]{0} -Commands.xplock.locked=[[GOLD]]\uB2F9\uC2E0\uC758 \uACBD\uD5D8\uCE58 \uBC14\uB294 {0}\uB85C \uC7A0\uACBC\uC2B5\uB2C8\uB2E4! -Commands.xplock.unlocked=[[GOLD]]\uB2F9\uC2E0\uC758 \uACBD\uD5D8\uCE58 \uBC14\uB294 [[GREEN]]\uC7A0\uAE08 \uD574\uC81C\uB418\uC5C8\uC2B5\uB2C8\uB2E4[[GOLD]]! -Commands.xprate.modified=\uACBD\uD5D8\uCE58 \uBC30\uC728\uC774 {0}\uBC30\uB85C \uC218\uC815\uB418\uC5C8\uC2B5\uB2C8\uB2E4 -Commands.xprate.over=mcMMO \uACBD\uD5D8\uCE58 \uC774\uBCA4\uD2B8\uAC00 \uC885\uB8CC\uB418\uC5C8\uC2B5\uB2C8\uB2E4!! -Commands.xprate.proper.0=\uACBD\uD5D8\uCE58 \uBC30\uC728 \uC774\uBCA4\uD2B8\uB97C \uC0AC\uC6A9\uBC95: [[WHITE]]/xprate <\uBC30\uC728> -Commands.xprate.proper.1=\uACBD\uD5D8\uCE58 \uBC30\uC728\uC744 \uCD08\uAE30\uD654 \uBC29\uBC95: [[WHITE]]/xprate reset -Commands.xprate.proper.2=\uC774\uAC83\uC740 XP \uC774\uBCA4\uD2B8\uC778\uC9C0 \uC544\uB2CC\uC9C0 true \uB610\uB294 false\uB85C \uB098\uD0C0\uB0B4\uAE30 \uC704\uD574 \uC9C0\uC815\uD558\uC2ED\uC2DC\uC624 -Commands.xprate.started.0=[[GOLD]]mcMMO \uACBD\uD5D8\uCE58 \uC774\uBCA4\uD2B8\uAC00 \uC2DC\uC791\uB418\uC5C8\uC2B5\uB2C8\uB2E4! -Commands.xprate.started.1=[[GOLD]]mcMMO \uACBD\uD5D8\uCE58 \uBC30\uC728\uC740 {0}\uBC30 \uC785\uB2C8\uB2E4! -XPRate.Event= [[GOLD]]mcMMO \uB294 \uD604\uC7AC \uACBD\uD5D8\uCE58 \uC774\uBCA4\uD2B8 \uC911\uC785\uB2C8\uB2E4! \uACBD\uD5D8\uCE58\uB294 {0}\uBC30 \uC785\uB2C8\uB2E4! +Commands.XPGain.Acrobatics=떨어지기 +Commands.XPGain.Alchemy=포션 양조하기 +Commands.XPGain.Archery=몬스터 공격하기 +Commands.XPGain.Axes=몬스터 공격하기 +Commands.XPGain.Child=상위 스킬들로 부터 레벨들을 얻습니다 +Commands.XPGain.Excavation=땅 파거나 보물 발견하기 +Commands.XPGain.Fishing=낚시하기 +Commands.XPGain.Herbalism=식물 수집하기 +Commands.XPGain.Mining=돌이나 광석 캐기 +Commands.XPGain.Repair=수리하기 +Commands.XPGain.Swords=몬스터 공격하기 +Commands.XPGain.Taming=동물을 조련하거나, 조련된 동물로 사냥하기 +Commands.XPGain.Unarmed=몬스터 공격하기 +Commands.XPGain.Woodcutting=나무 자르기 +Commands.XPGain=&8경험치 얻는 방법: &f{0} +Commands.xplock.locked=&6당신의 경험치 바는 {0}로 잠겼습니다! +Commands.xplock.unlocked=&6당신의 경험치 바는 &a잠금 해제되었습니다&6! +Commands.xprate.modified=경험치 배율이 {0}배로 수정되었습니다 +Commands.xprate.over=mcMMO 경험치 이벤트가 종료되었습니다!! +Commands.xprate.proper.0=경험치 배율 이벤트를 사용법: &f/xprate <배율> +Commands.xprate.proper.1=경험치 배율을 초기화 방법: &f/xprate reset +Commands.xprate.proper.2=이것은 XP 이벤트인지 아닌지 true 또는 false로 나타내기 위해 지정하십시오 +Commands.xprate.started.0=&6mcMMO 경험치 이벤트가 시작되었습니다! +Commands.xprate.started.1=&6mcMMO 경험치 배율은 {0}배 입니다! +XPRate.Event= &6mcMMO 는 현재 경험치 이벤트 중입니다! 경험치는 {0}배 입니다! #EFFECTS ##generic -Effects.Effects=\uD6A8\uACFC -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} +Effects.Effects=효과 +Effects.Child=&8LVL: &a{0} +Effects.Level=&8LVL: &a{0} &3XP&e(&6{1}&e/&6{2}&e) +Effects.Parent= &6{0} - +Effects.Template=&3{0}: &a{1} #GUIDES -Guides.Available=[[GRAY]]{0} \uAC00\uC774\uB4DC\uAC00 \uC788\uC2B5\uB2C8\uB2E4 - \uD0C0\uC785 /{1} ? [\uD398\uC774\uC9C0] -Guides.Header=[[GOLD]]-=[[GREEN]]{0} \uAC00\uC774\uB4DC[[GOLD]]=- -Guides.Page.Invalid=\uC62C\uBC14\uB978 \uD398\uC774\uC9C0 \uBC88\uD638\uAC00 \uC544\uB2D9\uB2C8\uB2E4! -Guides.Page.OutOfRange=\uADF8 \uD398\uC774\uC9C0\uB294 \uC874\uC7AC\uD558\uC9C0 \uC54A\uC2B5\uB2C8\uB2E4, \uC624\uC9C1 \uCD1D {0} \uD398\uC774\uC9C0\uAC00 \uC788\uC2B5\uB2C8\uB2E4. -Guides.Usage= \uC0AC\uC6A9\uBC95 /{0} ? [\uD398\uC774\uC9C0] +Guides.Available=&7{0} 가이드가 있습니다 - 타입 /{1} ? [페이지] +Guides.Header=&6-=&a{0} 가이드&6=- +Guides.Page.Invalid=올바른 페이지 번호가 아닙니다! +Guides.Page.OutOfRange=그 페이지는 존재하지 않습니다, 오직 총 {0} 페이지가 있습니다. +Guides.Usage= 사용법 /{0} ? [페이지] ##Acrobatics -Guides.Acrobatics.Section.0=[[DARK_AQUA]]\uACE1\uC608\uC5D0 \uB300\uD558\uC5EC:\n[[YELLOW]]\uACE1\uC608\uB294 mcMMO\uC758 \uC6B0\uC640\uD558\uAC8C \uC6C0\uC9C1\uC774\uB294 \uC608\uC220\uC785\uB2C8\uB2E4.\n[[YELLOW]]\uC804\uD22C \uD2B9\uD61C\uC640 \uD658\uACBD \uC190\uC0C1 \uD2B9\uD61C\uB97C \uC99D\uAC00\uC2DC\uD0B5\uB2C8\uB2E4.\n\n[[DARK_AQUA]]XP \uC5BB\uAE30:\n[[YELLOW]]\uC774 \uC2A4\uD0AC\uC758 XP\uB97C \uC5BB\uC744\uB824\uBA74 \uC804\uD22C\uB098 \uC0DD\uC874\uC5D0\uC11C \uD53C\uD574\uB97C \n[[YELLOW]]\uC785\uB294 \uB099\uD558\uC5D0\uC11C \uCC29\uC9C0 \uD589\uB3D9\uC774 \uC694\uAD6C\uB429\uB2C8\uB2E4. -Guides.Acrobatics.Section.1=[[DARK_AQUA]]\uC5B4\uB5BB\uAC8C \uAD6C\uB974\uAE30\uB97C \uD558\uB098\uC694?\n[[YELLOW]]\uB2F9\uC2E0\uC774 \uB099\uD558 \uD53C\uD574\uB97C \uBC1B\uC744 \uB54C \uD53C\uD574\uB97C \uBB34\uD6A8\uD654\uD560\n[[YELLOW]]\uC9C0\uC18D\uC801\uC778 \uAE30\uD68C\uB97C \uAC00\uC9C0\uAC8C \uB429\uB2C8\uB2E4. \uCB48\uAD6C\uB9AC\uAE30 \uBC84\uD2BC\uC744 \uB204\uB974\uACE0 \uC788\uC73C\uBA74\n[[YELLOW]]\uB5A8\uC5B4\uC9C0\uB294 \uB3D9\uC548 \uB450\uBC30\uC758 \uAE30\uD68C\uB97C \uAC00\uC9C0\uAC8C \uB429\uB2C8\uB2E4.\n[[YELLOW]]This triggers a Graceful Roll instead of a standard one.\n[[YELLOW]]Graceful Rolls are like regular rolls but are twice as likely to\n[[YELLOW]]occur and provide more damage safety than regular rolls.\n[[YELLOW]]Rolling chance is tied to your skill level -Guides.Acrobatics.Section.2=[[DARK_AQUA]]\uC5B4\uB5BB\uAC8C \uD68C\uD53C\uB97C \uD558\uB098\uC694?\n[[YELLOW]]\uD68C\uD53C\uB294 \uB2F9\uC2E0\uC774 \uC804\uD22C\uC5D0\uC11C \uC0C1\uCC98\uB97C \uC785\uC744 \uB54C \uC785\uB294\n[[YELLOW]]\uD53C\uD574\uB97C \uBC18\uAC10\uC2DC\uD0A4\uB294 \uC9C0\uC18D\uC801\uC778 \uAE30\uD68C\uC785\uB2C8\uB2E4.\n[[YELLOW]]\uC774\uAC83\uC740 \uB2F9\uC2E0\uC758 \uC2A4\uD0AC \uB808\uBCA8\uACFC \uC5F0\uACB0\uB429\uB2C8\uB2E4. +Guides.Acrobatics.Section.0=&3곡예에 대하여:\n&e곡예는 mcMMO의 우와하게 움직이는 예술입니다.\n&e전투 특혜와 환경 손상 특혜를 증가시킵니다.\n\n&3XP 얻기:\n&e이 스킬의 XP를 얻을려면 전투나 생존에서 피해를 \n&e입는 낙하에서 착지 행동이 요구됩니다. +Guides.Acrobatics.Section.1=&3어떻게 구르기를 하나요?\n&e당신이 낙하 피해를 받을 때 피해를 무효화할\n&e지속적인 기회를 가지게 됩니다. 쭈구리기 버튼을 누르고 있으면\n&e떨어지는 동안 두배의 기회를 가지게 됩니다.\n&eThis triggers a Graceful Roll instead of a standard one.\n&eGraceful Rolls are like regular rolls but are twice as likely to\n&eoccur and provide more damage safety than regular rolls.\n&eRolling chance is tied to your skill level +Guides.Acrobatics.Section.2=&3어떻게 회피를 하나요?\n&e회피는 당신이 전투에서 상처를 입을 때 입는\n&e피해를 반감시키는 지속적인 기회입니다.\n&e이것은 당신의 스킬 레벨과 연결됩니다. ##Alchemy -Guides.Alchemy.Section.0=[[DARK_AQUA]]About Alchemy:\n[[YELLOW]]Alchemy is about brewing potions.\n[[YELLOW]]It provides a speed increase in the potion brew time, as well\n[[YELLOW]]as the addition of new (previously) unobtainable potions.\n\n\n[[DARK_AQUA]]XP GAIN:\n[[YELLOW]]To gain XP in this skill you need to brew potions. -Guides.Alchemy.Section.1=[[DARK_AQUA]]How does Catalysis work?\n[[YELLOW]]Catalysis speeds of the brewing process, with a\n[[YELLOW]]max speed of 4x at level 1000.\n[[YELLOW]]This ability is unlocked at level 100 by default. -Guides.Alchemy.Section.2=[[DARK_AQUA]]How does Concoctions work?\n[[YELLOW]]Concoctions allows brewing of more potions with custom ingredients.\n[[YELLOW]]Which special ingredients are unlocked is determined\n[[YELLOW]]by your Rank. There are 8 ranks to unlock. -Guides.Alchemy.Section.3=[[DARK_AQUA]]Concoctions tier 1 ingredients:\n[[YELLOW]]Blaze Powder, Fermented Spider Eye, Ghast Tear, Redstone,\n[[YELLOW]]Glowstone Dust, Sugar, Glistering Melon, Golden Carrot,\n[[YELLOW]]Magma Cream, Nether Wart, Spider Eye, Suplhur, Water Lily,\n[[YELLOW]]Pufferfish\n[[YELLOW]](Vanilla Potions) -Guides.Alchemy.Section.4=[[DARK_AQUA]]Concoctions tier 2 ingredients:\n[[YELLOW]]Carrot (Potion of Haste)\n[[YELLOW]]Slimeball (Potion of Dullness)\n\n[[DARK_AQUA]]Concoctions tier 3 ingredients:\n[[YELLOW]]Quartz (Potion of Absorption)\n[[YELLOW]]Red Mushroom (Potion of Leaping) -Guides.Alchemy.Section.5=[[DARK_AQUA]]Concoctions tier 4 ingredients:\n[[YELLOW]]Apple (Potion of Health Boost)\n[[YELLOW]]Rotten Flesh (Potion of Hunger)\n\n[[DARK_AQUA]]Concoctions tier 5 ingredients:\n[[YELLOW]]Brown Mushroom (Potion of Nausea)\n[[YELLOW]]Ink Sack (Potion of Blindness) -Guides.Alchemy.Section.6=[[DARK_AQUA]]Concoctions tier 6 ingredients:\n[[YELLOW]]Fern (Potion of Saturation)\n\n[[DARK_AQUA]]Concoctions tier 7 ingredients:\n[[YELLOW]]Poisonous Potato (Potion of Decay)\n\n[[DARK_AQUA]]Concoctions tier 8 ingredients:\n[[YELLOW]]Regular Golden Apple (Potion of Resistance) +Guides.Alchemy.Section.0=&3About Alchemy:\n&eAlchemy is about brewing potions.\n&eIt provides a speed increase in the potion brew time, as well\n&eas the addition of new (previously) unobtainable potions.\n\n\n&3XP GAIN:\n&eTo gain XP in this skill you need to brew potions. +Guides.Alchemy.Section.1=&3How does Catalysis work?\n&eCatalysis speeds of the brewing process, with a\n&emax speed of 4x at level 1000.\n&eThis ability is unlocked at level 100 by default. +Guides.Alchemy.Section.2=&3How does Concoctions work?\n&eConcoctions allows brewing of more potions with custom ingredients.\n&eWhich special ingredients are unlocked is determined\n&eby your Rank. There are 8 ranks to unlock. +Guides.Alchemy.Section.3=&3Concoctions tier 1 ingredients:\n&eBlaze Powder, Fermented Spider Eye, Ghast Tear, Redstone,\n&eGlowstone Dust, Sugar, Glistering Melon, Golden Carrot,\n&eMagma Cream, Nether Wart, Spider Eye, Suplhur, Water Lily,\n&ePufferfish\n&e(Vanilla Potions) +Guides.Alchemy.Section.4=&3Concoctions tier 2 ingredients:\n&eCarrot (Potion of Haste)\n&eSlimeball (Potion of Dullness)\n\n&3Concoctions tier 3 ingredients:\n&eQuartz (Potion of Absorption)\n&eRed Mushroom (Potion of Leaping) +Guides.Alchemy.Section.5=&3Concoctions tier 4 ingredients:\n&eApple (Potion of Health Boost)\n&eRotten Flesh (Potion of Hunger)\n\n&3Concoctions tier 5 ingredients:\n&eBrown Mushroom (Potion of Nausea)\n&eInk Sack (Potion of Blindness) +Guides.Alchemy.Section.6=&3Concoctions tier 6 ingredients:\n&eFern (Potion of Saturation)\n\n&3Concoctions tier 7 ingredients:\n&ePoisonous Potato (Potion of Decay)\n\n&3Concoctions tier 8 ingredients:\n&eRegular Golden Apple (Potion of Resistance) ##Archery -Guides.Archery.Section.0=[[DARK_AQUA]]\uAD81\uC220\uC5D0 \uB300\uD558\uC5EC:\n[[YELLOW]]\uAD81\uC220\uC740 \uD65C\uACFC \uD654\uC0B4\uB85C \uC3D8\uB294 \uAC83\uC744 \uB73B\uD569\uB2C8\uB2E4.\n[[YELLOW]]\uAD81\uC220\uC740 PVP\uC5D0\uC11C \uB2F9\uC2E0\uC774 \uC801\uC744 \uD604\uD639\uC2DC\uD0A4\uB294 \uB2A5\uB825\uACFC\n[[YELLOW]]\uB808\uBCA8 \uD06C\uAE30\uC758 \uB370\uBBF8\uC9C0 \uBD80\uC2A4\uD130\uB97C \uAC19\uC740 \uAC83\uC73C\uB85C\n[[YELLOW]]\uC804\uD22C \uBCF4\uB108\uC2A4\uB97C \uC81C\uACF5\uD569\uB2C8\uB2E4. In addition to this, you can retrieve\n[[YELLOW]]some of your spent arrows from the corpses of your foes.\n\n\n[[DARK_AQUA]]XP GAIN:\n[[YELLOW]]To gain XP in this skill you need to shoot mobs or\n[[YELLOW]]other players. -Guides.Archery.Section.1=[[DARK_AQUA]]How does Skill Shot work?\n[[YELLOW]]Skill Shot provides additional damage to your shots.\n[[YELLOW]]The bonus damage from Skill Shot increases as you\n[[YELLOW]]level in Archery.\n[[YELLOW]]With the default settings, your archery damage increases 10%\n[[YELLOW]]every 50 levels, to a maximum of 200% bonus damage. -Guides.Archery.Section.2=[[DARK_AQUA]]How does Daze work?\n[[YELLOW]]You have a passive chance to daze other players when\n[[YELLOW]]you shoot them. When Daze triggers it forces your opponents\n[[YELLOW]]to look straight up for a short duration.\n[[YELLOW]]A Daze shot also deals an additional 4 damage (2 hearts). -Guides.Archery.Section.3=[[DARK_AQUA]]How does Arrow Retrieval work?\n[[YELLOW]]You have a passive chance to retrieve some of your arrows\n[[YELLOW]]when you kill a mob with your bow.\n[[YELLOW]]This chance increases as you level in Archery.\n[[YELLOW]]By default, this ability increases by 0.1% per level, up to 100%\n[[YELLOW]]at level 1000. +Guides.Archery.Section.0=&3궁술에 대하여:\n&e궁술은 활과 화살로 쏘는 것을 뜻합니다.\n&e궁술은 PVP에서 당신이 적을 현혹시키는 능력과\n&e레벨 크기의 데미지 부스터를 같은 것으로\n&e전투 보너스를 제공합니다. In addition to this, you can retrieve\n&esome of your spent arrows from the corpses of your foes.\n\n\n&3XP GAIN:\n&eTo gain XP in this skill you need to shoot mobs or\n&eother players. +Guides.Archery.Section.1=&3How does Skill Shot work?\n&eSkill Shot provides additional damage to your shots.\n&eThe bonus damage from Skill Shot increases as you\n&elevel in Archery.\n&eWith the default settings, your archery damage increases 10%\n&eevery 50 levels, to a maximum of 200% bonus damage. +Guides.Archery.Section.2=&3How does Daze work?\n&eYou have a passive chance to daze other players when\n&eyou shoot them. When Daze triggers it forces your opponents\n&eto look straight up for a short duration.\n&eA Daze shot also deals an additional 4 damage (2 hearts). +Guides.Archery.Section.3=&3How does Arrow Retrieval work?\n&eYou have a passive chance to retrieve some of your arrows\n&ewhen you kill a mob with your bow.\n&eThis chance increases as you level in Archery.\n&eBy default, this ability increases by 0.1% per level, up to 100%\n&eat level 1000. ##Axes -Guides.Axes.Section.0=[[DARK_AQUA]]About Axes:\n[[YELLOW]]With the Axes skill you can use your axe for much more then\n[[YELLOW]]just deforesting! You can hack and chop away at mobs\n[[YELLOW]]and players to gain XP, hitting mobs with the effect of\n[[YELLOW]]knockback and inflicting DEADLY criticals on mobs and players.\n[[YELLOW]]Your axe also becomes a hand-held woodchipper,\n[[YELLOW]]breaking down the enemy's armor with ease as your level\n[[YELLOW]]increases.\n[[DARK_AQUA]]XP GAIN:\n[[YELLOW]]To gain XP in this skill you need hit other mobs or players\n[[YELLOW]]with an Axe. -Guides.Axes.Section.1=[[DARK_AQUA]]How does Skull Splitter work?\n[[YELLOW]]This ability allows you to deal an AoE (Area of Effect) hit.\n[[YELLOW]]This AoE hit will deal half as much damage as you did to the\n[[YELLOW]]main target, so it's great for clearing out large piles of mobs. -Guides.Axes.Section.2=[[DARK_AQUA]]How does Critical Strikes work?\n[[YELLOW]]Critical Strikes is a passive ability which gives players a\n[[YELLOW]]chance to deal additional damage.\n[[YELLOW]]With the default settings, every 2 skill levels in Axes awards a\n[[YELLOW]]0.1% chance to deal a Critical Strike, causing 2.0 times damage\n[[YELLOW]]to mobs or 1.5 times damage against other players. -Guides.Axes.Section.3=[[DARK_AQUA]]How does Axe Mastery work?\n[[YELLOW]]Axe Mastery is a passive ability that will add additional damage\n[[YELLOW]]to your hits when using Axes.\n[[YELLOW]]By default, the bonus damage increases by 1 every 50 levels,\n[[YELLOW]]up to a cap of 4 extra damage at level 200. -Guides.Axes.Section.4=[[DARK_AQUA]]How does Armor Impact work?\n[[YELLOW]]Strike with enough force to shatter armor!\n[[YELLOW]]Armor Impact has a passive chance to damage your\n[[YELLOW]]opponent's armor. This damage increases as you level in Axes. -Guides.Axes.Section.5=[[DARK_AQUA]]How does Greater Impact work?\n[[YELLOW]]You have a passive chance to achieve a greater impact when\n[[YELLOW]]hitting mobs or players with your axe.\n[[YELLOW]]By default this chance is 25%. This passive ability has an\n[[YELLOW]]extreme knockback effect, similar to the Knockback II\n[[YELLOW]]enchantment. In addition, it deals bonus damage to the target. +Guides.Axes.Section.0=&3About Axes:\n&eWith the Axes skill you can use your axe for much more then\n&ejust deforesting! You can hack and chop away at mobs\n&eand players to gain XP, hitting mobs with the effect of\n&eknockback and inflicting DEADLY criticals on mobs and players.\n&eYour axe also becomes a hand-held woodchipper,\n&ebreaking down the enemy's armor with ease as your level\n&eincreases.\n&3XP GAIN:\n&eTo gain XP in this skill you need hit other mobs or players\n&ewith an Axe. +Guides.Axes.Section.1=&3How does Skull Splitter work?\n&eThis ability allows you to deal an AoE (Area of Effect) hit.\n&eThis AoE hit will deal half as much damage as you did to the\n&emain target, so it's great for clearing out large piles of mobs. +Guides.Axes.Section.2=&3How does Critical Strikes work?\n&eCritical Strikes is a passive ability which gives players a\n&echance to deal additional damage.\n&eWith the default settings, every 2 skill levels in Axes awards a\n&e0.1% chance to deal a Critical Strike, causing 2.0 times damage\n&eto mobs or 1.5 times damage against other players. +Guides.Axes.Section.3=&3How does Axe Mastery work?\n&eAxe Mastery is a passive ability that will add additional damage\n&eto your hits when using Axes.\n&eBy default, the bonus damage increases by 1 every 50 levels,\n&eup to a cap of 4 extra damage at level 200. +Guides.Axes.Section.4=&3How does Armor Impact work?\n&eStrike with enough force to shatter armor!\n&eArmor Impact has a passive chance to damage your\n&eopponent's armor. This damage increases as you level in Axes. +Guides.Axes.Section.5=&3How does Greater Impact work?\n&eYou have a passive chance to achieve a greater impact when\n&ehitting mobs or players with your axe.\n&eBy default this chance is 25%. This passive ability has an\n&eextreme knockback effect, similar to the Knockback II\n&eenchantment. In addition, it deals bonus damage to the target. ##Excavation -Guides.Excavation.Section.0=[[DARK_AQUA]]About Excavation:\n[[YELLOW]]Excavation is the act of digging up dirt to find treasures.\n[[YELLOW]]By excavating the land you will find treasures.\n[[YELLOW]]The more you do this the more treasures you can find.\n\n[[DARK_AQUA]]XP GAIN:\n[[YELLOW]]To gain XP in this skill you must dig with a shovel in hand.\n[[YELLOW]]Only certain materials can be dug up for treasures and XP. -Guides.Excavation.Section.1=[[DARK_AQUA]]Compatible Materials:\n[[YELLOW]]Grass, Dirt, Sand, Clay, Gravel, Mycelium, Soul Sand, Snow -Guides.Excavation.Section.2=[[DARK_AQUA]]How to use Giga Drill Breaker:\n[[YELLOW]]With a shovel in hand right click to ready your tool.\n[[YELLOW]]Once in this state you have about 4 seconds to make\n[[YELLOW]]contact with Excavation compatible materials this will\n[[YELLOW]]activate Giga Drill Breaker. -Guides.Excavation.Section.3=[[DARK_AQUA]]What is Giga Drill Breaker?\n[[YELLOW]]Giga Drill Breaker is an ability with a cooldown\n[[YELLOW]]tied to Excavation skill. It triples your chance\n[[YELLOW]]of finding treasures and enables instant break\n[[YELLOW]]on Excavation materials. -Guides.Excavation.Section.4=[[DARK_AQUA]]How does Treasure Hunter work?\n[[YELLOW]]Every possible treasure for Excavation has its own\n[[YELLOW]]skill level requirement for it to drop, as a result it's\n[[YELLOW]]difficult to say how much it is helping you.\n[[YELLOW]]Just keep in mind that the higher your Excavation skill\n[[YELLOW]]is, the more treasures that can be found.\n[[YELLOW]]And also keep in mind that each type of Excavation\n[[YELLOW]]compatible material has its own unique list of treasures.\n[[YELLOW]]In other words you will find different treasures in Dirt\n[[YELLOW]]than you would in Gravel. -Guides.Excavation.Section.5=[[DARK_AQUA]]Notes about Excavation:\n[[YELLOW]]Excavation drops are completely customizeable\n[[YELLOW]]So results vary server to server. +Guides.Excavation.Section.0=&3About Excavation:\n&eExcavation is the act of digging up dirt to find treasures.\n&eBy excavating the land you will find treasures.\n&eThe more you do this the more treasures you can find.\n\n&3XP GAIN:\n&eTo gain XP in this skill you must dig with a shovel in hand.\n&eOnly certain materials can be dug up for treasures and XP. +Guides.Excavation.Section.1=&3Compatible Materials:\n&eGrass, Dirt, Sand, Clay, Gravel, Mycelium, Soul Sand, Snow +Guides.Excavation.Section.2=&3How to use Giga Drill Breaker:\n&eWith a shovel in hand right click to ready your tool.\n&eOnce in this state you have about 4 seconds to make\n&econtact with Excavation compatible materials this will\n&eactivate Giga Drill Breaker. +Guides.Excavation.Section.3=&3What is Giga Drill Breaker?\n&eGiga Drill Breaker is an ability with a cooldown\n&etied to Excavation skill. It triples your chance\n&eof finding treasures and enables instant break\n&eon Excavation materials. +Guides.Excavation.Section.4=&3How does Treasure Hunter work?\n&eEvery possible treasure for Excavation has its own\n&eskill level requirement for it to drop, as a result it's\n&edifficult to say how much it is helping you.\n&eJust keep in mind that the higher your Excavation skill\n&eis, the more treasures that can be found.\n&eAnd also keep in mind that each type of Excavation\n&ecompatible material has its own unique list of treasures.\n&eIn other words you will find different treasures in Dirt\nðan you would in Gravel. +Guides.Excavation.Section.5=&3Notes about Excavation:\n&eExcavation drops are completely customizeable\n&eSo results vary server to server. ##Fishing -Guides.Fishing.Section.0=[[DARK_AQUA]]About Fishing:\n[[YELLOW]]With the Fishing skill, Fishing is exciting again!\n[[YELLOW]]Find hidden treasures, and shake items off mobs.\n\n[[DARK_AQUA]]XP GAIN:\n[[YELLOW]]Catch fish. -Guides.Fishing.Section.1=[[DARK_AQUA]]How does Treasure Hunter work?\n[[YELLOW]]This ability allows you to find treasure from fishing \n[[YELLOW]]with a small chance of the items being enchanted.\n[[YELLOW]]Every possible treasure for Fishing has a chance\n[[YELLOW]]to drop on any level. It depends however\n[[YELLOW]]what the rarity of the item is how often it will drop.\n[[YELLOW]]The higher your Fishing skill is, the better\n[[YELLOW]]your chances are to find better treasures. -Guides.Fishing.Section.2=[[DARK_AQUA]]How does Ice Fishing work?\n[[YELLOW]]This passive skill allows you to fish in ice lakes!\n[[YELLOW]]Cast your fishing rod in an ice lake and the ability will\n[[YELLOW]]create a small hole in the ice to fish in. -Guides.Fishing.Section.3=[[DARK_AQUA]]How does Master Angler work?\n[[YELLOW]]This passive skill increases the bite chance while fishing.\n[[YELLOW]]When you've unlocked this ability, fishing while in\n[[YELLOW]]a boat or when an ocean biome doubles the bite chance. -Guides.Fishing.Section.4=[[DARK_AQUA]]How does Shake work?\n[[YELLOW]]This active ability allows you to shake items loose from mobs\n[[YELLOW]]by hooking them with the fishing rod. \n[[YELLOW]]Mobs will drop items they would normally drop on death.\n[[YELLOW]]It is also possible to acquire mob skulls, which are normally \n[[YELLOW]]unobtainable in survival mode. -Guides.Fishing.Section.5=[[DARK_AQUA]]How does Fisherman's Diet work?\n[[YELLOW]]This passive skill increases the amount of hunger restored \n[[YELLOW]]from eating fish. -Guides.Fishing.Section.6=[[DARK_AQUA]]Notes about Fishing:\n[[YELLOW]]Fishing drops are completely customizable,\n[[YELLOW]]so results vary server to server. +Guides.Fishing.Section.0=&3About Fishing:\n&eWith the Fishing skill, Fishing is exciting again!\n&eFind hidden treasures, and shake items off mobs.\n\n&3XP GAIN:\n&eCatch fish. +Guides.Fishing.Section.1=&3How does Treasure Hunter work?\n&eThis ability allows you to find treasure from fishing \n&ewith a small chance of the items being enchanted.\n&eEvery possible treasure for Fishing has a chance\n&eto drop on any level. It depends however\n&ewhat the rarity of the item is how often it will drop.\n&eThe higher your Fishing skill is, the better\n&eyour chances are to find better treasures. +Guides.Fishing.Section.2=&3How does Ice Fishing work?\n&eThis passive skill allows you to fish in ice lakes!\n&eCast your fishing rod in an ice lake and the ability will\n&ecreate a small hole in the ice to fish in. +Guides.Fishing.Section.3=&3How does Master Angler work?\n&eThis passive skill increases the bite chance while fishing.\n&eWhen you've unlocked this ability, fishing while in\n&ea boat or when an ocean biome doubles the bite chance. +Guides.Fishing.Section.4=&3How does Shake work?\n&eThis active ability allows you to shake items loose from mobs\n&eby hooking them with the fishing rod. \n&eMobs will drop items they would normally drop on death.\n&eIt is also possible to acquire mob skulls, which are normally \n&eunobtainable in survival mode. +Guides.Fishing.Section.5=&3How does Fisherman's Diet work?\n&eThis passive skill increases the amount of hunger restored \n&efrom eating fish. +Guides.Fishing.Section.6=&3Notes about Fishing:\n&eFishing drops are completely customizable,\n&eso results vary server to server. ##Herbalism -Guides.Herbalism.Section.0=[[DARK_AQUA]]About Herbalism:\n[[YELLOW]]Herbalism is about collecting herbs and plants.\n\n\n[[DARK_AQUA]]XP GAIN:\n[[YELLOW]]Collect plants and herbs. -Guides.Herbalism.Section.1=[[DARK_AQUA]]Compatible Blocks\n[[YELLOW]]Wheat, Potatoes, Carrots, Melons, \n[[YELLOW]]Pumpkins, Sugar Canes, Cocoa Beans, Flowers, Cacti, Mushrooms,\n[[YELLOW]]Nether Wart, Lily Pads, and Vines. -Guides.Herbalism.Section.2=[[DARK_AQUA]]How does Green Terra work?\n[[YELLOW]]Green Terra is an active ability, you can right-click\n[[YELLOW]]while holding a hoe to activate Green Terra.\n[[YELLOW]]Green Terra grants players a chance to get 3x drops from\n[[YELLOW]]harvesting plants. It also gives players the ability to\n[[YELLOW]]spread life into blocks and transform them using seeds\n[[YELLOW]]from your inventory. -Guides.Herbalism.Section.3=[[DARK_AQUA]]How does Green Thumb (Crops) work?\n[[YELLOW]]This passive ability will automatically replant crops when\n[[YELLOW]]harvesting.\n[[YELLOW]]Your chance of success depends on your Herbalism skill. -Guides.Herbalism.Section.4=[[DARK_AQUA]]How does Green Thumb (Cobble/Stone Brick/Dirt) work?\n[[YELLOW]]This active ability allows you to turn blocks into their\n[[YELLOW]]"plant-related" counterparts. You can do this by right-clicking\n[[YELLOW]]a block, while holding seeds. This will consume 1 seed. -Guides.Herbalism.Section.5=[[DARK_AQUA]]How does Farmer's Diet work?\n[[YELLOW]]This passive skill increases the amount of hunger restored \n[[YELLOW]]when eating Bread, Cookies, Melons, Mushroom Soup, Carrots,\n[[YELLOW]]and Potatoes. -Guides.Herbalism.Section.6=[[DARK_AQUA]]How does Hylian Luck work?\n[[YELLOW]]This passive ability gives you a chance to find rare items\n[[YELLOW]]when certain blocks are broken with a sword. -Guides.Herbalism.Section.7=[[DARK_AQUA]]How do Double Drops work?\n[[YELLOW]]This passive ability gives players more yield from their\n[[YELLOW]]harvests. +Guides.Herbalism.Section.0=&3About Herbalism:\n&eHerbalism is about collecting herbs and plants.\n\n\n&3XP GAIN:\n&eCollect plants and herbs. +Guides.Herbalism.Section.1=&3Compatible Blocks\n&eWheat, Potatoes, Carrots, Melons, \n&ePumpkins, Sugar Canes, Cocoa Beans, Flowers, Cacti, Mushrooms,\n&eNether Wart, Lily Pads, and Vines. +Guides.Herbalism.Section.2=&3How does Green Terra work?\n&eGreen Terra is an active ability, you can right-click\n&ewhile holding a hoe to activate Green Terra.\n&eGreen Terra grants players a chance to get 3x drops from\n&eharvesting plants. It also gives players the ability to\n&espread life into blocks and transform them using seeds\n&efrom your inventory. +Guides.Herbalism.Section.3=&3How does Green Thumb (Crops) work?\n&eThis passive ability will automatically replant crops when\n&eharvesting.\n&eYour chance of success depends on your Herbalism skill. +Guides.Herbalism.Section.4=&3How does Green Thumb (Cobble/Stone Brick/Dirt) work?\n&eThis active ability allows you to turn blocks into their\n&e"plant-related" counterparts. You can do this by right-clicking\n&ea block, while holding seeds. This will consume 1 seed. +Guides.Herbalism.Section.5=&3How does Farmer's Diet work?\n&eThis passive skill increases the amount of hunger restored \n&ewhen eating Bread, Cookies, Melons, Mushroom Soup, Carrots,\n&eand Potatoes. +Guides.Herbalism.Section.6=&3How does Hylian Luck work?\n&eThis passive ability gives you a chance to find rare items\n&ewhen certain blocks are broken with a sword. +Guides.Herbalism.Section.7=&3How do Double Drops work?\n&eThis passive ability gives players more yield from their\n&eharvests. ##Mining -Guides.Mining.Section.0=[[DARK_AQUA]]About Mining:\n[[YELLOW]]Mining consists of mining stone and ores. It provides bonuses\n[[YELLOW]]to the amount of materials dropped while mining.\n\n[[DARK_AQUA]]XP GAIN:\n[[YELLOW]]To gain XP in this skill, you must mine with a pickaxe in hand.\n[[YELLOW]]Only certain blocks award XP. -Guides.Mining.Section.1=[[DARK_AQUA]]Compatible Materials:\n[[YELLOW]]Stone, Coal Ore, Iron Ore, Gold Ore, Diamond Ore, Redstone Ore,\n[[YELLOW]]Lapis Ore, Obsidian, Mossy Cobblestone, Ender Stone,\n[[YELLOW]]Glowstone, and Netherrack. -Guides.Mining.Section.2=[[DARK_AQUA]]How to use Super Breaker:\n[[YELLOW]]With a pickaxe in your hand, right click to ready your tool.\n[[YELLOW]]Once in this state, you have about 4 seconds to make contact\n[[YELLOW]]with Mining compatible materials, which will activate Super\n[[YELLOW]]Breaker. -Guides.Mining.Section.3=[[DARK_AQUA]]What is Super Breaker?\n[[YELLOW]]Super Breaker is an ability with a cooldown tied to the Mining\n[[YELLOW]]skill. It triples your chance of extra items dropping and\n[[YELLOW]]enables instant break on Mining materials. -Guides.Mining.Section.4=[[DARK_AQUA]]How to use Blast Mining:\n[[YELLOW]]With a detonator in hand, which is a flint & steel by default,\n[[YELLOW]]crouch and right-click on TNT from a distance. This will cause the TNT\n[[YELLOW]]to instantly explode. -Guides.Mining.Section.5=[[DARK_AQUA]]How does Blast Mining work?\n[[YELLOW]]Blast Mining is an ability with a cooldown tied to the Mining\n[[YELLOW]]skill. It gives bonuses when mining with TNT and allows you\n[[YELLOW]]to remote detonate TNT. There are three parts to Blast Mining.\n[[YELLOW]]The first part is Bigger Bombs, which increases blast radius.\n[[YELLOW]]The second is Demolitions Expert, which decreases damage\n[[YELLOW]]from TNT explosions. The third part simply increases the\n[[YELLOW]]amount of ores dropped from TNT and decreases the\n[[YELLOW]]debris dropped. +Guides.Mining.Section.0=&3About Mining:\n&eMining consists of mining stone and ores. It provides bonuses\n&eto the amount of materials dropped while mining.\n\n&3XP GAIN:\n&eTo gain XP in this skill, you must mine with a pickaxe in hand.\n&eOnly certain blocks award XP. +Guides.Mining.Section.1=&3Compatible Materials:\n&eStone, Coal Ore, Iron Ore, Gold Ore, Diamond Ore, Redstone Ore,\n&eLapis Ore, Obsidian, Mossy Cobblestone, Ender Stone,\n&eGlowstone, and Netherrack. +Guides.Mining.Section.2=&3How to use Super Breaker:\n&eWith a pickaxe in your hand, right click to ready your tool.\n&eOnce in this state, you have about 4 seconds to make contact\n&ewith Mining compatible materials, which will activate Super\n&eBreaker. +Guides.Mining.Section.3=&3What is Super Breaker?\n&eSuper Breaker is an ability with a cooldown tied to the Mining\n&eskill. It triples your chance of extra items dropping and\n&eenables instant break on Mining materials. +Guides.Mining.Section.4=&3How to use Blast Mining:\n&eWith a detonator in hand, which is a flint & steel by default,\n&ecrouch and right-click on TNT from a distance. This will cause the TNT\n&eto instantly explode. +Guides.Mining.Section.5=&3How does Blast Mining work?\n&eBlast Mining is an ability with a cooldown tied to the Mining\n&eskill. It gives bonuses when mining with TNT and allows you\n&eto remote detonate TNT. There are three parts to Blast Mining.\n&eThe first part is Bigger Bombs, which increases blast radius.\n&eThe second is Demolitions Expert, which decreases damage\n&efrom TNT explosions. The third part simply increases the\n&eamount of ores dropped from TNT and decreases the\n&edebris dropped. ##Repair -Guides.Repair.Section.0=[[DARK_AQUA]]About Repair:\n[[YELLOW]]Repair allows you to use an iron block to repair armor and\n[[YELLOW]]tools, or a gold block to salvage armor and tools.\n\n[[DARK_AQUA]]XP GAIN:\n[[YELLOW]]Repair tools or armor using the mcMMO Anvil. This is an\n[[YELLOW]]iron block by default and should not be confused with\n[[YELLOW]]the Vanilla Minecraft Anvil. -Guides.Repair.Section.1=[[DARK_AQUA]]How can I use Repair?\n[[YELLOW]]Place down a mcMMO Anvil and right-click to repair the item \n[[YELLOW]]you're currently holding. This consumes 1 item on every use. -Guides.Repair.Section.2=[[DARK_AQUA]]How does Repair Mastery work?\n[[YELLOW]]Repair Mastery increases the repair amount. The extra amount\n[[YELLOW]]repaired is influenced by your Repair skill level. -Guides.Repair.Section.3=[[DARK_AQUA]]How does Super Repair work?\n[[YELLOW]]Super Repair is a passive ability. When repairing an item,\n[[YELLOW]]it grants players a chance to repair an item with\n[[YELLOW]]double effectiveness. -Guides.Repair.Section.4=[[DARK_AQUA]]How does Arcane Forging work?\n[[YELLOW]]This passive ability allows you to repair items with a certain\n[[YELLOW]]chance of maintaining its enchantments. The enchants may be\n[[YELLOW]]kept at their existing levels, downgraded to a lower level,\n[[YELLOW]]or lost entirely. +Guides.Repair.Section.0=&3About Repair:\n&eRepair allows you to use an iron block to repair armor and\n&etools, or a gold block to salvage armor and tools.\n\n&3XP GAIN:\n&eRepair tools or armor using the mcMMO Anvil. This is an\n&eiron block by default and should not be confused with\nðe Vanilla Minecraft Anvil. +Guides.Repair.Section.1=&3How can I use Repair?\n&ePlace down a mcMMO Anvil and right-click to repair the item \n&eyou're currently holding. This consumes 1 item on every use. +Guides.Repair.Section.2=&3How does Repair Mastery work?\n&eRepair Mastery increases the repair amount. The extra amount\n&erepaired is influenced by your Repair skill level. +Guides.Repair.Section.3=&3How does Super Repair work?\n&eSuper Repair is a passive ability. When repairing an item,\n&eit grants players a chance to repair an item with\n&edouble effectiveness. +Guides.Repair.Section.4=&3How does Arcane Forging work?\n&eThis passive ability allows you to repair items with a certain\n&echance of maintaining its enchantments. The enchants may be\n&ekept at their existing levels, downgraded to a lower level,\n&eor lost entirely. ##Salvage -Guides.Salvage.Section.0=[[DARK_AQUA]]About Salvage:\n[[YELLOW]]Salvage allows you to use an gold block to salvage armor and\n[[YELLOW]]tools.\n\n[[DARK_AQUA]]XP GAIN:\n[[YELLOW]]Salvage is a child skill of Repair and Fishing, your Salvage\n[[YELLOW]]skill level is based on your Fishing and Repair skill levels. -Guides.Salvage.Section.1=[[DARK_AQUA]]How can I use Salvage?\n[[YELLOW]]Place down a mcMMO Salvage Anvil and right-click to salvage\n[[YELLOW]]the item you're currently holding. This will break apart the item,\n[[YELLOW]]and give back materials used to craft the item.\n\n[[YELLOW]]For example, salvaging an iron pickaxe will give you iron bars. -Guides.Salvage.Section.2=[[DARK_AQUA]]How does Advanced Salvage work?\n[[YELLOW]]When unlocked, this ability allows you to salvage damaged items.\n[[YELLOW]]The yield percentage increases as you level up. A higher yield\n[[YELLOW]]means that you can get more materials back.\n[[YELLOW]]With advanced salvage you will always get 1 material back,\n[[YELLOW]]unless the item is too damaged. So you don't have to worry\n[[YELLOW]]about destroying items without getting anything in return. -Guides.Salvage.Section.3=[[DARK_AQUA]]To illustrate how this works, here's an example:\n[[YELLOW]]Let's say we salvage a gold pickaxe which is damaged for 20%,\n[[YELLOW]]this means that the maximum amount you could get is only 2\n[[YELLOW]](because the pick is crafted with 3 ingots - each worth\n[[YELLOW]]33,33% durability) which is equal to 66%. If your yield\n[[YELLOW]]percentage is below 66% you are not able to get 2 ingots.\n[[YELLOW]]If it is above this value you are able to gain the "full amount",\n[[YELLOW]]which means that you will get 2 ingots. -Guides.Salvage.Section.4=[[DARK_AQUA]]How does Arcane Salvage work?\n[[YELLOW]]This ability allows you to get enchanted books when salvaging\n[[YELLOW]]enchanted items. Depending on your level the chance of\n[[YELLOW]]successfully extracting a full or partial enchantment varies.\n\n[[YELLOW]]When an enchantment is partially extracted, the enchantment\n[[YELLOW]]book will have a lower level enchantment compared to what\n[[YELLOW]]it was on the item. +Guides.Salvage.Section.0=&3About Salvage:\n&eSalvage allows you to use an gold block to salvage armor and\n&etools.\n\n&3XP GAIN:\n&eSalvage is a child skill of Repair and Fishing, your Salvage\n&eskill level is based on your Fishing and Repair skill levels. +Guides.Salvage.Section.1=&3How can I use Salvage?\n&ePlace down a mcMMO Salvage Anvil and right-click to salvage\nðe item you're currently holding. This will break apart the item,\n&eand give back materials used to craft the item.\n\n&eFor example, salvaging an iron pickaxe will give you iron bars. +Guides.Salvage.Section.2=&3How does Advanced Salvage work?\n&eWhen unlocked, this ability allows you to salvage damaged items.\n&eThe yield percentage increases as you level up. A higher yield\n&emeans that you can get more materials back.\n&eWith advanced salvage you will always get 1 material back,\n&eunless the item is too damaged. So you don't have to worry\n&eabout destroying items without getting anything in return. +Guides.Salvage.Section.3=&3To illustrate how this works, here's an example:\n&eLet's say we salvage a gold pickaxe which is damaged for 20%,\nðis means that the maximum amount you could get is only 2\n&e(because the pick is crafted with 3 ingots - each worth\n&e33,33% durability) which is equal to 66%. If your yield\n&epercentage is below 66% you are not able to get 2 ingots.\n&eIf it is above this value you are able to gain the "full amount",\n&ewhich means that you will get 2 ingots. +Guides.Salvage.Section.4=&3How does Arcane Salvage work?\n&eThis ability allows you to get enchanted books when salvaging\n&eenchanted items. Depending on your level the chance of\n&esuccessfully extracting a full or partial enchantment varies.\n\n&eWhen an enchantment is partially extracted, the enchantment\n&ebook will have a lower level enchantment compared to what\n&eit was on the item. ##Smelting Guides.Smelting.Section.0=Coming soon... ##Swords -Guides.Swords.Section.0=[[DARK_AQUA]]About Swords:\n[[YELLOW]]This skill awards combat bonuses to anyone fighting with a\n[[YELLOW]]sword.\n\n[[DARK_AQUA]]XP GAIN:\n[[YELLOW]]XP is gained based on the amount of damage dealt to mobs or \n[[YELLOW]]other players when wielding a sword. -Guides.Swords.Section.1=[[DARK_AQUA]]How does Serrated Strikes work?\n[[YELLOW]]Serrated Strikes is an active ability, you can activate it by\n[[YELLOW]]right-clicking with a sword. This ability allows you to deal \n[[YELLOW]]an AoE (Area of Effect) hit. This AoE will do a bonus 25%\n[[YELLOW]]damage and will inflict a bleed effect that lasts for 5 ticks. -Guides.Swords.Section.2=[[DARK_AQUA]]How does Counter Attack work?\n[[YELLOW]]Counter Attack is an active ability. When blocking and taking\n[[YELLOW]]hits from mobs, you will have a chance to reflect 50% of \n[[YELLOW]]the damage that was taken. -Guides.Swords.Section.3=[[DARK_AQUA]]How does Bleed work?\n[[YELLOW]]Bleed causes enemies to take damage every two seconds. The \n[[YELLOW]]target will bleed until the effect wears off, or death, \n[[YELLOW]]whichever comes first.\n[[YELLOW]]The duration of the bleed is increased by your sword skill. +Guides.Swords.Section.0=&3About Swords:\n&eThis skill awards combat bonuses to anyone fighting with a\n&esword.\n\n&3XP GAIN:\n&eXP is gained based on the amount of damage dealt to mobs or \n&eother players when wielding a sword. +Guides.Swords.Section.1=&3How does Serrated Strikes work?\n&eSerrated Strikes is an active ability, you can activate it by\n&eright-clicking with a sword. This ability allows you to deal \n&ean AoE (Area of Effect) hit. This AoE will do a bonus 25%\n&edamage and will inflict a bleed effect that lasts for 5 ticks. +Guides.Swords.Section.2=&3How does Counter Attack work?\n&eCounter Attack is an active ability. When blocking and taking\n&ehits from mobs, you will have a chance to reflect 50% of \nðe damage that was taken. +Guides.Swords.Section.3=&3How does Bleed work?\n&eBleed causes enemies to take damage every two seconds. The \n&etarget will bleed until the effect wears off, or death, \n&ewhichever comes first.\n&eThe duration of the bleed is increased by your sword skill. ##Taming -Guides.Taming.Section.0=[[DARK_AQUA]]About Taming:\n[[YELLOW]]Taming will give players various combat bonuses when using\n[[YELLOW]]tamed wolves.\n\n[[DARK_AQUA]]XP GAIN:\n[[YELLOW]]To gain XP in this skill, you need to tame wolves/ocelots or\n[[YELLOW]]get into combat with your wolves. -Guides.Taming.Section.1=[[DARK_AQUA]]How does Call of the Wild work?\n[[YELLOW]]Call of the Wild is an active ability that will allow you to summon\n[[YELLOW]]a wolf or an ocelot by your side. You can do this by\n[[YELLOW]]left-clicking while holding bones or fish. -Guides.Taming.Section.2=[[DARK_AQUA]]How does Beast Lore work?\n[[YELLOW]]Beast Lore allows players to inspect pets and to check the\n[[YELLOW]]stats of wolves and ocelots. Left-click a wolf or ocelot to use\n[[YELLOW]]Beast Lore. -Guides.Taming.Section.3=[[DARK_AQUA]]How does Gore work?\n[[YELLOW]]Gore is a passive ability that has a chance of inflicting a\n[[YELLOW]]bleeding effect on your wolves' targets. -Guides.Taming.Section.4=[[DARK_AQUA]]How does Sharpened Claws work?\n[[YELLOW]]Sharpened Claws provides a damage bonus to damage dealt\n[[YELLOW]]by wolves. The damage bonus depends on your Taming level. -Guides.Taming.Section.5=[[DARK_AQUA]]How does Environmentally Aware work?\n[[YELLOW]]This passive ability will allow wolves to teleport to you when\n[[YELLOW]]they get near hazards, such as Cacti/Lava. It will also give\n[[YELLOW]]wolves fall damage immunity. -Guides.Taming.Section.6=[[DARK_AQUA]]How does Thick Fur work?\n[[YELLOW]]This passive ability will reduce damage and make wolves\n[[YELLOW]]fire resistant. -Guides.Taming.Section.7=[[DARK_AQUA]]How does Shock Proof work?\n[[YELLOW]]This passive ability reduces damage done to wolves\n[[YELLOW]]from explosions. -Guides.Taming.Section.8=[[DARK_AQUA]]How does Fast Food Service work?\n[[YELLOW]]This passive ability gives wolves a chance to heal whenever\n[[YELLOW]]they perform an attack. +Guides.Taming.Section.0=&3About Taming:\n&eTaming will give players various combat bonuses when using\n&etamed wolves.\n\n&3XP GAIN:\n&eTo gain XP in this skill, you need to tame wolves/ocelots or\n&eget into combat with your wolves. +Guides.Taming.Section.1=&3How does Call of the Wild work?\n&eCall of the Wild is an active ability that will allow you to summon\n&ea wolf or an ocelot by your side. You can do this by\n&eleft-clicking while holding bones or fish. +Guides.Taming.Section.2=&3How does Beast Lore work?\n&eBeast Lore allows players to inspect pets and to check the\n&estats of wolves and ocelots. Left-click a wolf or ocelot to use\n&eBeast Lore. +Guides.Taming.Section.3=&3How does Gore work?\n&eGore is a passive ability that has a chance of inflicting a\n&ebleeding effect on your wolves' targets. +Guides.Taming.Section.4=&3How does Sharpened Claws work?\n&eSharpened Claws provides a damage bonus to damage dealt\n&eby wolves. The damage bonus depends on your Taming level. +Guides.Taming.Section.5=&3How does Environmentally Aware work?\n&eThis passive ability will allow wolves to teleport to you when\nðey get near hazards, such as Cacti/Lava. It will also give\n&ewolves fall damage immunity. +Guides.Taming.Section.6=&3How does Thick Fur work?\n&eThis passive ability will reduce damage and make wolves\n&efire resistant. +Guides.Taming.Section.7=&3How does Shock Proof work?\n&eThis passive ability reduces damage done to wolves\n&efrom explosions. +Guides.Taming.Section.8=&3How does Fast Food Service work?\n&eThis passive ability gives wolves a chance to heal whenever\nðey perform an attack. ##Unarmed -Guides.Unarmed.Section.0=[[DARK_AQUA]]About Unarmed:\n[[YELLOW]]Unarmed will give players various combat bonuses when using\n[[YELLOW]]your fists as a weapon. \n\n[[DARK_AQUA]]XP GAIN:\n[[YELLOW]]XP is gained based on the amount of damage dealt to mobs \n[[YELLOW]]or other players when unarmed. -Guides.Unarmed.Section.1=[[DARK_AQUA]]How does Berserk work?\n[[YELLOW]]Beserk is an active ability that is activated by\n[[YELLOW]]right-clicking. While in Beserk mode, you deal 50% more\n[[YELLOW]]damage and you can break weak materials instantly, such as\n[[YELLOW]]Dirt and Grass. -Guides.Unarmed.Section.2=[[DARK_AQUA]]How does Iron Arm work?\n[[YELLOW]]Iron Arm increases the damage dealt when hitting mobs or\n[[YELLOW]]players with your fists. -Guides.Unarmed.Section.3=[[DARK_AQUA]]How does Arrow Deflect work?\n[[YELLOW]]Arrow Deflect is a passive ability that gives you a chance\n[[YELLOW]]to deflect arrows shot by Skeletons or other players.\n[[YELLOW]]The arrow will fall harmlessly to the ground. -Guides.Unarmed.Section.4=[[DARK_AQUA]]How does Iron Grip work?\n[[YELLOW]]Iron Grip is a passive ability that counters disarm. As your\n[[YELLOW]]unarmed level increases, the chance of preventing a disarm increases. -Guides.Unarmed.Section.5=[[DARK_AQUA]]How does Disarm work?\n[[YELLOW]]This passive ability allows players to disarm other players,\n[[YELLOW]]causing the target's equipped item to fall to the ground. +Guides.Unarmed.Section.0=&3About Unarmed:\n&eUnarmed will give players various combat bonuses when using\n&eyour fists as a weapon. \n\n&3XP GAIN:\n&eXP is gained based on the amount of damage dealt to mobs \n&eor other players when unarmed. +Guides.Unarmed.Section.1=&3How does Berserk work?\n&eBeserk is an active ability that is activated by\n&eright-clicking. While in Beserk mode, you deal 50% more\n&edamage and you can break weak materials instantly, such as\n&eDirt and Grass. +Guides.Unarmed.Section.2=&3How does Iron Arm work?\n&eIron Arm increases the damage dealt when hitting mobs or\n&eplayers with your fists. +Guides.Unarmed.Section.3=&3How does Arrow Deflect work?\n&eArrow Deflect is a passive ability that gives you a chance\n&eto deflect arrows shot by Skeletons or other players.\n&eThe arrow will fall harmlessly to the ground. +Guides.Unarmed.Section.4=&3How does Iron Grip work?\n&eIron Grip is a passive ability that counters disarm. As your\n&eunarmed level increases, the chance of preventing a disarm increases. +Guides.Unarmed.Section.5=&3How does Disarm work?\n&eThis passive ability allows players to disarm other players,\n&ecausing the target's equipped item to fall to the ground. ##Woodcutting -Guides.Woodcutting.Section.0=[[DARK_AQUA]]About Woodcutting:\n[[YELLOW]]Woodcutting is all about chopping down trees.\n\n[[DARK_AQUA]]XP GAIN:\n[[YELLOW]]XP is gained whenever you break log blocks. -Guides.Woodcutting.Section.1=[[DARK_AQUA]]How does Tree Feller work?\n[[YELLOW]]Tree Feller is an active ability, you can right-click\n[[YELLOW]]while holding an ax to activate Tree Feller. This will\n[[YELLOW]]cause the entire tree to break instantly, dropping all\n[[YELLOW]]of its logs at once. -Guides.Woodcutting.Section.2=[[DARK_AQUA]]How does Leaf Blower work?\n[[YELLOW]]Leaf Blower is a passive ability that will cause leaf\n[[YELLOW]]blocks to break instantly when hit with an axe. By default,\n[[YELLOW]]this ability unlocks at level 100. -Guides.Woodcutting.Section.3=[[DARK_AQUA]]How do Double Drops work?\n[[YELLOW]]This passive ability gives you a chance to obtain an extra\n[[YELLOW]]block for every log you chop. +Guides.Woodcutting.Section.0=&3About Woodcutting:\n&eWoodcutting is all about chopping down trees.\n\n&3XP GAIN:\n&eXP is gained whenever you break log blocks. +Guides.Woodcutting.Section.1=&3How does Tree Feller work?\n&eTree Feller is an active ability, you can right-click\n&ewhile holding an ax to activate Tree Feller. This will\n&ecause the entire tree to break instantly, dropping all\n&eof its logs at once. +Guides.Woodcutting.Section.2=&3How does Leaf Blower work?\n&eLeaf Blower is a passive ability that will cause leaf\n&eblocks to break instantly when hit with an axe. By default,\nðis ability unlocks at level 100. +Guides.Woodcutting.Section.3=&3How do Double Drops work?\n&eThis passive ability gives you a chance to obtain an extra\n&eblock for every log you chop. #INSPECT -Inspect.Offline= [[RED]]\uADF8 \uD50C\uB808\uC774\uC5B4\uB294 \uC624\uD504\uB77C\uC778 \uC785\uB2C8\uB2E4, \uC624\uC9C1 op\uB4E4\uB9CC \uAC80\uC0AC\uD560 \uC218 \uC788\uC2B5\uB2C8\uB2E4! -Inspect.OfflineStats=mcMMO \uC624\uD504\uB77C\uC778 \uC720\uC800 \uC2A4\uD15F\uC740 [[YELLOW]]{0} \uC785\uB2C8\uB2E4 -Inspect.Stats=[[GREEN]]mcMMO \uC2A4\uD15F\uC740 [[YELLOW]]{0} \uC785\uB2C8\uB2E4 -Inspect.TooFar=\uB2F9\uC2E0\uC740 \uADF8 \uD50C\uB808\uC774\uC5B4\uC640 \uB108\uBB34 \uBA40\uB9AC \uB5A8\uC5B4\uC838 \uC788\uC5B4 \uAC80\uC0AC\uD560 \uC218 \uC5C6\uC2B5\uB2C8\uB2E4! +Inspect.Offline= &c그 플레이어는 오프라인 입니다, 오직 op들만 검사할 수 있습니다! +Inspect.OfflineStats=mcMMO 오프라인 유저 스텟은 &e{0} 입니다 +Inspect.Stats=&amcMMO 스텟은 &e{0} 입니다 +Inspect.TooFar=당신은 그 플레이어와 너무 멀리 떨어져 있어 검사할 수 없습니다! #ITEMS -Item.ChimaeraWing.Fail=**\uD0A4\uBA54\uB77C\uC758 \uB0A0\uAC1C \uC2E4\uD328!** -Item.ChimaeraWing.Pass=**\uD0A4\uBA54\uB77C \uB0A0\uAC1C** -Item.ChimaeraWing.Name=\uD0A4\uBA54\uB77C \uB0A0\uAC1C -Item.ChimaeraWing.Lore=[[GRAY]]\uB2F9\uC2E0\uC758 \uCE68\uB300\uB85C \uD154\uB808\uD3EC\uD2B8\uD569\uB2C8\uB2E4. -Item.Generic.Wait=\uD0A4\uBA54\uB77C\uC758 \uB0A0\uAC1C\uB97C \uB2E4\uC2DC \uC0AC\uC6A9\uD560\uB824\uBA74 [[YELLOW]]({0}\uCD08) [[RED]]\uAE30\uB2EC\uB824\uC57C \uD569\uB2C8\uB2E4! -Item.Injured.Wait=\uB2F9\uC2E0\uC740 \uCD5C\uADFC\uC5D0 \uBD80\uC0C1\uC744 \uB2F9\uD588\uACE0 \uC0AC\uC6A9\uD560\uB824\uBA74 [[YELLOW]]({0}\uCD08) [[WHITE]]\uAE30\uB2EC\uB824\uC57C \uD569\uB2C8\uB2E4 -Item.FluxPickaxe.Name=\uC6A9\uD574 \uACE1\uAD2D\uC774 -Item.FluxPickaxe.Lore.1=[[GRAY]]\uAD11\uBB3C\uC744 \uC989\uC2DC \uC81C\uB828\uD560 \uAE30\uD68C\uB97C \uAC00\uC9D1\uB2C8\uB2E4. -Item.FluxPickaxe.Lore.2=[[GRAY]]\uC81C\uB828 \uC694\uAD6C \uB808\uBCA8 {0} \uC774\uC0C1 +Item.ChimaeraWing.Fail=**키메라의 날개 실패!** +Item.ChimaeraWing.Pass=**키메라 날개** +Item.ChimaeraWing.Name=키메라 날개 +Item.ChimaeraWing.Lore=&7당신의 침대로 텔레포트합니다. +Item.Generic.Wait=키메라의 날개를 다시 사용할려면 &e({0}초) &c기달려야 합니다! +Item.Injured.Wait=당신은 최근에 부상을 당했고 사용할려면 &e({0}초) &f기달려야 합니다 +Item.FluxPickaxe.Name=용해 곡괭이 +Item.FluxPickaxe.Lore.1=&7광물을 즉시 제련할 기회를 가집니다. +Item.FluxPickaxe.Lore.2=&7제련 요구 레벨 {0} 이상 #TELEPORTATION -Teleport.Commencing=[[GRAY]]\uD154\uB808\uD3EC\uD2B8\uAC00 [[GOLD]]({0}) [[GRAY]]\uCD08\uC548\uC5D0 \uC2DC\uC791\uB429\uB2C8\uB2E4, \uAC00\uB9CC\uD788 \uAE30\uB2EC\uB824\uC8FC\uC138\uC694... -Teleport.Cancelled=[[DARK_RED]]\uD154\uB808\uD3EC\uD2B8 \uCDE8\uC18C\uB428! +Teleport.Commencing=&7텔레포트가 &6({0}) &7초안에 시작됩니다, 가만히 기달려주세요... +Teleport.Cancelled=&4텔레포트 취소됨! #SKILLS -Skills.Child=[[GOLD]](\uD558\uC704 \uC2A4\uD0AC) -Skills.Disarmed=[[DARK_RED]]\uB2F9\uC2E0\uC740 \uBB34\uC7A5 \uD574\uC81C\uB418\uC5C8\uC2B5\uB2C8\uB2E4! -Skills.Header=-----[][[GREEN]]{0}[[RED]][]----- -Skills.NeedMore=[[DARK_RED]]\uB2F9\uC2E0\uC740 [[GRAY]]{0}\uAC00 \uB354 \uD544\uC694\uD569\uB2C8\uB2E4 -Skills.Parents = \uC0C1\uC704\uB4E4 -Skills.Stats={0}[[GREEN]]{1}[[DARK_AQUA]] XP([[GRAY]]{2}[[DARK_AQUA]]/[[GRAY]]{3}[[DARK_AQUA]]) -Skills.ChildStats={0}[[GREEN]]{1} -Skills.TooTired=\uC2A4\uD0AC \uC7AC \uC0AC\uC6A9 \uB300\uAE30\uC2DC\uAC04: ({0}\uCD08) -Skills.Cancelled={0} \uCDE8\uC18C\uB428! -Skills.ConfirmOrCancel=[[GREEN]]\uB2E4\uC2DC \uC6B0-\uD074\uB9AD\uC744 \uD558\uBA74 \uD655\uC778 [[GOLD]]{0}[[GREEN]]. \uC88C-\uD074\uB9AD\uC744 \uD558\uBA74 \uCDE8\uC18C\uAC00 \uB429\uB2C8\uB2E4. +Skills.Child=&6(하위 스킬) +Skills.Disarmed=&4당신은 무장 해제되었습니다! +Skills.Header=-----[]&a{0}&c[]----- +Skills.NeedMore=&4당신은 &7{0}가 더 필요합니다 +Skills.Parents = 상위들 +Skills.Stats={0}&a{1}&3 XP(&7{2}&3/&7{3}&3) +Skills.ChildStats={0}&a{1} +Skills.TooTired=스킬 재 사용 대기시간: ({0}초) +Skills.Cancelled={0} 취소됨! +Skills.ConfirmOrCancel=&a다시 우-클릭을 하면 확인 &6{0}&a. 좌-클릭을 하면 취소가 됩니다. #STATISTICS -Stats.Header.Combat=[[GOLD]]-=\uC804\uD22C \uC2A4\uD0AC=- -Stats.Header.Gathering=[[GOLD]]-=\uC218\uC9D1 \uC2A4\uD0AC=- -Stats.Header.Misc=[[GOLD]]-=\uAE30\uD0C0 \uC2A4\uD0AC=- -Stats.Own.Stats=[[GREEN]][mcMMO] \uC2A4\uD15F +Stats.Header.Combat=&6-=전투 스킬=- +Stats.Header.Gathering=&6-=수집 스킬=- +Stats.Header.Misc=&6-=기타 스킬=- +Stats.Own.Stats=&a[mcMMO] 스텟 #PERKS -Perks.XP.Name=\uACBD\uD5D8\uCE58 -Perks.XP.Desc=\uD2B9\uC815 \uC2A4\uD0AC\uC5D0 \uACBD\uD5D8\uCE58 \uBD80\uC2A4\uD2B8\uB97C \uBC1B\uC74C. -Perks.Lucky.Name=\uD589\uC6B4 -Perks.Lucky.Desc={0} \uC2A4\uD0AC\uACFC \uB2A5\uB825\uC5D0 33.3%\uC758 \uB354 \uB9CE\uC740 \uD65C\uC131\uD654 \uD655\uB960\uC744 \uBD80\uC5EC\uD569\uB2C8\uB2E4. -Perks.Lucky.Desc.Login=\uD2B9\uC815 \uC2A4\uD0AC\uACFC \uB2A5\uB825\uC5D0 33.3%\uC758 \uB354 \uB9CE\uC740 \uD65C\uC131\uD654 \uD655\uB960\uC744 \uBD80\uC5EC\uD569\uB2C8\uB2E4. -Perks.Lucky.Bonus=[[GOLD]] ({0} \uC6B4\uC88B\uC740 \uD2B9\uC804\uACFC \uD568\uAED8) -Perks.Cooldowns.Name=\uBE60\uB978 \uD68C\uBCF5 -Perks.Cooldowns.Desc=\uC7AC\uC0AC\uC6A9\uB300\uAE30\uC2DC\uAC04\uC744 {0}\uB9CC\uD07C \uC904\uC785\uB2C8\uB2E4 -Perks.ActivationTime.Name=\uC778\uB0B4\uB825 -Perks.ActivationTime.Desc=\uB2A5\uB825 \uD65C\uC131 \uC2DC\uAC04\uC774 {0}\uCD08\uB85C \uC99D\uAC00\uD569\uB2C8\uB2E4. -Perks.ActivationTime.Bonus=[[GOLD]] ({0}\uCD08\uC758 \uC778\uB0B4\uB825 \uD2B9\uC804) +Perks.XP.Name=경험치 +Perks.XP.Desc=특정 스킬에 경험치 부스트를 받음. +Perks.Lucky.Name=행운 +Perks.Lucky.Desc={0} 스킬과 능력에 33.3%의 더 많은 활성화 확률을 부여합니다. +Perks.Lucky.Desc.Login=특정 스킬과 능력에 33.3%의 더 많은 활성화 확률을 부여합니다. +Perks.Lucky.Bonus=&6 ({0} 운좋은 특전과 함께) +Perks.Cooldowns.Name=빠른 회복 +Perks.Cooldowns.Desc=재사용대기시간을 {0}만큼 줄입니다 +Perks.ActivationTime.Name=인내력 +Perks.ActivationTime.Desc=능력 활성 시간이 {0}초로 증가합니다. +Perks.ActivationTime.Bonus=&6 ({0}초의 인내력 특전) #HARDCORE -Hardcore.Mode.Disabled=[[GOLD]][mcMMO] \uD558\uB4DC\uCF54\uC5B4 \uBAA8\uB4DC {0}\uAC00 {1}\uC5D0 \uBE44\uD65C\uC131\uD654\uB428. -Hardcore.Mode.Enabled=[[GOLD]][mcMMO] \uD558\uB4DC\uCF54\uC5B4 \uBAA8\uB4DC {0}\uAC00 {1}\uC5D0 \uD65C\uC131\uD654\uB428. -Hardcore.DeathStatLoss.Name=\uC2A4\uD0AC \uB370\uC2A4 \uD328\uB110\uD2F0 -Hardcore.DeathStatLoss.PlayerDeath=[[GOLD]][mcMMO] [[DARK_RED]]\uB2F9\uC2E0\uC740 \uC8FD\uC5B4\uC11C [[BLUE]]{0}[[DARK_RED]] \uB808\uBCA8\uC744 \uC783\uC5C8\uC2B5\uB2C8\uB2E4. -Hardcore.DeathStatLoss.PercentageChanged=[[GOLD]][mcMMO] \uC2A4\uD15F \uAC10\uC18C \uBE44\uC728\uC774 {0}\uB85C \uBCC0\uACBD\uB418\uC5C8\uC2B5\uB2C8\uB2E4.. -Hardcore.Vampirism.Name=\uBC40\uD30C\uC774\uC5B4\uB9AC\uC810 -Hardcore.Vampirism.Killer.Failure=[[GOLD]][mcMMO] [[YELLOW]]{0}[[GRAY]]\uB2D8\uC740 \uD2B9\uBCC4\uD55C \uAE30\uC220\uC744 \uAC00\uC9C0\uACE0 \uC788\uC9C0\uC54A\uC544 \uB2F9\uC2E0\uC774 \uAC00\uC838\uAC08 \uC9C0\uC2DD\uC774 \uC5C6\uC2B5\uB2C8\uB2E4. -Hardcore.Vampirism.Killer.Success=[[GOLD]][mcMMO] [[DARK_AQUA]]\uB2F9\uC2E0\uC740 [[YELLOW]]{1}[[DARK_AQUA]]\uB2D8\uC73C\uB85C\uBD80\uD130 [[BLUE]]{0}[[DARK_AQUA]] \uB808\uBCA8\uC744 \uD6D4\uCCE4\uC2B5\uB2C8\uB2E4. -Hardcore.Vampirism.Victim.Failure=[[GOLD]][mcMMO] [[YELLOW]]{0}[[GRAY]]\uB2D8\uC740 \uB2F9\uC2E0\uC758 \uC9C0\uC2DD\uC744 \uAC00\uC838\uAC08\uC218 \uC5C6\uC5C8\uC2B5\uB2C8\uB2E4! -Hardcore.Vampirism.Victim.Success=[[GOLD]][mcMMO] [[YELLOW]]{0}[[DARK_RED]]\uB2D8\uC740 \uB2F9\uC2E0\uC5D0\uAC8C\uC11C [[BLUE]]{1}[[DARK_RED]] \uB808\uBCA8\uC744 \uD6D4\uCCD0\uAC14\uC2B5\uB2C8\uB2E4! -Hardcore.Vampirism.PercentageChanged=[[GOLD]][mcMMO] \uC2A4\uD15F \uD761\uD608 \uBE44\uC728\uC774 {0}\uB85C \uBCC0\uACBD\uB418\uC5C8\uC2B5\uB2C8\uB2E4. +Hardcore.Mode.Disabled=&6[mcMMO] 하드코어 모드 {0}가 {1}에 비활성화됨. +Hardcore.Mode.Enabled=&6[mcMMO] 하드코어 모드 {0}가 {1}에 활성화됨. +Hardcore.DeathStatLoss.Name=스킬 데스 패널티 +Hardcore.DeathStatLoss.PlayerDeath=&6[mcMMO] &4당신은 죽어서 &9{0}&4 레벨을 잃었습니다. +Hardcore.DeathStatLoss.PercentageChanged=&6[mcMMO] 스텟 감소 비율이 {0}로 변경되었습니다.. +Hardcore.Vampirism.Name=뱀파이어리점 +Hardcore.Vampirism.Killer.Failure=&6[mcMMO] &e{0}&7님은 특별한 기술을 가지고 있지않아 당신이 가져갈 지식이 없습니다. +Hardcore.Vampirism.Killer.Success=&6[mcMMO] &3당신은 &e{1}&3님으로부터 &9{0}&3 레벨을 훔쳤습니다. +Hardcore.Vampirism.Victim.Failure=&6[mcMMO] &e{0}&7님은 당신의 지식을 가져갈수 없었습니다! +Hardcore.Vampirism.Victim.Success=&6[mcMMO] &e{0}&4님은 당신에게서 &9{1}&4 레벨을 훔쳐갔습니다! +Hardcore.Vampirism.PercentageChanged=&6[mcMMO] 스텟 흡혈 비율이 {0}로 변경되었습니다. #MOTD -MOTD.Donate=[[DARK_AQUA]]\uAE30\uBD80 \uC815\uBCF4: -MOTD.Hardcore.Enabled=[[GOLD]][mcMMO] [[DARK_AQUA]]\uD558\uB4DC\uCF54\uC5B4 \uBAA8\uB4DC \uD65C\uC131\uD654\uB428: [[DARK_RED]]{0} -MOTD.Hardcore.DeathStatLoss.Stats=[[GOLD]][mcMMO] [[DARK_AQUA]]\uB370\uC2A4 \uD328\uB110\uD2F0 \uB2A5\uB825: [[DARK_RED]]{0}% -MOTD.Hardcore.Vampirism.Stats=[[GOLD]][mcMMO] [[DARK_AQUA]]\uBC40\uD30C\uC774\uC5B4\uB9AC\uC810 \uC2A4\uD15F \uD761\uC218: [[DARK_RED]]{0}% -MOTD.PerksPrefix=[mcMMO \uD2B9\uC804] -MOTD.Version=[[GOLD]][mcMMO] \uAD6C\uB3D9\uC911\uC778 \uBC84\uC804 [[DARK_AQUA]]{0} -MOTD.Website=[[GOLD]][mcMMO] [[GREEN]]{0}[[YELLOW]] - mcMMO \uC6F9\uC0AC\uC774\uD2B8 +MOTD.Donate=&3기부 정보: +MOTD.Hardcore.Enabled=&6[mcMMO] &3하드코어 모드 활성화됨: &4{0} +MOTD.Hardcore.DeathStatLoss.Stats=&6[mcMMO] &3데스 패널티 능력: &4{0}% +MOTD.Hardcore.Vampirism.Stats=&6[mcMMO] &3뱀파이어리점 스텟 흡수: &4{0}% +MOTD.PerksPrefix=[mcMMO 특전] +MOTD.Version=&6[mcMMO] 구동중인 버전 &3{0} +MOTD.Website=&6[mcMMO] &a{0}&e - mcMMO 웹사이트 + +# XP BAR +XPBar.Template={0} +XPBar.Template.EarlyGameBoost=&6새로운 스킬을 배우는 중... +XPBar.Acrobatics=곡예 Lv.&6{0} +XPBar.Alchemy=연금술 Lv.&6{0} +XPBar.Archery=궁술 Lv.&6{0} +XPBar.Axes=부술 Lv.&6{0} +XPBar.Excavation=발굴 Lv.&6{0} +XPBar.Fishing=낚시 Lv.&6{0} +XPBar.Herbalism=약초학 Lv.&6{0} +XPBar.Mining=채광 Lv.&6{0} +XPBar.Repair=수리 Lv.&6{0} +XPBar.Salvage=회수 Lv.&6{0} +XPBar.Smelting=제련 Lv.&6{0} +XPBar.Swords=검술 Lv.&6{0} +XPBar.Taming=조련 Lv.&6{0} +XPBar.Unarmed=비무장 Lv.&6{0} +XPBar.Woodcutting=벌목 Lv.&6{0} +XPBar.Complex.Template={0} &3 {4}&f% &3(&f{1}&3/&f{2}&3) + #SMELTING -Smelting.Ability.FluxMining=\uC720\uB3D9 \uCC44\uAD74 \uD655\uB960: [[YELLOW]]{0} -Smelting.Ability.FuelEfficiency=\uC720\uB3D9 \uD6A8\uC728\uC131 \uBC30\uC728: [[YELLOW]]{0}x -Smelting.Ability.Locked.0={0}\uB808\uBCA8 \uB54C \uAE30\uC220\uC774 \uD574\uC81C\uB429\uB2C8\uB2E4 (\uBC14\uB2D0\uB77C XP \uBD80\uC2A4\uD2B8) -Smelting.Ability.Locked.1={0}\uB808\uBCA8 \uB54C \uAE30\uC220\uC774 \uD574\uC81C\uB429\uB2C8\uB2E4 (\uC720\uB3D9 \uCC44\uAD74) -Smelting.Ability.SecondSmelt=\uB450\uBC88\uC9F8 \uC7AC\uB828 \uD655\uB960: [[YELLOW]{0} -Smelting.Ability.VanillaXPBoost=\uBC14\uB2D0\uB77C XP \uBC30\uC728: [[YELLOW]]{0}x -Smelting.SubSkill.FuelEfficiency.Name=\uC720\uB3D9 \uD6A8\uC728\uC131 -Smelting.SubSkill.FuelEfficiency.Description=\uD654\uB85C\uC5D0\uC11C \uC7AC\uB828\uC2DC \uC5F0\uB8CC \uC5F0\uC18C \uC2DC\uAC04 \uC99D\uAC00 -Smelting.SubSkill.SecondSmelt.Name=\uB450\uBC88\uC9F8 \uC81C\uB828 -Smelting.SubSkill.SecondSmelt.Description=\uC81C\uB828\uC2DC \uC5BB\uB294 \uC790\uC6D0 2\uBC30 -Smelting.Effect.4=\uBC14\uB2D0\uB77C XP \uBD80\uC2A4\uD2B8 -Smelting.Effect.5=\uC81C\uB828\uC911 \uBC14\uB2D0\uB77C XP \uC5BB\uAE30 \uC99D\uAC00 -Smelting.SubSkill.FluxMining.Name=\uC720\uB3D9 \uCC44\uAD74 -Smelting.SubSkill.FluxMining.Description=\uCC44\uAD74\uC911 \uAD11\uBB3C \uC989\uC2DC \uC7AC\uB828 \uD655\uB960 -Smelting.FluxMining.Success=[[GREEN]]\uAD11\uBB3C\uC774 \uC7AC\uB828\uB418\uC5C8\uC2B5\uB2C8\uB2E4! -Smelting.Listener=\uC81C\uB828(Smelting): -Smelting.SkillName=\uC81C\uB828 +Smelting.Ability.FluxMining=유동 채굴 확률: &e{0} +Smelting.Ability.FuelEfficiency=유동 효율성 배율: &e{0}x +Smelting.Ability.Locked.0={0}레벨 때 기술이 해제됩니다 (바닐라 XP 부스트) +Smelting.Ability.Locked.1={0}레벨 때 기술이 해제됩니다 (유동 채굴) +Smelting.Ability.SecondSmelt=두번째 재련 확률: &e{0} +Smelting.Ability.VanillaXPBoost=바닐라 XP 배율: &e{0}x +Smelting.SubSkill.FuelEfficiency.Name=유동 효율성 +Smelting.SubSkill.FuelEfficiency.Description=화로에서 재련시 연료 연소 시간 증가 +Smelting.SubSkill.SecondSmelt.Name=두번째 제련 +Smelting.SubSkill.SecondSmelt.Description=제련시 얻는 자원 2배 +Smelting.Effect.4=바닐라 XP 부스트 +Smelting.Effect.5=제련중 바닐라 XP 얻기 증가 +Smelting.SubSkill.FluxMining.Name=유동 채굴 +Smelting.SubSkill.FluxMining.Description=채굴중 광물 즉시 재련 확률 +Smelting.FluxMining.Success=&a광물이 재련되었습니다! +Smelting.Listener=제련(Smelting): +Smelting.SkillName=제련 #COMMAND DESCRIPTIONS -Commands.Description.addlevels=mcMMO \uB808\uBCA8\uC744 \uC720\uC800\uC5D0\uAC8C \uCD94\uAC00 -Commands.Description.adminchat=mcMMO \uAD00\uB9AC\uC790 \uCC44\uD305 \uCF1C\uAE30/\uB044\uAE30\uB098 \uAD00\uB9AC\uC790 \uCC44\uD305 \uBA54\uC138\uC9C0 \uBCF4\uB0B4\uAE30 -Commands.Description.addxp=mcMMO \uACBD\uD5D8\uCE58\uB97C \uC720\uC800\uC5D0\uAC8C \uCD94\uAC00 -Commands.Description.hardcore=mcMMO \uD558\uB4DC\uCF54\uC5B4 \uD655\uB960 \uC218\uC815\uC774\uB098 \uD558\uB4DC\uCF54\uC5B4 \uBAA8\uB4DC \uCF1C\uAE30/\uB044\uAE30 -Commands.Description.inspect=\uB2E4\uB978 \uD50C\uB808\uC774\uC5B4\uC758 mcMMO \uC790\uC138\uD55C \uC815\uBCF4 \uBCF4\uAE30 -Commands.Description.mcability=mcMMO \uC6B0-\uD074\uB9AD \uB2A5\uB825 \uCF1C\uAE30/\uB044\uAE30 -Commands.Description.mccooldown=\uBAA8\uB4E0 mcMMO \uB2A5\uB825 \uC7AC \uC0AC\uC6A9 \uB300\uAE30\uC2DC\uAC04 \uBCF4\uAE30 -Commands.Description.mcgod=mcMMO \uBD88\uC0AC\uC2E0-\uBAA8\uB4DC \uCF1C\uAE30/\uB044\uAE30 -Commands.Description.mchud=mcMMO HUD \uBC29\uC2DD \uBCC0\uACBD -Commands.Description.mcmmo=mcMMO \uC81C\uC791\uC790 \uC124\uBA85 \uBCF4\uAE30 -Commands.Description.mcnotify=mcMMO \uB2A5\uB825 \uCC44\uD305 \uC54C\uB9BC \uBCF4\uAE30 \uCF1C\uAE30/\uB044\uAE30 -Commands.Description.mcpurge={0} \uB2EC \uC774\uC0C1 \uC811\uC18D\uC548\uD55C \uC720\uC800\uC758 mcMMO \uB808\uBCA8\uACFC \uC720\uC800\uB97C mcMMO \uB370\uC774\uD130\uBCA0\uC774\uC2A4\uC5D0\uC11C \uCD08\uAE30\uD654\uC2DC\uD0B4 -Commands.Description.mcrank=\uD50C\uB808\uC774\uC5B4 mcMMO \uC21C\uC704 \uBCF4\uAE30 -Commands.Description.mcrefresh=\uBAA8\uB4E0 mcMMO \uCFE8\uB2E4\uC6B4 \uCD08\uAE30\uD654 -Commands.Description.mcremove=\uC720\uC800 mcMMO \uB370\uC774\uD130\uBCA0\uC774\uC2A4 \uC0AD\uC81C -Commands.Description.mcscoreboard=\uB2F9\uC2E0\uC758 mcMMO \uC810\uC218\uD310 \uAD00\uB9AC -Commands.Description.mcstats=\uC790\uC2E0\uC758 mcMMO \uB808\uBCA8\uACFC XP \uBCF4\uAE30 -Commands.Description.mctop=mcMMO \uC810\uC218\uD45C \uBCF4\uAE30 -Commands.Description.mmoedit=\uC720\uC800\uC758 mcMMO \uB808\uBCA8 \uC218\uC815 -Commands.Description.mmoupdate=mcMMO \uB370\uC774\uD130\uBCA0\uC774\uC2A4\uB97C flatfile\uC5D0\uC11C MySQL\uB85C \uC804\uD658 -Commands.Description.mcconvert=\uB370\uC774\uD130\uBCA0\uC774\uC2A4 \uD0C0\uC785 \uB610\uB294 \uACBD\uD5D8 \uACF5\uC2DD \uD0C0\uC785 \uC804\uD658 -Commands.Description.mmoshowdb=\uD604\uC7AC \uB370\uC774\uD130\uBCA0\uC774\uC2A4 \uD0C0\uC785 \uC774\uB984 \uBCF4\uAE30(\uB098\uC911\uC5D0 /mmoupdate\uC640 \uD568\uAED8 \uC4F0\uC785\uB2C8\uB2E4) -Commands.Description.party=\uB2E4\uC591\uD55C mcMMO \uD30C\uD2F0 \uC124\uC815 \uAD00\uB9AC -Commands.Description.partychat=mcMMO \uD30C\uD2F0 \uCC44\uD305 \uCF1C\uAE30/\uB044\uAE30\uB098 \uD30C\uD2F0 \uCC44\uD305 \uBA54\uC138\uC9C0 \uBCF4\uB0B4\uAE30 -Commands.Description.ptp=mcMMO \uD30C\uD2F0 \uB9F4\uBC84 \uD154\uB808\uD3EC\uD2B8 -Commands.Description.Skill=mcMMO \uAE30\uC220 {0}\uC758 \uC790\uC138\uD55C \uC815\uBCF4 \uBCF4\uAE30 -Commands.Description.skillreset=\uC720\uC800\uC758 mcMMO \uB808\uBCA8 \uC7AC\uC124\uC815 -Commands.Description.vampirism=mcMMO \uBC40\uD30C\uC774\uC5B4\uB9AC\uC810 \uBE44\uC728\uC774\uB098 \uBC40\uD30C\uC774\uC5B4\uB9AC\uC810 \uBAA8\uB4DC \uCF1C\uAE30/\uB044\uAE30 -Commands.Description.xplock=\uBA85\uD655\uD55C mcMMO \uAE30\uC220\uC758 mcMMO xp \uBC14\uB97C \uC7A0\uAE08 -Commands.Description.xprate=mcMMO XP \uBC30\uC728 \uC218\uC815\uC774\uB098 mcMMO XP \uC774\uBCA4\uD2B8 \uC2DC\uC791 +Commands.Description.addlevels=mcMMO 레벨을 유저에게 추가 +Commands.Description.adminchat=mcMMO 관리자 채팅 켜기/끄기나 관리자 채팅 메세지 보내기 +Commands.Description.addxp=mcMMO 경험치를 유저에게 추가 +Commands.Description.hardcore=mcMMO 하드코어 확률 수정이나 하드코어 모드 켜기/끄기 +Commands.Description.inspect=다른 플레이어의 mcMMO 자세한 정보 보기 +Commands.Description.mcability=mcMMO 우-클릭 능력 켜기/끄기 +Commands.Description.mccooldown=모든 mcMMO 능력 재 사용 대기시간 보기 +Commands.Description.mcgod=mcMMO 불사신-모드 켜기/끄기 +Commands.Description.mchud=mcMMO HUD 방식 변경 +Commands.Description.mcmmo=mcMMO 제작자 설명 보기 +Commands.Description.mcnotify=mcMMO 능력 채팅 알림 보기 켜기/끄기 +Commands.Description.mcpurge={0} 달 이상 접속안한 유저의 mcMMO 레벨과 유저를 mcMMO 데이터베이스에서 초기화시킴 +Commands.Description.mcrank=플레이어 mcMMO 순위 보기 +Commands.Description.mcrefresh=모든 mcMMO 쿨다운 초기화 +Commands.Description.mcremove=유저 mcMMO 데이터베이스 삭제 +Commands.Description.mcscoreboard=당신의 mcMMO 점수판 관리 +Commands.Description.mcstats=자신의 mcMMO 레벨과 XP 보기 +Commands.Description.mctop=mcMMO 점수표 보기 +Commands.Description.mmoedit=유저의 mcMMO 레벨 수정 +Commands.Description.mmoupdate=mcMMO 데이터베이스를 flatfile에서 MySQL로 전환 +Commands.Description.mcconvert=데이터베이스 타입 또는 경험 공식 타입 전환 +Commands.Description.mmoshowdb=현재 데이터베이스 타입 이름 보기(나중에 /mmoupdate와 함께 쓰입니다) +Commands.Description.party=다양한 mcMMO 파티 설정 관리 +Commands.Description.partychat=mcMMO 파티 채팅 켜기/끄기나 파티 채팅 메세지 보내기 +Commands.Description.ptp=mcMMO 파티 맴버 텔레포트 +Commands.Description.Skill=mcMMO 기술 {0}의 자세한 정보 보기 +Commands.Description.skillreset=유저의 mcMMO 레벨 재설정 +Commands.Description.vampirism=mcMMO 뱀파이어리점 비율이나 뱀파이어리점 모드 켜기/끄기 +Commands.Description.xplock=명확한 mcMMO 기술의 mcMMO xp 바를 잠금 +Commands.Description.xprate=mcMMO XP 배율 수정이나 mcMMO XP 이벤트 시작 #UPDATE CHECKER -UpdateChecker.outdated=\uB2F9\uC2E0\uC740 mcMMO \uAD6C\uBC84\uC804\uC744 \uC0AC\uC6A9\uC911\uC785\uB2C8\uB2E4! -UpdateChecker.newavailable=\uC2E0 \uBC84\uC804\uC774 BukkitDev\uC5D0 \uC5C5\uB85C\uB4DC\uB418\uC5B4 \uC788\uC2B5\uB2C8\uB2E4. +UpdateChecker.outdated=당신은 mcMMO 구버전을 사용중입니다! +UpdateChecker.newavailable=신 버전이 BukkitDev에 업로드되어 있습니다. #SCOREBOARD HEADERS -Scoreboard.Header.PlayerStats=mcMMO \uC2A4\uD15F -Scoreboard.Header.PlayerCooldowns=mcMMO \uC7AC \uC0AC\uC6A9 \uB300\uAE30\uC2DC\uAC04 -Scoreboard.Header.PlayerRank=mcMMO \uC21C\uC704 -Scoreboard.Header.PlayerInspect=mcMMO \uC2A4\uD15F: -Scoreboard.Header.PowerLevel=\uCD1D \uB808\uBCA8 -Scoreboard.Misc.PowerLevel=[[GOLD]]\uCD1D \uB808\uBCA8 -Scoreboard.Misc.Level=[[DARK_AQUA]]\uB808\uBCA8 -Scoreboard.Misc.CurrentXP=[[GREEN]]\uD604\uC7AC XP -Scoreboard.Misc.RemainingXP=\uB0A8\uC740 XP -Scoreboard.Misc.Cooldown=[[LIGHT_PURPLE]]\uC7AC \uC0AC\uC6A9 \uB300\uAE30\uC2DC\uAC04 -Scoreboard.Misc.Overall=[[GOLD]]\uC885\uD569 +Scoreboard.Header.PlayerStats=mcMMO 스텟 +Scoreboard.Header.PlayerCooldowns=mcMMO 재 사용 대기시간 +Scoreboard.Header.PlayerRank=mcMMO 순위 +Scoreboard.Header.PlayerInspect=mcMMO 스텟: +Scoreboard.Header.PowerLevel=총 레벨 +Scoreboard.Misc.PowerLevel=&6총 레벨 +Scoreboard.Misc.Level=&3레벨 +Scoreboard.Misc.CurrentXP=&a현재 XP +Scoreboard.Misc.RemainingXP=남은 XP +Scoreboard.Misc.Cooldown=&d재 사용 대기시간 +Scoreboard.Misc.Overall=&6종합 #DATABASE RECOVERY -Profile.Loading.Success=[[GREEN]]\uB2F9\uC2E0\uC758 mcMMO \uD504\uB85C\uD30C\uC77C\uC774 \uBD88\uB7EC\uC640\uC84C\uC2B5\uB2C8\uB2E4. -Profile.Loading.Failure=mcMMO\uB294 \uC5EC\uC804\uD788 \uB2F9\uC2E0\uC758 \uB370\uC774\uD130\uB97C \uC77D\uC744 \uC218 \uC5C6\uC2B5\uB2C8\uB2E4. \uB2F9\uC2E0\uC740 \uC544\uB9C8\uB3C4 [[AQUA]]\uC11C\uBC84\uAD00\uB9AC\uC790\uC640 \uC5F0\uB77D[[RED]]\uD558\uAE30\uB97C \uC6D0\uD560 \uAC83\uC785\uB2C8\uB2E4.\n[[YELLOW]]\uB2F9\uC2E0\uC740 \uC5EC\uC804\uD788 \uC11C\uBC84\uC5D0\uC11C \uAC8C\uC784\uC911\uC774\uC9C0\uB9CC, \uB2F9\uC2E0\uC740 [[BOLD]]mcMMO \uB808\uBCA8\uC774 \uC5C6\uACE0[[YELLOW]] \uB2F9\uC2E0\uC774 \uC5BB\uC740 \uC5B4\uB290 XP\uB3C4 [[BOLD]]\uC800\uC7A5\uB418\uC9C0 \uC54A\uC744 \uAC81\uB2C8\uB2E4[[YELLOW]]. -Profile.Loading.AdminFailureNotice=[[DARK_RED]][A][[RED]] mcMMO\uB294 [[YELLOW]]{0}[[RED]] \uD50C\uB808\uC774\uC5B4 \uB370\uC774\uD130 \uC77D\uAE30\uAC00 \uBD88\uAC00\uB2A5\uD569\uB2C8\uB2E4. [[LIGHT_PURPLE]]\uB2F9\uC2E0\uC758 \uB370\uC774\uD130\uBCA0\uC774\uC2A4 \uC124\uCE58\uB97C \uAC80\uC0AC\uD574\uC8FC\uC138\uC694. +Profile.Loading.Success=&a당신의 mcMMO 프로파일이 불러와졌습니다. +Profile.Loading.Failure=mcMMO는 여전히 당신의 데이터를 읽을 수 없습니다. 당신은 아마도 &b서버관리자와 연락&c하기를 원할 것입니다.\n&e당신은 여전히 서버에서 게임중이지만, 당신은 &lmcMMO 레벨이 없고&e 당신이 얻은 어느 XP도 &l저장되지 않을 겁니다&e. +Profile.Loading.AdminFailureNotice=&4[A]&c mcMMO는 &e{0}&c 플레이어 데이터 읽기가 불가능합니다. &d당신의 데이터베이스 설치를 검사해주세요. +Commands.XPBar.Usage=Proper usage is /mmoxpbar +Commands.Description.mmoxpbar=Player settings for mcMMO XP bars +Commands.Description.mmocompat=Information about mcMMO and whether or not its in compatibility mode or fully functional. +#OVERHAULs +Overhaul.Levelup=&l{0} &r(이)가 레벨 &r&a&l{2}&r&f 로 성장 했습니다. +Overhaul.Name.Acrobatics=곡예 +Overhaul.Name.Alchemy=연금술 +Overhaul.Name.Archery=궁술 +Overhaul.Name.Axes=부술 +Overhaul.Name.Excavation=발굴 +Overhaul.Name.Fishing=낚시 +Overhaul.Name.Herbalism=약초학 +Overhaul.Name.Mining=채광 +Overhaul.Name.Repair=수리 +Overhaul.Name.Salvage=회수 +Overhaul.Name.Smelting=제련 +Overhaul.Name.Swords=검술 +Overhaul.Name.Taming=조련 +Overhaul.Name.Unarmed=비무장 +Overhaul.Name.Woodcutting=벌목 diff --git a/src/main/resources/locale/locale_lt_LT.properties b/src/main/resources/locale/locale_lt_LT.properties index 03296ff8a..040aecec0 100644 --- a/src/main/resources/locale/locale_lt_LT.properties +++ b/src/main/resources/locale/locale_lt_LT.properties @@ -7,14 +7,14 @@ JSON.DescriptionHeader=Aprašymas JSON.JWrapper.Header=Informacija JSON.Type.Passive=Neaktyvuota JSON.Type.Active=Aktyvuota -JSON.Type.SuperAbility=Super Ability +JSON.Type.SuperAbility=Super Galimybė JSON.Locked=-=[UŽRAKINTA]=- JSON.LevelRequirement=Įgūdžių lygių reikalavimai JSON.JWrapper.Target.Type=Pasirinktas tipas: JSON.JWrapper.Target.Block=Blokas JSON.JWrapper.Target.Player=Žaidėjas -JSON.JWrapper.Perks.Header=[[GOLD]]Lucky Perks -JSON.JWrapper.Perks.Lucky={0}% Better Odds +JSON.JWrapper.Perks.Header=&6Sėkmingos Privilegijos +JSON.JWrapper.Perks.Lucky={0}% Geresni šansai JSON.Hover.Tips=Svarbu JSON.Acrobatics=Acrobatika JSON.Alchemy=Alchemija @@ -36,53 +36,53 @@ JSON.URL.Patreon=Pagalbą teikia: nossr50 prisidėti prie mcMMO galite paremdami JSON.URL.Spigot=Oficialus mcMMO Spigot tiekėjas! JSON.URL.Translation=Vertimai mcMMO kitomis kalbomis! JSON.URL.Wiki=Oficiali mcMMO Pagalba! -JSON.SkillUnlockMessage=[[GOLD]][ mcMMO[[YELLOW]] @[[DARK_AQUA]]{0} [[GOLD]]Įgūdžių Rankas [[DARK_AQUA]]{1}[[GOLD]] Atrakintas! ] +JSON.SkillUnlockMessage=&6[ mcMMO&e @&3{0} &6Įgūdžių Rankas &3{1}&6 Atrakintas! ] JSON.Hover.Rank=&e&lRankas:&r &f{0} JSON.Hover.NextRank=&7&oKitas ranko pakėlimas už {0} LvL. # for JSON.Hover.Mystery you can add {0} to insert the level required into the name, I don't like how that looks so I'm not doing that atm -JSON.Hover.Mystery=[[GRAY]]??? -JSON.Hover.Mystery2=[[YELLOW]][[[DARK_GRAY]]{0}[[YELLOW]]][[DARK_GRAY]]???&r -JSON.Hover.SkillName=[[DARK_AQUA]]{0}&r -JSON.Hover.SuperAbility=[[DARK_PURPLE]]{0}&r -JSON.Hover.MaxRankSkillName=[[GOLD]]{0}&r -JSON.Hover.AtSymbolSkills=[[YELLOW]]@ -JSON.Hover.AtSymbolURL=[[YELLOW]]@ +JSON.Hover.Mystery=&7??? +JSON.Hover.Mystery2=&e[&8{0}&e]&8???&r +JSON.Hover.SkillName=&3{0}&r +JSON.Hover.SuperAbility=&5{0}&r +JSON.Hover.MaxRankSkillName=&6{0}&r +JSON.Hover.AtSymbolSkills=&e@ +JSON.Hover.AtSymbolURL=&e@ #This is the message sent to players when an ability is activated JSON.Notification.SuperAbility={0} #These are the JSON Strings used for SubSkills -JSON.Acrobatics.Roll.Interaction.Activated=Test [[RED]]Rolled Test -JSON.Acrobatics.SubSkill.Roll.Details.Tips=If you hold sneak while falling you can prevent up to twice the damage that you would normally take! -Anvil.SingleItemStack=[[RED]]You cannot salvage or repair item stacks that have more than one item, split the stack first. +JSON.Acrobatics.Roll.Interaction.Activated=Test &cRolled Test +JSON.Acrobatics.SubSkill.Roll.Details.Tips=Jei laikysite sėlinimo mygtuką kol krentate, galite išvengti beveik puse nukritimo žąlos! +Anvil.SingleItemStack=&cJūs negalite išardyti ar taisyti daiktų kurie yra vienoje krūvoje, padalinkite krūvelę. #DO NOT USE COLOR CODES IN THE JSON KEYS #COLORS ARE DEFINED IN advanced.yml IF YOU WISH TO CHANGE THEM -mcMMO.Template.Prefix=[[GOLD]]([[GREEN]]mcMMO[[GOLD]]) [[GRAY]]{0} +mcMMO.Template.Prefix=&6(&amcMMO&6) &7{0} # BEGIN STYLING -Ability.Generic.Refresh=[[GREEN]]**ABILITIES REFRESHED!** -Ability.Generic.Template.Lock=[[GRAY]]{0} +Ability.Generic.Refresh=&a**ABILITIES REFRESHED!** +Ability.Generic.Template.Lock=&7{0} # Skill Command Styling -Ability.Generic.Template=[[DARK_AQUA]]{0}: [[GREEN]]{1} -Ability.Generic.Template.Custom=[[DARK_AQUA]]{0} -Skills.Overhaul.Header=[[RED]][]=====[][[GREEN]] {0} [[RED]][]=====[] +Ability.Generic.Template=&3{0}: &a{1} +Ability.Generic.Template.Custom=&3{0} +Skills.Overhaul.Header=&c[]=====[]&a {0} &c[]=====[] Effects.Effects=EFFECTS Effects.SubSkills.Overhaul=Sub-Skills -Effects.Child.Overhaul=[[DARK_AQUA]]Buvęs LvL.[[YELLOW]] {0}[[DARK_AQUA]]: {1} -Effects.Child.ParentList=[[GREEN]]{0}[[GOLD]]([[DARK_AQUA]]LvL.[[YELLOW]]{1}[[GOLD]]) -Effects.Level.Overhaul=[[GOLD]]LvL: [[YELLOW]]{0} [[DARK_AQUA]]XP[[YELLOW]]([[GOLD]]{1}[[YELLOW]]/[[GOLD]]{2}[[YELLOW]]) -Effects.Parent=[[GOLD]]{0} - -Effects.Template=[[DARK_AQUA]]{0}: [[GREEN]]{1} +Effects.Child.Overhaul=&3Buvęs LvL.&e {0}&3: {1} +Effects.Child.ParentList=&a{0}&6(&3LvL.&e{1}&6) +Effects.Level.Overhaul=&6LvL: &e{0} &3XP&e(&6{1}&e/&6{2}&e) +Effects.Parent=&6{0} - +Effects.Template=&3{0}: &a{1} Commands.Stats.Self.Overhaul=Stats -Commands.XPGain.Overhaul=[[GOLD]]Įgavote patirties eXP: [[DARK_AQUA]]{0} -MOTD.Version.Overhaul=[[GOLD]][mcMMO] [[DARK_AQUA]]Overhaul Era[[GOLD]] - [[DARK_AQUA]]{0} -Overhaul.mcMMO.Header=[[RED]][]=====[][[GREEN]] mcMMO - Overhaul Era [[RED]][]=====[] -Overhaul.mcMMO.Url.Wrap.Prefix=[[RED]][| -Overhaul.mcMMO.Url.Wrap.Suffix=[[RED]]|] -Overhaul.mcMMO.MmoInfo.Wiki=[[YELLOW]][[[WHITE]]View this skill on the wiki![[YELLOW]]] +Commands.XPGain.Overhaul=&6Įgavote patirties EXP: &3{0} +MOTD.Version.Overhaul=&6[mcMMO] &3Overhaul Era&6 - &3{0} +Overhaul.mcMMO.Header=&c[]=====[]&a mcMMO - Overhaul Era &c[]=====[] +Overhaul.mcMMO.Url.Wrap.Prefix=&c[| +Overhaul.mcMMO.Url.Wrap.Suffix=&c|] +Overhaul.mcMMO.MmoInfo.Wiki=&e[&fPeržiūrėkite šį įgūdi Wikyje!&e] # Overhaul.Levelup can take {0} - Skill Name defined in Overhaul.Name {1} - Amount of levels gained {2} - Level in skill -Overhaul.Levelup=[[BOLD]]{0} [[GOLD]]LvL. [[DARK_AQUA]]pakilo iki: [[RESET]][[GREEN]][[BOLD]]{2}[[RESET]][[WHITE]]. +Overhaul.Levelup=&l{0} &6LvL. &3pakilo iki: &r&a&l{2}&r&f. Overhaul.Name.Acrobatics=Akrobatinių įgūdžių Overhaul.Name.Alchemy=Alchemiko įgūdžių Overhaul.Name.Archery=Lankininko įgūdžių @@ -99,616 +99,614 @@ Overhaul.Name.Taming=Prijaukinimo įgūdžių Overhaul.Name.Unarmed=Beginklės kovos įgūdžių Overhaul.Name.Woodcutting=Medkirčio įgūdžių # /mcMMO Command Style Stuff -Commands.mcc.Header=[[RED]]---[][[GREEN]]mcMMO Commands[[RED]][]--- -Commands.Other=[[RED]]---[][[GREEN]]SPECIAL COMMANDS[[RED]][]--- -Commands.Party.Header=[[RED]]-----[][[GREEN]]PARTY[[RED]][]----- -Commands.Party.Features.Header=[[RED]]-----[][[GREEN]]FEATURES[[RED]][]----- +Commands.mcc.Header=&c---[]&amcMMO Komandos&c[]--- +Commands.Other=&c---[]&aSPECIALIOS KOMANDOS&c[]--- +Commands.Party.Header=&c-----[]&aPARTIJA&c[]----- +Commands.Party.Features.Header=&c-----[]&aFUNKCIJOS&c[]----- # XP BAR Allows for the following variables -- {0} = Skill Level, {1} Current XP, {2} XP Needed for next level, {3} Power Level, {4} Percentage of Level # Make sure you turn on Experience_Bars.ThisMayCauseLag.AlwaysUpdateTitlesWhenXPIsGained if you want the XP bar title to update every time a player gains XP! XPBar.Template={0} -XPBar.Template.EarlyGameBoost=[[GOLD]]Įgyjami nauji įgūdžiai... -XPBar.Acrobatics=Akrobatinių įgūdžių LvL.[[GOLD]]{0} -XPBar.Alchemy=Alchemiko įgūdžių LvL.[[GOLD]]{0} -XPBar.Archery=Lankininko įgūdžių LvL.[[GOLD]]{0} -XPBar.Axes=Kirvio valdymo įgūdžių LvL.[[GOLD]]{0} -XPBar.Excavation=Kasinėjimosi įgūdžių LvL.[[GOLD]]{0} -XPBar.Fishing=Žvejybos įgūdžių LvL.[[GOLD]]{0} -XPBar.Herbalism=Žolininko įgūdžių LvL.[[GOLD]]{0} -XPBar.Mining=Akmens skaldytojo įgūdžių LvL.[[GOLD]]{0} -XPBar.Repair=Taisymo įgūdžių LvL.[[GOLD]]{0} -XPBar.Salvage=Gelbėjimo įgūdžių LvL.[[GOLD]]{0} -XPBar.Smelting=Kepimo įgūdžių LvL.[[GOLD]]{0} -XPBar.Swords=Kardo valdymo įgūdžių LvL.[[GOLD]]{0} -XPBar.Taming=Prijaukinimo įgūdžių LvL.[[GOLD]]{0} -XPBar.Unarmed=Beginklės kovos įgūdžių LvL.[[GOLD]]{0} -XPBar.Woodcutting=Medkirčio įgūdžių LvL.[[GOLD]]{0} +XPBar.Template.EarlyGameBoost=&6Įgyjami nauji įgūdžiai... +XPBar.Acrobatics=Akrobatinių įgūdžių LvL.&6{0} +XPBar.Alchemy=Alchemiko įgūdžių LvL.&6{0} +XPBar.Archery=Lankininko įgūdžių LvL.&6{0} +XPBar.Axes=Kirvio valdymo įgūdžių LvL.&6{0} +XPBar.Excavation=Kasinėjimosi įgūdžių LvL.&6{0} +XPBar.Fishing=Žvejybos įgūdžių LvL.&6{0} +XPBar.Herbalism=Žolininko įgūdžių LvL.&6{0} +XPBar.Mining=Akmens skaldytojo įgūdžių LvL.&6{0} +XPBar.Repair=Taisymo įgūdžių LvL.&6{0} +XPBar.Salvage=Gelbėjimo įgūdžių LvL.&6{0} +XPBar.Smelting=Kepimo įgūdžių LvL.&6{0} +XPBar.Swords=Kardo valdymo įgūdžių LvL.&6{0} +XPBar.Taming=Prijaukinimo įgūdžių LvL.&6{0} +XPBar.Unarmed=Beginklės kovos įgūdžių LvL.&6{0} +XPBar.Woodcutting=Medkirčio įgūdžių LvL.&6{0} #This is just a preset template that gets used if the 'ExtraDetails' setting is turned on in experience.yml (off by default), you can ignore this template and just edit the strings above -XPBar.Complex.Template={0} [[DARK_AQUA]] {4}[[WHITE]]% [[DARK_AQUA]]([[WHITE]]{1}[[DARK_AQUA]]/[[WHITE]]{2}[[DARK_AQUA]]) +XPBar.Complex.Template={0} &3 {4}&f% &3(&f{1}&3/&f{2}&3) # XP BAR Allows for the following variables -- {0} = Skill Level, {1} Current XP, {2} XP Needed for next level, {3} Power Level, {4} Percentage of Level # Make sure you turn on Experience_Bars.ThisMayCauseLag.AlwaysUpdateTitlesWhenXPIsGained if you want the XP bar title to update every time a player gains XP! # END STYLING #ACROBATICS -Acrobatics.Ability.Proc=[[GREEN]]**Graceful Landing** -Acrobatics.Combat.Proc=[[GREEN]]**Dodged** -Acrobatics.SubSkill.Roll.Stats=[[GOLD]]Roll Chance [[YELLOW]]{0}%[[GOLD]] Graceful Roll Chance[[YELLOW]] {1}% -Acrobatics.SubSkill.Roll.Stat=Roll Chance -Acrobatics.SubSkill.Roll.Stat.Extra=Graceful Roll Chance -Acrobatics.SubSkill.Roll.Name=Roll -Acrobatics.SubSkill.Roll.Description=Land strategically to avoid damage. -Acrobatics.SubSkill.Roll.Chance=Roll Chance: [[YELLOW]]{0} -Acrobatics.SubSkill.Roll.GraceChance=Graceful Roll Chance: [[YELLOW]]{0} -Acrobatics.SubSkill.Roll.Mechanics=[[GRAY]]Rolling is an active Sub-Skill with a passive component.\nWhenever you take fall damage you have a chance to completely negate the damage based on your skill level, at level 50 you have a [[YELLOW]]{0}%[[GRAY]] chance to prevent damage, and [[YELLOW]]{1}%[[GRAY]] if you activate Graceful Roll.\nThe chance for success is scaled against your skill level in a linear curve until level [[YELLOW]]{2}[[GRAY]] where it maxes out, every level in Acrobatics gives you a [[YELLOW]]{3}%[[GRAY]] chance to succeed.\nBy holding the sneak button you can double your odds to avoid fall damage and avoid up to twice the fall damage! Holding sneak will transform a normal roll into a Graceful Roll.\nRolling will only prevent up to [[RED]]{4}[[GRAY]] damage. Graceful Rolls will prevent up to [[GREEN]]{5}[[GRAY]] 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.SubSkill.Dodge.Stat=Dodge Chance -Acrobatics.Listener=Acrobatics: -Acrobatics.Roll.Text=[[ITALIC]]**Rolled** +Acrobatics.Ability.Proc=&a**Grakštus Nusileidimas** +Acrobatics.Combat.Proc=&a**Išvengta** +Acrobatics.SubSkill.Roll.Stats=&6Nusileidimo šansas &e{0}%&6 Grakštaus Nusileidimo šansas {1}% +Acrobatics.SubSkill.Roll.Stat=Nusileidimo šansas +Acrobatics.SubSkill.Roll.Stat.Extra=Grakštaus Nusileidimo Šansas +Acrobatics.SubSkill.Roll.Name=Nusiridenti +Acrobatics.SubSkill.Roll.Description=Strategiškai nusileisti išvengiant žąlos. +Acrobatics.SubSkill.Roll.Chance=Nusileidimo šansas: &e{0} +Acrobatics.SubSkill.Roll.GraceChance=Grakštaus Nusileidimo Šansas: &e{0} +Acrobatics.SubSkill.Roll.Mechanics=&7Nusiridenimas yra aktyvus antrinis įgudis su pasyviu komponentu.\nBet kada nukritus gauni žąlos, yra šansas visiškai jos išvengti priklausomai nuo įgūdžio lygio, 50 lygyje, tu turi &e{0}%&7 šansą išvengti žąlos, ir &e{1}%&7 jei aktyvuoji Grakštų Nusileidimą.\nŠansas yra proporcingai lyginamas su tavo įgudžiu linijinėję kreivėję iki lygio &e{2}&7 kur jis pasiekia maksimumą, kiekvienas lygis Akrobatikoje duoda &e{3}%&7 šanso pasisekti.\nLaikant sėlinimo mygtuką, gali pasidvigubinti šansą išvengti net iki dvigubos kritimo žąlos! Sėlinant Nusiridenimas transformuojasi į Grakštų Nusileidimą.\nRolling will only prevent up to &c{4}&7 damage. Graceful Rolls will prevent up to &a{5}&7 damage. +Acrobatics.SubSkill.GracefulRoll.Name=Grakštus Nusileidimas +Acrobatics.SubSkill.GracefulRoll.Description=Dvigubai efektyvesnis nei normalus Nusileidimas +Acrobatics.SubSkill.Dodge.Name=Išvengimas +Acrobatics.SubSkill.Dodge.Description=Per puse sumažina gautą puolimo žąlą +Acrobatics.SubSkill.Dodge.Stat=Išvengimo šansas +Acrobatics.Listener=Acrobatika: +Acrobatics.Roll.Text=&o**Nusileista** Acrobatics.SkillName=ACROBATICS #ALCHEMY -Alchemy.SubSkill.Catalysis.Name=Catalysis -Alchemy.SubSkill.Catalysis.Description=Increases potion brewing speed -Alchemy.SubSkill.Catalysis.Stat=Brewing Speed -Alchemy.SubSkill.Concoctions.Name=Concoctions -Alchemy.SubSkill.Concoctions.Description=Brew potions with more ingredients -Alchemy.SubSkill.Concoctions.Stat=Concoctions Rank: [[GREEN]]{0}[[DARK_AQUA]]/[[GREEN]]{1} -Alchemy.SubSkill.Concoctions.Stat.Extra=Ingredients [[[GREEN]]{0}[[DARK_AQUA]]]: [[GREEN]]{1} -Alchemy.Listener=Alchemy: +Alchemy.SubSkill.Catalysis.Name=Katalizė +Alchemy.SubSkill.Catalysis.Description=Sumažina stebuklingo gėrimo gaminimo laiką +Alchemy.SubSkill.Catalysis.Stat=Gaminimo Laikas +Alchemy.SubSkill.Concoctions.Name=Mikstūra +Alchemy.SubSkill.Concoctions.Description=Gėrimų gaminimas su daugiau ingredientų +Alchemy.SubSkill.Concoctions.Stat=Tinktūrų Rankas: &a{0}&3/&a{1} +Alchemy.SubSkill.Concoctions.Stat.Extra=Ingredientai [&a{0}&3]: &a{1} +Alchemy.Listener=Alchemija: Alchemy.Ability.Locked.0=LOCKED UNTIL {0}+ SKILL (CATALYSIS) Alchemy.SkillName=ALCHEMY #ARCHERY -Archery.SubSkill.SkillShot.Name=Skill Shot -Archery.SubSkill.SkillShot.Description=Increases damage done with bows -Archery.SubSkill.SkillShot.Stat=Skill Shot Bonus Damage -Archery.SubSkill.Daze.Name=Daze -Archery.SubSkill.Daze.Description=Disorients foes and deals extra DMG -Archery.SubSkill.Daze.Stat=Daze Chance -Archery.SubSkill.ArrowRetrieval.Name=Arrow Retrieval -Archery.SubSkill.ArrowRetrieval.Description=Chance to retrieve arrows from corpses -Archery.SubSkill.ArrowRetrieval.Stat=Arrow Recovery Chance -Archery.SubSkill.ArcheryLimitBreak.Name=Archery Limit Break -Archery.SubSkill.ArcheryLimitBreak.Description=Breaking your limits. Increased damage against tough opponents. Intended for PVP, up to server settings for whether or not it will boost damage in PVE. -Archery.SubSkill.ArcheryLimitBreak.Stat=Limit Break Max DMG -Archery.Listener=Archery: +Archery.SubSkill.SkillShot.Name=Taiklus Šūvis +Archery.SubSkill.SkillShot.Description=Padidiną daromą žąlą su lankais +Archery.SubSkill.SkillShot.Stat=Taiklaus Šūvio Papildoma Žąla +Archery.SubSkill.Daze.Name=Apsvaiginimas +Archery.SubSkill.Daze.Description=Apsvaigina priešą ir daro papildomai žąlos +Archery.SubSkill.Daze.Stat=Apsvaiginimo Šansas +Archery.SubSkill.ArrowRetrieval.Name=Strėlių Susigrąžinimas +Archery.SubSkill.ArrowRetrieval.Description=Šansas atgauti strėles iš priešų kūnų +Archery.SubSkill.ArrowRetrieval.Stat=Strėlių Atgavimo Šansas +Archery.SubSkill.ArcheryLimitBreak.Name=Lankininko Ribos Peržengimas +Archery.SubSkill.ArcheryLimitBreak.Description=Sugriauna tavo ribas. Padidiną žąlą prieš stiprius priešininkus. Naudojamas prieš kitus žaidėjus, serveris nustato ar duods papildomos žąlos prieš monstrus. +Archery.SubSkill.ArcheryLimitBreak.Stat=Ribos Peržengimo MAX Žąla +Archery.Listener=Lankininko įgūdis: Archery.SkillName=ARCHERY #AXES Axes.Ability.Bonus.0=Kirvio meistras -Axes.Ability.Bonus.1=Pridės {0} žalos -Axes.Ability.Bonus.2=Armor 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=[[DARK_AQUA]]You [[GOLD]]ready[[DARK_AQUA]] your Axe. -Axes.Combat.CritStruck=[[DARK_RED]]You were CRITICALLY hit! -Axes.Combat.CriticalHit=CRITICAL HIT! -Axes.Combat.GI.Proc=[[GREEN]]**STRUCK WITH GREAT FORCE** -Axes.Combat.GI.Struck=**HIT BY GREATER IMPACT** -Axes.Combat.SS.Struck=[[DARK_RED]]Struck by SKULL SPLITTER! +Axes.Ability.Bonus.1=Pridės {0} žąlos +Axes.Ability.Bonus.2=Šarvų laužymas +Axes.Ability.Bonus.3=Padaro {0} Papildomos žąlos šarvams +Axes.Ability.Bonus.4=Didesnis poveikis +Axes.Ability.Bonus.5=Pridės {0} Papildomos žąlos bešarviams priešams +Axes.Ability.Lower=&7Nuleidai savo kirvį. +Axes.Ability.Ready=&3Tu &6paruošei&3 savo kirvį. +Axes.Combat.CritStruck=&4Buvai KRITIŠKAI pažeistas! +Axes.Combat.CriticalHit=KRITIŠKAS SMŪGIS! +Axes.Combat.GI.Proc=&a**SMŪGIS SU DIDELE JĖGA** +Axes.Combat.GI.Struck=**SMŲGIS SU DIDELIU POVEIKIU** +Axes.Combat.SS.Struck=&4Pažeistas KAUKOLĘS SKALDYTOJU! Axes.SubSkill.SkullSplitter.Name=Kaukolių skaldytojas -Axes.SubSkill.SkullSplitter.Description=Deal AoE Damage -Axes.SubSkill.SkullSplitter.Stat=Skull Splitter Duration -Axes.SubSkill.CriticalStrikes.Name=Critical Strikes -Axes.SubSkill.CriticalStrikes.Description=Double Damage -Axes.SubSkill.CriticalStrikes.Stat=Critical Strike Chance -Axes.SubSkill.AxeMastery.Name=Axe Mastery -Axes.SubSkill.AxeMastery.Description=Adds bonus DMG -Axes.SubSkill.AxesLimitBreak.Name=Axes Limit Break -Axes.SubSkill.AxesLimitBreak.Description=Breaking your limits. Increased damage against tough opponents. Intended for PVP, up to server settings for whether or not it will boost damage in PVE. -Axes.SubSkill.AxesLimitBreak.Stat=Limit Break Max DMG -Axes.SubSkill.ArmorImpact.Name=Armor 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.SubSkill.SkullSplitter.Description=Daro Žąlą Zonoje +Axes.SubSkill.SkullSplitter.Stat=Kaukolės skaldytojo laikotarpis +Axes.SubSkill.CriticalStrikes.Name=Kritiški smūgiai +Axes.SubSkill.CriticalStrikes.Description=Dviguba Žąla +Axes.SubSkill.CriticalStrikes.Stat=Kritiško Smūgio Šansas +Axes.SubSkill.AxeMastery.Name=Kirvio Meistryste +Axes.SubSkill.AxeMastery.Description=Prideda papildomos Žąlos +Axes.SubSkill.AxesLimitBreak.Name=Kirvių Ribų Peržengimas +Axes.SubSkill.AxesLimitBreak.Description=Sugriauna tavo ribas. Padidiną žąlą prieš stiprius priešininkus. Naudojamas prieš kitus žaidėjus, serveris nustato ar duods papildomos žąlos prieš monstrus. +Axes.SubSkill.AxesLimitBreak.Stat=Ribos Peržengimo MAX Žąla +Axes.SubSkill.ArmorImpact.Name=Šarvų Poveikis +Axes.SubSkill.ArmorImpact.Description=Smūgis su pakankamai jėgos, sulaužyti šarvams +Axes.SubSkill.GreaterImpact.Name=Didelės Jėgos Smūgis +Axes.SubSkill.GreaterImpact.Description=Daro papildomai žąlos bešarviams priešams +Axes.Listener=Kirviai: Axes.SkillName=AXES -Axes.Skills.SS.Off=**Skull Splitter has worn off** -Axes.Skills.SS.On=[[GREEN]]**Skull Splitter ACTIVATED** -Axes.Skills.SS.Refresh=[[GREEN]]Your [[YELLOW]]Skull Splitter [[GREEN]]ability is refreshed! -Axes.Skills.SS.Other.Off=Skull Splitter[[GREEN]] has worn off for [[YELLOW]]{0} -Axes.Skills.SS.Other.On=[[GREEN]]{0}[[DARK_GREEN]] has used [[RED]]Skull Splitter! +Axes.Skills.SS.Off=**Kaukolės Skaldytojas pasibaigė** +Axes.Skills.SS.On=&a**Kaukolės Skaldytojas ĮJUNGTAS** +Axes.Skills.SS.Refresh=&aYour &eKaukolių Skaldytojas &aatsinaujino! +Axes.Skills.SS.Other.Off=Kaukolių Skaldytojas&a išsijungė &e{0} +Axes.Skills.SS.Other.On=&a{0}&2 panaudojo &cKaukolių Skaldytoją! #EXCAVATION -Excavation.Ability.Lower=[[GRAY]]You lower your shovel. -Excavation.Ability.Ready=[[DARK_AQUA]]You [[GOLD]]ready[[DARK_AQUA]] your Shovel. -Excavation.SubSkill.GigaDrillBreaker.Name=Giga Drill Breaker -Excavation.SubSkill.GigaDrillBreaker.Description=3x Drop Rate, 3x EXP, +Speed -Excavation.SubSkill.GigaDrillBreaker.Stat=Giga Drill Breaker Duration +Excavation.Ability.Lower=&7Nuleidai savo kastuvą. +Excavation.Ability.Ready=&3Tu &6paruošei&3 savo kastuvą. +Excavation.SubSkill.GigaDrillBreaker.Name=Giga Grąžtas +Excavation.SubSkill.GigaDrillBreaker.Description=3x Iškasenų, 3x EXP, +Greitis +Excavation.SubSkill.GigaDrillBreaker.Stat=Giga Grąžto trukmė Excavation.SubSkill.Archaeology.Name=Archeologas -Excavation.SubSkill.Archaeology.Description=Unearth the secrets of the land! High skill levels increase your odds of finding experience orbs when you find treasure! -Excavation.SubSkill.Archaeology.Stat=Archaeology Experience Orb Chance -Excavation.SubSkill.Archaeology.Stat.Extra=Archaeology Experience Orb Amount -Excavation.Listener=Excavation: +Excavation.SubSkill.Archaeology.Description=Atkask žemės paslaptis! Aukštas įgūdžio lygis padidina tavo šansus gauti EXP orbus kai randi lobius! +Excavation.SubSkill.Archaeology.Stat=Archaeologijos EXP Orbų Šansas +Excavation.SubSkill.Archaeology.Stat.Extra=Archaeologijos EXP Orbų Kiekis +Excavation.Listener=Kasinėjimas: Excavation.SkillName=EXCAVATION -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.Skills.GigaDrillBreaker.Off=**Giga Grąžtas pasibaigė** +Excavation.Skills.GigaDrillBreaker.On=&a**GIGA GRĄŽTAS AKTYVUOTAS** +Excavation.Skills.GigaDrillBreaker.Refresh=&aTavo &eGiga Grąžto &agalia atsinaujino! +Excavation.Skills.GigaDrillBreaker.Other.Off=Giga Grąžtas&a išsijungė &e{0} +Excavation.Skills.GigaDrillBreaker.Other.On=&a{0}&2 panaudojo &cGiga Grąžtą! #FISHING -Fishing.ScarcityTip=[[YELLOW]]&oŠioje zonoje nebeliko ką žvejoti, todėl prašome Jūsų žvejoti kitoje vietoje persikeliant: {0} blokus į bet kurįą pusę! -Fishing.Scared=[[GRAY]]&oGreitai judėdami išgasdinsite žuvis! -Fishing.Exhausting=[[RED]]&oNaudodami meškerę ne pagal paskirtį ją sulaužysite! -Fishing.LowResourcesTip=[[GRAY]]Šioje zonoje nebeliko ką žvejoti, todėl prašome Jūsų žvejoti kitoje vietoje persikeliant: {0} blokus į bet kurįą pusę! -Fishing.Ability.Info=Magiškas žvejys: [[GRAY]] **Kitas rankas: Lobių ieškotojas** -Fishing.Ability.Locked.0=LOCKED UNTIL {0}+ SKILL (SHAKE) -Fishing.Ability.Locked.1=LOCKED UNTIL {0}+ SKILL (ICE FISHING) -Fishing.Ability.Locked.2=LOCKED UNTIL {0}+ SKILL (MASTER ANGLER) +Fishing.ScarcityTip=&e&oŠioje zonoje nebeliko ką žvejoti, todėl prašome Jūsų žvejoti kitoje vietoje persikeliant: {0} blokus į bet kurįą pusę! +Fishing.Scared=&7&oGreitai judėdami išgasdinsite žuvis! +Fishing.Exhausting=&c&oNaudodami meškerę ne pagal paskirtį ją sulaužysite! +Fishing.LowResourcesTip=&7Šioje zonoje nebeliko ką žvejoti, todėl prašome Jūsų žvejoti kitoje vietoje persikeliant: {0} blokus į bet kurįą pusę! +Fishing.Ability.Info=Magiškas žvejys: &7 **Kitas rankas: Lobių ieškotojas** +Fishing.Ability.Locked.0=UŽRAKINTAS IKI {0}+ GALIA (PURTYTI) +Fishing.Ability.Locked.1=UŽRAKINTAS IKI {0}+ GALIA (LEDO ŽVEJYBA) +Fishing.Ability.Locked.2=UŽRAKINTAS IKI {0}+ GALIA (MEISTRAS ŽVEJYS) Fishing.SubSkill.TreasureHunter.Name=Lobių ieškotojas -Fishing.SubSkill.TreasureHunter.Description=Fish up misc. objects -Fishing.SubSkill.TreasureHunter.Stat=Lobių ieškotojo rankas: [[GREEN]]{0}[[DARK_AQUA]]/[[GREEN]]{1} -Fishing.SubSkill.TreasureHunter.Stat.Extra=Drop Rate: [[GRAY]]Common: [[YELLOW]]{0} [[GREEN]]Uncommon: [[YELLOW]]{1}\n[[BLUE]]Rare: [[YELLOW]]{2} [[LIGHT_PURPLE]]Epic: [[YELLOW]]{3} [[GOLD]]Legendary: [[YELLOW]]{4} [[AQUA]]Record: [[YELLOW]]{5} +Fishing.SubSkill.TreasureHunter.Description=Sužvejoji atsitiktinius daiktus +Fishing.SubSkill.TreasureHunter.Stat=Lobių ieškotojo rankas: &a{0}&3/&a{1} +Fishing.SubSkill.TreasureHunter.Stat.Extra=Laimikio šansas: &7Dažnas: &e{0} &aNedažnas: &e{1}\n&9Retas: &e{2} &dEpiškas: &e{3} &6Legendinis: &e{4} &bMitiškas: &e{5} Fishing.SubSkill.MagicHunter.Name=Magiškas žvejys -Fishing.SubSkill.MagicHunter.Description=Find Enchanted Items -Fishing.SubSkill.MagicHunter.Stat=Magic Hunter Chance -Fishing.SubSkill.Shake.Name=Shake -Fishing.SubSkill.Shake.Description=Shake items off of mobs or players w/ fishing pole -Fishing.SubSkill.Shake.Stat=Shake Chance -Fishing.SubSkill.FishermansDiet.Name=Fisherman's Diet -Fishing.SubSkill.FishermansDiet.Description=Improves hunger restored from fished foods -Fishing.SubSkill.FishermansDiet.Stat=Fisherman's Diet:[[GREEN]] Rank {0} -Fishing.SubSkill.MasterAngler.Name=Master Angler -Fishing.SubSkill.MasterAngler.Description=Improves chance of getting a bite while fishing -Fishing.SubSkill.MasterAngler.Stat=Added Bite Chance at your current location: [[GREEN]]+{0} -Fishing.SubSkill.IceFishing.Name=Ice Fishing -Fishing.SubSkill.IceFishing.Description=Allows you to fish in icy biomes -Fishing.SubSkill.IceFishing.Stat=Ice Fishing -Fishing.Chance.Raining=[[BLUE]] Rain Bonus -Fishing.Listener=Fishing: -Fishing.Ability.TH.MagicFound=[[GRAY]]You feel a touch of magic with this catch... -Fishing.Ability.TH.Boom=[[GRAY]]BOOM TIME!!! -Fishing.Ability.TH.Poison=[[GRAY]]Something doesn't smell quite right... +Fishing.SubSkill.MagicHunter.Description=Rasti užkerėtų daiktų +Fishing.SubSkill.MagicHunter.Stat=Magiško Medžiotojo Šansas +Fishing.SubSkill.Shake.Name=Purtyti +Fishing.SubSkill.Shake.Description=Nupurtyti daiktus nuo monstrų ar žaidėjų su meškere +Fishing.SubSkill.Shake.Stat=Nupurtymo šansas +Fishing.SubSkill.FishermansDiet.Name=Žvejo dieta +Fishing.SubSkill.FishermansDiet.Description=Žuvies maistas papildomai mažina alkį +Fishing.SubSkill.FishermansDiet.Stat=Žvejo dieta:&a Reitingas {0} +Fishing.SubSkill.MasterAngler.Name=Meistras Žvejys +Fishing.SubSkill.IceFishing.Name=Ledinė žvejyba +Fishing.SubSkill.IceFishing.Description=Leidžia jums žvejoti šaltuose biomuose +Fishing.SubSkill.IceFishing.Stat=Ledinė žvejyba +Fishing.Chance.Raining=&9 Lietaus bonusas +Fishing.Listener=Žvejojimas: +Fishing.Ability.TH.MagicFound=&7Tu jauti magišką prisilietima su šiuo laimikiu... +Fishing.Ability.TH.Boom=&7BUMO LAIKAS!!! +Fishing.Ability.TH.Poison=&7Kažkas blogai kvepia... Fishing.SkillName=FISHING #HERBALISM -Herbalism.Ability.GTe.NeedMore=You need more seeds to spread Green Terra. -Herbalism.Ability.GTh.Fail=**GREEN THUMB FAIL** -Herbalism.Ability.GTh=[[GREEN]]**GREEN THUMB** -Herbalism.Ability.Lower=[[GRAY]]You lower your Hoe. -Herbalism.Ability.Ready=[[DARK_AQUA]]You [[GOLD]]ready[[DARK_AQUA]] your Hoe. -Herbalism.Ability.ShroomThumb.Fail=**SHROOM THUMB FAIL** -Herbalism.SubSkill.GreenTerra.Name=Green Terra -Herbalism.SubSkill.GreenTerra.Description=Spread the Terra, 3x Drops -Herbalism.SubSkill.GreenTerra.Stat=Green Terra Duration -Herbalism.SubSkill.GreenThumb.Name=Green Thumb -Herbalism.SubSkill.GreenThumb.Description=Auto-Plants crops when harvesting -Herbalism.SubSkill.GreenThumb.Stat=Green Thumb Chance -Herbalism.SubSkill.GreenThumb.Stat.Extra=Green Thumb Stage: [[GREEN]] Crops grow in stage {0} -Herbalism.Effect.4=Green Thumb (Blocks) -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.FarmersDiet.Stat=Farmer's Diet: [[GREEN]]Rank {0} -Herbalism.SubSkill.DoubleDrops.Name=Double Drops -Herbalism.SubSkill.DoubleDrops.Description=Double the normal loot -Herbalism.SubSkill.DoubleDrops.Stat=Double Drop Chance -Herbalism.SubSkill.HylianLuck.Name=Hylian Luck -Herbalism.SubSkill.HylianLuck.Description=Gives a small chance of finding rare items -Herbalism.SubSkill.HylianLuck.Stat=Hylian Luck Chance -Herbalism.SubSkill.ShroomThumb.Name=Shroom Thumb -Herbalism.SubSkill.ShroomThumb.Description=Spread mycelium to dirt & grass -Herbalism.SubSkill.ShroomThumb.Stat=Shroom Thumb Chance -Herbalism.HylianLuck=[[GREEN]]The luck of Hyrule is with you today! -Herbalism.Listener=Herbalism: +Herbalism.Ability.GTe.NeedMore=Tau reikia daugiau sėklų naudoti Žaliai Žemei. +Herbalism.Ability.GTh.Fail=**ŽALIAS NYKŠTYS NEPASISEKĖ** +Herbalism.Ability.GTh=&a**ŽALIAS NYKŠTYS** +Herbalism.Ability.Lower=&7Tu nuleidai savo Kauplį. +Herbalism.Ability.Ready=&3Tu &6paruošei&3 savo Kauplį. +Herbalism.Ability.ShroomThumb.Fail=**GRYBŲ NYKŠTYS NEPASISEKĖ** +Herbalism.SubSkill.GreenTerra.Name=Žalia Žemė +Herbalism.SubSkill.GreenTerra.Description=Išplėsti žemę, 3x iškasenos +Herbalism.SubSkill.GreenTerra.Stat=Žalios Žemės Trukmė +Herbalism.SubSkill.GreenThumb.Name=Žalias Nykštys +Herbalism.SubSkill.GreenThumb.Description=Auto-Pasodina pasėlius nuimant derlių +Herbalism.SubSkill.GreenThumb.Stat=Žalio Nykščio Šansas +Herbalism.SubSkill.GreenThumb.Stat.Extra=Žalio Nykščio Stadija: &a Pasėliai užauga stadijoje {0} +Herbalism.Effect.4=Žalias Nykštys (Blokai) +Herbalism.SubSkill.GreenThumb.Description.2=Padaro plytas apaugusias, arba užaugina žolę +Herbalism.SubSkill.FarmersDiet.Name=Ūkininko dieta +Herbalism.SubSkill.FarmersDiet.Description=Užaugintas maistas papildomai mažina alkį +Herbalism.SubSkill.FarmersDiet.Stat=Ūkininko dieta: &aReitingas {0} +Herbalism.SubSkill.DoubleDrops.Name=Dvigubas derlius +Herbalism.SubSkill.DoubleDrops.Description=Dvigubas laimikis +Herbalism.SubSkill.DoubleDrops.Stat=Dvigubo derliaus šansas +Herbalism.SubSkill.HylianLuck.Name=Hyliano Sėkmė +Herbalism.SubSkill.HylianLuck.Description=Duoda mažą šansą rasti retų daiktų +Herbalism.SubSkill.HylianLuck.Stat=Hyliano Sėkmės Šansas +Herbalism.SubSkill.ShroomThumb.Name=Grybų Nykštys +Herbalism.SubSkill.ShroomThumb.Description=Išplečia grybiena į purvą ir žolę +Herbalism.SubSkill.ShroomThumb.Stat=Grybų Nykščio Šansas +Herbalism.HylianLuck=&aHyrulės sėkmė yra šiandien su tavimi! +Herbalism.Listener=Žolininkystė: Herbalism.SkillName=HERBALISM -Herbalism.Skills.GTe.Off=**Green Terra has worn off** -Herbalism.Skills.GTe.On=[[GREEN]]**GREEN TERRA ACTIVATED** -Herbalism.Skills.GTe.Refresh=[[GREEN]]Your [[YELLOW]]Green Terra [[GREEN]]ability is refreshed! -Herbalism.Skills.GTe.Other.Off=Green Terra[[GREEN]] has worn off for [[YELLOW]]{0} -Herbalism.Skills.GTe.Other.On=[[GREEN]]{0}[[DARK_GREEN]] has used [[RED]]Green Terra! +Herbalism.Skills.GTe.Off=**Žalia Žemė pasibaigė** +Herbalism.Skills.GTe.On=&a**ŽALIA ŽEMĖ AKTYVUOTA** +Herbalism.Skills.GTe.Refresh=&aTavo &eŽalia Žemė &agalia atsinaujino! +Herbalism.Skills.GTe.Other.Off=Žalia Žemė&a pasibaigė &e{0} +Herbalism.Skills.GTe.Other.On=&a{0}&2 panaudojo &cŽalia Žemė! #MINING -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=[[DARK_AQUA]]You [[GOLD]]ready[[DARK_AQUA]] your pickaxe. -Mining.SubSkill.SuperBreaker.Name=Super Breaker -Mining.SubSkill.SuperBreaker.Description=Speed+, Triple Drop Chance -Mining.SubSkill.SuperBreaker.Stat=Super Breaker Length -Mining.SubSkill.DoubleDrops.Name=Double Drops -Mining.SubSkill.DoubleDrops.Description=Double the normal loot -Mining.SubSkill.DoubleDrops.Stat=Double Drop Chance -Mining.SubSkill.BlastMining.Name=Blast Mining -Mining.SubSkill.BlastMining.Description=Bonuses to mining with TNT -Mining.SubSkill.BlastMining.Stat=Blast Mining:[[GREEN]] Rank {0}/{1} [[GRAY]]({2}) -Mining.SubSkill.BlastMining.Stat.Extra=Blast Radius Increase: [[GREEN]]+{0} -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.SubSkill.DemolitionsExpertise.Stat=Demolitions Expert Damage Decrease +Mining.Ability.Locked.0=UŽRAKINTAS IKI {0}+ GALIA (SPROGIMO KASYBA) +Mining.Ability.Locked.1=UŽRAKINTAS IKI {0}+ GALIA (DIDESNĖS BOMBOS) +Mining.Ability.Locked.2=UŽRAKINTAS IKI {0}+ GALIA (SPROGMENŲ EKSPERTAS) +Mining.Ability.Lower=&7Nuleidai savo Kirtiklį. +Mining.Ability.Ready=&3Tu &6paruošei&3 savo kirtiklį. +Mining.SubSkill.SuperBreaker.Name=Super Griovėjas +Mining.SubSkill.SuperBreaker.Description=Greitis+, Trigubas Iškasenų Šansas +Mining.SubSkill.SuperBreaker.Stat=Super Griovėjo trukmė +Mining.SubSkill.DoubleDrops.Name=Dvigubos iškasenos +Mining.SubSkill.DoubleDrops.Description=Dvigubas laimikis +Mining.SubSkill.DoubleDrops.Stat=Dvigubos iškasenos +Mining.SubSkill.BlastMining.Name=Sprogimo Kasyba +Mining.SubSkill.BlastMining.Description=Bonusai kasinėjant su sprogmenimis +Mining.SubSkill.BlastMining.Stat=Sprogimo kasyba:&a Rankas {0}/{1} &7({2}) +Mining.SubSkill.BlastMining.Stat.Extra=Sprogimo spindulys padidintas: &a+{0} +Mining.SubSkill.BiggerBombs.Name=Didesnės Bombos +Mining.SubSkill.BiggerBombs.Description=Padidina bombų sprogimo spindulį +Mining.SubSkill.DemolitionsExpertise.Name=Sprogmenų Eskpertas +Mining.SubSkill.DemolitionsExpertise.Description=Sumažina žąlą nuo bombų sprogimo +Mining.SubSkill.DemolitionsExpertise.Stat=Sprogmenų eksperto žąlos sumažinimas Mining.Listener=Mining: 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]]Your [[YELLOW]]Super Breaker [[GREEN]]ability is refreshed! +Mining.Skills.SuperBreaker.Off=**Super Griovėjas pasibaigė** +Mining.Skills.SuperBreaker.On=&a**SUPER GRIOVĖJAS AKTYVUOTAS** +Mining.Skills.SuperBreaker.Other.Off=Super Griovėjas&a pasibagiė &e{0} +Mining.Skills.SuperBreaker.Other.On=&a{0}&2 panaudojo &cSuper griovėja! +Mining.Skills.SuperBreaker.Refresh=&aYour &eSuper Griovėjas &agalia atsinaujino! #Blast Mining -Mining.Blast.Boom=[[GRAY]]**BOOM** +Mining.Blast.Boom=&7**BŪM** Mining.Blast.Cooldown= -Mining.Blast.Effect=+{0} ore yield, {1}x drops -Mining.Blast.Other.On=[[GREEN]]{0}[[DARK_GREEN]] has used [[RED]]Blast Mining! -Mining.Blast.Refresh=[[GREEN]]Your [[YELLOW]]Blast Mining [[GREEN]]ability is refreshed! +Mining.Blast.Effect=+{0} iškasenos, {1}x +Mining.Blast.Other.On=&a{0}&2 panaudojo &cSprogimo Kasyba! +Mining.Blast.Refresh=&aYour &eSprogimo Kasyba &agalia atsinaujino! #REPAIR -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.RepairMastery.Stat=Repair Mastery: [[GREEN]]Extra {0} durability restored -Repair.SubSkill.SuperRepair.Name=Super Repair -Repair.SubSkill.SuperRepair.Description=Double effectiveness -Repair.SubSkill.SuperRepair.Stat=Super Repair Chance -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=Repair magic items -Repair.SubSkill.ArcaneForging.Stat=Arcane Forging: [[YELLOW]]Rank {0}/{1} -Repair.SubSkill.ArcaneForging.Stat.Extra=[[DARK_AQUA]]Arcane Forging Odds:[[GRAY]] Success [[GREEN]]{0}[[GRAY]]%, Failure [[RED]]{1}[[GRAY]]% -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=Repair: +Repair.SubSkill.Repair.Name=Taisymas +Repair.SubSkill.Repair.Description=Šarvų ir įrankių taisymas +Repair.SubSkill.GoldRepair.Name=Aukso taisymas ({0}+ ĮGŪDIS) +Repair.SubSkill.GoldRepair.Description=Auksinių įrankių ir šarvų taisymas +Repair.SubSkill.IronRepair.Name=Geležies taisymas ({0}+ ĮGŪDIS) +Repair.SubSkill.IronRepair.Description=Geležinių įrankių ir šarvų taisymas +Repair.SubSkill.StoneRepair.Name=Akmens taisymas ({0}+ ĮGŪDIS) +Repair.SubSkill.StoneRepair.Description=Akmeninių įrankių taisymas +Repair.SubSkill.RepairMastery.Name=Taisymo Meistriškumas +Repair.SubSkill.RepairMastery.Description=Padidina taisymo kiekį +Repair.SubSkill.RepairMastery.Stat=Taisymo Meistriškumas: &aPapildomo {0} patvarumas atstatytas +Repair.SubSkill.SuperRepair.Name=Super Taisymas +Repair.SubSkill.SuperRepair.Description=Dvigubas efektyvumas +Repair.SubSkill.SuperRepair.Stat=Super Pataisymo Šansas +Repair.SubSkill.DiamondRepair.Name=Deimantų Taisymas ({0}+ ĮGŪDIS) +Repair.SubSkill.DiamondRepair.Description=Deimantinių įrankių ir šarvų taisymas +Repair.SubSkill.ArcaneForging.Name=Arkaniška Kalvystė +Repair.SubSkill.ArcaneForging.Description=Sutaisyti magiškus daiktus +Repair.SubSkill.ArcaneForging.Stat=Arkaniška Kalvystė: &eRankas {0}/{1} +Repair.SubSkill.ArcaneForging.Stat.Extra=&3Arkaniškos Kalvystės Šansas:&7 Sėkmė &a{0}&7%, Nesekmė &c{1}&7% +Repair.Error=&4mcMMO susidūrė su problema bandant taisyti šį daiktą! +Repair.Listener.Anvil=&4Pastatei Kaltą, kaltai gali taisyti įrankius ir šarvus. +Repair.Listener=Taisymas: Repair.SkillName=REPAIR -Repair.Skills.AdeptDiamond=[[DARK_RED]]You're not skilled enough to repair Diamond. -Repair.Skills.AdeptGold=[[DARK_RED]]You're not skilled enough to repair Gold. -Repair.Skills.AdeptIron=[[DARK_RED]]You're not skilled enough to repair Iron. -Repair.Skills.AdeptStone=[[DARK_RED]]You're not skilled enough to repair Stone. -Repair.Skills.Adept=[[RED]]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.StackedItems=[[DARK_RED]]You can't repair stacked items. -Repair.Pretty.Name=Repair +Repair.Skills.AdeptDiamond=&4Jūs neesate pakankamai įgudę, jog sutaisytumete deimantą. +Repair.Skills.AdeptGold=&4Jūs neesate pakankamai įgudę, jog sutaisytumete auksą. +Repair.Skills.AdeptIron=&4Jūs neesate pakankamai įgudę, jog sutaisytumete geležį. +Repair.Skills.AdeptStone=&4Jūs neesate pakankamai įgudę, jog sutaisytumete akmenį. +Repair.Skills.Adept=&cJūs turite būti lygio &e{0}&c, jog sutaisytumėte &e{1} +Repair.Skills.FeltEasy=&7Tai pasijautė lengva. +Repair.Skills.FullDurability=&7Tai yra pilnai sutaisyta. +Repair.Skills.StackedItems=&4Jūs negalite sutaisyti sukrautų dadiktų. +Repair.Pretty.Name=Taisyti #Arcane Forging -Repair.Arcane.Downgrade=Arcane power has decreased for this item. -Repair.Arcane.Fail=Arcane power has permanently left the item. -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.Downgrade=Šio daikto Arkaniška galia sumažėjo. +Repair.Arcane.Fail=Arkaniška galia visiškai pranyko iš šio daikto. +Repair.Arcane.Lost=Jūs nebuvo pakankamai įgudę išsaugoti kerėjimus. +Repair.Arcane.Perfect=&aJūs išsaugojote arkaniškas galias šiame daikte. #SALVAGE -Salvage.Pretty.Name=Salvage -Salvage.SubSkill.UnderstandingTheArt.Name=Understanding The Art -Salvage.SubSkill.UnderstandingTheArt.Description=You're not just digging through your neighbors trash, you're taking care of the environment.\nPowers up various properties of Salvaging. -Salvage.SubSkill.ScrapCollector.Name=Scrap Collector -Salvage.SubSkill.ScrapCollector.Description=Salvage materials from an item, a perfect salvage depends on skill and luck. -Salvage.SubSkill.ScrapCollector.Stat=Scrap Collector: [[GREEN]]Salvage up to [[YELLOW]]{0}[[GREEN]] items. Some luck is involved. -Salvage.SubSkill.ArcaneSalvage.Name=Arcane Salvaging -Salvage.SubSkill.ArcaneSalvage.Description=Extract enchantments from items -Salvage.SubSkill.ArcaneSalvage.Stat=Arcane Salvaging: [[YELLOW]]Rank {0}/{1} -Salvage.Ability.Bonus.0=Scrap Collector -Salvage.Ability.Bonus.1=Salvage up to [[YELLOW]]{0}[[GREEN]] items. Some luck is involved. -Salvage.Arcane.ExtractFull=[[GRAY]]AS Full-Enchant Chance -Salvage.Arcane.ExtractPartial=[[GRAY]]AS Partial-Enchant Chance -Salvage.Skills.Success=[[GREEN]]Item salvaged! -Salvage.Skills.Adept.Damaged=[[DARK_RED]]You aren't skilled enough to salvage damaged items. -Salvage.Skills.Adept.Level=You must be level [[YELLOW]]{0}[[RED]] to salvage [[YELLOW]]{1} -Salvage.Skills.TooDamaged=[[DARK_RED]]This item is too damaged to be salvaged. -Salvage.Skills.ArcaneFailed=[[RED]]You were unable to extract the knowledge contained within this item. -Salvage.Skills.ArcanePartial=[[RED]]You were only able to extract some of the knowledge contained within this item. -Salvage.Skills.ArcaneSuccess=[[GREEN]]You able to extract all of the knowledge contained within this item! -Salvage.Listener.Anvil=[[DARK_RED]]You have placed a Salvage anvil, use this to Salvage tools and armor. -Salvage.Listener=Salvage: +Salvage.Pretty.Name=Išgelbėjimas +Salvage.SubSkill.UnderstandingTheArt.Name=Meno supratimas +Salvage.SubSkill.UnderstandingTheArt.Description=Jūs ne tik naršote pro kaimynų šiukšles, jūs rūpinatės aplinka\nPastiprina gelbėjimo įvairias galias. +Salvage.SubSkill.ScrapCollector.Name=Atliekų Surinkėjas +Salvage.SubSkill.ScrapCollector.Description=Išgelbėti medžiagas iš daikto, tobulas išgelbėjimas priklauso nuo įgūdžio ir sėkmės. +Salvage.SubSkill.ScrapCollector.Stat=Scrap Collector: &aSalvage up to &e{0}&a items. Some luck is involved. +Salvage.SubSkill.ArcaneSalvage.Name=Arkaniškas Gelbėjimas +Salvage.SubSkill.ArcaneSalvage.Description=Ištraukti kerėjimus iš daiktų +Salvage.SubSkill.ArcaneSalvage.Stat=Arkaniškas Gelbėjimas: &eRankas {0}/{1} +Salvage.Ability.Bonus.0=Atliekų Surinkėjas +Salvage.Ability.Bonus.1=Išgelbėti iki &e{0}&a daiktų. Šiek tiek susideda iš sėkmės. +Salvage.Arcane.ExtractFull=&7AS Pilno kėrėjimo šansas +Salvage.Arcane.ExtractPartial=&7AS Dalinio kėrėjimo šansas +Salvage.Skills.Success=&aDaiktas Išgelbėtas! +Salvage.Skills.Adept.Damaged=&4Jūs neesate pakankamai įgudę, jog surinktumėte sulaužytus daiktus. +Salvage.Skills.Adept.Level=Reikia Lygio &e{0}&c kad išgelbėti &e{1} +Salvage.Skills.TooDamaged=&4Šis daiktas per daug sulaužytas kad būtų galima išgelbėti. +Salvage.Skills.ArcaneFailed=&cJūs negalėjote ištraukti žinių esančių šiame daikte. +Salvage.Skills.ArcanePartial=&cJūs galėjote ištraukti tik dalį žinių esančių šiame daikte. +Salvage.Skills.ArcaneSuccess=&aJūs galėjote ištraukti visas žinias iš šio daikto! +Salvage.Listener.Anvil=&4Jūs pastatėte išgelbėjimo priekalą, naudokite jį išgelbėti medžiagas iš daiktų. +Salvage.Listener=Išgelbėjimas: Salvage.SkillName=SALVAGE -Salvage.Skills.Lottery.Normal=[[GOLD]]You were able to salvage [[DARK_AQUA]]{0}[[GOLD]] materials from [[YELLOW]]{1}[[GOLD]]. -Salvage.Skills.Lottery.Perfect=[[GREEN]][[BOLD]]Perfect![[RESET]][[GOLD]] You salvaged [[DARK_AQUA]]{1}[[GOLD]] effortlessly, retrieving [[DARK_AQUA]]{0}[[GOLD]] materials. -Salvage.Skills.Lottery.Untrained=[[GRAY]]You aren't properly trained in salvaging. You were only able to recover [[RED]]{0}[[GRAY]] materials from [[GREEN]]{1}[[GRAY]]. +Salvage.Skills.Lottery.Normal=&6Jūs išgelbėjote &3{0}&6 medžiagų iš &e{1}&6. +Salvage.Skills.Lottery.Perfect=&a&lTobula!&r&6 Jūs išgelbėjote &3{1}&6 be pastangų, atgavote &3{0}&6 medžiagų. +Salvage.Skills.Lottery.Untrained=&7Jūs neesate tinkamai išmokyti rinkimo. Jūs tik galėjote surinkti &c{0}&7 daiktų iš &a{1}&7. #Anvil (Shared between SALVAGE and REPAIR) -Anvil.Unbreakable=This item is unbreakable! +Anvil.Unbreakable=Šis daiktas yra nesunaikinamas! #SWORDS -Swords.Ability.Lower=[[GRAY]]You lower your sword. -Swords.Ability.Ready=[[DARK_AQUA]]You [[GOLD]]ready[[DARK_AQUA]] your Sword. -Swords.Combat.Rupture.Note=[[GRAY]]NOTE: [[YELLOW]]1 Tick happens every 0.5 seconds! -Swords.Combat.Bleeding.Started=[[DARK_RED]] You're bleeding! -Swords.Combat.Bleeding.Stopped=[[GRAY]]The bleeding has [[GREEN]]stopped[[GRAY]]! -Swords.Combat.Bleeding=[[GREEN]]**ENEMY BLEEDING** -Swords.Combat.Counter.Hit=[[DARK_RED]]Hit with a counter-attack! -Swords.Combat.Countered=[[GREEN]]**COUNTER-ATTACKED** -Swords.Combat.SS.Struck=[[DARK_RED]]Struck by SERRATED STRIKES! -Swords.SubSkill.CounterAttack.Name=Counter Attack -Swords.SubSkill.CounterAttack.Description=Reflect a portion of damage when attacked! -Swords.SubSkill.CounterAttack.Stat=Counter Attack Chance -Swords.SubSkill.SerratedStrikes.Name=Serrated Strikes -Swords.SubSkill.SerratedStrikes.Description=Deal partial damage in an AOE with a chance to apply Rupture! -Swords.SubSkill.SerratedStrikes.Stat=Serrated Strikes Length -Swords.SubSkill.Rupture.Name=Rupture -Swords.SubSkill.Rupture.Description=Apply a powerful bleed DoT -Swords.SubSkill.Stab.Name=Stab -Swords.SubSkill.Stab.Description=Adds bonus damage to your attacks. -Swords.SubSkill.Stab.Stat=Stab Damage -Swords.SubSkill.SwordsLimitBreak.Name=Swords Limit Break -Swords.SubSkill.SwordsLimitBreak.Description=Breaking your limits. Increased damage against tough opponents. Intended for PVP, up to server settings for whether or not it will boost damage in PVE. -Swords.SubSkill.SwordsLimitBreak.Stat=Limit Break Max DMG -Swords.SubSkill.Rupture.Stat=Rupture Chance -Swords.SubSkill.Rupture.Stat.Extra=Rupture: [[GREEN]]{0} ticks [{1} DMG vs Player] [{2} DMG vs Mobs] -Swords.Effect.4=Serrated Strikes Rupture+ -Swords.Effect.5={0} Tick Rupture -Swords.Listener=Swords: +Swords.Ability.Lower=&7Jūs nuleidote savo kardą. +Swords.Ability.Ready=&3Tu &6paruošei&3 savo kardą. +Swords.Combat.Rupture.Note=&7PASTABA: &e1 Tickas atsitinka kas 0.5 sekundes! +Swords.Combat.Bleeding.Started=&4 Jūs kraujuojate! +Swords.Combat.Bleeding.Stopped=&7Kraujavimas &asustojo&7! +Swords.Combat.Bleeding=&a**PRIEŠAS KRAUJUOJA** +Swords.Combat.Counter.Hit=&4Kontratakos Smūgis! +Swords.Combat.Countered=&a**KONTRATAKA** +Swords.Combat.SS.Struck=&4Sužeidė su DANTYTA ATAKA! +Swords.SubSkill.CounterAttack.Name=Kontrataka +Swords.SubSkill.CounterAttack.Description=Atspindi dalį žąlos kai atakuoja! +Swords.SubSkill.CounterAttack.Stat=Kontratakos Šansas +Swords.SubSkill.SerratedStrikes.Name=Dantytos Atakos +Swords.SubSkill.SerratedStrikes.Description=Daro dalį žalos zonoje su šansų pradurti! +Swords.SubSkill.SerratedStrikes.Stat=Dantytos atakos trukmė +Swords.SubSkill.Rupture.Name=Pradūrimas +Swords.SubSkill.Rupture.Description=Padaro stiprų kraujavimą +Swords.SubSkill.Stab.Name=Durti +Swords.SubSkill.Stab.Description=Prideda papildomos žąlos prie atakų. +Swords.SubSkill.Stab.Stat=Durimo žąla +Swords.SubSkill.SwordsLimitBreak.Name=Kardų įgūdžių ribų peržengimas +Swords.SubSkill.SwordsLimitBreak.Description=Sugriauna tavo ribas. Padidiną žąlą prieš stiprius priešininkus. Naudojamas prieš kitus žaidėjus, serveris nustato ar duods papildomos žąlos prieš monstrus. +Swords.SubSkill.SwordsLimitBreak.Stat=Ribos peržengimo MAX Žąla +Swords.SubSkill.Rupture.Stat=Pradūrimo šansas +Swords.SubSkill.Rupture.Stat.Extra=Pradūrimas: &a{0} tickai [{1} Žąla prieš žaidėja] [{2} Žąla prieš monstrą] +Swords.Effect.4=Dantydos atakos pradūrimas+ +Swords.Effect.5={0} Ticko Pradūrimas +Swords.Listener=Kardai: Swords.SkillName=SWORDS -Swords.Skills.SS.Off=**Serrated Strikes has worn off** -Swords.Skills.SS.On=[[GREEN]]**SERRATED STRIKES ACTIVATED** -Swords.Skills.SS.Refresh=[[GREEN]]Your [[YELLOW]]Serrated Strikes [[GREEN]]ability is refreshed! -Swords.Skills.SS.Other.Off=Serrated Strikes[[GREEN]] has worn off for [[YELLOW]]{0} -Swords.Skills.SS.Other.On=[[GREEN]]{0}[[DARK_GREEN]] has used [[RED]]Serrated Strikes! +Swords.Skills.SS.Off=**Dantytos Atakos pasibaige** +Swords.Skills.SS.On=&a**DANTYTOS ATAKOS AKTYVUOTOS** +Swords.Skills.SS.Refresh=&aTavo &eDantytos Atakos &agalia atsinaujino! +Swords.Skills.SS.Other.Off=Dantytos Atakos&a pasibaigė &e{0} +Swords.Skills.SS.Other.On=&a{0}&2 Panaudojo &cDantytos Atakos! #TAMING -Taming.Ability.Bonus.0=Environmentally Aware -Taming.Ability.Bonus.1=Wolves avoid danger -Taming.Ability.Bonus.2=Thick Fur -Taming.Ability.Bonus.3=1/{0} Damage, Fire Resistance -Taming.Ability.Bonus.4=Shock Proof -Taming.Ability.Bonus.5=Explosives do 1/{0} normal damage -Taming.Ability.Bonus.6=Sharpened Claws -Taming.Ability.Bonus.7=+{0} Damage -Taming.Ability.Bonus.8=Fast Food Service -Taming.Ability.Bonus.9={0} Chance for heal on attack -Taming.Ability.Bonus.10=Holy Hound -Taming.Ability.Bonus.11=Regain health when damaged by magic or poison -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.Ability.Locked.5=LOCKED UNTIL {0}+ SKILL (HOLY HOUND) -Taming.Combat.Chance.Gore=Gore Chance -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: Crouch and left-click with\n {0} {1} (Ocelot), {2} {3} (Wolf), {4} {5} (Horse) -Taming.SubSkill.FastFoodService.Name=Fast Food Service -Taming.SubSkill.FastFoodService.Description=Chance for wolves to heal on attack -Taming.SubSkill.HolyHound.Name=Holy Hound -Taming.SubSkill.HolyHound.Description=Healed by Magic & Poison -Taming.SubSkill.Gore.Name=Gore -Taming.SubSkill.Gore.Description=Critical Strike that applies Rupture -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.SubSkill.Pummel.Name=Pummel -Taming.SubSkill.Pummel.Description=Your Wolves have a chance of knocking back foes -Taming.SubSkill.Pummel.TargetMessage=You've been knocked back by a wolf! -Taming.Listener.Wolf=[[DARK_GRAY]]Your wolf scurries back to you... -Taming.Listener=Taming: +Taming.Ability.Bonus.0=Aplinkos sąmoningumas +Taming.Ability.Bonus.1=Vilkai vengia pavojaus +Taming.Ability.Bonus.2=Storas kailis +Taming.Ability.Bonus.3=1/{0} Žala, Ugnies atsparumas +Taming.Ability.Bonus.4=Smūgio atsparumas +Taming.Ability.Bonus.5=sprogimai daro 1/{0} normalios žąlos +Taming.Ability.Bonus.6=Pagaląsti Nagai +Taming.Ability.Bonus.7=+{0} Žąla +Taming.Ability.Bonus.8=Greito Maisto Paslauga +Taming.Ability.Bonus.9={0} Šansas pasigydyti atakuojant +Taming.Ability.Bonus.10=Šventas Skalikas +Taming.Ability.Bonus.11=Atgauna gyvybių kai sužeidžia magija arba nuodai +Taming.Ability.Locked.0=UŽRAKINTA IKI {0}+ GALIA (APLINKOS SĄMONINGUMAS) +Taming.Ability.Locked.1=UŽRAKINTA IKI {0}+ GALIA (STORAS KAILIS) +Taming.Ability.Locked.2=UŽRAKINTA IKI {0}+ GALIA (SMŪGIO ATSPARUMAS) +Taming.Ability.Locked.3=UŽRAKINTA IKI {0}+ GALIA (PAGALĄSTI NAGAI) +Taming.Ability.Locked.4=UŽRAKINTA IKI {0}+ GALIA (GREITO MAISTO PASLAUGA) +Taming.Ability.Locked.5=UŽRAKINTA IKI {0}+ GALIA (ŠVENTAS SKALIKAS) +Taming.Combat.Chance.Gore=Plėšimo Šansas +Taming.SubSkill.BeastLore.Name=Žvėries apibendrinimas +Taming.SubSkill.BeastLore.Description=Mosikuojant-kaulu apžiūri vilkus ir ocelotus +Taming.SubSkill.ShockProof.Name=Smūgio Atsparumas +Taming.SubSkill.ShockProof.Description=Sprogimo žąlos atsparumas +Taming.SubSkill.CallOfTheWild.Name=Laukinio pašaukimas +Taming.SubSkill.CallOfTheWild.Description=Iškviečia gyvuną +Taming.SubSkill.CallOfTheWild.Description.2=&7LP: Atsitūpkite ir paspauskite kairijį pelės klavišą su\n {0} {1} (Ocelotas), {2} {3} (Vilkas), {4} {5} (Arklys) +Taming.SubSkill.FastFoodService.Name=Greito Maisto Paslauga +Taming.SubSkill.FastFoodService.Description=Šansas vilkams pasigydyti įkandant +Taming.SubSkill.HolyHound.Name=Šventas Skalikas +Taming.SubSkill.HolyHound.Description=Pagydė su magija arba nuodais +Taming.SubSkill.Gore.Name=Plėšimas +Taming.SubSkill.Gore.Description=Kritiški smūgiai kurie praduria +Taming.SubSkill.SharpenedClaws.Name=Pagaląsti Nagai +Taming.SubSkill.SharpenedClaws.Description=Žąlos Bonusas +Taming.SubSkill.EnvironmentallyAware.Name=Aplinkos Sąmoningumas +Taming.SubSkill.EnvironmentallyAware.Description=Kaktusų/Lavos Fobija, Nukritimo Žąlos imunitetas +Taming.SubSkill.ThickFur.Name=Storas Kailis +Taming.SubSkill.ThickFur.Description=Žąlos atsparumas, ugnies atsparumas +Taming.SubSkill.Pummel.Name=Trenkti +Taming.SubSkill.Pummel.Description=Tavo vilkai turi šansą atmušti priešą +Taming.SubSkill.Pummel.TargetMessage=Jūs buvote atmuštas vilko! +Taming.Listener.Wolf=&8Tavo vilkas parbėga prie tavęs... +Taming.Listener=Prijaukinimas: Taming.SkillName=TAMING -Taming.Summon.COTW.Success.WithoutLifespan=[[GREEN]](Call Of The Wild) [[GRAY]]You have summoned a [[GOLD]]{0}[[GRAY]] -Taming.Summon.COTW.Success.WithLifespan=[[GREEN]](Call Of The Wild) [[GRAY]]You have summoned a [[GOLD]]{0}[[GRAY]] and it has a duration of [[GOLD]]{1}[[GRAY]] seconds. -Taming.Summon.COTW.Limit=[[GREEN]](Call Of The Wild) [[GRAY]]You can only have [[RED]]{0} [[GRAY]]summoned [[GRAY]]{1} pets at the same time. -Taming.Summon.COTW.TimeExpired=[[GREEN]](Call Of The Wild) [[GRAY]]Time is up, your [[GOLD]]{0}[[GRAY]] departs. -Taming.Summon.COTW.BreedingDisallowed=[[GREEN]](Call Of The Wild) [[RED]]You cannot breed a summoned animal. -Taming.Summon.COTW.NeedMoreItems=[[GREEN]](Call Of The Wild) [[GRAY]]You need [[YELLOW]]{0}[[GRAY]] more [[DARK_AQUA]]{1}[[GRAY]](s) -Taming.Summon.Name.Format=[[GOLD]](COTW) [[WHITE]]{0}'s {1} +Taming.Summon.COTW.Success.WithoutLifespan=&a(Laukinio Pašaukimas) &7Tu iškvietei &6{0}&7 +Taming.Summon.COTW.Success.WithLifespan=&a(Laukinio Pašaukimas) &7Tu iškvietei &6{0}&7 ir jo trukmė yra &6{1}&7 sekundžių. +Taming.Summon.COTW.Limit=&a(Laukinio Pašaukimas) &7Tu gali turėti tik &c{0} &7iškviestus &7{1} gyvunus vienu metu. +Taming.Summon.COTW.TimeExpired=&a(Laukinio Pašaukimas) &7Laikas pasibaigė, tavo &6{0}&7 išėjo. +Taming.Summon.COTW.BreedingDisallowed=&a(Laukinio Pašaukimas) &cTu negali veisti iškviestų gyvunų. +Taming.Summon.COTW.NeedMoreItems=&a(Laukinio Pašaukimas) &7Tau reikia &e{0}&7 daugiau &3{1}&7(s) +Taming.Summon.Name.Format=&6(LP) &f{0} {1} #UNARMED -Unarmed.Ability.Bonus.0=Iron Arm Style -Unarmed.Ability.Bonus.1=+{0} DMG Upgrade -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=[[DARK_AQUA]]You [[GOLD]]ready[[DARK_AQUA]] your Fists. -Unarmed.SubSkill.Berserk.Name=Berserk -Unarmed.SubSkill.Berserk.Description=+50% DMG, Breaks weak materials -Unarmed.SubSkill.Berserk.Stat=Berserk Length -Unarmed.SubSkill.Disarm.Name=Disarm -Unarmed.SubSkill.Disarm.Description=Drops the foes item held in hand -Unarmed.SubSkill.Disarm.Stat=Disarm Chance -Unarmed.SubSkill.UnarmedLimitBreak.Name=Unarmed Limit Break -Unarmed.SubSkill.UnarmedLimitBreak.Description=Breaking your limits. Increased damage against tough opponents. Intended for PVP, up to server settings for whether or not it will boost damage in PVE. -Unarmed.SubSkill.UnarmedLimitBreak.Stat=Limit Break Max DMG -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.SubSkill.ArrowDeflect.Stat=Arrow Deflect Chance -Unarmed.SubSkill.IronGrip.Name=Iron Grip -Unarmed.SubSkill.IronGrip.Description=Prevents you from being disarmed -Unarmed.SubSkill.IronGrip.Stat=Iron Grip Chance -Unarmed.SubSkill.BlockCracker.Name=Block Cracker -Unarmed.SubSkill.BlockCracker.Description=Break rock with your fists -Unarmed.Listener=Unarmed: +Unarmed.Ability.Bonus.0=Geležinių Rankų Stilius +Unarmed.Ability.Bonus.1=+{0} Žąlos Padidinimas +Unarmed.Ability.IronGrip.Attacker=Jūsų priešas turi geležinį sugriebimą! +Unarmed.Ability.IronGrip.Defender=&aTavo geležinis sugriebimas neleido tau būti nuginkluotam! +Unarmed.Ability.Lower=&7Tu nuleidai savo kumščius. +Unarmed.Ability.Ready=&3Tu &6paruošei&3 your Fists. +Unarmed.SubSkill.Berserk.Name=Įtūžimas +Unarmed.SubSkill.Berserk.Description=+50% Žąlos, Sulaužo silpnas medžiagas +Unarmed.SubSkill.Berserk.Stat=Įtūžio trukmė +Unarmed.SubSkill.Disarm.Name=Nuginkluoti +Unarmed.SubSkill.Disarm.Description=Numeta priešo daiktą laikytą rankoje +Unarmed.SubSkill.Disarm.Stat=Nuginklavimo Šansas +Unarmed.SubSkill.UnarmedLimitBreak.Name=Beginklio ribų peržengimas +Unarmed.SubSkill.UnarmedLimitBreak.Description=Sugriauna tavo ribas. Padidiną žąlą prieš stiprius priešininkus. Naudojamas prieš kitus žaidėjus, serveris nustato ar duods papildomos žąlos prieš monstrus. +Unarmed.SubSkill.UnarmedLimitBreak.Stat=Ribos peržengimo MAX Žąla +Unarmed.SubSkill.IronArmStyle.Name=Geležinių Rankų Stilius +Unarmed.SubSkill.IronArmStyle.Description=Per laiką sustiprina tavo rankas +Unarmed.SubSkill.ArrowDeflect.Name=Strėlių Nukreipimas +Unarmed.SubSkill.ArrowDeflect.Description=Strėlių Nukreipimas +Unarmed.SubSkill.ArrowDeflect.Stat=Strėlių Nukreipimo Šansas +Unarmed.SubSkill.IronGrip.Name=Geležinis Sugriebimas +Unarmed.SubSkill.IronGrip.Description=Neleidžia jums būti nuginkluotam +Unarmed.SubSkill.IronGrip.Stat=Geležinio Sugriebimo Šansas +Unarmed.SubSkill.BlockCracker.Name=Blokų Layžytojas +Unarmed.SubSkill.BlockCracker.Description=Sulaužo akmenis su plikomis rankomis +Unarmed.Listener=Beginklis: Unarmed.SkillName=UNARMED -Unarmed.Skills.Berserk.Off=**Berserk has worn off** -Unarmed.Skills.Berserk.On=[[GREEN]]**BERSERK ACTIVATED** -Unarmed.Skills.Berserk.Other.Off=Berserk[[GREEN]] has worn off for [[YELLOW]]{0} -Unarmed.Skills.Berserk.Other.On=[[GREEN]]{0}[[DARK_GREEN]] has used [[RED]]Berserk! -Unarmed.Skills.Berserk.Refresh=[[GREEN]]Your [[YELLOW]]Berserk [[GREEN]]ability is refreshed! +Unarmed.Skills.Berserk.Off=**Įtūžimas pasibaigė** +Unarmed.Skills.Berserk.On=&a**ĮTŪŽIS AKTYVUOTAS** +Unarmed.Skills.Berserk.Other.Off=Įtūžis&a pasibaigė &e{0} +Unarmed.Skills.Berserk.Other.On=&a{0}&2 panaudojo &cĮtūžis! +Unarmed.Skills.Berserk.Refresh=&aTavo &eĮtūžis &agalia atsinaujino! #WOODCUTTING -Woodcutting.Ability.0=Leaf Blower -Woodcutting.Ability.1=Blow away leaves -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.TreeFeller.Stat=Tree Feller Length -Woodcutting.SubSkill.LeafBlower.Name=Leaf Blower -Woodcutting.SubSkill.LeafBlower.Description=Blow Away Leaves -Woodcutting.SubSkill.HarvestLumber.Name=Harvest Lumber -Woodcutting.SubSkill.HarvestLumber.Description=Skillfully extract more Lumber -Woodcutting.SubSkill.HarvestLumber.Stat=Double Drop Chance -Woodcutting.SubSkill.Splinter.Name=Splinter -Woodcutting.SubSkill.Splinter.Description=Cut down trees more efficiently. -Woodcutting.SubSkill.BarkSurgeon.Name=Bark Surgeon -Woodcutting.SubSkill.BarkSurgeon.Description=Extract useful materials when stripping trees. -Woodcutting.SubSkill.NaturesBounty.Name=Nature's Bounty -Woodcutting.SubSkill.NaturesBounty.Description=Gather experience from nature. -Woodcutting.Listener=Woodcutting: +Woodcutting.Ability.0=Lapų pūtėjas +Woodcutting.Ability.1=Nupūčia lapus +Woodcutting.Ability.Locked.0=UŽRAKINTAS IKI {0}+ GALIA (LAPŲ PŪTĖJAS) +Woodcutting.SubSkill.TreeFeller.Name=Medžių Kirtėjas +Woodcutting.SubSkill.TreeFeller.Description=Susprogdina medžius +Woodcutting.SubSkill.TreeFeller.Stat=Medžių Kirtėjo Trukmė +Woodcutting.SubSkill.LeafBlower.Name=Lapų pūtėjas +Woodcutting.SubSkill.LeafBlower.Description=Nupučia lapus +Woodcutting.SubSkill.HarvestLumber.Name=Nupjauna medieną +Woodcutting.SubSkill.HarvestLumber.Description=Meistriškai išgauna daugiau medienos +Woodcutting.SubSkill.HarvestLumber.Stat=Dvigubų iškasenų šansas +Woodcutting.SubSkill.Splinter.Name=Skaldytojas +Woodcutting.SubSkill.Splinter.Description=Greičiau nukerta medieną. +Woodcutting.SubSkill.BarkSurgeon.Name=Žievės Chirurgas +Woodcutting.SubSkill.BarkSurgeon.Description=Išgauna naudingų medžiagų nužievinant medžius. +Woodcutting.SubSkill.NaturesBounty.Name=Gamtos Premija +Woodcutting.SubSkill.NaturesBounty.Description=Gauna EXP iš gamtos. +Woodcutting.Listener=Medkirtystė: Woodcutting.SkillName=WOODCUTTING -Woodcutting.Skills.TreeFeller.Off=**Tree Feller has worn off** -Woodcutting.Skills.TreeFeller.On=[[GREEN]]**TREE FELLER ACTIVATED** -Woodcutting.Skills.TreeFeller.Refresh=[[GREEN]]Your [[YELLOW]]Tree Feller [[GREEN]]ability is refreshed! -Woodcutting.Skills.TreeFeller.Other.Off=Tree Feller[[GREEN]] has worn off for [[YELLOW]]{0} -Woodcutting.Skills.TreeFeller.Other.On=[[GREEN]]{0}[[DARK_GREEN]] has used [[RED]]Tree Feller! -Woodcutting.Skills.TreeFeller.Splinter=YOUR AXE SPLINTERS INTO DOZENS OF PIECES! -Woodcutting.Skills.TreeFeller.Threshold=That tree is too large! +Woodcutting.Skills.TreeFeller.Off=**Medžių Kirtėjas pasibaigė** +Woodcutting.Skills.TreeFeller.On=&a**MEDŽIŲ KIRTĖJAS AKTYVUOTAS** +Woodcutting.Skills.TreeFeller.Refresh=&aTavo &eMedžių Kirtėjas &agalia atsinaujino! +Woodcutting.Skills.TreeFeller.Other.Off=Medžių Kirtėjas&a pasibaigė &e{0} +Woodcutting.Skills.TreeFeller.Other.On=&a{0}&2 Panaudojo &cMedžių Kirtėjas! +Woodcutting.Skills.TreeFeller.Splinter=TAVO KIRVIS IŠSITAŠKĖ Į ŠIPULIUS! +Woodcutting.Skills.TreeFeller.Threshold=Tas medis yra per didelis! #ABILITIY #COMBAT -Combat.ArrowDeflect=[[WHITE]]**ARROW DEFLECT** -Combat.BeastLore=[[GREEN]]**BEAST LORE** -Combat.BeastLoreHealth=[[DARK_AQUA]]Būklė ([[GREEN]]{0}[[DARK_AQUA]]/{1}) -Combat.BeastLoreOwner=[[DARK_AQUA]]Savininkas ([[RED]]{0}[[DARK_AQUA]]) -Combat.BeastLoreHorseSpeed=[[DARK_AQUA]]Horse Movement Speed ([[GREEN]]{0} blocks/s[[DARK_AQUA]]) -Combat.BeastLoreHorseJumpStrength=[[DARK_AQUA]]Horse Jump Strength ([[GREEN]]Max {0} blocks[[DARK_AQUA]]) -Combat.Gore=[[GREEN]]**GORED** -Combat.StruckByGore=**YOU HAVE BEEN GORED** -Combat.TargetDazed=Target was [[DARK_RED]]Dazed -Combat.TouchedFuzzy=[[DARK_RED]]Touched Fuzzy. Felt Dizzy. +Combat.ArrowDeflect=&f**STRĖLĖS NUKREIPIMAS** +Combat.BeastLore=&a**ŽVĖRIES APIBENDRINIMAS** +Combat.BeastLoreHealth=&3Būklė (&a{0}&3/{1}) +Combat.BeastLoreOwner=&3Savininkas (&c{0}&3) +Combat.BeastLoreHorseSpeed=&3Arklio Judėjimo Greitis (&a{0} blokai/s&3) +Combat.BeastLoreHorseJumpStrength=&3Arklio Pašokimo Jėga (&aMaks {0} blokai&3) +Combat.Gore=&a**IPLĖŠĖ** +Combat.StruckByGore=**TAU IPLĖŠĖ** +Combat.TargetDazed=Taikinys buvo &4Apsvaigintas +Combat.TouchedFuzzy=&4Palietė Fuzzy. Pasijautė apsvaigęs. #COMMANDS ##generic -mcMMO.Description=[[DARK_AQUA]]Visa informacija apie: [[YELLOW]]mcMMO[[DARK_AQUA]] Projektas:,[[GOLD]]mcMMO yra [[RED]]atvirojo kodo[[GOLD]] RPG modifikacija sukurta 2011 metų Vasario mėn.,[[GOLD]]projekto autorius: [[BLUE]]nossr50[[GOLD]]. Pagrindinė idėja buvo apjungti RPG įgūdžius.,[[DARK_AQUA]]Svarbu:,[[GOLD]] - [[GREEN]]Naudokite [[RED]]/mcmmo help[[GREEN]] norėdami peržiūrėti komandoms,[[GOLD]] - [[GREEN]]Naudokite [[RED]]/SKILLNAME[[GREEN]] norėdami peržiūrėti įgūdžių informaciją,[[DARK_AQUA]]Autoriai:,[[GOLD]] - [[GREEN]]nossr50 [[BLUE]](Creator & Project Lead),[[GOLD]] - [[GREEN]]electronicboy [[BLUE]](Dev),[[GOLD]] - [[GREEN]]kashike [[BLUE]](Dev),[[GOLD]] - [[GREEN]]t00thpick1 [[BLUE]](Classic versijos plėtotojas) -mcMMO.Description.FormerDevs=[[DARK_AQUA]]Pagrindiniai plėtotojai: [[GREEN]]GJ, NuclearW, bm01, TfT_02, Glitchfinder -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.Ability.Toggle=Ability use has been toggled for [[YELLOW]]{0} -Commands.AdminChat.Off=Admin Chat only [[RED]]Off -Commands.AdminChat.On=Admin Chat only [[GREEN]]On -Commands.AdminToggle=[[GREEN]]- Toggle admin chat +mcMMO.Description=&3Visa informacija apie: &emcMMO&3 Projektas:,&6mcMMO yra &catvirojo kodo&6 RPG modifikacija sukurta 2011 metų Vasario mėn.,&6projekto autorius: &9nossr50&6. Pagrindinė idėja buvo apjungti RPG įgūdžius.,&3Svarbu:,&6 - &aNaudokite &c/mcmmo help&a norėdami peržiūrėti komandoms,&6 - &aNaudokite &c/SKILLNAME&a norėdami peržiūrėti įgūdžių informaciją,&3Autoriai:,&6 - &anossr50 &9(Creator & Project Lead),&6 - &aelectronicboy &9(Dev),&6 - &akashike &9(Dev),&6 - &at00thpick1 &9(Classic versijos plėtotojas) +mcMMO.Description.FormerDevs=&3Pagrindiniai plėtotojai: &aGJ, NuclearW, bm01, TfT_02, Glitchfinder +Commands.addlevels.AwardAll.1=&aBuvai apdovanotas {0} visuose įgūdžiuose! +Commands.addlevels.AwardAll.2=Visi lygiai buvo modifikuoti {0}. +Commands.addlevels.AwardSkill.1=&aBuvai apdovanotas {0} lygiais {1}! +Commands.addlevels.AwardSkill.2={0} modifikuotas {1}. +Commands.addxp.AwardAll=&aBuvai apdovanotas {0} EXP visuose įgūdžiuose! +Commands.addxp.AwardSkill=&aBuvai apdovanotas {0} EXP {1}! +Commands.Ability.Off=Galia nustatyta &coff +Commands.Ability.On=Galia nustatyta &aon +Commands.Ability.Toggle=Galia nustatyta &e{0} +Commands.AdminChat.Off=Tik Adminų pokalbis &cOff +Commands.AdminChat.On=Tik Adminų pokalbis &aOn +Commands.AdminToggle=&a- Nustatyti adminų pokalbį Commands.Chat.Console=*Console* -Commands.Cooldowns.Header=[[GOLD]]--= [[GREEN]]mcMMO Ability Cooldowns[[GOLD]] =-- -Commands.Cooldowns.Row.N=\ [[RED]]{0}[[WHITE]] - [[GOLD]]{1} seconds left -Commands.Cooldowns.Row.Y=\ [[AQUA]]{0}[[WHITE]] - [[DARK_GREEN]]Ready! -Commands.Database.CooldownMS=You must wait {0} milliseconds before using this command again. -Commands.Database.Processing=Your previous command is still being processed. Please wait. +Commands.Cooldowns.Header=&6--= &amcMMO Galios atsinaujinimas&6 =-- +Commands.Cooldowns.Row.N=\ &c{0}&f - &6{1} sekundžių +Commands.Cooldowns.Row.Y=\ &b{0}&f - &2Pasiruošęs! +Commands.Database.CooldownMS=Turi palaukti {0} milisekundžių prieš vėl naudojant šią komandą. +Commands.Database.Processing=Paskutinė komanda visa dar vykdoma. Palaukite. Commands.Disabled=Apgailestaujame, tačiau ši komanda yra išjungta! -Commands.DoesNotExist= [[RED]]Apgailestaujame, tačiau tokio žaidėjų serverio duomenų bazėje nėra! +Commands.DoesNotExist= &cApgailestaujame, tačiau tokio žaidėjų serverio duomenų bazėje nėra! Commands.GodMode.Disabled=mcMMO Nemirtingumas Išjungtas Commands.GodMode.Enabled=mcMMO Nemirtingumas Įjungtas -Commands.AdminChatSpy.Enabled=mcMMO Party Chat Spy Enabled -Commands.AdminChatSpy.Disabled=mcMMO Party Chat Spy Disabled -Commands.AdminChatSpy.Toggle=mcMMO Party Chat has been toggled for [[YELLOW]]{0} -Commands.AdminChatSpy.Chat=[[GOLD]][SPY: [[GREEN]]{0}[[GOLD]]] [[WHITE]]{1} -Commands.GodMode.Forbidden=[mcMMO] God Mode not permitted on this world (See Permissions) -Commands.GodMode.Toggle=Nemirtingumo rėžimas nustatytas: [[YELLOW]]{0} -Commands.Healthbars.Changed.HEARTS=[mcMMO] Your healthbar display type was changed to [[RED]]Hearts[[WHITE]]. -Commands.Healthbars.Changed.BAR=[mcMMO] Your healthbar display type was changed to [[YELLOW]]Boxes[[WHITE]]. -Commands.Healthbars.Changed.DISABLED=[mcMMO] Your mob healthbars have been [[GRAY]]disabled[[WHITE]]. -Commands.Healthbars.Invalid=Invalid healthbar type! -Commands.Inspect= [[GREEN]]- Peržiūrėti detalią žaidėjo informaciją -Commands.Invite.Success=[[GREEN]]Pakvietimas sėkmingai išsiustas. -Commands.Leaderboards= [[GREEN]]- Leaderboards -Commands.mcgod=[[GREEN]]- Nemirtingumo valdymas -Commands.mchud.Invalid=That is not a valid HUD type. -Commands.mcpurge.Success=[[GREEN]]The database was successfully purged! -Commands.mcrank.Heading=[[GOLD]]-=ASMENINIAI ĮGŪDŽIAI=- -Commands.mcrank.Overall=Overall[[GREEN]] - [[GOLD]]Rank [[WHITE]]#[[GREEN]]{0} -Commands.mcrank.Player=[[YELLOW]]Žaidėjo įgūdžių rankas: [[WHITE]]{0} -Commands.mcrank.Skill=[[YELLOW]]{0}[[GREEN]] - [[GOLD]]Įgūdžių Rankas [[WHITE]]#[[GREEN]]{1} -Commands.mcrank.Unranked=[[WHITE]]Neturintis įgūdžių ranko! -Commands.mcrefresh.Success={0}''s cooldowns have been refreshed. -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=[player] [[GREEN]] - Modify target -Commands.mmoedit.AllSkills.1=[[GREEN]]Your level in all skills was set to {0}! -Commands.mmoedit.Modified.1=[[GREEN]]Your level in {0} was set to {1}! -Commands.mmoedit.Modified.2={0} has been modified for {1}. -Commands.mcconvert.Database.Same=You are already using the {0} database! +Commands.AdminChatSpy.Enabled=mcMMO Partijos pokalbio šnipinėjimas įjungtas +Commands.AdminChatSpy.Disabled=mcMMO Partijos pokalbio šnipinėjimas išjungtas +Commands.AdminChatSpy.Toggle=mcMMO Partijos pokalbis nustatytas &e{0} +Commands.AdminChatSpy.Chat=&6[ŠNIPINĖJIMAS: &a{0}&6] &f{1} +Commands.GodMode.Forbidden=[mcMMO] Nemirtingumo rėžimas neleidžiamas šiam pasaulyje (peržiūrėt Leidimus) +Commands.GodMode.Toggle=Nemirtingumo rėžimas nustatytas: &e{0} +Commands.Healthbars.Changed.HEARTS=[mcMMO] Tavo gyvybių rodymo tipas buvo nustatytas &cŠirdelės&f. +Commands.Healthbars.Changed.BAR=[mcMMO] Tavo gyvybių rodymo tipas buvo nustatytas &eDėžutės&f. +Commands.Healthbars.Changed.DISABLED=[mcMMO] Tavo monstrų gyvybių rodymas buvo &7išjungtas&f. +Commands.Healthbars.Invalid=Neleistinas gyvybių rodymo tipas! +Commands.Inspect= &a- Peržiūrėti detalią žaidėjo informaciją +Commands.Invite.Success=&aPakvietimas sėkmingai išsiustas. +Commands.Leaderboards= &a- Leaderboards +Commands.mcgod=&a- Nemirtingumo valdymas +Commands.mchud.Invalid=Tai nėra galimas HUD tipas. +Commands.mcpurge.Success=&aDuomenų bazė buvo sėkmingai išvalytą! +Commands.mcrank.Heading=&6-=ASMENINIAI ĮGŪDŽIAI=- +Commands.mcrank.Overall=Bendras&a - &6Rankas &f#&a{0} +Commands.mcrank.Player=&eŽaidėjo įgūdžių rankas: &f{0} +Commands.mcrank.Skill=&e{0}&a - &6Įgūdžių Rankas &f#&a{1} +Commands.mcrank.Unranked=&fNeturintis įgūdžių ranko! +Commands.mcrefresh.Success={0}''s atsinaujinimai buvo atstatyti. +Commands.mcremove.Success=&a{0} buvo sėkmingai pašalintas iš duomenų bazės! +Commands.mctop.Tip=&6Tip: Use &c/mcrank&6 pamatyti visus asmeninius rankus! +Commands.mmoedit=[player] &a - Modifikuoti objektą +Commands.mmoedit.AllSkills.1=&aTavo lygis visuose įgūdžiuose buvo nustatytas {0}! +Commands.mmoedit.Modified.1=&aTavo lygis {0} buvo nustatytas {1}! +Commands.mmoedit.Modified.2={0} modifikuotas į {1}. +Commands.mcconvert.Database.Same=Tu jau naudojiesi {0} duomenų baze! Commands.mcconvert.Database.InvalidType={0} nustatytas netinkamas duomenų tipas. -Commands.mcconvert.Database.Start=[[GRAY]]Starting conversion from {0} to {1}... -Commands.mcconvert.Database.Finish=[[GRAY]]Database migration complete; the {1} database now has all data from the {0} database. -Commands.mmoshowdb=The currently used database is [[GREEN]]{0} -Commands.mcconvert.Experience.Invalid=Nežinomas formulės tipas! Galimi tipai yra: [[GREEN]]LINEAR [[RED]]and [[GREEN]]EXPONENTIAL. -Commands.mcconvert.Experience.Same=Already using formula type {0} -Commands.mcconvert.Experience.Start=[[GRAY]]Starting conversion from {0} to {1} curve -Commands.mcconvert.Experience.Finish=[[GRAY]]Formula conversion complete; now using {0} XP curve. -Commands.ModDescription=[[GREEN]]- Read brief mod description +Commands.mcconvert.Database.Start=&7Pradedamas konvertavimas iš {0} į {1}... +Commands.mcconvert.Database.Finish=&7Duomenų bazės migracija pabaigta; {1} duomenų bazė dabar turi visus duomenis iš {0} duomenų bazės. +Commands.mmoshowdb=Dabartinė naudojama duomenų bazė &a{0} +Commands.mcconvert.Experience.Invalid=Nežinomas formulės tipas! Galimi tipai yra: &aLINEAR &cand &aEXPONENTIAL. +Commands.mcconvert.Experience.Same=Jau naudojamas formulės tipas {0} +Commands.mcconvert.Experience.Start=&7Pradedama konversija iš {0} į {1} kreivę +Commands.mcconvert.Experience.Finish=&7Formulės konvertacija baigta; dabar naudojama {0} EXP kreivė. +Commands.ModDescription=&a- Perskaityti modifikacijos santrumpą Commands.NoConsole=Ši komanda negali būti naudojama konsolės rėžime! -Commands.Notifications.Off=Ability notifications toggled [[RED]]off -Commands.Notifications.On=Ability notifications toggled [[GREEN]]on -Commands.Offline=This command does not work for offline players. +Commands.Notifications.Off=Galios pranešimas &coff +Commands.Notifications.On=Galios pranešimas &aon +Commands.Offline=Ši komanda neveikia atsijungusiems žaidėjams. Commands.NotLoaded=Žaidėjo profilis dar nepakrautas! -Commands.Party.Status=[[DARK_GRAY]]NAME: [[WHITE]]{0} {1} [[DARK_GRAY]]LEVEL: [[DARK_AQUA]]{2} -Commands.Party.Status.Alliance=[[DARK_GRAY]]ALLY: [[WHITE]]{0} -Commands.Party.UnlockedFeatures=[[DARK_GRAY]]Unlocked Features: [[GRAY]][[ITALIC]]{0} -Commands.Party.ShareMode=[[DARK_GRAY]]SHARE MODE: -Commands.Party.ItemShare=[[GRAY]]ITEM [[DARK_AQUA]]({0}) -Commands.Party.ExpShare=[[GRAY]]EXP [[DARK_AQUA]]({0}) -Commands.Party.ItemShareCategories=[[DARK_GRAY]]Sharing Items: [[GRAY]][[ITALIC]]{0} -Commands.Party.MembersNear=[[DARK_GRAY]]NEAR YOU [[DARK_AQUA]]{0}[[DARK_GRAY]]/[[DARK_AQUA]]{1} -Commands.Party.Accept=[[GREEN]]- Accept party invite -Commands.Party.Chat.Off=Party Chat only [[RED]]Off -Commands.Party.Chat.On=Party Chat only [[GREEN]]On -Commands.Party.Commands=[[RED]]---[][[GREEN]]PARTY COMMANDS[[RED]][]--- -Commands.Party.Invite.0=[[RED]]ALERT: [[GREEN]]You have received a party invite for {0} from {1} -Commands.Party.Invite.1=[[YELLOW]]Type [[GREEN]]/party accept[[YELLOW]] to accept the invite -Commands.Party.Invite=[[GREEN]]- Send party invite -Commands.Party.Invite.Accepted=[[GREEN]]Invite Accepted. You have joined party {0} -Commands.Party.Join=[[GRAY]]Joined Party: {0} -Commands.Party.PartyFull=[[GOLD]]{0}[[RED]] is full! -Commands.Party.PartyFull.Invite=You cannot invite [[YELLOW]]{0}[[RED]] to [[GREEN]]{1}[[RED]] because it already has [[DARK_AQUA]]{2}[[RED]] players in it! -Commands.Party.PartyFull.InviteAccept=You cannot join [[GREEN]]{0}[[RED]] because it already has [[DARK_AQUA]]{1}[[RED]] players in it! -Commands.Party.Create=[[GRAY]]Created Party: {0} -Commands.Party.Rename=[[GRAY]]Party name changed to: [[WHITE]]{0} -Commands.Party.SetSharing=[[GRAY]]Party {0} sharing set to: [[DARK_AQUA]]{1} -Commands.Party.ToggleShareCategory=[[GRAY]]Party item sharing for [[GOLD]]{0} [[GRAY]]has been [[DARK_AQUA]]{1} -Commands.Party.AlreadyExists=[[DARK_RED]]Party {0} already exists! -Commands.Party.Kick=[[RED]]You were kicked from party [[GREEN]]{0}[[RED]]! -Commands.Party.Leave=[[YELLOW]]You have left that party -Commands.Party.Members.Header=[[RED]]-----[][[GREEN]]MEMBERS[[RED]][]----- -Commands.Party.None=[[RED]]You are not in a party. -Commands.Party.Quit=[[GREEN]]- Leave your current party -Commands.Party.Teleport=[[GREEN]]- Teleport to party member -Commands.Party.Toggle=[[GREEN]]- Toggle Party Chat -Commands.Party1=[[GREEN]]- Create a new party -Commands.Party2=[[GREEN]]- Join a players party -Commands.Party.Alliance.Header=[[RED]]-----[][[GREEN]]PARTY ALLIANCE[[RED]][]----- -Commands.Party.Alliance.Ally=[[WHITE]]{0} [[DARK_GRAY]]IS ALLIED WITH: [[WHITE]]{1} -Commands.Party.Alliance.Members.Header=[[RED]]-----[][[GREEN]]ALLIANCE MEMBERS[[RED]][]----- -Commands.Party.Alliance.Invite.0=ALERT: [[GREEN]]You have received a party alliance invite for {0} from {1} -Commands.Party.Alliance.Invite.1=Type [[GREEN]]/party alliance accept[[YELLOW]] to accept the invite -Commands.Party.Alliance.Invite.Accepted=[[GREEN]]Alliance invite Accepted. -Commands.Party.Alliance.None=[[RED]]Your party does not have an ally. -Commands.Party.Alliance.AlreadyAllies=[[RED]]Your party already has an ally. Disband with [[DARK_AQUA]]/party alliance disband -Commands.Party.Alliance.Help.0=[[RED]]This party hasn't formed an alliance. Invite a party leader -Commands.Party.Alliance.Help.1=[[RED]] to an alliance with [[DARK_AQUA]]/party alliance invite [[RED]]. -Commands.ptp.Enabled=Party teleporting [[GREEN]]enabled -Commands.ptp.Disabled=Party teleporting [[RED]]disabled -Commands.ptp.NoRequests=[[RED]]You have no teleport requests at this time -Commands.ptp.NoWorldPermissions=[[RED]][mcMMO] You do not have permission to teleport to the world {0}. -Commands.ptp.Request1=[[YELLOW]]{0} [[GREEN]]has requested to teleport to you. -Commands.ptp.Request2=[[GREEN]]To teleport, type [[YELLOW]]/ptp accept[[GREEN]]. Request expires in [[RED]]{0} [[GREEN]]seconds. -Commands.ptp.AcceptAny.Enabled=Party teleport request confirmation [[GREEN]]enabled -Commands.ptp.AcceptAny.Disabled=Party teleport request confirmation [[RED]]disabled -Commands.ptp.RequestExpired=[[RED]]Party teleport request has expired! -Commands.PowerLevel.Leaderboard=[[YELLOW]]--mcMMO[[BLUE]] Power Level [[YELLOW]]Leaderboard-- -Commands.PowerLevel.Capped=[[DARK_RED]]POWER LEVEL: [[GREEN]]{0} [[DARK_RED]]MAX LEVEL: [[YELLOW]]{1} -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=[[GREEN]]- Reset a skill's level to 0 -Commands.Scoreboard.Clear=[[DARK_AQUA]]mcMMO scoreboard cleared. -Commands.Scoreboard.NoBoard=[[RED]]The mcMMO scoreboard is not active. -Commands.Scoreboard.Keep=[[DARK_AQUA]]The mcMMO scoreboard will stay up until you use [[GREEN]]/mcscoreboard clear[[DARK_AQUA]]. -Commands.Scoreboard.Timer=[[DARK_AQUA]]The mcMMO scoreboard will clear [[GOLD]]{0}[[DARK_AQUA]] seconds from now. -Commands.Scoreboard.Help.0=[[GOLD]] == [[GREEN]]Help for [[RED]]/mcscoreboard[[GOLD]] == -Commands.Scoreboard.Help.1=[[DARK_AQUA]]/mcscoreboard[[AQUA]] clear [[WHITE]] - clear the McMMO scoreboard -Commands.Scoreboard.Help.2=[[DARK_AQUA]]/mcscoreboard[[AQUA]] keep [[WHITE]] - keep the mcMMO scoreboard up -Commands.Scoreboard.Help.3=[[DARK_AQUA]]/mcscoreboard[[AQUA]] time [n] [[WHITE]] - clear the McMMO scoreboard after [[LIGHT_PURPLE]]n[[WHITE]] seconds -Commands.Scoreboard.Tip.Keep=[[GOLD]]Tip: Use [[RED]]/mcscoreboard keep[[GOLD]] while the scoreboard is shown to keep it from going away. -Commands.Scoreboard.Tip.Clear=[[GOLD]]Tip: Use [[RED]]/mcscoreboard clear[[GOLD]] to get rid of the scoreboard. -Commands.Skill.Invalid=That is not a valid skillname! -Commands.Skill.ChildSkill=Child skills are not valid for this command! -Commands.Skill.Leaderboard=--mcMMO [[BLUE]]{0}[[YELLOW]] Lyderiai-- -Commands.SkillInfo=[[GREEN]]- Peržiūrėsite detalią informaciją apie įgūdžius -Commands.Stats=[[GREEN]]- Peržiūrėti mcMMO Informaciją -Commands.ToggleAbility=[[GREEN]]- Toggle ability activation with right click -Commands.Usage.0=[[RED]]Teisingas naudojimas: /{0} -Commands.Usage.1=[[RED]]Teisingas naudojimas: /{0} {1} -Commands.Usage.2=[[RED]]Teisingas naudojimas: /{0} {1} {2} -Commands.Usage.3=[[RED]]Teisingas naudojimas: /{0} {1} {2} {3} +Commands.Party.Status=&8VARDAS: &f{0} {1} &8LYGIS: &3{2} +Commands.Party.Status.Alliance=&8BENDRAŽYGIS: &f{0} +Commands.Party.UnlockedFeatures=&8Atrakintos funkcijos: &7&o{0} +Commands.Party.ShareMode=&8DALINIMOSI RĖŽIMAS: +Commands.Party.ItemShare=&7DAIKTAS &3({0}) +Commands.Party.ExpShare=&7EXP &3({0}) +Commands.Party.ItemShareCategories=&8Daiktų dalinimas: &7&o{0} +Commands.Party.MembersNear=&8ŠALIA TAVĘS &3{0}&8/&3{1} +Commands.Party.Accept=&a- Priimti partijos kvietimą +Commands.Party.Chat.Off=Partijos pokalbis tik &cOff +Commands.Party.Chat.On=Partijos pokalbis tik &aOn +Commands.Party.Commands=&c---[]&aPARTIJOS KOMANDOS&c[]--- +Commands.Party.Invite.0=&cDĖMĖSIO: &aTu gavai partijos pakvietimą {0} iš {1} +Commands.Party.Invite.1=&eParašyk &a/party accept&e kad priimti kvietimą +Commands.Party.Invite=&a- Išsiųsti partijos kvietimą +Commands.Party.Invite.Accepted=&aKvietimas Priimtas. Tu prisijungei prie partijos {0} +Commands.Party.Join=&7Prisijungė prie partijos: {0} +Commands.Party.PartyFull=&6{0}&c yra pilnas! +Commands.Party.PartyFull.Invite=Negali pakviesti &e{0}&c į &a{1}&c nes jau turi &3{2}&c žaidėjų! +Commands.Party.PartyFull.InviteAccept=Negali prisijungti prie &a{0}&c nes jau turi &3{1}&c žaidėjų! +Commands.Party.Create=&7Sukurta Partija: {0} +Commands.Party.Rename=&7Partijos pavadinimas pakeistas į: &f{0} +Commands.Party.SetSharing=&7Partija {0} dalinimasis nustatytas į: &3{1} +Commands.Party.ToggleShareCategory=&7Partijos daiktų dalinimasis &6{0} &7buvo &3{1} +Commands.Party.AlreadyExists=&4Partija {0} Jau egzistuoja! +Commands.Party.Kick=&cTu buvai išspirtas iš partijos &a{0}&c! +Commands.Party.Leave=&eTu palikai partiją +Commands.Party.Members.Header=&c-----[]&aNARIAI&c[]----- +Commands.Party.None=&cTu nesi partijoje. +Commands.Party.Quit=&a- Palikti savo dabartinę partiją +Commands.Party.Teleport=&a- Nusiteleportuoti prie partijos nario +Commands.Party.Toggle=&a- Nustatyti partijos pokalbį +Commands.Party1=&a- Sukurti naują partiją +Commands.Party2=&a- Prisijungti prie žaidėjo partijos +Commands.Party.Alliance.Header=&c-----[]&aPARTIJOS ALJANSAS&c[]----- +Commands.Party.Alliance.Ally=&f{0} &8YRA ALJANSE SU: &f{1} +Commands.Party.Alliance.Members.Header=&c-----[]&aALJANSO NARIAI&c[]----- +Commands.Party.Alliance.Invite.0=DĖMESIO: &aGavai partijos aljanso pakvietimą į {0} iš {1} +Commands.Party.Alliance.Invite.1=Parašyk &a/party alliance accept&e priimti partijos aljanso kvietimui +Commands.Party.Alliance.Invite.Accepted=&aAljanso kvietimas priimtas. +Commands.Party.Alliance.None=&cTavo partija neturi aljanso. +Commands.Party.Alliance.AlreadyAllies=&cTavo partija jau turi aljansą. Išsiskirti naudojant &3/party alliance disband +Commands.Party.Alliance.Help.0=&cŠi grupė nėra sukųrusi alianso. Pakviesk partijos lyderį +Commands.Party.Alliance.Help.1=&c į aljaną su &3/party alliance invite &c. +Commands.ptp.Enabled=Partijos teleportacija &aįjungta +Commands.ptp.Disabled=Partijos teleportacija &cišjungta +Commands.ptp.NoRequests=&cTu šiuo metu neturi teleportacijos kvietimų +Commands.ptp.NoWorldPermissions=&c[mcMMO] Tu neturi leidimų teleportuotis į pasaulį {0}. +Commands.ptp.Request1=&e{0} &apaprašė nusiteleportuoti iki tavęs. +Commands.ptp.Request2=&aKad nusiteleportuoti, rašyk &e/ptp accept&a. Prašymas baigiasi už &c{0} &asekundžių. +Commands.ptp.AcceptAny.Enabled=Partijos teleporto kvietimo patvirtinimas &aįjungtas +Commands.ptp.AcceptAny.Disabled=Partijos teleporto kvietimo patvirtinimas &cišjungtas +Commands.ptp.RequestExpired=&cPartijos teleportavimosi prašymas pasibaigė! +Commands.PowerLevel.Leaderboard=&e--mcMMO&9 Galios Lygis &Pirmaujanciųjų sąrašas-- +Commands.PowerLevel.Capped=&4GALIOS LYGIS: &a{0} &4MAX LYGIS: &e{1} +Commands.PowerLevel=&4GALIOS LYGIS: &a{0} +Commands.Reset.All=&aVisi tavo įgūdžių lygiai buvo restartuoti sėkmingai. +Commands.Reset.Single=&aTavo {0} įgūdžio lygis buvo restartuotas sėkmingai. +Commands.Reset=&a- Nustatyti įgūdžių lygį į 0 +Commands.Scoreboard.Clear=&3mcMMO pirmaujanciųjų sąrašas išvalytas. +Commands.Scoreboard.NoBoard=&cThe mcMMO pirmaujanciųjų sąrašas nėra aktyvus. +Commands.Scoreboard.Keep=&3The mcMMO pirmaujanciųjų sąrašas bus aktyvus kol nepanaudosi &a/mcscoreboard clear&3. +Commands.Scoreboard.Timer=&3The mcMMO pirmaujanciųjų sąrašas išsivalys po &6{0}&3 sekundžių nuo dabar. +Commands.Scoreboard.Help.0=&6 == &aPagalba dėl &c/mcscoreboard&6 == +Commands.Scoreboard.Help.1=&3/mcscoreboard&b clear &f - Išvalo McMMO pirmaujanciųjų sąrašą +Commands.Scoreboard.Help.2=&3/mcscoreboard&b keep &f - Palieka mcMMO pirmaujanciųjų sąrašą aktyvų +Commands.Scoreboard.Help.3=&3/mcscoreboard&b time [n] &f - Išvalo McMMO pirmaujanciųjų sąrašą po &dn&f sekundžių +Commands.Scoreboard.Tip.Keep=&6Pastaba: naudok &c/mcscoreboard keep&6 kol pirmaujanciųjų sąrašas yra rodomas kad nedingtu. +Commands.Scoreboard.Tip.Clear=&6Pastaba: naudok &c/mcscoreboard clear&6 kad pašalinti pirmaujanciųjų sąrašą. +Commands.Skill.Invalid=Tai netinkamas įgūdžio pavadinimas! +Commands.Skill.ChildSkill=Dukteriniai įgūdžiai netinkami šiai komandai! +Commands.Skill.Leaderboard=--mcMMO &9{0}&e Lyderiai-- +Commands.SkillInfo=&a- Peržiūrėsite detalią informaciją apie įgūdžius +Commands.Stats=&a- Peržiūrėti mcMMO Informaciją +Commands.ToggleAbility=&a- Nustatyti galios aktivacija su dešiniuoju pelės klavišu +Commands.Usage.0=&cTeisingas naudojimas: /{0} +Commands.Usage.1=&cTeisingas naudojimas: /{0} {1} +Commands.Usage.2=&cTeisingas naudojimas: /{0} {1} {2} +Commands.Usage.3=&cTeisingas naudojimas: /{0} {1} {2} {3} Commands.Usage.FullClassName=classname Commands.Usage.Level=level Commands.Usage.Message=message @@ -720,391 +718,410 @@ Commands.Usage.Rate=rate Commands.Usage.Skill=skill Commands.Usage.SubSkill=subskill Commands.Usage.XP=xp -Commands.Description.mmoinfo=Read details about a skill or mechanic. -Commands.MmoInfo.Mystery=[[GRAY]]You haven't unlocked this skill yet, but when you do you will be able to read details about it here! -Commands.MmoInfo.NoMatch=That subskill doesn't exist! -Commands.MmoInfo.Header=[[DARK_AQUA]]-=[]=====[][[GOLD]] MMO Info [[DARK_AQUA]][]=====[]=- -Commands.MmoInfo.SubSkillHeader=[[GOLD]]Name:[[YELLOW]] {0} -Commands.MmoInfo.DetailsHeader=[[DARK_AQUA]]-=[]=====[][[GREEN]] Details [[DARK_AQUA]][]=====[]=- -Commands.MmoInfo.OldSkill=[[GRAY]]mcMMO skills are being converted into an improved modular skill system, unfortunately this skill has not been converted yet and lacks detailed stats. The new system will allow for faster release times for new mcMMO skills and greater flexibility with existing skills. -Commands.MmoInfo.Mechanics=[[DARK_AQUA]]-=[]=====[][[GOLD]] Mechanics [[DARK_AQUA]][]=====[]=- +Commands.Description.mmoinfo=Paskaitykite detales apie įgūdį arba veikimo principą. +Commands.MmoInfo.Mystery=&7Tu dar neatsirakinai šio įgūdžio, bet kai atsirakinsi, galėsi paskaityti apie tai čia! +Commands.MmoInfo.NoMatch=Šis antrinis įgūdis neegzistuoja! +Commands.MmoInfo.Header=&3-=[]=====[]&6 MMO Informacija &3[]=====[]=- +Commands.MmoInfo.SubSkillHeader=&6Pavadinimas:&e {0} +Commands.MmoInfo.OldSkill=&7mcMMO įgūdžiai yra konvertuojami į modulinę įgūdžių sistemą, deja šis įgūdis dar nebuvo konvertuotas ir trūksta detalių. Nauja sistema leis greitesniam įgūdžių kūrimui ir esamų fleksiškumui. +Commands.MmoInfo.DetailsHeader=&3-=[]=====[]&a Detalės &3[]=====[]=- +Commands.MmoInfo.Mechanics=&3-=[]=====[]&6 Principas &3[]=====[]=- Commands.MmoInfo.Stats=INFORMACIJA: {0} -Commands.Mmodebug.Toggle=mcMMO Debug Mode is now [[GOLD]]{0}[[GRAY]], use this command again to toggle. With debug mode true, you can punch blocks to print useful information used for support. -mcMMO.NoInvites=[[RED]]Šiuo metu Jūs neturite jokio pakvietimo! -mcMMO.NoPermission=[[DARK_RED]]Apgailestaujame, tačiau tam Jūs neturite atitinkamų leidimų! -mcMMO.NoSkillNote=[[DARK_GRAY]]If you don't have access to a skill it will not be shown here. +Commands.Mmodebug.Toggle=mcMMO Debug rėžimas dabar yra &6{0}&7, panaudokite šią komandą vėl, kad nustatyti. Su įjungtu debug rėžimu, tu gali smūgiuoti blokus, kad išgauti naudingos informacijos. +mcMMO.NoInvites=&cŠiuo metu Jūs neturite jokio pakvietimo! +mcMMO.NoPermission=&4Apgailestaujame, tačiau tam Jūs neturite atitinkamų leidimų! +mcMMO.NoSkillNote=&8Jeigu jūs neturite prieigos prie įgūddžio, jis nebus rodomas čia. ##party -Party.Forbidden=[mcMMO] Parties not permitted on this world (See Permissions) -Party.Help.0=[[RED]]Teisingas naudojimas: [[DARK_AQUA]]{0} [password]. -Party.Help.1=[[RED]]To create a party, use [[DARK_AQUA]]{0} [password]. -Party.Help.2=[[RED]]Consult [[DARK_AQUA]]{0} [[RED]]for more information -Party.Help.3=[[RED]]Use [[DARK_AQUA]]{0} [password] [[RED]]to join or [[DARK_AQUA]]{1} [[RED]]to quit -Party.Help.4=[[RED]]To lock or unlock your party, use [[DARK_AQUA]]{0} -Party.Help.5=[[RED]]To password protect your party, use [[DARK_AQUA]]{0} -Party.Help.6=[[RED]]To kick a player from your party, use [[DARK_AQUA]]{0} -Party.Help.7=[[RED]]To transfer ownership of your party, use [[DARK_AQUA]]{0} -Party.Help.8=[[RED]]To disband your party, use [[DARK_AQUA]]{0} -Party.Help.9=[[RED]]Use [[DARK_AQUA]]{0} [[RED]]to share items with party members -Party.Help.10=[[RED]]Use [[DARK_AQUA]]{0} [[RED]]to enable XP sharing with party members -Party.InformedOnJoin={0} [[GREEN]]has joined your party -Party.InformedOnQuit={0} [[GREEN]]has left your party -Party.InformedOnNameChange=[[GOLD]]{0} [[GREEN]]has set the party name to [[WHITE]]{1} -Party.InvalidName=[[DARK_RED]]That is not a valid party name. -Party.Invite.Self=[[RED]]You can't invite yourself! -Party.IsLocked=[[RED]]This party is already locked! -Party.IsntLocked=[[RED]]This party is not locked! -Party.Locked=[[RED]]Party is locked, only party leader may invite. -Party.NotInYourParty=[[DARK_RED]]{0} is not in your party -Party.NotOwner=[[DARK_RED]]You are not the party leader. -Party.Target.NotOwner=[[DARK_RED]]{0} is not the party leader. -Party.Owner.New=[[GREEN]]{0} is the new party leader. -Party.Owner.NotLeader=[[DARK_RED]]You are no longer the party leader. -Party.Owner.Player =[[GREEN]]You are now the party leader. -Party.Password.None=[[RED]]This party is password protected. Please provide a password to join. -Party.Password.Incorrect=[[RED]]Party password is incorrect. -Party.Password.Set=[[GREEN]]Party password set to {0} -Party.Password.Removed=[[GREEN]]Party password has been cleared. -Party.Player.Invalid=[[RED]]That is not a valid player. -Party.NotOnline=[[DARK_RED]]{0} is not online! -Party.Player.InSameParty=[[RED]]{0} already is in your party! -Party.PlayerNotInParty=[[DARK_RED]]{0} is not in a party -Party.Specify=[[RED]]You must specify a party. -Party.Teleport.Dead=[[RED]]You can't teleport to a dead player. -Party.Teleport.Hurt=[[RED]]You have been hurt in the last {0} seconds and cannot teleport. -Party.Teleport.Player=[[GREEN]]You have teleported to {0}. -Party.Teleport.Self=[[RED]]You can't teleport to yourself! -Party.Teleport.Target=[[GREEN]]{0} has teleported to you. -Party.Teleport.Disabled=[[RED]]{0} doesn't allow party teleportation. -Party.Rename.Same=[[RED]]That is already the name of your party! -Party.Join.Self=[[RED]]You can't join yourself! -Party.Unlocked=[[GRAY]]Party is unlocked -Party.Disband=[[GRAY]]The party has been disbanded -Party.Alliance.Formed=[[GRAY]]Your party is now allies with [[GREEN]]{0} -Party.Alliance.Disband=[[GRAY]]Your party is no longer allies with [[RED]]{0} -Party.Status.Locked=[[DARK_RED]](INVITE-ONLY) -Party.Status.Unlocked=[[DARK_GREEN]](OPEN) -Party.LevelUp=[[YELLOW]]Party level increased by {0}. Total ({1}) -Party.Feature.Chat=Party Chat -Party.Feature.Teleport=Party Teleport -Party.Feature.Alliance=Alliances -Party.Feature.ItemShare=Item Sharing -Party.Feature.XpShare=XP Sharing -Party.Feature.Locked.Chat=LOCKED UNTIL {0}+ (PARTY CHAT) -Party.Feature.Locked.Teleport=LOCKED UNTIL {0}+ (PARTY TELEPORT) -Party.Feature.Locked.Alliance=LOCKED UNTIL {0}+ (ALLIANCES) -Party.Feature.Locked.ItemShare=LOCKED UNTIL {0}+ (ITEM SHARING) -Party.Feature.Locked.XpShare=LOCKED UNTIL {0}+ (XP SHARING) -Party.Feature.Disabled.1=[[RED]]Party chat is not unlocked yet. -Party.Feature.Disabled.2=[[RED]]Party teleport is not unlocked yet. -Party.Feature.Disabled.3=[[RED]]Party alliances are not unlocked yet. -Party.Feature.Disabled.4=[[RED]]Party item sharing is not unlocked yet. -Party.Feature.Disabled.5=[[RED]]Party XP sharing is not unlocked yet. +Party.Forbidden=[mcMMO] Partijos nėra leidžiamos šiame pasaulyje (peržiūrėti Leidimus) +Party.Help.0=&cTeisingas naudojimas: &3{0} [password]. +Party.Help.1=&cSukurti partijai, naudoti &3{0} [password]. +Party.Help.2=&cKonsultuotis &3{0} &cdėl informacijos +Party.Help.3=&cNaudoti &3{0} [password] &ckad prisijungti, arba &3{1} &ckad išeiti +Party.Help.4=&cKad užrakinti arba atrakinti savo partiją, naudoti &3{0} +Party.Help.5=&cKad apsaugoti partiją su slaptažodžiu, naudoti &3{0} +Party.Help.6=&cKad išspirti žaidėja iš partijos, naudoti &3{0} +Party.Help.7=&cKad perleisti partijos nuosavybę, naudoti &3{0} +Party.Help.8=&cKad išformuoti partiją, naudoti &3{0} +Party.Help.9=&cNaudoti &3{0} &ckad dalintis daiktais su partijos nariais +Party.Help.10=&cNaudoti &3{0} &ckad dalintis XP su partijos nariais +Party.InformedOnJoin={0} &aPrisijungė prie jūsų partijos +Party.InformedOnQuit={0} &aPaliko jūsų partiją +Party.InformedOnNameChange=&6{0} &aPakeitė partijos pavadinimą į &f{1} +Party.InvalidName=&4Nėra tinkamas partijos pavadinimas. +Party.Invite.Self=Jūs negalite pakviesti savęs! +Party.IsLocked=&cŠi partija jau yra užrakinta! +Party.IsntLocked=&cŠi partija nėra užrakinta! +Party.Locked=&cPartija užrakinta, tik partijos lyderis gali pakviesti. +Party.NotInYourParty=&4{0} nėra jūsų partijoje +Party.NotOwner=&4Tu nesi partijos lyderis. +Party.Target.NotOwner=&4{0} nėra partijos lyderis. +Party.Owner.New=&a{0} yra naujas partijos lyderis. +Party.Owner.NotLeader=&4Tu nebesi partijos lyderis. +Party.Owner.Player =&aDabar tu esi partijos lyderis. +Party.Password.None=&cŠi partija yra apsaugota slaptažodžiu. Pateikite slaptažodį kad prisijungtumėte. +Party.Password.Incorrect=&cPartijos slaptažodis neteisingas. +Party.Password.Set=&aPartijos slaptažodis nustatytas į {0} +Party.Password.Removed=&aPartijos slaptažodis buvo panaikintas. +Party.Player.Invalid=&cTai nėra tinkamas žaidėjas. +Party.NotOnline=&4{0} nėra prisijungęs! +Party.Player.InSameParty=&c{0} jau yra jūsų partijoje! +Party.PlayerNotInParty=&4{0} nėra jūsų partijoje +Party.Specify=&cPrivalai nurodyti partiją. +Party.Teleport.Dead=&cJūs negalite nusiteleportuoti pas mirusė žaidėją. +Party.Teleport.Hurt=&cJus buvote sužeistas per paskutines {0} sek. ir negalite teleportuotis. +Party.Teleport.Player=&aBuvote nuteleportuotas į {0}. +Party.Teleport.Self=&cJūs negalite nusiteleportuoti pas savęs! +Party.Teleport.Target=&a{0} atsiteleportavo pas jus. +Party.Teleport.Disabled=&c{0} Neleidžia grupės teleportacijų. +Party.Rename.Same=&cTai jau yra jūsų partijos pavadinimas! +Party.Join.Self=&cJūs negalite prisidėti savęs! +Party.Unlocked=&7Partija yra atrakinta +Party.Disband=&7Partija buvo išformuota +Party.Alliance.Formed=&7Jūsų partija dabar yra aljanse su &a{0} +Party.Alliance.Disband=&7Jūsų partija dabar nebėra aljanse su &c{0} +Party.Status.Locked=&4(TIK-SU-PAKVIETIMAIS) +Party.Status.Unlocked=&2(ATIDARYTA) +Party.LevelUp=&ePartijos lygis pakeltas {0}. Iš viso ({1}) +Party.Feature.Chat=Partijos Pokalbis +Party.Feature.Teleport=Partijos Teleportas +Party.Feature.Alliance=Aljansas +Party.Feature.ItemShare=Daiktų dalinimasis +Party.Feature.XpShare=XP dalinimasis +Party.Feature.Locked.Chat=UŽRAKINTA IKI {0}+ (PARTIJOS POKALBIS) +Party.Feature.Locked.Teleport=UŽRAKINTA IKI {0}+ (PARTIJOS TELEPORTAS) +Party.Feature.Locked.Alliance=UŽRAKINTA IKI {0}+ (ALJANSAS) +Party.Feature.Locked.ItemShare=UŽRAKINTA IKI {0}+ (DAIKTŲ DALINIMASIS) +Party.Feature.Locked.XpShare=UŽRAKINTA IKI {0}+ (XP DALINIMASIS) +Party.Feature.Disabled.1=&cPartijos pokalbis dar nėra atrakintas. +Party.Feature.Disabled.2=&cPartijos teleportas dar nėra atrakintas. +Party.Feature.Disabled.3=&cPartijos aljansas dar nėra atrakintas. +Party.Feature.Disabled.4=&cPartijos daiktų dalinimasis dar nėra atrakintas. +Party.Feature.Disabled.5=&cPartijos XP dalinimasis dar nėra atrakintas. Party.ShareType.Xp=XP -Party.ShareType.Item=ITEM -Party.ShareMode.None=NONE -Party.ShareMode.Equal=EQUAL -Party.ShareMode.Random=RANDOM -Party.ItemShare.Category.Loot=Loot -Party.ItemShare.Category.Mining=Mining -Party.ItemShare.Category.Herbalism=Herbalism -Party.ItemShare.Category.Woodcutting=Woodcutting -Party.ItemShare.Category.Misc=Misc +Party.ShareType.Item=DAIKTAS +Party.ShareMode.None=NIEKO +Party.ShareMode.Equal=LYGUS +Party.ShareMode.Random=ATSITIKTINIS +Party.ItemShare.Category.Loot=Lobis +Party.ItemShare.Category.Mining=Kasinėjimas +Party.ItemShare.Category.Herbalism=Žolininkystė +Party.ItemShare.Category.Woodcutting=Medkirtystė +Party.ItemShare.Category.Misc=Įvairūs ##xp -Commands.XPGain.Acrobatics=Falling -Commands.XPGain.Alchemy=Brewing Potions -Commands.XPGain.Archery=Attacking Monsters -Commands.XPGain.Axes=Attacking Monsters -Commands.XPGain.Child=Gains levels from Parent Skills -Commands.XPGain.Excavation=Digging and finding treasures -Commands.XPGain.Fishing=Fishing (Go figure!) -Commands.XPGain.Herbalism=Harvesting Herbs -Commands.XPGain.Mining=Mining Stone & Ore -Commands.XPGain.Repair=Repairing -Commands.XPGain.Swords=Attacking Monsters -Commands.XPGain.Taming=Animal Taming, or combat w/ your wolves -Commands.XPGain.Unarmed=Attacking Monsters -Commands.XPGain.Woodcutting=Chopping down trees -Commands.XPGain=[[DARK_GRAY]]XP GAIN: [[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=[[RED]]The XP RATE was modified to {0} -Commands.xprate.over=[[RED]]mcMMO XP Rate Event is OVER!! -Commands.xprate.proper.0=[[RED]]Proper usage to change the XP rate is /xprate -Commands.xprate.proper.1=[[RED]]Proper usage to restore the XP rate to default is /xprate reset -Commands.xprate.proper.2=[[RED]]Please specify true or false to indicate if this is an xp event or not -Commands.NegativeNumberWarn=Don't use negative numbers! -Commands.Event.Start=[[GREEN]]mcMMO[[GOLD]] Event! -Commands.Event.Stop=[[GREEN]]mcMMO[[DARK_AQUA]] Event Over! -Commands.Event.Stop.Subtitle=[[GREEN]]I hope you had fun! -Commands.Event.XP=[[DARK_AQUA]]XP Rate is now [[GOLD]]{0}[[DARK_AQUA]]x -Commands.xprate.started.0=[[GOLD]]XP EVENT FOR mcMMO HAS STARTED! -Commands.xprate.started.1=[[GOLD]]mcMMO XP RATE IS NOW {0}x! +Commands.XPGain.Acrobatics=Kritimas +Commands.XPGain.Alchemy=Gėrimų gaminimas +Commands.XPGain.Archery=Monstrų Puolimas +Commands.XPGain.Axes=Monstrų Puolimas +Commands.XPGain.Child=Gauna lygius iš pirminių įgūdžių +Commands.XPGain.Excavation=Kasinėjimas ir lobių radimas +Commands.XPGain.Fishing=Žvejojimas (Kas galėjo pagalvoti!) +Commands.XPGain.Herbalism=Žolelių rinkimas +Commands.XPGain.Mining=Akmens, iškasenų skaldymas +Commands.XPGain.Repair=Taisymas +Commands.XPGain.Swords=Monstrų Puolimas +Commands.XPGain.Taming=Gyvunų prijaukinimas, arba kovojimas kartu su savo vilkais +Commands.XPGain.Unarmed=Monstrų Puolimas +Commands.XPGain.Woodcutting=Medžių kirtimas +Commands.XPGain=&8XP GAVIMAS: &f{0} +Commands.xplock.locked=&6Tavo XP JUOSTA dabar užrakinta ties {0}! +Commands.xplock.unlocked=&6Tavo XP JUOSTA dabar &aATRAKINTA&6! +Commands.xprate.modified=&cXP Reitingas pakeistas į {0} +Commands.xprate.over=&cmcMMO XP Reitingų renginys PASIBAIGĖ! +Commands.xprate.proper.0=&cTinkamas naudojimas pakeisti XP reitingui yra /xprate +Commands.xprate.proper.1=&cTinkamas naudojimas atstatyti XP reiginui į numatytąjį yra /xprate reset +Commands.xprate.proper.2=&cPrašome nurodyti tiesa ar netiesa, kad įdentikuoti ar tai yra XP renginys ar ne +Commands.NegativeNumberWarn=Nenaudokite negatyvių skaičių! +Commands.Event.Start=&amcMMO&6 Renginys! +Commands.Event.Stop=&amcMMO&3 Renginys Pasibaigė! +Commands.Event.Stop.Subtitle=&aTikimės jums buvo linksma! +Commands.Event.XP=&3XP Reitingai dabar yra &6{0}&3x +Commands.xprate.started.0=&6XP RENGINYS mcMMO PRASIDĖJO! +Commands.xprate.started.1=&6mcMMO XP REITINGAS DABAR YRA {0}x! # Admin Notifications -Server.ConsoleName=[[YELLOW]][Server] -Notifications.Admin.XPRate.Start.Self=[[GRAY]]You have set the global XP rate multiplier to [[GOLD]]{0}x -Notifications.Admin.XPRate.End.Self=[[GRAY]]You ended the XP rate event. -Notifications.Admin.XPRate.End.Others={0} [[GRAY]]has ended the XP rate event -Notifications.Admin.XPRate.Start.Others={0} [[GRAY]]has started or modified an XP rate event with global multiplier {1}x -Notifications.Admin.Format.Others=[[GOLD]]([[GREEN]]mcMMO [[DARK_AQUA]]Admin[[GOLD]]) [[GRAY]]{0} -Notifications.Admin.Format.Self=[[GOLD]]([[GREEN]]mcMMO[[GOLD]]) [[GRAY]]{0} +Server.ConsoleName=&e[Server] +Notifications.Admin.XPRate.Start.Self=&7Nusatėte globalų XP reitingo daugiklį į &6{0}x +Notifications.Admin.XPRate.End.Self=&7Jus baigėte XP reitingo renginį. +Notifications.Admin.XPRate.End.Others={0} &7Baigė XP reitingo renginį +Notifications.Admin.XPRate.Start.Others={0} &7Pradėjo arba modifikavo XP reitingų renginį su globaliu daugikliu {1}x +Notifications.Admin.Format.Others=&6(&amcMMO &3Adminas&6) &7{0} +Notifications.Admin.Format.Self=&6(&amcMMO&6) &7{0} # Event -XPRate.Event=[[GOLD]]mcMMO is currently in an XP rate event! XP rate is {0}x! +XPRate.Event=&6mcMMO yra XP reitingų renginyje! XP reitingas yra {0}x! #GUIDES -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.Page.OutOfRange=That page does not exist, there are only {0} total pages. -Guides.Usage= Usage is /{0} ? [page] +Guides.Available=&7Gidas {0} prieinamas - parašykite /{1} ? [page] +Guides.Header=&6-=&a{0} Gidas&6=- +Guides.Page.Invalid=Neteisingas puslapio numeris! +Guides.Page.OutOfRange=Toks puslapis neegzistuoja, iš viso yra {0} pusl. +Guides.Usage= Naudojimas yra /{0} ? [page] ##Acrobatics -Guides.Acrobatics.Section.0=[[DARK_AQUA]]About Acrobatics:\n[[YELLOW]]Acrobatics is the art of moving Gracefuly in mcMMO.\n[[YELLOW]]It provides combat bonuses and environment damage bonuses.\n\n[[DARK_AQUA]]XP GAIN:\n[[YELLOW]]To gain XP in this skill you need to perform a dodge\n[[YELLOW]]in combat or survive falls from heights that damage you. -Guides.Acrobatics.Section.1=[[DARK_AQUA]]How does Rolling work?\n[[YELLOW]]You have a passive chance when you take fall damage\n[[YELLOW]]to negate the damage done. You can hold the sneak button to\n[[YELLOW]]double your chances during the fall.\n[[YELLOW]]This triggers a Graceful Roll instead of a standard one.\n[[YELLOW]]Graceful Rolls are like regular rolls but are twice as likely to\n[[YELLOW]]occur and provide more damage safety than regular rolls.\n[[YELLOW]]Rolling chance is tied to your skill level -Guides.Acrobatics.Section.2=[[DARK_AQUA]]How does Dodge work?\n[[YELLOW]]Dodge is a passive chance when you are\n[[YELLOW]]injured in combat to halve the damage taken.\n[[YELLOW]]It is tied to your skill level. +Guides.Acrobatics.Section.1=&3Kaip veikia nusileidimas?\n&eTuri pasyvu šansą krentant iš aukštai\n&enegauti jokios žąlos. Laikant sėlinimo mygtuką\n&epadvigubina šansus išvengti žąlos.\n&eTai įjungia grakštų nusileidima, vietoje paprasto.\n&eGrakštus nusileidimas yra kaip paprastas nusileidimas, bet yra dvigubai\n&edažnesnis ir duoda daugiau apsaugos nei paprastas.\n&eNusileidimo šansas yra surištas su tavo įgūdžio lygiu +Guides.Acrobatics.Section.0=&3Apie Akrobatika:\n&eAkrobatika yra grakštaus judėjimo menas.\n&eTai duoda bonusų kovoje ir aplinkos privalumų.\n\n&3XP GAVIMAS:\n&eKad gauti XP šitame įgūdyje, reikia atlikti išvengimą\n&ekovoje arba išgyventi aukštus šuolius kurie tave sužaloja. +Guides.Acrobatics.Section.2=&3Kaip veikia išvengimas?\n&eIšvengimas yra pasyvus šansas kai esi\n&esužeidžiamas kovoje, sumažina pusiau gautą žąlą.\n&ešansas yra surištas su tavo įgūdžio lygiu. ##Alchemy -Guides.Alchemy.Section.0=[[DARK_AQUA]]About Alchemy:\n[[YELLOW]]Alchemy is about brewing potions.\n[[YELLOW]]It provides a speed increase in the potion brew time, as well\n[[YELLOW]]as the addition of new (previously) unobtainable potions.\n\n\n[[DARK_AQUA]]XP GAIN:\n[[YELLOW]]To gain XP in this skill you need to brew potions. -Guides.Alchemy.Section.1=[[DARK_AQUA]]How does Catalysis work?\n[[YELLOW]]Catalysis speeds of the brewing process, with a\n[[YELLOW]]max speed of 4x at level 1000.\n[[YELLOW]]This ability is unlocked at level 100 by default. -Guides.Alchemy.Section.2=[[DARK_AQUA]]How does Concoctions work?\n[[YELLOW]]Concoctions allows brewing of more potions with custom ingredients.\n[[YELLOW]]Which special ingredients are unlocked is determined\n[[YELLOW]]by your Rank. There are 8 ranks to unlock. -Guides.Alchemy.Section.3=[[DARK_AQUA]]Concoctions tier 1 ingredients:\n[[YELLOW]]Blaze Powder, Fermented Spider Eye, Ghast Tear, Redstone,\n[[YELLOW]]Glowstone Dust, Sugar, Glistering Melon, Golden Carrot,\n[[YELLOW]]Magma Cream, Nether Wart, Spider Eye, Suplhur, Water Lily,\n[[YELLOW]]Pufferfish\n[[YELLOW]](Vanilla Potions) -Guides.Alchemy.Section.4=[[DARK_AQUA]]Concoctions tier 2 ingredients:\n[[YELLOW]]Carrot (Potion of Haste)\n[[YELLOW]]Slimeball (Potion of Dullness)\n\n[[DARK_AQUA]]Concoctions tier 3 ingredients:\n[[YELLOW]]Quartz (Potion of Absorption)\n[[YELLOW]]Red Mushroom (Potion of Leaping) -Guides.Alchemy.Section.5=[[DARK_AQUA]]Concoctions tier 4 ingredients:\n[[YELLOW]]Apple (Potion of Health Boost)\n[[YELLOW]]Rotten Flesh (Potion of Hunger)\n\n[[DARK_AQUA]]Concoctions tier 5 ingredients:\n[[YELLOW]]Brown Mushroom (Potion of Nausea)\n[[YELLOW]]Ink Sack (Potion of Blindness) -Guides.Alchemy.Section.6=[[DARK_AQUA]]Concoctions tier 6 ingredients:\n[[YELLOW]]Fern (Potion of Saturation)\n\n[[DARK_AQUA]]Concoctions tier 7 ingredients:\n[[YELLOW]]Poisonous Potato (Potion of Decay)\n\n[[DARK_AQUA]]Concoctions tier 8 ingredients:\n[[YELLOW]]Regular Golden Apple (Potion of Resistance) +Guides.Alchemy.Section.0=&3Apie Alchemiją:\n&eAlchemija yra apie gėrimų ruošimą .\n&eTai leidžia pagreitinti gėrimo paruošimo laiką , taip pat\n&epridėti naujų (anksčiau) nepasiekiamų gėrimų .\n\n\n&3XP GAVIMAS:\n&eNorėdami įgyti XP šio įgūdžio, turite gaminti gėrimus . +Guides.Alchemy.Section.1=&3Kaip veikia Katalyzė?\n&eKatalyzė pagreitina gėrimų gaminimą, su\n&emaksimaliu 4x greičiu ties lygiu 1000.\n&eŠi galia atsirakina ties lygiu 100 pagal numatytus nustatymus. +Guides.Alchemy.Section.2=&3Kaip veikia mikstūros?\n&eMikstūros leidžia gaminti gėrimus iš naujų ingredientų.\n&eKurie ingredientai atsirakina, numato jūsų \n&erankas. Iš viso yra 8 rankai. +Guides.Alchemy.Section.3=&3Mikstūrų 1 pakopos ingredientai:\n&eBlaze Powder, Fermented Spider Eye, Ghast Tear, Redstone,\n&eGlowstone Dust, Sugar, Glistering Melon, Golden Carrot,\n&eMagma Cream, Nether Wart, Spider Eye, Suplhur, Water Lily,\n&ePufferfish\n&e(Paprasti gėrimai) +Guides.Alchemy.Section.4=&3Mikstūrų 2 pakopos ingredientai:\n&eCarrot (Potion of Haste)\n&eSlimeball (Potion of Dullness)\n\n&3Mikstūrų 3 pakopos ingredientai:\n&eQuartz (Potion of Absorption)\n&eRed Mushroom (Potion of Leaping) +Guides.Alchemy.Section.5=&3Mikstūrų 4 pakopos ingredientai:\n&eApple (Potion of Health Boost)\n&eRotten Flesh (Potion of Hunger)\n\n&3Mikstūrų 5 pakopos ingredientai:\n&eBrown Mushroom (Potion of Nausea)\n&eInk Sack (Potion of Blindness) +Guides.Alchemy.Section.6=&3Mikstūrų 6 pakopos ingredientai:\n&eFern (Potion of Saturation)\n\n&3Mikstūrų 7 pakopos ingredientai:\n&ePoisonous Potato (Potion of Decay)\n\n&3Mikstūrų 8 pakopos ingredientai:\n&ePaprastas Golden Apple (Potion of Resistance) ##Archery -Guides.Archery.Section.0=[[DARK_AQUA]]About Archery:\n[[YELLOW]]Archery is about shooting with your bow and arrow.\n[[YELLOW]]It provides various combat bonuses, such as a damage boost\n[[YELLOW]]that scales with your level and the ability to daze your\n[[YELLOW]]opponents in PvP. In addition to this, you can retrieve\n[[YELLOW]]some of your spent arrows from the corpses of your foes.\n\n\n[[DARK_AQUA]]XP GAIN:\n[[YELLOW]]To gain XP in this skill you need to shoot mobs or\n[[YELLOW]]other players. -Guides.Archery.Section.1=[[DARK_AQUA]]How does Skill Shot work?\n[[YELLOW]]Skill Shot provides additional damage to your shots.\n[[YELLOW]]The bonus damage from Skill Shot increases as you\n[[YELLOW]]level in Archery.\n[[YELLOW]]With the default settings, your archery damage increases 10%\n[[YELLOW]]every 50 levels, to a maximum of 200% bonus damage. -Guides.Archery.Section.2=[[DARK_AQUA]]How does Daze work?\n[[YELLOW]]You have a passive chance to daze other players when\n[[YELLOW]]you shoot them. When Daze triggers it forces your opponents\n[[YELLOW]]to look straight up for a short duration.\n[[YELLOW]]A Daze shot also deals an additional 4 damage (2 hearts). -Guides.Archery.Section.3=[[DARK_AQUA]]How does Arrow Retrieval work?\n[[YELLOW]]You have a passive chance to retrieve some of your arrows\n[[YELLOW]]when you kill a mob with your bow.\n[[YELLOW]]This chance increases as you level in Archery.\n[[YELLOW]]By default, this ability increases by 0.1% per level, up to 100%\n[[YELLOW]]at level 1000. +Guides.Archery.Section.0=&3Apie Lankininkystę:\n&eLankininko įgūdžiai yra apie tai, kaip šaudyti iš lanko su strėlėmis.\n&eTai suteikia įvairių kovos bonusų, kaip žąlos padidinimą\n&ekuris didėja kartu su jūsų lygių ir galimybe apsvaiginti jūsų\n&epriešininką. Papildomai, atgaunate dalį\n&eiššaudytų strėlių iš priešininkų lavonų.\n\n\n&3XP GAVIMAS:\n&ekad gauti XP šiame įgūdyje turite šaudyti į monstrus\n&earba kitus priešininkus. +Guides.Archery.Section.1=&3Kaip veikia Taiklus Šūvis?\n&eTaiklus Šūvis prideda papildomos žąlos jūsų šūviams.\n&ePapildoma žala Taikliam Šūviui didėja kartu\n&esu jųsų lygiu.\n&ePagal numatytus nustatymus, daroma žala didėja po 10%\n&ekas kiekvieną 50 lygį, iki 200% maksimalios papildomos žalos. +Guides.Archery.Section.2=&3Kaip veikia Apsvaiginimas?\n&eTurite pasyvų šansą apsvaiginti kitus žaidėjus, kai\n&ejūs šaunate į juos. Kai įsijungia Apsvaiginimas, jis priverčia jūsų priešininkus\n&ežiūrėti tiesiai trumpam laikui.\n&eSvaiginantis šūvis daro papildomos 4 taškų žalos (2 širdys). +Guides.Archery.Section.3=&3Kaip veikia strėlių susigrąžinimas?\n&eJūs turite pasyvų šansą atgauti kai kurias iššautas strėles\n&ekai nužudote monstrą su lanku.\n&eŠis šansas didėja kartu su jųsš įgūdžiu.\n&ePagal numatytus nustatymus, ši galimybė didėja po 0.1% per lygį, iki 100%\n&eties 1000 lygiu. ##Axes -Guides.Axes.Section.0=[[DARK_AQUA]]About Axes:\n[[YELLOW]]With the Axes skill you can use your axe for much more then\n[[YELLOW]]just deforesting! You can hack and chop away at mobs\n[[YELLOW]]and players to gain XP, hitting mobs with the effect of\n[[YELLOW]]knockback and inflicting DEADLY criticals on mobs and players.\n[[YELLOW]]Your axe also becomes a hand-held woodchipper,\n[[YELLOW]]breaking down the enemy's armor with ease as your level\n[[YELLOW]]increases.\n[[DARK_AQUA]]XP GAIN:\n[[YELLOW]]To gain XP in this skill you need hit other mobs or players\n[[YELLOW]]with an Axe. -Guides.Axes.Section.1=[[DARK_AQUA]]How does Skull Splitter work?\n[[YELLOW]]This ability allows you to deal an AoE (Area of Effect) hit.\n[[YELLOW]]This AoE hit will deal half as much damage as you did to the\n[[YELLOW]]main target, so it's great for clearing out large piles of mobs. -Guides.Axes.Section.2=[[DARK_AQUA]]How does Critical Strikes work?\n[[YELLOW]]Critical Strikes is a passive ability which gives players a\n[[YELLOW]]chance to deal additional damage.\n[[YELLOW]]With the default settings, every 2 skill levels in Axes awards a\n[[YELLOW]]0.1% chance to deal a Critical Strike, causing 2.0 times damage\n[[YELLOW]]to mobs or 1.5 times damage against other players. -Guides.Axes.Section.3=[[DARK_AQUA]]How does Axe Mastery work?\n[[YELLOW]]Axe Mastery is a passive ability that will add additional damage\n[[YELLOW]]to your hits when using Axes.\n[[YELLOW]]By default, the bonus damage increases by 1 every 50 levels,\n[[YELLOW]]up to a cap of 4 extra damage at level 200. -Guides.Axes.Section.4=[[DARK_AQUA]]How does Armor Impact work?\n[[YELLOW]]Strike with enough force to shatter armor!\n[[YELLOW]]Armor Impact has a passive chance to damage your\n[[YELLOW]]opponent's armor. This damage increases as you level in Axes. -Guides.Axes.Section.5=[[DARK_AQUA]]How does Greater Impact work?\n[[YELLOW]]You have a passive chance to achieve a greater impact when\n[[YELLOW]]hitting mobs or players with your axe.\n[[YELLOW]]By default this chance is 25%. This passive ability has an\n[[YELLOW]]extreme knockback effect, similar to the Knockback II\n[[YELLOW]]enchantment. In addition, it deals bonus damage to the target. +Guides.Axes.Section.0=&3Apie Kirvius:\n&eSu Kirvio valdymo įgūdžiais galite daug daugiau nei\n&etik kirsti medžius! Jūs galite nukirsti ir sukapoti monstrus\n&eir žaidėjus kad gauti XP, mušant monstrus su atmušimo efektu ir\n&eir suduodant mirtinus smūgius priešininkams ir monstrams.\n&eJūsų kirvis taip pat tampa rankinis smulkintuvas,\n&elengviau laužo priešininko šarvus \n&ekylant lygiui.\n&3XP GAVIMAS:\n&eKad gaudi XP, jums reikia mušti monstrus arba žaidėjus\n&esu kirviu. +Guides.Axes.Section.1=&3Kaip veikia Kaukolių Skaldytojas?\n&eŠi galia daro žąlą zonoje.\n&eZonos žąla yra tokia pati kaip ir padaryta \n&epradiniam taikiniui, todėl jis yra tobulas išvalyti didesnį kiekį monstrų. +Guides.Axes.Section.2=&3Kaip veikia Kritiški Smūgiai?\n&eKritiški Smūgiai yra pasyvi galia kuri duoda žaidėjams a\n&ešansą daryti papildomos žąlos.\n&eNaudojant numatytuosius nustatymus, kas 2 Kirvių valdymo įgūdžių lygis duoda a\n&e0.1% šanso suveikdinti Kritiškus Smūgius, darant 2.0 kartus žąlos\n&emonstrams arba 1.5 karto žaidėjams. +Guides.Axes.Section.3=&3Kaip veikia Kirvio Meistriškumas?\n&eKirvio Meistrystė yra pasyvi galia kuri duoda papildomos žalos \n&esmūgiuojant kirviu.\n&ePagal numatytus nustatymus, žąlos bonusas kyla po 1 kas 50 lygių,\n&eiki 4 maksimumo, ties 200 lygiu. +Guides.Axes.Section.4=&3Kaip veikia Šarvų Poveikis?\n&eKirsk su pakankamai jėgos perlaužti šarvus!\n&eŠarvų Poveikis yra pasyvus šansas gadinti \n&epriešininko šarvus. Ši žąla didėja bekylant jūsų lygiui. +Guides.Axes.Section.5=&3Kaip veikia Didelės Jėgos Smūgiai?\n&eJūs turite pasyvų šansą suduoti Didelės Jėgos Smūgius kai\n&epuolate priešininkus su savo kirviu.\n&ePagal numatytuosius nustatymus, šis šansas yra 25%. Ši pasyvi galia turi\n&eekstremalų atmušimo efektą, panašų į Knockback II\n&eužkerėjimą. Papildomai, tai daro daugiau žąlos. ##Excavation -Guides.Excavation.Section.0=[[DARK_AQUA]]About Excavation:\n[[YELLOW]]Excavation is the act of digging up dirt to find treasures.\n[[YELLOW]]By excavating the land you will find treasures.\n[[YELLOW]]The more you do this the more treasures you can find.\n\n[[DARK_AQUA]]XP GAIN:\n[[YELLOW]]To gain XP in this skill you must dig with a shovel in hand.\n[[YELLOW]]Only certain materials can be dug up for treasures and XP. -Guides.Excavation.Section.1=[[DARK_AQUA]]Compatible Materials:\n[[YELLOW]]Grass, Dirt, Sand, Clay, Gravel, Mycelium, Soul Sand, Snow -Guides.Excavation.Section.2=[[DARK_AQUA]]How to use Giga Drill Breaker:\n[[YELLOW]]With a shovel in hand right click to ready your tool.\n[[YELLOW]]Once in this state you have about 4 seconds to make\n[[YELLOW]]contact with Excavation compatible materials this will\n[[YELLOW]]activate Giga Drill Breaker. -Guides.Excavation.Section.3=[[DARK_AQUA]]What is Giga Drill Breaker?\n[[YELLOW]]Giga Drill Breaker is an ability with a cooldown\n[[YELLOW]]tied to Excavation skill. It triples your chance\n[[YELLOW]]of finding treasures and enables instant break\n[[YELLOW]]on Excavation materials. -Guides.Excavation.Section.4=[[DARK_AQUA]]How does Archaeology work?\n[[YELLOW]]Every possible treasure for Excavation has its own\n[[YELLOW]]skill level requirement for it to drop, as a result it's\n[[YELLOW]]difficult to say how much it is helping you.\n[[YELLOW]]Just keep in mind that the higher your Excavation skill\n[[YELLOW]]is, the more treasures that can be found.\n[[YELLOW]]And also keep in mind that each type of Excavation\n[[YELLOW]]compatible material has its own unique list of treasures.\n[[YELLOW]]In other words you will find different treasures in Dirt\n[[YELLOW]]than you would in Gravel. -Guides.Excavation.Section.5=[[DARK_AQUA]]Notes about Excavation:\n[[YELLOW]]Excavation drops are completely customizeable\n[[YELLOW]]So results vary server to server. +Guides.Excavation.Section.0=&3Apie Kasinėjimą:\n&eKasinėjimas yra veikla, kuria kasinėjant birias medžiagas, randate iškasenų.\n&eKasinėjant žemes kartais gausite naudingų iškasenų.\n&eKuo daugiau tuo užsiiminėsie, tuo daugiau iškasenų rasite.\n\n&3XP GAVIMAS:\n&eKad gauti XP šiame įgūdyje, kasant reikia naudoti kastuvą.\n&eTik tam tikros medžiagos gali būti kasamos dėl XP ir iškasenų. +Guides.Excavation.Section.1=&3Kasamos medžiagos:\n&eGrass, Dirt, Sand, Clay, Gravel, Mycelium, Soul Sand, Snow +Guides.Excavation.Section.2=&3Kaip naudoti Giga Grąžtą:\n&eSu kastuvu dešinėje rankoje, paspauskite dešinį pelės klavišą kad pasiruošti.\n&eKai įsijungia, turite 4 sekundes pradėti medžiagų\n&ekasybą, tinkamų medžiagų\n&etai įjungs Giga Grąžtą. +Guides.Excavation.Section.3=&3Kas yra Giga Grąžtas?\n&eGiga Grąžtas yra galia, su atsinaujinimo laiku\n&esujungtu su Kasinėjimo įgūdžiu. Jis patrigubina jūsų šansus\n&erasti iškasenų ir duoda didžiulį kasinėjimo greitį\n&etam tikrom medžiagom. +Guides.Excavation.Section.4=&3Kaip veikia Archeologija?\n&eKiekviena įmanoma iškasena ar lobis turi savo\n&eįgūdžio reikalavimą kad būtų galima juos rasti, ko pasekoje\n&eyra labai sunku nusakyti kiek tai jums padeda.\n&eTik turėkite omenyje, kuo didesnis jūsų Kasinėjimo įgūdis,\n&etuo dažniau rasite iškasenų ir lobių.\n&eTaip pat turėkite omenyje, kad kiekvienas skirtigos iškastos medžiagos\n&eturi skirtingus galimus lobius ir naudingas iškasenas.\n&eKitaip tąriant, galite gauti kitokį lobį iš purvo\n&enei kastumėte žvyrą. +Guides.Excavation.Section.5=&3Užrašai apie Kasinėjimą:\n&eKasinėjimo lobiai ir iškasenos yra nustatomas ir keičiamos serverio administracijos,\n&eTai rezultatai gali skirtis. ##Fishing -Guides.Fishing.Section.0=[[DARK_AQUA]]About Fishing:\n[[YELLOW]]With the Fishing skill, Fishing is exciting again!\n[[YELLOW]]Find hidden treasures, and shake items off mobs.\n\n[[DARK_AQUA]]XP GAIN:\n[[YELLOW]]Catch fish. -Guides.Fishing.Section.1=[[DARK_AQUA]]How does Treasure Hunter work?\n[[YELLOW]]This ability allows you to find treasure from fishing \n[[YELLOW]]with a small chance of the items being enchanted.\n[[YELLOW]]Every possible treasure for Fishing has a chance\n[[YELLOW]]to drop on any level. It depends however\n[[YELLOW]]what the rarity of the item is how often it will drop.\n[[YELLOW]]The higher your Fishing skill is, the better\n[[YELLOW]]your chances are to find better treasures. -Guides.Fishing.Section.2=[[DARK_AQUA]]How does Ice Fishing work?\n[[YELLOW]]This passive skill allows you to fish in ice lakes!\n[[YELLOW]]Cast your fishing rod in an ice lake and the ability will\n[[YELLOW]]create a small hole in the ice to fish in. -Guides.Fishing.Section.3=[[DARK_AQUA]]How does Master Angler work?\n[[YELLOW]]This passive skill increases the bite chance while fishing.\n[[YELLOW]]When you've unlocked this ability, fishing while in\n[[YELLOW]]a boat or when an ocean biome doubles the bite chance. -Guides.Fishing.Section.4=[[DARK_AQUA]]How does Shake work?\n[[YELLOW]]This active ability allows you to shake items loose from mobs\n[[YELLOW]]by hooking them with the fishing rod. \n[[YELLOW]]Mobs will drop items they would normally drop on death.\n[[YELLOW]]It is also possible to acquire mob skulls, which are normally \n[[YELLOW]]unobtainable in survival mode. -Guides.Fishing.Section.5=[[DARK_AQUA]]How does Fisherman's Diet work?\n[[YELLOW]]This passive skill increases the amount of hunger restored \n[[YELLOW]]from eating fish. -Guides.Fishing.Section.6=[[DARK_AQUA]]Notes about Fishing:\n[[YELLOW]]Fishing drops are completely customizable,\n[[YELLOW]]so results vary server to server. +Guides.Fishing.Section.0=&3Apie Žvejybą:\n&eSu Žvejojimo įgūdžiu, žvejojimas vėl pasidarė įdomus!\n&eSužvejokite prarastus lobius ir nukratykite daiktus nuo monstrų.\n\n&3XP GAVIMAS:\n&eSužvejokite žuvis. +Guides.Fishing.Section.1=&3Kaip veikia Lobių Ieškotojas?\n&eŠi galia leidžia jums ištraukti lobius vietoj žuvų \n&esu mažu šansu, jog tie lobiai bus užkerėti.\n&eKiekvienas skirtinas lobis turi šansą būti pagautas\n&ebet kokiame lygyjė. Tačiau tai priklauso nuo\n&ekokio retumo tai lobis.\n&eKuo didesnis Žvejybos įgūdis, tuo didesnis\n&ejūsų šansas jį rasti/pagauti. +Guides.Fishing.Section.2=&3Kaip veikia Ledinė Žvejyba?\n&eŠi pasyvi galia leidžia jums žvejoti ant ledo ežerų!\n&eUžmeskite meškerę ant ledo, ir galia\n&epadarys skylę lede, kurioje galėsite žvejoti. +Guides.Fishing.Section.3=&3Kaip veikia Meistras Žvejys?\n&eŠi pasyvi galia padidins žuvies užkibimo šansus.\n&eKai atsirakinsite šią galią, bežvejojant\n&evaltyje arba vandenyne, padvigubins užkibimo šansą. +Guides.Fishing.Section.4=&3Kaip veikia Nupurtymas?\n&eŠi aktyvi galia leidžia nupurtyti laisvus daiktus nuo monstrų\n&e užkabinant su kabliuku. \n&eMonstrai numes daiktus kuriuose normaliomis salygomis išmestu, jiems mirus.\n&eTaip pat įmanoma išgauti monstrų kaukolių, kas normalioms salygomis \n&enėra išgaunamas išgyvenimo rėžime. +Guides.Fishing.Section.5=&3Kaip veikia Žvejo Dieta?\n&eŠi pasyvi galia padidiną atgautą alkį \n&eiš žuvies. +Guides.Fishing.Section.6=&3Užrašai apie Žvėjybą:\n&eŽvėjybos laimikiai yra nustatomi serverio administracijos,\n&etodėl gali keistis. ##Herbalism -Guides.Herbalism.Section.0=[[DARK_AQUA]]About Herbalism:\n[[YELLOW]]Herbalism is about collecting herbs and plants.\n\n\n[[DARK_AQUA]]XP GAIN:\n[[YELLOW]]Collect plants and herbs. -Guides.Herbalism.Section.1=[[DARK_AQUA]]Compatible Blocks\n[[YELLOW]]Wheat, Potatoes, Carrots, Melons, \n[[YELLOW]]Pumpkins, Sugar Canes, Cocoa Beans, Flowers, Cacti, Mushrooms,\n[[YELLOW]]Nether Wart, Lily Pads, and Vines. -Guides.Herbalism.Section.2=[[DARK_AQUA]]How does Green Terra work?\n[[YELLOW]]Green Terra is an active ability, you can right-click\n[[YELLOW]]while holding a hoe to activate Green Terra.\n[[YELLOW]]Green Terra grants players a chance to get 3x drops from\n[[YELLOW]]harvesting plants. It also gives players the ability to\n[[YELLOW]]spread life into blocks and transform them using seeds\n[[YELLOW]]from your inventory. -Guides.Herbalism.Section.3=[[DARK_AQUA]]How does Green Thumb (Crops) work?\n[[YELLOW]]This passive ability will automatically replant crops when\n[[YELLOW]]harvesting.\n[[YELLOW]]Your chance of success depends on your Herbalism skill. -Guides.Herbalism.Section.4=[[DARK_AQUA]]How does Green Thumb (Cobble/Stone Brick/Dirt) work?\n[[YELLOW]]This active ability allows you to turn blocks into their\n[[YELLOW]]"plant-related" counterparts. You can do this by right-clicking\n[[YELLOW]]a block, while holding seeds. This will consume 1 seed. -Guides.Herbalism.Section.5=[[DARK_AQUA]]How does Farmer's Diet work?\n[[YELLOW]]This passive skill increases the amount of hunger restored \n[[YELLOW]]when eating Bread, Cookies, Melons, Mushroom Soup, Carrots,\n[[YELLOW]]and Potatoes. -Guides.Herbalism.Section.6=[[DARK_AQUA]]How does Hylian Luck work?\n[[YELLOW]]This passive ability gives you a chance to find rare items\n[[YELLOW]]when certain blocks are broken with a sword. -Guides.Herbalism.Section.7=[[DARK_AQUA]]How do Double Drops work?\n[[YELLOW]]This passive ability gives players more yield from their\n[[YELLOW]]harvests. +Guides.Herbalism.Section.0=&3Apie Žolininkystę:\n&eŽolininkystė yra apie žolių ir augalų rinkimą.\n\n\n&3XP GAVIMAS:\n&eRinkti žoleles ir augalus. +Guides.Herbalism.Section.1=&3Tinkamos medžiagos\n&eWheat, Potatoes, Carrots, Melons, \n&ePumpkins, Sugar Canes, Cocoa Beans, Flowers, Cacti, Mushrooms,\n&eNether Wart, Lily Pads, and Vines. +Guides.Herbalism.Section.2=&3Kaip veikia Žalia Žemė?\n&eŽalia Žemė yra aktyvi galia, galite paspausti dešinį pelės klavišą\n&ekol laikote rankoje kaplį kad įjungti Žalią Žemę.\n&eŽalia Žemė duoda jums 3x derliaus\n&enuimant užaugintus augalus. Taip pat duoda jums galimybę\n&eišplėsti gyvybę į šalia esančius blokus, ir transformuoti naudojant sėklas\n&eiš jūsų kuprinės. +Guides.Herbalism.Section.3=&3Kaip veikia Žalias Nykštys (Pasėliai)?\n&eŠi pasyvi galia automatiškai atsės nuimtą\n&ederlių.\n&eJūsų atsėjimo šansas priklauso nuo Žolininkystės įgūdžio lygio. +Guides.Herbalism.Section.4=&3Kaip veikia Žalias Nykštys (Cobble/Stone Brick/Dirt)?\n&eŠi aktyvi galia jums leidžia paversti blokus į\n&e"apžėlusius" tipus. Jūs tai galite padaryti spaudžiant dešinį pelės klavišą\n&eant bloko, kol laikote sėklas. Tai sunaudos 1 sėklą. +Guides.Herbalism.Section.5=&3Kaip veikia Fermerio Dieta?\n&eŠi pasyvi galia jums leidžia atgauti papildomai alkio \n&ekai valgote užaugintą/pagamintą maistą kaip Bread, Cookies, Melons, Mushroom Soup, Carrots,\n&eir Potatoes. +Guides.Herbalism.Section.6=&3Kaip veikia Hylio Sėkmė?\n&eŠi pasyvi galia jums suteikią šansą rasti retų daiktų\n&ekai iškertate tam tikrus blokus su kardu. +Guides.Herbalism.Section.7=&3Kaip veikia Dvigubas Laimikis?\n&eŠi pasyvi galia duoda žaidėjams papildomo derliaus kai\n&ekai jis yra nuimamas. ##Mining -Guides.Mining.Section.0=[[DARK_AQUA]]About Mining:\n[[YELLOW]]Mining consists of mining stone and ores. It provides bonuses\n[[YELLOW]]to the amount of materials dropped while mining.\n\n[[DARK_AQUA]]XP GAIN:\n[[YELLOW]]To gain XP in this skill, you must mine with a pickaxe in hand.\n[[YELLOW]]Only certain blocks award XP. -Guides.Mining.Section.1=[[DARK_AQUA]]Compatible Materials:\n[[YELLOW]]Stone, Coal Ore, Iron Ore, Gold Ore, Diamond Ore, Redstone Ore,\n[[YELLOW]]Lapis Ore, Obsidian, Mossy Cobblestone, Ender Stone,\n[[YELLOW]]Glowstone, and Netherrack. -Guides.Mining.Section.2=[[DARK_AQUA]]How to use Super Breaker:\n[[YELLOW]]With a pickaxe in your hand, right click to ready your tool.\n[[YELLOW]]Once in this state, you have about 4 seconds to make contact\n[[YELLOW]]with Mining compatible materials, which will activate Super\n[[YELLOW]]Breaker. -Guides.Mining.Section.3=[[DARK_AQUA]]What is Super Breaker?\n[[YELLOW]]Super Breaker is an ability with a cooldown tied to the Mining\n[[YELLOW]]skill. It triples your chance of extra items dropping and\n[[YELLOW]]enables instant break on Mining materials. -Guides.Mining.Section.4=[[DARK_AQUA]]How to use Blast Mining:\n[[YELLOW]]With a pickaxe in hand,\n[[YELLOW]]crouch and right-click on TNT from a distance. This will cause the TNT\n[[YELLOW]]to instantly explode. -Guides.Mining.Section.5=[[DARK_AQUA]]How does Blast Mining work?\n[[YELLOW]]Blast Mining is an ability with a cooldown tied to the Mining\n[[YELLOW]]skill. It gives bonuses when mining with TNT and allows you\n[[YELLOW]]to remote detonate TNT. There are three parts to Blast Mining.\n[[YELLOW]]The first part is Bigger Bombs, which increases blast radius.\n[[YELLOW]]The second is Demolitions Expert, which decreases damage\n[[YELLOW]]from TNT explosions. The third part simply increases the\n[[YELLOW]]amount of ores dropped from TNT and decreases the\n[[YELLOW]]debris dropped. +Guides.Mining.Section.0=&3Apie Akmens Skaldymą:\n&eAkmens Skaldymas susideda iš akmens ir kitų iškasenų kasinėjima. Duoda papildomų bonusų\n&eiškastų medžiagų ir iškasenų kiekiui.\n\n&3XP GAVIMAS:\n&eKad gauti XP šiame įgūdyje, jums reikia iškirsti akmenis su kirtikliu.\n&eTIk tam tikri blokai duoda XP. +Guides.Mining.Section.1=&3Tinkamos medžiagos:\n&eStone, Coal Ore, Iron Ore, Gold Ore, Diamond Ore, Redstone Ore,\n&eLapis Ore, Obsidian, Mossy Cobblestone, Ender Stone,\n&eGlowstone, ir Netherrack. +Guides.Mining.Section.2=&3Kaip naudoti Super Griovėją:\n&eSu kirtikliu savo rankose, paspauskite dešinį pelės klavišą kad paruoštumėtę įrankį.\n&eToje stadijoje, turite 4 sekundes pradėti įkirsti\n&eį tinkamus blokus, kas\n&eaktyvuos Super Griovėją. +Guides.Mining.Section.3=&3Kas yra Super Griovėjas?\n&eSuper Griovėjas yra galia kuri turi atsitatymo laiką surištą su Akmens Skaldytojo lygiu.\n&eJis patrigubina papildomų iškasenų šansą ir\n&eįjungia didelio greičio kasybą. +Guides.Mining.Section.4=&3Kaip naudoti Sprogimo Kasybą:\n&eSu kirtikliu savo rankose,\n&epritūpę paspauskite dešinį pelės klavišą žiūrėdami į padėtą dinamitą. Tai privers jį\n&estaigiai sprogti. +Guides.Mining.Section.5=&3Kaip veikia Sprogimo Kasyba?\n&eSprogimo Kasyba yra galia su atsistatymo laiku surištu su jūsų Akmens Skaldymo įgūdžio lygiu.\n&eJis duoda bonusų kasant su dinamitu, ir leidžia\n&esusprogdinti dinamitą iš atstumo. Yra trys dalys Sprogimo kasybos.\n&ePirma dalis yra Didesnės Bombos, kurios padidina sprogimo zoną.\n&eAntra yra Sprogmenų Ekspertas, kuris sumažina gautą žąlą\n&enuo dinamito sprogimų. Trečia dalis paprasčiausiai padidiną\n&egautų uolienų ir iškasenų kiekį nuo dinamito ir sumažina\n&eiškrentančių šiukslių kiekį. ##Repair -Guides.Repair.Section.0=[[DARK_AQUA]]About Repair:\n[[YELLOW]]Repair allows you to use an iron block to repair armor and\n[[YELLOW]]tools.\n\n[[DARK_AQUA]]XP GAIN:\n[[YELLOW]]Repair tools or armor using the mcMMO Anvil. This is an\n[[YELLOW]]iron block by default and should not be confused with\n[[YELLOW]]the Vanilla Minecraft Anvil. -Guides.Repair.Section.1=[[DARK_AQUA]]How can I use Repair?\n[[YELLOW]]Place down a mcMMO Anvil and right-click to repair the item \n[[YELLOW]]you're currently holding. This consumes 1 item on every use. -Guides.Repair.Section.2=[[DARK_AQUA]]How does Repair Mastery work?\n[[YELLOW]]Repair Mastery increases the repair amount. The extra amount\n[[YELLOW]]repaired is influenced by your Repair skill level. -Guides.Repair.Section.3=[[DARK_AQUA]]How does Super Repair work?\n[[YELLOW]]Super Repair is a passive ability. When repairing an item,\n[[YELLOW]]it grants players a chance to repair an item with\n[[YELLOW]]double effectiveness. -Guides.Repair.Section.4=[[DARK_AQUA]]How does Arcane Forging work?\n[[YELLOW]]This passive ability allows you to repair items with a certain\n[[YELLOW]]chance of maintaining its enchantments. The enchants may be\n[[YELLOW]]kept at their existing levels, downgraded to a lower level,\n[[YELLOW]]or lost entirely. +Guides.Repair.Section.0=&3Apie Taisymą:\n&eTaisymas leidžia jums naudoti geležies bloką, kad pataisytumėte šarvus ir\n&eįrankius.\n\n&3XP GAVIMAS:\n&eTaisykite šarvus ir įrankius naudodami mcMMO Priekalą. Kas yra\n&egeležies blokas pagal numatytuosius nustatymus ir neturėtu būti sumaišytas su\n&epaprastu priekalu. +Guides.Repair.Section.1=&3Kaip naudoti Taisymą?\n&ePadėkite mcMMO priekalą ir panaudokite dešinį pelės klavišą, kad sutaisytumėte \n&edaiktą kurį laikote. Tai sunaudoja vieną daiktą kiekvieną panaudojimą. +Guides.Repair.Section.2=&3Kaip veikia Taisymo Meistrystė?\n&eTaisymo Meistrystė pataisymo kiekį. Papildomas kiekis yra\n&epriklausomas nuo jūsų esamo Taisymo įgūdžių lygio. +Guides.Repair.Section.3=&3Kaip veikia Super Taisymas?\n&eSuper Taisymas yra pasyvi galia. Taisant daiktą,\n&ejis jums duoda šansą kad sutaisytumėte daiktą su\n&edvigubu efektyvumu. +Guides.Repair.Section.4=&3Kaip veikia Arkaniška Kalvystė?\n&eŠi pasyvi galia jums leidžia taisyti daiktus su tam tikrais\n&ešansais išsaugoti kerėjimus. Kerėjimai gali išlikti\n&eesamo lygio, sumažėti arba\n&epradingti visai. ##Salvage -Guides.Salvage.Section.0=[[DARK_AQUA]]About Salvage:\n[[YELLOW]]Salvage allows you to use a gold block to salvage armor and\n[[YELLOW]]tools.\n\n[[DARK_AQUA]]XP GAIN:\n[[YELLOW]]Salvage is a child skill of Repair and Fishing, your Salvage\n[[YELLOW]]skill level is based on your Fishing and Repair skill levels. -Guides.Salvage.Section.1=[[DARK_AQUA]]How can I use Salvage?\n[[YELLOW]]Place down a mcMMO Salvage Anvil and right-click to salvage\n[[YELLOW]]the item you're currently holding. This will break apart the item,\n[[YELLOW]]and give back materials used to craft the item.\n\n[[YELLOW]]For example, salvaging an iron pickaxe will give you iron bars. -Guides.Salvage.Section.2=[[DARK_AQUA]]How does Advanced Salvage work?\n[[YELLOW]]When unlocked, this ability allows you to salvage damaged items.\n[[YELLOW]]The yield percentage increases as you level up. A higher yield\n[[YELLOW]]means that you can get more materials back.\n[[YELLOW]]With advanced salvage you will always get 1 material back,\n[[YELLOW]]unless the item is too damaged. So you don't have to worry\n[[YELLOW]]about destroying items without getting anything in return. -Guides.Salvage.Section.3=[[DARK_AQUA]]To illustrate how this works, here's an example:\n[[YELLOW]]Let's say we salvage a gold pickaxe which is damaged for 20%,\n[[YELLOW]]this means that the maximum amount you could get is only 2\n[[YELLOW]](because the pick is crafted with 3 ingots - each worth\n[[YELLOW]]33,33% durability) which is equal to 66%. If your yield\n[[YELLOW]]percentage is below 66% you are not able to get 2 ingots.\n[[YELLOW]]If it is above this value you are able to gain the "full amount",\n[[YELLOW]]which means that you will get 2 ingots. -Guides.Salvage.Section.4=[[DARK_AQUA]]How does Arcane Salvage work?\n[[YELLOW]]This ability allows you to get enchanted books when salvaging\n[[YELLOW]]enchanted items. Depending on your level the chance of\n[[YELLOW]]successfully extracting a full or partial enchantment varies.\n\n[[YELLOW]]When an enchantment is partially extracted, the enchantment\n[[YELLOW]]book will have a lower level enchantment compared to what\n[[YELLOW]]it was on the item. +Guides.Salvage.Section.0=&3Apie Gelbėjimą:\n&eGelbėjimo įgūdis leidžia naudoti aukso bloką kad išardyti šarvus ir\n&eįrankius.\n\n&3XP GAVIMAS:\n&eGelbėjimas yra dukterinis įgūdis iš Taisymo ir Žvejojimo. Jūsų Gelbėjimo\n&eįgūdžio lygis priklauso nuo jūsų Žvejybos ir Taisymo įgūdžių lygių. +Guides.Salvage.Section.1=&3Kaip naudoti Gelbėjimą?\n&ePadėkite mcMMO Gelbėjimo priekalą ir paspauskite dešinį pelės klavišą kad išardyti\n&edaiktą kurį laikote rankoje. Tai išardys laikytą daiktą,,\n&eir grąžins medžiagas iš kurių jis buvo pagamintas.\n\n&ePVZ, išardant geležinį kirtiklį, jums gražins geležies luitų. +Guides.Salvage.Section.2=&3Kaip veikia Pažengęs Gelbėjimas?\n&eKai atrakinta, ši galia leidžia išsaugoti sugadintus daiktus.\n&eATgautų daiktų kiekis didėja kartu su lygiu. Didesnis atgavimas reiškia\n&ekad atgaunate daugiau medžiagų.\n&eSu Pažengusiu Gelbėjimu jūs visada atgausite 1 daiktą atgal,\n&enebent tas daiktas yra per daug sugadintas. Todėl jūs neturite pergyventi,\n&ekad išmetate daiktus nieko neatgaunant atgal. +Guides.Salvage.Section.3=&3Kad parodyti kaip tai veikia, štai pavyzdys:\n&eSakykime kad jūs išardėte auksinį kirtiklį kuris buvo apgadintas 20%,\n&etai reiškia, kad maksimalus aukso kiekis kuri galite atgauti yra tik 2\n&e(nes auksinis kirtiklis gaminamas iš 3 luitų - kiekvieno vertė\n&e33,33% atsparumo) kas lygu 66%. Jei atgavimo\n&eprocentas yra mažesnis nei 66% jūs negalite atgauti 2 luitų.\n&eJei jis yra virš šio skaičiaus,galite atgauti "pilną kiekį",\n&ekas reikštų, kad atgautumėte 2 luitus. +Guides.Salvage.Section.4=&3Kaip veikia Arkaniškas Gelbėjimas?\n&eŠi galia jums leidžia atgauti kerėjimo knygų kai išardote\n&ekerėtus daiktus. Priklausomai nuo jūsų lygio, yra tam tikras šansas\n&epilnai arba dalinai atgauti kerėjimus.\n\n&eKai kerėjimas yra dalinai atgaunamas, kerėjimo\n&eknyga bus žemesnio lygio lyginant\n&ekoks jis buvo uždėtas ant daikto. ##Smelting -Guides.Smelting.Section.0=Coming soon... +Guides.Smelting.Section.0=Bus Greitai... ##Swords -Guides.Swords.Section.0=[[DARK_AQUA]]About Swords:\n[[YELLOW]]This skill awards combat bonuses to anyone fighting with a\n[[YELLOW]]sword.\n\n[[DARK_AQUA]]XP GAIN:\n[[YELLOW]]XP is gained based on the amount of damage dealt to mobs or \n[[YELLOW]]other players when wielding a sword. -Guides.Swords.Section.1=[[DARK_AQUA]]How does Serrated Strikes work?\n[[YELLOW]]Serrated Strikes is an active ability, you can activate it by\n[[YELLOW]]right-clicking with a sword. This ability allows you to deal \n[[YELLOW]]an AoE (Area of Effect) hit. This AoE will do a bonus 25%\n[[YELLOW]]damage and will inflict a bleed effect that lasts for 5 ticks. -Guides.Swords.Section.2=[[DARK_AQUA]]How does Counter Attack work?\n[[YELLOW]]Counter Attack is an active ability. When blocking and taking\n[[YELLOW]]hits from mobs, you will have a chance to reflect 50% of \n[[YELLOW]]the damage that was taken. -Guides.Swords.Section.3=[[DARK_AQUA]]How does Rupture work?\n[[YELLOW]]Rupture causes enemies to take damage every two seconds. The \n[[YELLOW]]target will bleed until the effect wears off, or death, \n[[YELLOW]]whichever comes first.\n[[YELLOW]]The duration of the bleed is increased by your sword skill. +Guides.Swords.Section.0=&3Apie Kardus:\n&eŠis įgūdis duoda jums kovos bonusų kovojant su betkuo, naudojant a\n&ekardą.\n\n&3XP GAVIMAS:\n&eXP yra gaunamas priklausomai nuo to, kiek žąlos jūs padarote monstrams arba \n&ekitiems žaidėjams kai laikote rankose kardą. +Guides.Swords.Section.1=&3Kaip veikia Dantuotos Atakos?\n&eDantuotos Atakos yra aktyvi galia, kurią galima aktyvuoti\n&espaudžiant dešinį pelės klavišą turint kardą. Ši galia jums leis daryti \n&eataką zonoje. Šioje zonoje bus daroma papildoma 25%\n&ežąla ir būs priešams suteikiamas kraujavimo efektas kuris truks 5 tikus. +Guides.Swords.Section.2=&3Kaip veikia Kontrataka?\n&eKontrataka yra aktyvi galia. Kai blokuojate ir gaunate\n&ežalos iš monstrų, jūs turėsite šansą grąžinti 50% visos \n&ejums padarytos žąlos. +Guides.Swords.Section.3=&3Kaip veikia Pradūrimas?\n&ePradūrimas priverčia priešus gauti žąlos kas dvi sekundes. \n&eTaikinys kraujuos kol baigsis efektas arba mirs, \n&ekuris bus pirmas.\n&eKraujavimo laikotarpis didėja kuo aukštesnis jūsų Kardo Valdymo Įgūdis. ##Taming -Guides.Taming.Section.0=[[DARK_AQUA]]About Taming:\n[[YELLOW]]Taming will give players various combat bonuses when using\n[[YELLOW]]tamed wolves.\n\n[[DARK_AQUA]]XP GAIN:\n[[YELLOW]]To gain XP in this skill, you need to tame wolves/ocelots or\n[[YELLOW]]get into combat with your wolves. -Guides.Taming.Section.1=[[DARK_AQUA]]How does Call of the Wild work?\n[[YELLOW]]Call of the Wild is an active ability that will allow you to summon\n[[YELLOW]]a wolf or an ocelot by your side. You can do this by\n[[YELLOW]]sneaking + left-clicking while holding bones or fish. -Guides.Taming.Section.2=[[DARK_AQUA]]How does Beast Lore work?\n[[YELLOW]]Beast Lore allows players to inspect pets and to check the\n[[YELLOW]]stats of wolves and ocelots. Left-click a wolf or ocelot to use\n[[YELLOW]]Beast Lore. -Guides.Taming.Section.3=[[DARK_AQUA]]How does Gore work?\n[[YELLOW]]Gore is a passive ability that has a chance of inflicting a\n[[YELLOW]]bleeding effect on your wolves' targets. -Guides.Taming.Section.4=[[DARK_AQUA]]How does Sharpened Claws work?\n[[YELLOW]]Sharpened Claws provides a damage bonus to damage dealt\n[[YELLOW]]by wolves. The damage bonus depends on your Taming level. -Guides.Taming.Section.5=[[DARK_AQUA]]How does Environmentally Aware work?\n[[YELLOW]]This passive ability will allow wolves to teleport to you when\n[[YELLOW]]they get near hazards, such as Cacti/Lava. It will also give\n[[YELLOW]]wolves fall damage immunity. -Guides.Taming.Section.6=[[DARK_AQUA]]How does Thick Fur work?\n[[YELLOW]]This passive ability will reduce damage and make wolves\n[[YELLOW]]fire resistant. -Guides.Taming.Section.7=[[DARK_AQUA]]How does Shock Proof work?\n[[YELLOW]]This passive ability reduces damage done to wolves\n[[YELLOW]]from explosions. -Guides.Taming.Section.8=[[DARK_AQUA]]How does Fast Food Service work?\n[[YELLOW]]This passive ability gives wolves a chance to heal whenever\n[[YELLOW]]they perform an attack. +Guides.Taming.Section.0=&3Apie Prijaukinimą:\n&ePrijaukinimas duoda įvairiausių kovos bonusų naudojant\n&eprijaukintus vilkus.\n\n&3XP GAVIMAS:\n&eKad gauti XP šiame įgūdyje, jums reikia prijaukinti vilkus/ocelotus arba\n&eįžengti į kovą kartu su savo vilkais. +Guides.Taming.Section.1=&3Kaip veikia Laukinio Pašaukimas?\n&eLaukinio Pašaukimas yra aktyvi galia kuri leidžia iškviesti\n&evilką arba ocelotą greta jūsų. Jūs tai galite atlikti\n&esėlinant + kairys-pelės mygtukas laikant kaulą arba žuvį. +Guides.Taming.Section.2=&3Kaip veikia Žvėries Apibendrinimas?\n&eŽvėries Apibendrinimas apžiūrės jūsų gyvuną\n&eir parodys jo specifikacijas. Paspauskite kairį-pelės klavišą ant vilko arba oceloto,\n&e kad panaudoti Žvėries Apibendrinimą. +Guides.Taming.Section.3=&3Kaip veikia Plėšimas?\n&ePlėšimas yra pasyvi galia kuri turi šansą suduoti\n&ekraujuojantį efektą jūsų vilko taikiniui. +Guides.Taming.Section.4=&3Kaip veikia Pagaląsti Nagai?\n&ePagaląsti Nagai duoda papildomos žąlos\n&evilkams. Papildoma žąla priklauso nuo jūsų Prijaukinimo įgūdžio lygio. +Guides.Taming.Section.5=&3Kaip veikia Aplinkos Sąmoningumas?\n&eŠi pasyvi galia leidžia jūsų vilkams atsirasti prie jūsų\n&ekai jie pakliūna į pavojų, kaip kaktusai/lava. Tai taip pad duoda\n&ejiems kritimo žąlos imunitetą. +Guides.Taming.Section.6=&3Kaip veikia Storas Kailis?\n&eŠi pasyvi galia sumažina vilkams daromą žąlą ir padaro vilkus\n&eatsparius ugniai. +Guides.Taming.Section.7=&3Kaip veikia Smūgio Atsparumas?\n&eŠi pasyvi galia sumažina vilkams daroma žalą\n&enuo sprogimų. +Guides.Taming.Section.8=&3Kaip veikia Greito Maisto Paslauga?\n&eŠi pasyvi galia duoda šansą vilkams pasigydyti kai\n&ejie įkanda priešininkui. ##Unarmed -Guides.Unarmed.Section.0=[[DARK_AQUA]]About Unarmed:\n[[YELLOW]]Unarmed will give players various combat bonuses when using\n[[YELLOW]]your fists as a weapon. \n\n[[DARK_AQUA]]XP GAIN:\n[[YELLOW]]XP is gained based on the amount of damage dealt to mobs \n[[YELLOW]]or other players when unarmed. -Guides.Unarmed.Section.1=[[DARK_AQUA]]How does Berserk work?\n[[YELLOW]]Beserk is an active ability that is activated by\n[[YELLOW]]right-clicking. While in Beserk mode, you deal 50% more\n[[YELLOW]]damage and you can break weak materials instantly, such as\n[[YELLOW]]Dirt and Grass. -Guides.Unarmed.Section.2=[[DARK_AQUA]]How does Iron Arm work?\n[[YELLOW]]Iron Arm increases the damage dealt when hitting mobs or\n[[YELLOW]]players with your fists. -Guides.Unarmed.Section.3=[[DARK_AQUA]]How does Arrow Deflect work?\n[[YELLOW]]Arrow Deflect is a passive ability that gives you a chance\n[[YELLOW]]to deflect arrows shot by Skeletons or other players.\n[[YELLOW]]The arrow will fall harmlessly to the ground. -Guides.Unarmed.Section.4=[[DARK_AQUA]]How does Iron Grip work?\n[[YELLOW]]Iron Grip is a passive ability that counters disarm. As your\n[[YELLOW]]unarmed level increases, the chance of preventing a disarm increases. -Guides.Unarmed.Section.5=[[DARK_AQUA]]How does Disarm work?\n[[YELLOW]]This passive ability allows players to disarm other players,\n[[YELLOW]]causing the target's equipped item to fall to the ground. +Guides.Unarmed.Section.0=&3Apie Beginklę kovą:\n&eKovojant su kumščiais jums yra duodama įvairiausių\n&ekovos bonusų. \n\n&3XP GAVIMAS:\n&eXP yra duodamas priklausomai nuo to kiek padarote žąlos monstrams \n&earba žaidėjams plikomis rankomis. +Guides.Unarmed.Section.1=&3Kaip veikia Įtūžimas?\n&eĮtūžimas yra aktyvi galia kuri yra aktyvuojama\n&espaudžiant dešinį pelės klavišą. Kol esate įtūžę, darote 50% daugiau\n&ežąlos ir galite staigiai sulaužyti silpnus blokus, pvz. kaip\n&ePurvas arba Stiklas. +Guides.Unarmed.Section.2=&3Kaip veikia Geležinių Rankų Stilius?\n&eGeležinių Rankų Stilius didina daromą žąlą kai trankote monstrus arba\n&ežaidėjus plikomis rankomis. +Guides.Unarmed.Section.3=&3Kaip veikia Strėlių Nukreipimas?\n&eStrėlių Nukreipimas yra pasyvi galia kuri duoda šansą\n&enukreipti strėles iššautas monstrų ar kitų žaidėjų.\n&eStrėlė nukrenta ant žemės be pavojaus. +Guides.Unarmed.Section.4=&3Kaip veikia Geležinis Sugriebimas?\n&eGeležinis Sugriebimas yra pasyvi galia kuri kontratakuoja nuginklavimą. Kai kyla Beginklės\n&ekovos įgūdis, didėja šansas neleisti jums būti nuginkluotam. +Guides.Unarmed.Section.5=&3Kaip veikia Nuginklavimas?\n&eŠi pasyvi galia jums leidžia nuginkluoti jūsų priešininkus,\n&epriverčiant priešininkų daiktus nukristi ant žemės. ##Woodcutting -Guides.Woodcutting.Section.0=[[DARK_AQUA]]About Woodcutting:\n[[YELLOW]]Woodcutting is all about chopping down trees.\n\n[[DARK_AQUA]]XP GAIN:\n[[YELLOW]]XP is gained whenever you break log blocks. -Guides.Woodcutting.Section.1=[[DARK_AQUA]]How does Tree Feller work?\n[[YELLOW]]Tree Feller is an active ability, you can right-click\n[[YELLOW]]while holding an ax to activate Tree Feller. This will\n[[YELLOW]]cause the entire tree to break instantly, dropping all\n[[YELLOW]]of its logs at once. -Guides.Woodcutting.Section.2=[[DARK_AQUA]]How does Leaf Blower work?\n[[YELLOW]]Leaf Blower is a passive ability that will cause leaf\n[[YELLOW]]blocks to break instantly when hit with an axe. By default,\n[[YELLOW]]this ability unlocks at level 100. -Guides.Woodcutting.Section.3=[[DARK_AQUA]]How do Double Drops work?\n[[YELLOW]]This passive ability gives you a chance to obtain an extra\n[[YELLOW]]block for every log you chop. +Guides.Woodcutting.Section.0=&3Apie Medkirtystę:\n&eMedkirtystė yra vien apie medžių kirtimą.\n\n&3XP GAVIMAS:\n&eXP gaunate bet kada kai iškertate medieną. +Guides.Woodcutting.Section.1=&3Kaip veikia Medžių Kirtėjas?\n&eMedžių Kirtėjas yra aktyvi galia, kurią aktyvuoti reikia paspaudžiant\n&edešinį pelės klavišą laikant kirvį rankose. Tai privers medžius\n&ebūti visiškai nukirstais iš karto, numetant\n&evisas jo malkas vienu metu. +Guides.Woodcutting.Section.2=&3Kaip veikia Lapų Pūtėjas?\n&eLapų Pūtėjas yra pasyvi galia kuri privers lapus\n&enukristi iš karto kai bus paliesti jūsų kirvio. Pagal numatytuosius nustatymus,\n&eši galia atsirakina ties 100 įgūdžio lygiu. +Guides.Woodcutting.Section.3=&3Kaip veikia Dvigubas Laimikis?\n&eTai yra pasyvi galia kuri duoda papildomos\n&emedienos iškertant kiekvieną medžio bloką. #INSPECT -Inspect.Offline= [[RED]]Apgailestaujame, tačiau atsijungusių žaidėjų patikrinimui neturi atitinkamo leidimo! -Inspect.OfflineStats=mcMMO Atsijungusių žaidėjų Įgūdžių Informacija [[YELLOW]]{0} -Inspect.Stats=[[GREEN]]mcMMO Įgūdžių Informacija: [[YELLOW]]{0} +Inspect.Offline= &cApgailestaujame, tačiau atsijungusių žaidėjų patikrinimui neturi atitinkamo leidimo! +Inspect.OfflineStats=mcMMO Atsijungusių žaidėjų Įgūdžių Informacija &e{0} +Inspect.Stats=&amcMMO Įgūdžių Informacija: &e{0} Inspect.TooFar=Atrodo, jog esate per toli nuo, Jūsų tikrinamo žaidėjo! #ITEMS -Item.ChimaeraWing.Fail=[[RED]]**CHIMAERA WING FAILED!** -Item.ChimaeraWing.Pass=**CHIMAERA WING** -Item.ChimaeraWing.Name=Chimaera Wing -Item.ChimaeraWing.Lore=[[GRAY]]Teleports you to your bed. -Item.ChimaeraWing.NotEnough=You need [[YELLOW]]{0}[[RED]] more [[GOLD]]{1}[[RED]]! -Item.NotEnough=You need [[YELLOW]]{0}[[RED]] more [[GOLD]]{1}[[RED]]! -Item.Generic.Wait=You need to wait before you can use this again! [[YELLOW]]({0}s) -Item.Injured.Wait=You were injured recently and must wait to use this. [[YELLOW]]({0}s) -Item.FluxPickaxe.Name=Flux Pickaxe -Item.FluxPickaxe.Lore.1=[[GRAY]]Has a chance of instantly smelting ores. -Item.FluxPickaxe.Lore.2=[[GRAY]]Requires Smelting level {0}+ +Item.ChimaeraWing.Fail=&c**CHIMEROS SPARNAS NEPASISEKĖ!** +Item.ChimaeraWing.Pass=**CHIMEROS SPARNAS** +Item.ChimaeraWing.Name=Chimeros Sparnas +Item.ChimaeraWing.Lore=&7Nuteleportuoja jus prie jūsų lovos. +Item.ChimaeraWing.NotEnough=Jums reikia &e{0}&c daugiau &6{1}&c! +Item.NotEnough=Jums reikia &e{0}&c daugiau &6{1}&c! +Item.Generic.Wait=Jums reikia palaukti kol vėl galėsite tai naudoti! &e({0}s) +Item.Injured.Wait=Jūs neseniai buvote sužeistas, todėl reikia palaukti prieš naudojant. &e({0}s) +Item.FluxPickaxe.Name=Fliuso Kirtiklis +Item.FluxPickaxe.Lore.1=&7Turi Šansą iš karto išlydyti iškasenas. +Item.FluxPickaxe.Lore.2=&7Reikia Kepimo įgūdžio lygio {0}+ #TELEPORTATION -Teleport.Commencing=[[GRAY]]Perkėlimas už: [[GOLD]]({0}) [[GRAY]]s., prašome nejudėti... -Teleport.Cancelled=[[DARK_RED]]Perkėlimas atmestas! +Teleport.Commencing=&7Perkėlimas už: &6({0}) &7s., prašome nejudėti... +Teleport.Cancelled=&4Perkėlimas atmestas! #SKILLS -Skills.Child=[[GOLD]](CHILD SKILL) -Skills.Disarmed=[[DARK_RED]]You have been disarmed! -Skills.Header=-----[] [[GREEN]]{0}[[RED]] []----- -Skills.NeedMore=[[DARK_RED]]You need more [[GRAY]]{0} -Skills.NeedMore.Extra=[[DARK_RED]]You need more [[GRAY]]{0}{1} -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.MaxXP=Max -Skills.TooTired=You are too tired to use that ability again. [[YELLOW]]({0}s) -Skills.Cancelled=[[GOLD]]{0} [[RED]]cancelled! -Skills.ConfirmOrCancel=[[GREEN]]Right-click again to confirm [[GOLD]]{0}[[GREEN]]. Left-click to cancel. -Skills.AbilityGateRequirementFail=[[GRAY]]You require [[YELLOW]]{0}[[GRAY]] more levels of [[DARK_AQUA]]{1}[[GRAY]] to use this super ability. +Skills.Child=&6(DUKTERINIS ĮGŪDIS) +Skills.Disarmed=&4Jūs buvote nuginkluotas! +Skills.Header=-----[] &a{0}&c []----- +Skills.NeedMore=&4Jums reikia daugiau &7{0} +Skills.NeedMore.Extra=&4Jums reikia daugiau &7{0}{1} +Skills.Parents= TĖVAI +Skills.Stats={0}&a{1}&3 XP(&7{2}&3/&7{3}&3) +Skills.ChildStats={0}&a{1} +Skills.MaxXP=Maks. +Skills.TooTired=Jūs esate per daug pavargęs, kad vėl naudotumėte šią galią. &e({0}s) +Skills.Cancelled=&6{0} &catšaukta! +Skills.ConfirmOrCancel=&aPaspauskite dešinį pelės mygtuką, kad patvirtinti &6{0}&a. kairį, kad atšaukti. +Skills.AbilityGateRequirementFail=&7Jums reikia &e{0}&7 daugiau lygių, &3{1}&7 kad naudoti šią super galią. #STATISTICS -Stats.Header.Combat=[[GOLD]]-=KOVOS ĮGŪDŽIAI=- -Stats.Header.Gathering=[[GOLD]]-=GATHERING SKILLS=- -Stats.Header.Misc=[[GOLD]]-=ĮVAIRŪS ĮGŪDŽIAI=- -Stats.Own.Stats=[[GREEN]][mcMMO] Informacija +Stats.Header.Combat=&6-=KOVOS ĮGŪDŽIAI=- +Stats.Header.Gathering=&6-=RINKIMO ĮGŪDŽIAI=- +Stats.Header.Misc=&6-=ĮVAIRŪS ĮGŪDŽIAI=- +Stats.Own.Stats=&a[mcMMO] Informacija #PERKS -Perks.XP.Name=Experience -Perks.XP.Desc=Receive boosted XP in certain skills. -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) +Perks.XP.Name=Patirtis +Perks.XP.Desc=Gaukite daugiau XP tam tikruose įgūdžiuose. +Perks.Lucky.Name=Sėkmė +Perks.Lucky.Desc=Duoda {0} galioms ir įgūdžiams 33.3% geresnį šansą aktyvuotis. +Perks.Lucky.Desc.Login=Duoda tam tikriems įgūdžiams ir galioms 33.3% geresnį šansą aktyvuotis. +Perks.Lucky.Bonus=&6 ({0} su sėkmės privalumu) +Perks.Cooldowns.Name=Greitas Atsigavimas +Perks.Cooldowns.Desc=Sumažina Atsinaujinimo laiką {0}. +Perks.ActivationTime.Name=Ištvermė +Perks.ActivationTime.Desc=Padidina galios aktyvacijos laiką {0} sekundėmis. +Perks.ActivationTime.Bonus=&6 ({0}s su ištvermės privalumu) #HARDCORE -Hardcore.Mode.Disabled=[[GOLD]][mcMMO] Hardcore mode {0} disabled for {1}. -Hardcore.Mode.Enabled=[[GOLD]][mcMMO] Hardcore mode {0} enabled for {1}. -Hardcore.DeathStatLoss.Name=Skill Death Penalty -Hardcore.DeathStatLoss.PlayerDeath=[[GOLD]][mcMMO] [[DARK_RED]]You have lost [[BLUE]]{0}[[DARK_RED]] levels from death. -Hardcore.DeathStatLoss.PercentageChanged=[[GOLD]][mcMMO] The stat loss percentage was changed to {0}. -Hardcore.Vampirism.Name=Vampirism -Hardcore.Vampirism.Killer.Failure=[[GOLD]][mcMMO] [[YELLOW]]{0}[[GRAY]] was too unskilled to grant you any knowledge. -Hardcore.Vampirism.Killer.Success=[[GOLD]][mcMMO] [[DARK_AQUA]]You have stolen [[BLUE]]{0}[[DARK_AQUA]] levels from [[YELLOW]]{1}. -Hardcore.Vampirism.Victim.Failure=[[GOLD]][mcMMO] [[YELLOW]]{0}[[GRAY]] was unable to steal knowledge from you! -Hardcore.Vampirism.Victim.Success=[[GOLD]][mcMMO] [[YELLOW]]{0}[[DARK_RED]] has stolen [[BLUE]]{1}[[DARK_RED]] levels from you! -Hardcore.Vampirism.PercentageChanged=[[GOLD]][mcMMO] The stat leech percentage was changed to {0}. +Hardcore.Mode.Disabled=&6[mcMMO] Sunkus rėžimas {0} išjungtas {1}. +Hardcore.Mode.Enabled=&6[mcMMO] Sunkus rėžimas {0} įjungtas {1}. +Hardcore.DeathStatLoss.Name=Įgūdžio Mirties Nuobauda +Hardcore.DeathStatLoss.PlayerDeath=&6[mcMMO] &4Jūs praradote &9{0}&4 lygių po mirties. +Hardcore.DeathStatLoss.PercentageChanged=&6[mcMMO] Lygių praradimo procentas buvo pakeistas į {0}. +Hardcore.Vampirism.Name=Vampirizmas +Hardcore.Vampirism.Killer.Failure=&6[mcMMO] &e{0}&7 buvo per daug negabus suteikti jums žinių. +Hardcore.Vampirism.Killer.Success=&6[mcMMO] &3Jūs pavogėte &9{0}&3 lygių iš &e{1}. +Hardcore.Vampirism.Victim.Failure=&6[mcMMO] &e{0}&7 nebuvo pakankamai gabus pavogti iš jūsų žinių! +Hardcore.Vampirism.Victim.Success=&6[mcMMO] &e{0}&4 pavogė &9{1}&4 lygius iš jūsų! +Hardcore.Vampirism.PercentageChanged=&6[mcMMO] Lygių siurbimo procentas buvo pakeistas į {0}. #MOTD -MOTD.Donate=[[DARK_AQUA]]Donation Info: -MOTD.Hardcore.Enabled=[[GOLD]][mcMMO] [[DARK_AQUA]]Sunkusis rėžimas aktyvuotas: [[DARK_RED]]{0} -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=[[GOLD]][mcMMO Perks] -MOTD.Version=[[GOLD]][mcMMO] Naudojama sisteminė versija [[DARK_AQUA]]{0} -MOTD.Website=[[GOLD]][mcMMO] [[GREEN]]{0}[[YELLOW]] - mcMMO projekto tinklalapis +MOTD.Donate=&3Donorystės Informacija: +MOTD.Hardcore.Enabled=&6[mcMMO] &3Sunkusis rėžimas aktyvuotas: &4{0} +MOTD.Hardcore.DeathStatLoss.Stats=&6[mcMMO] &3Įgūdžių mirties nuobauda: &4{0}% +MOTD.Hardcore.Vampirism.Stats=&6[mcMMO] &3Vampirizmo Lygių Siurbimas: &4{0}% +MOTD.PerksPrefix=&6[mcMMO Privalumai] +MOTD.Version=&6[mcMMO] Naudojama sisteminė versija &3{0} +MOTD.Website=&6[mcMMO] &a{0}&e - mcMMO projekto tinklalapis #SMELTING -Smelting.SubSkill.UnderstandingTheArt.Name=Understanding The Art -Smelting.SubSkill.UnderstandingTheArt.Description=Maybe you're spending a bit too much time smelting in the caves.\nPowers up various properties of Smelting. -Smelting.SubSkill.UnderstandingTheArt.Stat=Vanilla XP Multiplier: [[YELLOW]]{0}x -Smelting.Ability.Locked.0=LOCKED UNTIL {0}+ SKILL (VANILLA XP BOOST) -Smelting.Ability.Locked.1=LOCKED UNTIL {0}+ SKILL (FLUX MINING) -Smelting.SubSkill.FuelEfficiency.Name=Fuel Efficiency -Smelting.SubSkill.FuelEfficiency.Description=Increase the burn time of fuel used in furnaces when smelting -Smelting.SubSkill.FuelEfficiency.Stat=Fuel Efficiency Multiplier: [[YELLOW]]{0}x -Smelting.SubSkill.SecondSmelt.Name=Second Smelt -Smelting.SubSkill.SecondSmelt.Description=Double the resources gained from smelting -Smelting.SubSkill.SecondSmelt.Stat=Second Smelt Chance -Smelting.Effect.4=Vanilla XP Boost -Smelting.Effect.5=Increase vanilla XP gained while smelting -Smelting.SubSkill.FluxMining.Name=Flux Mining -Smelting.SubSkill.FluxMining.Description=Chance for ores to be instantly smelted while mining -Smelting.SubSkill.FluxMining.Stat=Flux Mining Chance -Smelting.Listener=Smelting: +Smelting.SubSkill.UnderstandingTheArt.Name=Meno Supratimas +Smelting.SubSkill.UnderstandingTheArt.Description=Galbūt jūs praleidžiate per daug laiko kepant urvuose..\nPowers up various properties of Smelting. +Smelting.SubSkill.UnderstandingTheArt.Stat=Numatytasis XP Daugiklis: &e{0}x +Smelting.Ability.Locked.0=UŽRAKINTAS IKI {0}+ LYGIO (PAPRASTAS XP PADIDINIMAS) +Smelting.Ability.Locked.1=UŽRAKINTAS IKI {0}+ LYGIO (FLIUSO KASINĖJIMAS) +Smelting.SubSkill.FuelEfficiency.Name=Kuro Naudingumas +Smelting.SubSkill.FuelEfficiency.Description=Padidina degimo laiką naudojamo kuro kai kepate +Smelting.SubSkill.FuelEfficiency.Stat=Kuro Naudingumo Daugiklis: &e{0}x +Smelting.SubSkill.SecondSmelt.Name=Antrinis Kepimas +Smelting.SubSkill.SecondSmelt.Description=Dvigubi gaunami resurstai kepant +Smelting.SubSkill.SecondSmelt.Stat=Antrinio Kepimo Šansas +Smelting.Effect.4=Paprastas XP Padininimas +Smelting.Effect.5=Padidina paprasto XP gavimą kepant +Smelting.SubSkill.FluxMining.Name=Fliuso Kasimas +Smelting.SubSkill.FluxMining.Description=Šansas naudingom iškasenom iškepti juos bekasant +Smelting.SubSkill.FluxMining.Stat=Fliuso Kasimo Šansas +Smelting.Listener=Kepimas: Smelting.SkillName=SMELTING #COMMAND DESCRIPTIONS -Commands.Description.addlevels=Add mcMMO levels to a user -Commands.Description.adminchat=Toggle mcMMO admin chat on/off or send admin chat messages -Commands.Description.addxp=Add mcMMO XP to a user -Commands.Description.hardcore=Modify the mcMMO hardcore percentage or toggle hardcore mode on/off -Commands.Description.inspect=View detailed mcMMO info on another player -Commands.Description.mcability=Toggle mcMMO abilities being readied on right-click on/off -Commands.Description.mccooldown=View all of the mcMMO ability cooldowns -Commands.Description.mcchatspy=Toggle mcMMO party chat spying on or off -Commands.Description.mcgod=Toggle mcMMO god-mode on/off -Commands.Description.mchud=Change your mcMMO HUD style -Commands.Description.mcmmo=Show a brief description of mcMMO -Commands.Description.mcnotify=Toggle mcMMO abilities chat display notifications on/off -Commands.Description.mcpurge=Purge users with no mcMMO levels and users who have not connected in over {0} months from the mcMMO database. -Commands.Description.mcrank=Show mcMMO ranking for a player -Commands.Description.mcrefresh=Refresh all cooldowns for mcMMO -Commands.Description.mcremove=Remove a user from the mcMMO database -Commands.Description.mcscoreboard=Manage your mcMMO Scoreboard -Commands.Description.mcstats=Show your mcMMO levels and XP -Commands.Description.mctop=Show mcMMO leader boards -Commands.Description.mmoedit=Edit mcMMO levels for a user -Commands.Description.mmodebug=Toggle a debug mode which prints useful information when you hit blocks -Commands.Description.mmoupdate=Migrate mcMMO database from an old database into the current one -Commands.Description.mcconvert=Converts database types or experience formula types -Commands.Description.mmoshowdb=Show the name of the current database type (for later use with /mmoupdate) -Commands.Description.party=Control various mcMMO party settings -Commands.Description.partychat=Toggle mcMMO party chat on/off or send party chat messages -Commands.Description.ptp=Teleport to an mcMMO party member -Commands.Description.Skill=Display detailed mcMMO skill info for {0} -Commands.Description.skillreset=Reset mcMMO levels for a user -Commands.Description.vampirism=Modify the mcMMO vampirism percentage or toggle vampirism mode on/off -Commands.Description.xplock=Lock your mcMMO XP bar to a specific mcMMO skill -Commands.Description.xprate=Modify the mcMMO XP rate or start an mcMMO XP event +Commands.Description.addlevels=Pridėti mcMMO lygį prie žaidėjo +Commands.Description.adminchat=Jungti mcMMO adminų bendravimą on/off arba išsiūsti administracijai žinutę +Commands.Description.addxp=Pridėti mcMMO XP žaidėjui +Commands.Description.hardcore=Modifikuoti mcMMO sunkaus rėžimo procentą arba jungti rėžimą on/off +Commands.Description.inspect=Pažiųrėti detalizuotą mcMMO informaciją apie kitą žaidėją +Commands.Description.mcability=Jungti mcMMO galių paruošimą su dežiniu pelės klavišu on/off +Commands.Description.mccooldown=Peržiūrėti visus mcMMO galių laikus +Commands.Description.mcchatspy=Jungti mcMMO partijos bendravimo šnipinėjimą on/off +Commands.Description.mcgod=Jungti mcMMO dievo rėžimą on/off +Commands.Description.mchud=Pakeisti jūsų mcMMO HUD stilių +Commands.Description.mcmmo=Parodyti trumpą apibendrinimą apie mcMMO +Commands.Description.mcnotify=Jungti mcMMO galių parodyma pokalbyje on/off +Commands.Description.mcpurge=Išnaikinti žaidėjus be mcMMO lygių ir žaidėjus kurie nebuvo prisijungę jau {0} mėnesių prie mcMMO duom. bazės. +Commands.Description.mcrank=Rodyti mcMMO žaidėjo ranką +Commands.Description.mcrefresh=Atnaujinti visus galių laikus mcMMO +Commands.Description.mcremove=Pašalinti žaidėja iš mcMMO duom. bazės +Commands.Description.mcscoreboard=Tvarkyti jūsų mcMMO rezultatų suvestinę +Commands.Description.mcstats=Rodyti jūsų mcMMO lygius ir XP +Commands.Description.mctop=Rodyti mcMMO lyderių suvestines +Commands.Description.mmoedit=Redaguoti mcMMO lygius žaidėjui +Commands.Description.mmodebug=Jungti debug rėžimą kuris rodo naudingą informaciją kai trenkiate į blokus +Commands.Description.mmoupdate=Migruoti mcMMO duom. bazę iš senos duom. bazės į dabartinę +Commands.Description.mcconvert=Pakeičia duom. bazės tipus ir XP formulės tipus +Commands.Description.mmoshowdb=Rodo dabartinį duom. bazės tipą (vėlesniam naudojimui su /mmoupdate) +Commands.Description.party=Kontroliuoja įvairius mcMMO partijos nustatymus +Commands.Description.partychat=Jungia mcMMO partijos pokalbį on/off arba išsiunčia žinutę partijai +Commands.Description.ptp=Nuteleportuoja iki mcMMO partijos nario +Commands.Description.Skill=Parodo detalią mcMMO įgūdžio informacija apie {0} +Commands.Description.skillreset=Restartuoti mcMMO lygius žaidėjui +Commands.Description.vampirism=Modifikuoti mcMMO vampirizmo procentą arba jungti vampirizmo rėžimą on/off +Commands.Description.xplock=Užrakinti tam tikrą mcMMO XP juostą tam tikram mcMMO įgūdžiui +Commands.Description.xprate=Modifikuoti mcMMO XP reitingus arba pradėti mcMMO XP šventę #UPDATE CHECKER UpdateChecker.Outdated=Nustatyta, jog šis serveris naudoja pasenusią mcMMO versiją! UpdateChecker.NewAvailable=Atnaujinimą galima parsisiūsti iš: spigotmc.org. #SCOREBOARD HEADERS -Scoreboard.Header.PlayerStats=[[YELLOW]]mcMMO Informacija -Scoreboard.Header.PlayerCooldowns=[[YELLOW]]mcMMO Cooldowns -Scoreboard.Header.PlayerRank=[[YELLOW]]mcMMO Rankinimas -Scoreboard.Header.PlayerInspect=[[YELLOW]]mcMMO Informacija: {0} -Scoreboard.Header.PowerLevel=[[RED]]Jėgos įgūdžių lygis -Scoreboard.Misc.PowerLevel=[[GOLD]]Jėgos įgūdžių lygis -Scoreboard.Misc.Level=[[DARK_AQUA]]Įgūdžių lygis -Scoreboard.Misc.CurrentXP=[[GREEN]]Įgūdžių patirties XP -Scoreboard.Misc.RemainingXP=[[YELLOW]]Reikiamas XP -Scoreboard.Misc.Cooldown=[[LIGHT_PURPLE]]Cooldown -Scoreboard.Misc.Overall=[[GOLD]]Overall -Scoreboard.Misc.Ability=Ability +Scoreboard.Header.PlayerStats=&emcMMO Informacija +Scoreboard.Header.PlayerCooldowns=&emcMMO Atsigavimai +Scoreboard.Header.PlayerRank=&emcMMO Rankinimas +Scoreboard.Header.PlayerInspect=&emcMMO Informacija: {0} +Scoreboard.Header.PowerLevel=&cJėgos įgūdžių lygis +Scoreboard.Misc.PowerLevel=&6Jėgos įgūdžių lygis +Scoreboard.Misc.Level=&3Įgūdžių lygis +Scoreboard.Misc.CurrentXP=&aĮgūdžių patirties XP +Scoreboard.Misc.RemainingXP=&eReikiamas XP +Scoreboard.Misc.Cooldown=&dAtsigavimas +Scoreboard.Misc.Overall=&6Bendrai +Scoreboard.Misc.Ability=Galia #DATABASE RECOVERY -Profile.PendingLoad=[[RED]]Your mcMMO player data has not yet been loaded. -Profile.Loading.Success=[[GREEN]]Your mcMMO profile has been loaded. -Profile.Loading.FailurePlayer=[[RED]]mcMMO is having trouble loading your data, we have attempted to load it [[GREEN]]{0}[[RED]] times.[[RED]] You may want to contact the server admins about this issue. mcMMO will attempt to load your data until you disconnect, you will not gain XP or be able to use skills while the data is not loaded. -Profile.Loading.FailureNotice=[[DARK_RED]][A][[RED]] mcMMO was unable to load the player data for [[YELLOW]]{0}[[RED]]. [[LIGHT_PURPLE]]Please inspect your database setup. Attempts made so far {1}. +Profile.PendingLoad=&cJūsų mcMMO žaidėjo informacija dar nebuvo užkrauta. +Profile.Loading.Success=&aJūsų mcMMO profilis buvo užkrautas. +Profile.Loading.FailurePlayer=&cmcMMO turi problemų kraunant jūsų duomenis, mes bandėme užkrauti jas &a{0}&c kart.&c Jums reiktu susisiekti su serverio administracija dėl šios problemos. mcMMO bandys užkrauti jūsų duomenis iki kol atsijungsite, jūs negausite XP ar galėsite naudoti įgūdžių kol duomenys nebus užkrauti. +Profile.Loading.FailureNotice=&4[A]&c mcMMO negalėjo užkrauti duomenų žaidėjui &e{0}&c. &dPrašome peržiūrėti duomenų bazės sąranką. Atlikti bandymai {1}. #Holiday -Holiday.AprilFools.Levelup=[[GOLD]]{0} dabartinis įgūdžių lygis [[GREEN]]{1}[[GREEN]]LvL[[GOLD]]! -Holiday.Anniversary=[[BLUE]]Happy {0} Year Anniversary!\n[[BLUE]]In honor of all of nossr50's work and all the devs, here's a firework show! +Holiday.AprilFools.Levelup=&6{0} dabartinis įgūdžių lygis &a{1}&aLvL&6! +Holiday.Anniversary=&9Laimingos {0} Sukakties!\n&9dėl nossr50 darbo ir visų kūrėjų, štai šiek tiek fejerverkų šou! #Reminder Messages -Reminder.Squelched=[[GRAY]]Reminder: You are currently not receiving notifications from mcMMO, to enable notifications please run the /mcnotify command again. This is an automated hourly reminder. +Reminder.Squelched=&7Priminimas: Jūs negaunate žinučių iš mcMMO, kad įjungti žinutes, prašome parašyti /mcnotify komandą. Tai yra automatinis valandinis priminimas. #Locale -Locale.Reloaded=[[GREEN]]Kalbos nustatymai atnaujinti! +Locale.Reloaded=&aKalbos nustatymai atnaujinti! #Player Leveling Stuff -LevelCap.PowerLevel=[[GOLD]]([[GREEN]]mcMMO[[GOLD]]) [[YELLOW]]You have reached the power level cap of [[RED]]{0}[[YELLOW]]. You will cease to level in skills from this point on. -LevelCap.Skill=[[GOLD]]([[GREEN]]mcMMO[[GOLD]]) [[YELLOW]]You have reached the level cap of [[RED]]{0}[[YELLOW]] for [[GOLD]]{1}[[YELLOW]]. You will cease to level in this skill from this point on. +LevelCap.PowerLevel=&6(&amcMMO&6) &eJūs pasiekete galios lygio viršų &c{0}&e. Jūs nustosite keltis lygi šiame įgūdyje nuo dabar. +LevelCap.Skill=&6(&amcMMO&6) &eJūs pasiekete įgūdžio viršų &c{0}&e iki &6{1}&e. Jūs nustosite keltis lygį nuo dabar. +Commands.XPBar.Usage=Tinkamas naudojimas yra /mmoxpbar +Commands.Description.mmoxpbar=Žaidėjų nustatymai mcMMO XP juostom +Commands.Description.mmocompat=Informacija apie mcMMO ir ar jis yra suderinamumo rėžime ar pilnai funkcionuojantis. +Compatibility.Layer.Unsupported=&6Palaikomumas &a{0}&6 nėra palaikomas šios minecraft versijos. +Compatibility.Layer.PartialSupport=&6Palaikomumas &a{0}&6 nėra pilnai palaikomas šios minecraft versijos. bet mcMMO yra aktyvavę antrą sistemą, kad simuliuotų funkcijas +Commands.XPBar.DisableAll=&6 Visos mcMMO XP juostos dabar yra išjungtos, norėdami atkurti numatytuosius nustatymus, naudokite /mmoxpbar reset +#Modern Chat Settings +Chat.Style.Admin=&b(A) &r{0} &b\u2192 &r{1} +Chat.Style.Party=&a(P) &r{0} &a\u2192 &r{1} +Chat.Style.Party.Leader=&a(P) &r{0} &6\u2192 &r{1} +Chat.Identity.Console=&6* Konsolė * +Chat.Channel.On=&6(&amcMMO-Chat&6) &eJūsų pokalbių žinutės dabar bus siunčiamos į &a{0}&e pokalbių kanalą. +Chat.Channel.Off=&6(&amcMMO-Chat&6) &7Jūsų pokalbių žinutės dabar nebebus automatiškai siunčiamos į nurodytus kanalus +Chat.Spy.Party=&6[&eSPY&6-&a{2}&6] &r{0} &b\u2192 &r{1} +Broadcasts.LevelUpMilestone=&6(&amcMMO&6) {0}&7 Pasiekė lygį &a{1} &3{2}&7! +Broadcasts.PowerLevelUpMilestone=&6(&amcMMO&6) {0}&7 pasiekė galios lygį &a{1}&7! +Scoreboard.Recovery=Bandoma atgauti mcMMO lentelę... +Scoreboard.Disabled=mcMMO lentelės yra šiame serveryje išjungtos, nustatymą galite rasti mcMMO/config.yml +Scoreboard.NotSetupYet=Jūsų mcMMO lentelė dar nebuvo sutvarkyta, pabandykite dar kartą vėliau. diff --git a/src/main/resources/locale/locale_nl.properties b/src/main/resources/locale/locale_nl.properties index 83479f641..165fdc7f6 100644 --- a/src/main/resources/locale/locale_nl.properties +++ b/src/main/resources/locale/locale_nl.properties @@ -1,12 +1,12 @@ -Acrobatics.Ability.Proc=[[GREEN]]**VeiligeLanding** -Acrobatics.Combat.Proc=[[GREEN]]**Ontweken** -Acrobatics.DodgeChance=Ontwijk Kans: [[YELLOW]]{0} +Acrobatics.Ability.Proc=&a**Veilige Landing** +Acrobatics.Combat.Proc=&a**Ontweken** +Acrobatics.DodgeChance=Ontwijk Kans: &e{0} Acrobatics.SubSkill.Roll.Name=Rollen -Acrobatics.SubSkill.GracefulRoll.Name=Veilige Roll +Acrobatics.SubSkill.GracefulRoll.Name=Veilige Rol Acrobatics.SubSkill.Dodge.Name=Ontwijken Acrobatics.Listener=Acrobatiek -Acrobatics.SubSkill.Roll.Chance=Rol Kans: [[YELLOW]]{0} -Acrobatics.SubSkill.Roll.GraceChance=Elegante Rol Kans: [[YELLOW]]{0} +Acrobatics.SubSkill.Roll.Chance=Rol Kans: &e{0} +Acrobatics.SubSkill.Roll.GraceChance=Elegante Rol Kans: &e{0} Acrobatics.Roll.Text=**Gerold** Acrobatics.SkillName=ACROBATIEK Acrobatics.Skillup=Acrobatiek toegenomen met {0}. Totaal ({1}) @@ -18,19 +18,19 @@ Archery.SubSkill.ArrowRetrieval.Description=Kans om pijlen te krijgen van lijken Archery.Listener=Boogschieten: Archery.SkillName=BOOGSCHIETEN Archery.Skillup= Boogschieten ervaring toegenomen met {0}. Totaal ({1}) -Axes.Ability.Bonus.0=Bijl Meesterschap +Axes.Ability.Bonus.0=Bijl Vaardigheid Axes.Ability.Bonus.1=Bonus {0} schade Axes.Ability.Bonus.4=Grotere impact -Axes.Ability.Lower=[[GREEN]]**JE STOP JE BIJL WEER WEG** -Axes.Ability.Ready=[[GREEN]]**JE HOUDT JE BIJL GEREED** -Axes.Combat.CritStruck=[[DARK_RED]]Je bent KRITISCH geraakt -Axes.Combat.CriticalHit=Kritische Klap -Axes.Combat.GI.Proc=[[GREEN]] ** GESLAGEN MET GROTE KRACHT ** +Axes.Ability.Lower=&a**JE STOP JE BIJL WEER WEG** +Axes.Ability.Ready=&a**JE HOUDT JE BIJL GEREED** +Axes.Combat.CritStruck=&4Je bent KRITISCH geraakt +Axes.Combat.CriticalHit=Ernstige Klap +Axes.Combat.GI.Proc=&a ** GESLAGEN MET GROTE KRACHT ** Axes.Combat.GI.Struck=**GETROFFEN MET MEER SCHADE** -Axes.Combat.SS.Length=Schedel Splijter Lengte: [[YELLOW]]{0}s +Axes.Combat.SS.Length=Schedel Splijter Lengte: &e{0}s Axes.SubSkill.SkullSplitter.Name=Schedel Splijter Axes.SubSkill.SkullSplitter.Description=Veroorzaak AoE Schade -Axes.SubSkill.CriticalStrikes.Name=Kritieke Slag +Axes.SubSkill.CriticalStrikes.Name=Ernstige Slag Axes.SubSkill.CriticalStrikes.Description=Verdubbelde Schade Axes.SubSkill.AxeMastery.Name=Bijl Meesterschap Axes.SubSkill.AxeMastery.Description=Voegt DMG bonus toe @@ -40,13 +40,13 @@ Axes.SubSkill.GreaterImpact.Description=Deal bonus schade aan unarmored vijanden Axes.Listener=Bijlen Axes.SkillName=BIJLEN Axes.Skills.SS.Off= ** Skull Splitter is uitgewerkt ** -Axes.Skills.SS.On=[[GREEN]]**SCHEDEL SPLIJTER GEACTIVEERD** -Axes.Skills.SS.Refresh=[[GREEN]]Je [[YELLOW]]Schedel Splijter [[GREEN]]kracht is hersteld! -Axes.Skills.SS.Other.Off=Skull Splitter [[GREEN]]is uitgewerkt voor [[GEEL]]{0} -Axes.Skills.SS.Other.On=[[GREEN]]{0}[[DARK_GREEN]] heeft [[RED]]Schedel Splijter[[DARK_GREEN]]gebruikt! +Axes.Skills.SS.On=&a**SCHEDEL SPLIJTER GEACTIVEERD** +Axes.Skills.SS.Refresh=&aJe &eSchedel Splijter &akracht is hersteld! +Axes.Skills.SS.Other.Off=Skull Splitter &ais uitgewerkt voor [[GEEL]]{0} +Axes.Skills.SS.Other.On=&a{0}&2 heeft &cSchedel Splijter&2gebruikt! Axes.Skillup=Bijl ervaring toegenomen met {0}. Totaal ({1}) -Excavation.Ability.Lower=[[GRAY]]**JE STOP JE SCHEP WEER WEG** -Excavation.Ability.Ready=[[GREEN]]**JE HOUDT JE SCHEP GEREED** +Excavation.Ability.Lower=&7**JE STOP JE SCHEP WEER WEG** +Excavation.Ability.Ready=&a**JE HOUDT JE SCHEP GEREED** Excavation.SubSkill.GigaDrillBreaker.Name=Giga Drill Breker Excavation.SubSkill.GigaDrillBreaker.Description=3x Drop Rate, 3x EXP, +Speed Excavation.SubSkill.TreasureHunter.Name=Schatten Jager @@ -54,13 +54,13 @@ Excavation.SubSkill.TreasureHunter.Description=Mogelijkheid om te graven naar s Excavation.Listener=Uitgraving: Excavation.SkillName=Uitgraving Excavation.Skills.GigaDrillBreaker.Off= ** Giga Drill Breeker is uitgewerkt ** -Excavation.Skills.GigaDrillBreaker.On=[[GREEN]]**GIGA DRILL BREKER GEACTIVEERD** -Excavation.Skills.GigaDrillBreaker.Refresh=[[GREEN]]Je [[YELLOW]]Giga Drill Breeker [[GREEN]] kracht is hersteld! -Excavation.Skills.GigaDrillBreaker.Other.Off= Giga Drill Breaker [[GREEN]] is uitgewerkt voor [[GEEL]] {0} -Excavation.Skills.GigaDrillBreaker.Other.On=[[GREEN]]{0}[[DARK_GREEN]] heeft [[RED]]Giga Drill Breaker [[DARK_GREEN]]gebruikt! +Excavation.Skills.GigaDrillBreaker.On=&a**GIGA DRILL BREKER GEACTIVEERD** +Excavation.Skills.GigaDrillBreaker.Refresh=&aJe &eGiga Drill Breeker &a kracht is hersteld! +Excavation.Skills.GigaDrillBreaker.Other.Off= Giga Drill Breaker &a is uitgewerkt voor [[GEEL]] {0} +Excavation.Skills.GigaDrillBreaker.Other.On=&a{0}&2 heeft &cGiga Drill Breaker &2gebruikt! Excavation.Skillup=Uitgravings ervaring toegenomen met {0}. Totaal ({1}) -Fishing.Ability.Info=Magische Jager: [[GRAY]] ** verbetert bij Treasure Hunter Rank ** -Fishing.Ability.Shake=Schud Kans: [[YELLOW]]{0} +Fishing.Ability.Info=Magische Jager: &7 ** verbetert bij Treasure Hunter Rank ** +Fishing.Ability.Shake=Schud Kans: &e{0} Fishing.Ability.IceFishing= Ice Vissen: Ga vissen in ijs Fishing.SubSkill.TreasureHunter.Name=Schatten Jager (Passief) Fishing.SubSkill.TreasureHunter.Description=Vis misc. objecten op @@ -69,36 +69,35 @@ Fishing.SubSkill.MagicHunter.Description=Vind Enchanted Spullen Fishing.SubSkill.Shake.Name=Schudden (vs. Wezens) Fishing.SubSkill.Shake.Description=Schud items af van mobs w/ hengel Fishing.SubSkill.FishermansDiet.Name=Visserman\'s dieet -Fishing.SubSkill.FishermansDiet.Description=Verbetert de honger hersteld vanaf geviste voedingsmiddelen +Fishing.SubSkill.FishermansDiet.Description=Verbetert de honger hersteld door geviste voedingsmiddelen Fishing.SubSkill.MasterAngler.Name=Meester Hengelaar -Fishing.SubSkill.MasterAngler.Description=Verbetert de kans op het bijten tijdens het vissen Fishing.SubSkill.IceFishing.Name=Ijs Vissen Fishing.SubSkill.IceFishing.Description=Stelt je in staat om te vissen in de ijzige biomen -Fishing.Chance.Raining=[[BLUE]] Regen Bonus +Fishing.Chance.Raining=&9 Regen Bonus Fishing.Listener=Vissen: -Fishing.Ability.TH.MagicFound=[[GRAY]]Jij voelt een vleugje magie met deze vangst... +Fishing.Ability.TH.MagicFound=&7Jij voelt een vleugje magie met deze vangst... Fishing.SkillName=VISSEN -Herbalism.Ability.FD=Boeren Dieet: [[YELLOW]]Rank {0} -Herbalism.Ability.GTh=[[GREEN]]**GROEN DUIMPJE** -Herbalism.Ability.Lower=[[GRAY]]**JE STOP JE ZEIS WEER WEG** -Herbalism.Ability.Ready=[[GREEN]]**JE HOUDT JE ZEIS GEREED** +Herbalism.Ability.FD=Boeren Dieet: &eRank {0} +Herbalism.Ability.GTh=&a**GROEN DUIMPJE** +Herbalism.Ability.Lower=&7**JE STOP JE ZEIS WEER WEG** +Herbalism.Ability.Ready=&a**JE HOUDT JE ZEIS GEREED** Herbalism.SubSkill.GreenThumb.Name=Groene Duim (Graan) Herbalism.SubSkill.GreenThumb.Description.2=Maak stenen bemost, of laat gras groeien Herbalism.SubSkill.FarmersDiet.Name=Boeren dieet -Herbalism.SubSkill.FarmersDiet.Description=Verbetert de honger herstel van gekweekte voedingsmiddelen +Herbalism.SubSkill.FarmersDiet.Description=Verbetert de honger hersteld door gekweekte voedingsmiddelen Herbalism.SubSkill.DoubleDrops.Name=Dubbele drops (Alle Kruiden) Herbalism.SubSkill.DoubleDrops.Description=Het dubbele van de normale buit Herbalism.SubSkill.HylianLuck.Name=Hylian Geluk Herbalism.SubSkill.HylianLuck.Description=Geeft een kleine kans om zeldzame voorwerpen te vinden Herbalism.Listener=Kruidenkunde: Herbalism.SkillName=Kruidenkunde -Herbalism.Skills.GTe.On=[[GREEN]]**GREEN TERRA GEACTIVEERD** -Herbalism.Skills.GTe.Refresh=[[GREEN]]Je [[YELLOW]]Green Terra [[GREEN]]kracht is hersteld! -Herbalism.Skills.GTe.Other.Off=Green Terra[[GREEN]]is uitgewerkt voor [[YELLOW]]{0} -Herbalism.Skills.GTe.Other.On=[[GREEN]]{0}[[DARK_GREEN]]heeft[[RED]]Groene Aarde[[DARK_GREEN]]gebruikt! -Mining.Ability.Length=Super BrekerLengte: [[YELLOW]]{0}s -Mining.Ability.Lower=[[GREEN]]**JE STOP JE PIKHOUWEL WEER WEG * -Mining.Ability.Ready=[[GREEN]]**JE HOUDT JE PIKHOUWEEL GEREED** +Herbalism.Skills.GTe.On=&a**GREEN TERRA GEACTIVEERD** +Herbalism.Skills.GTe.Refresh=&aJe &eGreen Terra &akracht is hersteld! +Herbalism.Skills.GTe.Other.Off=Green Terra&ais uitgewerkt voor &e{0} +Herbalism.Skills.GTe.Other.On=&a{0}&2heeft&cGroene Aarde&2gebruikt! +Mining.Ability.Length=Super BrekerLengte: &e{0}s +Mining.Ability.Lower=&a**JE STOP JE PIKHOUWEL WEER WEG * +Mining.Ability.Ready=&a**JE HOUDT JE PIKHOUWEEL GEREED** Mining.SubSkill.DoubleDrops.Name=Dubbele Drops Mining.SubSkill.DoubleDrops.Description=Het dubbele van de normale buit Mining.SubSkill.BlastMining.Name=Explosie Mining @@ -109,14 +108,14 @@ Mining.SubSkill.DemolitionsExpertise.Description=Vermindert schade door TNT expl Mining.Listener=Mijnbouw: Mining.SkillName=MIJNBOUW Mining.Skills.SuperBreaker.Off= ** Super Breaker is uitgewerkt ** -Mining.Skills.SuperBreaker.Other.Off=Super Breker [[GREEN]]is uitgewerkt voor [[YELLOW]]{0} -Mining.Skills.SuperBreaker.Refresh=[[GREEN]]Je[[YELLOW]]Super Breeker [[GREEN]]kracht is hersteld! -Mining.Skillup=Mijn ervaring toegenomen met {0}. Totaal: ({1}) -Mining.Blast.Boom=[[GRAY]]**BOEM** -Mining.Blast.Radius.Increase= Ontploffings Radius Verhoging: [[YELLOW]] {0} -Mining.Blast.Rank=Explosie Mining: [[YELLOW]] Rang {0}/8 [[GRAY]]({1}) -Mining.Blast.Other.On=[[GREEN]]{0}[[DARK_GREEN]] heeft [[RED]] Blast Mining![DARK_GREEN] gebruikt -Mining.Blast.Refresh=[[GREEN]]Je [[YELLOW]]explosie mijn [[GREEN]]kracht is hersteld! +Mining.Skills.SuperBreaker.Other.Off=Super Breker &ais uitgewerkt voor &e{0} +Mining.Skills.SuperBreaker.Refresh=&aJe&eSuper Breeker &akracht is hersteld! +Mining.Skillup=Mijn ervaring is toegenomen met {0}. Totaal: ({1}) +Mining.Blast.Boom=&7**BOEM** +Mining.Blast.Radius.Increase= Ontploffings Radius Verhoging: &e {0} +Mining.Blast.Rank=Explosie Mining: &e Rang {0}/8 &7({1}) +Mining.Blast.Other.On=&a{0}&2 heeft &c Blast Mining![DARK_GREEN] gebruikt +Mining.Blast.Refresh=&aJe &eexplosie mijn &akracht is hersteld! Repair.SubSkill.Repair.Name=Repareren Repair.SubSkill.Repair.Description=Repareer Diamanten Gereedschap & Wapenuitrusting Repair.SubSkill.GoldRepair.Name=Goud Repareren ({0}+ SKILL) @@ -128,35 +127,35 @@ Repair.SubSkill.StoneRepair.Description=Repareer Stenen Gereedschap & Wapenuitru Repair.SubSkill.RepairMastery.Name=Reparatie Meesterschap Repair.SubSkill.RepairMastery.Description=Toegenomen reparatie aantal Repair.SubSkill.SuperRepair.Name=Super Reparatie -Repair.SubSkill.SuperRepair.Description=Verdubbelde effectiefheid +Repair.SubSkill.SuperRepair.Description=Verdubbelde effectiviteit Repair.SubSkill.DiamondRepair.Name=Diamanten Reparatie ({0}+ SKILL) Repair.SubSkill.DiamondRepair.Description=Repareer Diamanten Gereedschap & Wapenuitrusting Repair.SubSkill.ArcaneForging.Name=Arcane Smeden Repair.SubSkill.ArcaneForging.Description=Magische voorwerpen repareren -Repair.Listener.Anvil=[[DARK.RED]]Je hebt een aambeeld geplaatst, met een aambeeld kun je je gereedschappen en pantser mee repareren +Repair.Listener.Anvil=&4Je hebt een aambeeld geplaatst. Met een aambeeld kun je je gereedschappen en pantser repareren Repair.Listener=Repareer: Repair.SkillName=REPAREER -Repair.Skills.AdeptDiamond=[[DARK_RED]]Je bent nog niet sterk genoeg om diamant te repareren. -Repair.Skills.AdeptGold=[[DARK_RED]]Je bent niet goed genoeg om goud te repareren. -Repair.Skills.AdeptIron=[[DARK_RED]]Je bent niet vaardig genoeg om Ijzer te repareren. -Repair.Skills.AdeptStone=[[DARK_RED]]Je bent nog niet sterk genoeg om steen te repareren. -Repair.Skills.FeltEasy=[[GRAY]]Dat voelde makkelijk. +Repair.Skills.AdeptDiamond=&4Je bent nog niet sterk genoeg om diamant te repareren. +Repair.Skills.AdeptGold=&4Je bent niet vaardig genoeg om goud te repareren. +Repair.Skills.AdeptIron=&4Je bent niet vaardig genoeg om Ijzer te repareren. +Repair.Skills.AdeptStone=&4Je bent nog niet vaardig genoeg om steen te repareren. +Repair.Skills.FeltEasy=&7Dat voelde makkelijk. Repair.Skills.FullDurability=[[GRIJS]] Dat is bij volledige duurzaamheid. Repair.Skillup=Repareer ervaring toegenomen met {0}. Totaal: ({1}) Repair.Pretty.Name=Repareer -Repair.Arcane.Chance.Downgrade=[[GRAY]]AF Downgrade Kans: [[YELLOW]]{0}% -Repair.Arcane.Chance.Success=[[GRAY]] Mystiek Smeden Succes Percentage: [[YELLOW]]{0}% +Repair.Arcane.Chance.Downgrade=&7AF Downgrade Kans: &e{0}% +Repair.Arcane.Chance.Success=&7 Mystiek Smeden Succes Percentage: &e{0}% Repair.Arcane.Fail=Mysterieuze kracht heeft het voorwerp voorgoed verlaten. Repair.Arcane.Lost=Je hebt niet genoeg ervaring om de betoveringen te behouden -Swords.Ability.Lower=[[GREEN]]**JE STOP JE ZWAARD WEER WEG** -Swords.Ability.Ready=[[GREEN]]**JIJ HOUD JOU WAPEN GEREED** -Swords.Combat.Bleed.Chance=Bloed Kans: [[YELLOW]]{0} -Swords.Combat.Bleeding.Started=[[DARK_RED]] Jij bloedt! -Swords.Combat.Bleeding.Stopped=[[GRAY]]Het bloeden is [[GREEN]]Gestopt[[GRAY]]! -Swords.Combat.Bleeding=[[GREEN]]**VIJAND BLOED** -Swords.Combat.Counter.Hit=[[DARK_RED]]Geraakt door een tegenaanval -Swords.Combat.Countered=[[GREEN]]**TEGEN-AANVAL** -Swords.Combat.SS.Struck=[[DARK_RED]]Geraakt door GEKARTELDE SLAG! +Swords.Ability.Lower=&a**JE STOP JE ZWAARD WEER WEG** +Swords.Ability.Ready=&a**JIJ HOUD JOU WAPEN GEREED** +Swords.Combat.Bleed.Chance=Bloed Kans: &e{0} +Swords.Combat.Bleeding.Started=&4 Jij bloedt! +Swords.Combat.Bleeding.Stopped=&7Het bloeden is &aGestopt&7! +Swords.Combat.Bleeding=&a**VIJAND BLOED** +Swords.Combat.Counter.Hit=&4Geraakt door een tegenaanval +Swords.Combat.Countered=&a**TEGEN-AANVAL** +Swords.Combat.SS.Struck=&4Geraakt door GEKARTELDE SLAG! Swords.SubSkill.CounterAttack.Name=Tegenaanval Swords.SubSkill.SerratedStrikes.Name=Gekartelde Slag (Vermogen) Swords.SubSkill.SerratedStrikes.Description={0} DMG AoE, Bloeden+ AoE @@ -165,13 +164,13 @@ Swords.Effect.5={0} Tick Bloeden Swords.SubSkill.Bleed.Name=Bloeden Swords.Listener=Zwaarden: Swords.SkillName=ZWAARDEN -Swords.Skills.SS.Off=**Serrated Strikes is uitgewerkt** -Swords.Skills.SS.On=[[GREEN]]**GEKARTELDE SLAG GEACTIVEERD** -Swords.Skills.SS.Refresh=[[GREEN]]Je [[YELLOW]]Gekarteld Slag [[GREEN]] kracht is hersteld! -Swords.Skills.SS.Other.Off=Gekartelde Slag[[GREEN]] is uitgewerkt voor [[YELLOW]]{0} -Swords.Skills.SS.Other.On=[[GREEN]]{0}[[DARK_GREEN]] heeft [[RED]]Gekartelde Slag[[DARK_GREEN]]gebruikt! +Swords.Skills.SS.Off=**Gekartelde Slag is uitgewerkt** +Swords.Skills.SS.On=&a**GEKARTELDE SLAG GEACTIVEERD** +Swords.Skills.SS.Refresh=&aJe &eGekartelde Slag &a kracht is hersteld! +Swords.Skills.SS.Other.Off=Gekartelde Slag&a is uitgewerkt voor &e{0} +Swords.Skills.SS.Other.On=&a{0}&2 heeft &cGekartelde Slag&2gebruikt! Swords.Skillup=Zwaarden ervaring toegenomen met {0}. Totaal: ({1}) -Swords.SS.Length=Serrated Strikes Lengte: [[YELLOW]]{0}s +Swords.SS.Length=Serrated Strikes Lengte: &e{0}s Taming.Ability.Bonus.0=Omgevings bewust Taming.Ability.Bonus.1=Wolven vermijden gevaar Taming.Ability.Bonus.2=Dikke Vacht @@ -181,27 +180,27 @@ Taming.Ability.Bonus.7=+{0} Schade Taming.Ability.Bonus.8=Snel Eten Service Taming.SubSkill.ShockProof.Name=Schokbestendig Taming.SubSkill.ShockProof.Description=Explosieve Schade Verkleining -Taming.SubSkill.CallOfTheWild.Name=Roep van het WIld +Taming.SubSkill.CallOfTheWild.Name=Roep van het Wild Taming.SubSkill.CallOfTheWild.Description=Roep een dier aan je zijde op -Taming.SubSkill.CallOfTheWild.Description.2=[[GRAY]]COTW (Ocelot): Buk en linkermuisknop met {0} Vis in je hand -Taming.Effect.15=[[GRAY]]COTW (Wolf): Buk en linkermuisknop met {0} Botten in je hand +Taming.SubSkill.CallOfTheWild.Description.2=&7COTW (Ocelot): Buk en linkermuisknop met {0} Vis in je hand +Taming.Effect.15=&7COTW (Wolf): Buk en linkermuisknop met {0} Botten in je hand Taming.SubSkill.FastFoodService.Name=Fast Food Service Taming.SubSkill.FastFoodService.Description=Kans voor wolven na een aanval te regeneren -Taming.SubSkill.Gore.Description=Kritische Slag dat Blood toepast +Taming.SubSkill.Gore.Description=Ernstige Slag dat Blood toepast Taming.SubSkill.SharpenedClaws.Name=Geslepen Klauwen Taming.SubSkill.SharpenedClaws.Description=Schade Bonus Taming.SubSkill.EnvironmentallyAware.Name=Omgevings bewust Taming.SubSkill.ThickFur.Name=Dikke Vacht -Taming.Listener.Wolf=[[DARK_GRAY]]Jouw wolf dribbelt terug naar je... +Taming.Listener.Wolf=&8Jouw wolf dribbelt terug naar je... Taming.Listener=Temmen: Taming.SkillName=TEMMEN Taming.Skillup=Temmings ervaring toegenomen met {0}. Totaal ({1}) -Taming.Summon.Complete=[[GREEN]]Oproepen voltooid +Taming.Summon.Complete=&aOproepen voltooid Taming.Summon.Fail.Ocelot=Je hebt te veel ocelots in de buurt om nog meer op te roepen. Taming.Summon.Fail.Wolf=Je hebt te veel wolven in de buurt om nog meer op te roepen. -Unarmed.Ability.Berserk.Length=Razernij Lengte: [[YELLOW]]{0}s -Unarmed.Ability.Lower=[[GRAY]]**JE STOP JE HAND WEER WEG** -Unarmed.Ability.Ready=[[GREEN]]**JE HOUDT JE HAND GEREED** +Unarmed.Ability.Berserk.Length=Razernij Lengte: &e{0}s +Unarmed.Ability.Lower=&7**JE STOP JE HAND WEER WEG** +Unarmed.Ability.Ready=&a**JE HOUDT JE HAND GEREED** Unarmed.SubSkill.Berserk.Name=Razernij (KRACHT) Unarmed.SubSkill.Disarm.Name=Ontwapen (spelers) Unarmed.SubSkill.IronArmStyle.Description=Verhardt uw arm in de loop van de tijd @@ -212,10 +211,10 @@ Unarmed.SubSkill.IronGrip.Description=Voorkomt dat je ontwapend wordt Unarmed.Listener=Ongewapend: Unarmed.SkillName=Ongewapend Unarmed.Skills.Berserk.Off=**Razernij is uitgewerkt** -Unarmed.Skills.Berserk.On=[[GREEN]]**RAZERNIJ GEACTIVEERD** -Unarmed.Skills.Berserk.Other.Off=Razernij [[GREEN]]is uitgewerkt voor [[YELLOW]]{0} -Unarmed.Skills.Berserk.Other.On=[[GREEN]]{0}[[DARK_GREEN]] heeft [[RED]]Razernij [[DARK_GREEN]]gebruikt! -Unarmed.Skills.Berserk.Refresh=[[GREEN]]Je [[YELLOW]]Razernij [[GREEN]]kracht is hersteld! +Unarmed.Skills.Berserk.On=&a**RAZERNIJ GEACTIVEERD** +Unarmed.Skills.Berserk.Other.Off=Razernij &ais uitgewerkt voor &e{0} +Unarmed.Skills.Berserk.Other.On=&a{0}&2 heeft &cRazernij &2gebruikt! +Unarmed.Skills.Berserk.Refresh=&aJe &eRazernij &akracht is hersteld! Woodcutting.Ability.0=Bladblazer Woodcutting.Ability.1=Bladeren wegblazen Woodcutting.Ability.Length= Boom Feller Lengte: [[GEEL]]{0}s @@ -229,26 +228,26 @@ Woodcutting.SubSkill.HarvestLumber.Description=Het dubbele van de normale buit Woodcutting.Listener=Houthakken: Woodcutting.SkillName=Houthakken Woodcutting.Skills.TreeFeller.Off= ** Boom Feller is uitgewerkt ** -Woodcutting.Skills.TreeFeller.On=[[GREEN]]**BOOM FELLER GEACTIVEERD** -Woodcutting.Skills.TreeFeller.Refresh=[[GREEN]]Je [[YELLOW]]Boom Feller [[GREEN]]kracht is hersteld! -Woodcutting.Skills.TreeFeller.Other.Off= Boom Feller [[GREEN]] is uitgewerkt voor [[GEEL]]{0} -Woodcutting.Skills.TreeFeller.Other.On=[[GREEN]]{0}[[DARK)GREEN]]heeft[[RED]]Tree Feller[[DARK_GREEN]]gebruikt! +Woodcutting.Skills.TreeFeller.On=&a**BOOM FELLER GEACTIVEERD** +Woodcutting.Skills.TreeFeller.Refresh=&aJe &eBoom Feller &akracht is hersteld! +Woodcutting.Skills.TreeFeller.Other.Off= Boom Feller &a is uitgewerkt voor [[GEEL]]{0} +Woodcutting.Skills.TreeFeller.Other.On=&a{0}&2heeft&cTree Feller&2gebruikt! Woodcutting.Skills.TreeFeller.Splinter=JOU BIJL SPLINTERT IN DUIZENDEN STUKJES! Woodcutting.Skills.TreeFeller.Threshold=Die boom is te groot! Woodcutting.Skillup=Houthakken toegenomen met {0}. Totaal ({1}) -Ability.Generic.Refresh=[[GREEN]]**ABILITIES VERVEST!** -Ability.Generic.Template.Lock=[[GRAY]]{0} -Ability.Generic.Template=[[GOLD]]{0}: [[DARK_AQUA]]{1} -Combat.ArrowDeflect=[[WHITE]]**PIJL AFGEWEERD** -Combat.BeastLore=[[GREEN]]**WOLFINSPECTIE** -Combat.BeastLoreHealth=[[DARK_AQUA]]Levens ([[GREEN]]{0}[[DARK_AQUA]]/{1}) -Combat.BeastLoreOwner=[[DARK_AQUA]]Eigenaar ([[RED]]{0}[[DARK_AQUA]]) -Combat.Gore=[[GREEN]]**GESTOLD BLOED** +Ability.Generic.Refresh=&a**ABILITIES VERVEST!** +Ability.Generic.Template.Lock=&7{0} +Ability.Generic.Template=&6{0}: &3{1} +Combat.ArrowDeflect=&f**PIJL AFGEWEERD** +Combat.BeastLore=&a**WOLFINSPECTIE** +Combat.BeastLoreHealth=&3Levens (&a{0}&3/{1}) +Combat.BeastLoreOwner=&3Eigenaar (&c{0}&3) +Combat.Gore=&a**GESTOLD BLOED** Combat.StruckByGore=**VAST DOOR GESTOLD BLOED** -Combat.TargetDazed=Doelwit was [[DARK_RED]]versuft -Combat.TouchedFuzzy=[[DARK_RED]]Je raakte Fuzzy aan. Je voelt je duizelig. -Commands.AdminChat.Off=Alleen Admin gesprek[[RED]]Uit -Commands.AdminChat.On=Alleen Admin gesprek[[RED]]Aan +Combat.TargetDazed=Doelwit was &4versuft +Combat.TouchedFuzzy=&4Je raakte Fuzzy aan. Je voelt je duizelig. +Commands.AdminChat.Off=Alleen Admin gesprek&cUit +Commands.AdminChat.On=Alleen Admin gesprek&cAan Commands.AdminToggle=- Zet Admin Chat aan/uit Commands.Chat.Console=*Console* Commands.Disabled=Deze opdracht is gedeactiveerd. @@ -256,52 +255,52 @@ Commands.DoesNotExist=Speler bestaat niet in de database! Commands.GodMode.Disabled=mcMMO GodModus Uitgeschakeld Commands.GodMode.Enabled=mcMMO Godmode ag zet het tog uit... Commands.GodMode.Forbidden=[mcMMO] God Modus is niet toegestaan in deze wereld (Zie Permissions) -Commands.Party.Invite.Accepted=[[GREEN]]Uitnodiging geacepteerd. Jij hebt de groep {0} betreden -Commands.Invite.Success=[[GREEN]]Uitnodiging verstuurd! -Commands.mcc.Header=---[][[YELLOW]]mcMMO Commando\'s[[RED]][]--- +Commands.Party.Invite.Accepted=&aUitnodiging geacepteerd. Jij hebt de groep {0} betreden +Commands.Invite.Success=&aUitnodiging verstuurd! +Commands.mcc.Header=---[]&emcMMO Commando\'s&c[]--- Commands.mcgod=- GodModus Schakelen -Commands.mcrank.Player=DOELWIT: [[WHITE]]{0} -Commands.mmoedit=[player] [[RED]] - Pas doel aan -Commands.mmoedit.Modified.1=[[GREEN]]Uw level in {0} is veranderd naar {1} +Commands.mcrank.Player=DOELWIT: &f{0} +Commands.mmoedit=[player] &c - Pas doel aan +Commands.mmoedit.Modified.1=&aUw level in {0} is veranderd naar {1} Commands.mmoedit.Modified.2={0} is aangepast voor {1}. -Commands.mcconvert.Database.Same= Je makt al gebruik van de {0} database! +Commands.mcconvert.Database.Same= Je maakt al gebruik van de {0} database! Commands.mcconvert.Database.InvalidType= {0} is geen geldig soort database. Commands.ModDescription=- Lees instructie mod beschrijving -Commands.NoConsole=Deze commando wordt niet ondersteund vanuit de console. -Commands.Other=[[GREEN]]--OVERIGE COMMANDS-- -Commands.Party.Header=-----[][[GREEN]]GROEP[[RED]][]----- -Commands.Party.Status=[[DARK_GRAY]]NAAM: [[WHITE]]{0} {1} -Commands.Party.ShareMode=[[DARK_GRAY]]DEEL MODUS: -Commands.Party.ExpShare=[[GRAY]]EXP [[DARK_AQUA]]({0}) -Commands.Party.Accept=- Accepteer groep uitnodiging -Commands.Party.Chat.Off=Groep\'s Chat [[RED]]Uit -Commands.Party.Chat.On=Groep\'s Chat [[GREEN]]Aan -Commands.Party.Commands=[[GREEN]]--GROEP COMMANDOS-- -Commands.Party.Invite.0=ALERT: [[GREEN]]Jij hebt een groep uitnodiging ontvangen voor {0} van {1} +Commands.NoConsole=Dit commando wordt niet ondersteund vanuit de console. +Commands.Other=&a--OVERIGE COMMANDS-- +Commands.Party.Header=-----[]&aGROEP&c[]----- +Commands.Party.Status=&8NAAM: &f{0} {1} +Commands.Party.ShareMode=&8DEEL MODUS: +Commands.Party.ExpShare=&7EXP &3({0}) +Commands.Party.Accept=- Accepteer groepsuitnodiging +Commands.Party.Chat.Off=Groep\'s Chat &cUit +Commands.Party.Chat.On=Groep\'s Chat &aAan +Commands.Party.Commands=&a--GROEP COMMANDOS-- +Commands.Party.Invite.0=ALERT: &aJij hebt een groepsuitnodiging ontvangen voor {0} van {1} Commands.Party.Invite=- Verstuur groepsuitnodiging -Commands.Party.Join=[[GRAY]]heeft zich aangesloten bij de groep: {0} -Commands.Party.Create=[[GRAY]]Groep aangemaakt: {0} -Commands.Party.Rename=[[GRAY]]Groep\'s naan veranderd naar: [[WHITE]]{0} -Commands.Party.ToggleShareCategory=[[GRAY]]Groep item delen in [[GOLD]]{0} [[GRAY]]is nu [[DARK_AQUA]]{1} -Commands.Party.AlreadyExists=[[DARK_RED]]Groep {0} bestaat al! +Commands.Party.Join=&7heeft zich aangesloten bij de groep: {0} +Commands.Party.Create=&7Groep aangemaakt: {0} +Commands.Party.Rename=&7Groep\'s naan veranderd naar: &f{0} +Commands.Party.ToggleShareCategory=&7Groep item delen in &6{0} &7is nu &3{1} +Commands.Party.AlreadyExists=&4Groep {0} bestaat al! Commands.Party.Kick=Je bent verwijderd uit de groep {0}! Commands.Party.Leave=Je hebt de groep verlaten -Commands.Party.Members.Header=-----[][[GREEN]]LEDEN[[RED]][]----- -Commands.Party.None=Je bent niet in een groep. +Commands.Party.Members.Header=-----[]&aLEDEN&c[]----- +Commands.Party.None=Je zit niet in een groep. Commands.Party.Quit=- Verlaat je huidige groep -Commands.Party.Teleport= [[RED]]- Teleport naar een groepslid +Commands.Party.Teleport= &c- Teleporteer naar een groepslid Commands.Party.Toggle=- Zet Party Chat aan/uit Commands.Party.1=- Maak een nieuwe groep Commands.Party.2=- Ga bij een spelers groep -Commands.ptp.NoRequests= Je hebt geen teleporteren aanvragen op dit moment -Commands.ptp.RequestExpired=Groep\'s teleport verzoek is verlopen! -Commands.PowerLevel.Leaderboard=--mcMMO[[BLUE]] Kracht Level [[YELLOW]]Leiderbord-- -Commands.PowerLevel=[[DARK_RED]]KRACHT LEVEL: [[GREEN]]{0} +Commands.ptp.NoRequests= Je hebt geen teleportatie aanvragen op dit moment +Commands.ptp.RequestExpired=Groep\'s teleportatie verzoek is verlopen! +Commands.PowerLevel.Leaderboard=--mcMMO&9 Kracht Level &eLeiderbord-- +Commands.PowerLevel=&4KRACHT LEVEL: &a{0} Commands.Reset=Reset een niveau level naar 0 Commands.Skill.Invalid= Dat is geen geldig skillname! -Commands.Skill.Leaderboard=--mcMMO [[BLUE]]{0}[[YELLOW]] Ranglijst -- -Commands.Stats.Self=Je status -Commands.Stats=- Laat je mcMMO statussen zien +Commands.Skill.Leaderboard=--mcMMO &9{0}&e Ranglijst -- +Commands.Stats.Self=Jouw status +Commands.Stats=- Laat jouw mcMMO statussen zien Commands.ToggleAbility= - Toggle Kracht activering met rechts klikken Commands.Usage.Level=niveau Commands.Usage.Message=bericht @@ -310,43 +309,43 @@ Commands.Usage.Password=wachtwoord Commands.Usage.Player=speler Commands.Usage.Skill=Niveau Commands.Usage.XP=xp -mcMMO.NoPermission=[[DARK_RED]]Te wijning permissions. -mcMMO.NoSkillNote=[[DARK_GRAY]]als je geen toegang hebt tot een vermogen, wordt die hier niet getoont +mcMMO.NoPermission=&4Te weining machtigingen. +mcMMO.NoSkillNote=&8als je geen toegang hebt tot een vermogen, wordt die hier niet getoond Party.Forbidden=[mcMMO] Groepen zijn niet toegestaan in deze wereld (zie Machtigingen) -Party.Help.1=Maak een groep aan met [[DARK_AQUA]]{0} [password]. -Party.Help.10=Gebruik [[DARK_AQUA]]{0} [[RED]]om XP delen met groepsleden te activeren -Party.InformedOnJoin={0} [[GREEN]]heeft zich aangesloten bij je groep -Party.InformedOnQuit={0} [[GREEN]]heeft de groep verlaten -Party.InvalidName=[[DARK_RED]]Dat is geen geldige groep\'s naam. +Party.Help.1=Maak een groep aan met &3{0} [password]. +Party.Help.10=Gebruik &3{0} &com XP delen met groepsleden te activeren +Party.InformedOnJoin={0} &aheeft zich aangesloten bij je groep +Party.InformedOnQuit={0} &aheeft de groep verlaten +Party.InvalidName=&4Dat is geen geldige groep\'s naam. Party.Invite.Self=Je kan jezelf niet uitnodigen! Party.IsLocked=Deze groep is al gesloten! Party.IsntLocked=Deze groep is niet gesloten! Party.Locked=De groep is gesloten, alleen de groepsleider kan spelers uitnodigen. -Party.NotInYourParty=[[DARK_RED]]{0} zit niet in jou groep -Party.NotOwner=[[DARK_RED]]Jij bent niet de groepsleider. -Party.Owner.New=[[GREEN]]{0} is de nieuwe groep leider. -Party.Owner.NotLeader=[[DARK_RED]]Jij bent niet meer de groepsleider. -Party.Owner.Player=[[GREEN]]Jij bent nu de groep eigenaar. +Party.NotInYourParty=&4{0} zit niet in jouw groep +Party.NotOwner=&4Jij bent niet de groepsleider. +Party.Owner.New=&a{0} is de nieuwe groepsleider. +Party.Owner.NotLeader=&4Jij bent niet meer de groepsleider. +Party.Owner.Player=&aJij bent nu de groep eigenaar. Party.Password.None=Deze groep is vergrendeld met een wachtwoord. Voer het wachtwoord in om in deze groep te komen. Party.Password.Incorrect=Groeps- wachtwoord is incorrect. -Party.Password.Set=[[GREEN]]Groep wachtwoord veranderd in {0} -Party.Password.Removed=[[GREEN]]Groepswachtwoord is verwijderd. +Party.Password.Set=&aGroep wachtwoord veranderd in {0} +Party.Password.Removed=&aGroepswachtwoord is verwijderd. Party.Player.Invalid=Dat is geen geldige speler. -Party.NotOnline=[[DARK_RED]]{0} is niet online! +Party.NotOnline=&4{0} is niet online! Party.Player.InSameParty={0} zit al in uw groep! -Party.PlayerNotInParty=[[DARK_RED]]{0} zit niet in een groep +Party.PlayerNotInParty=&4{0} zit niet in een groep Party.Specify=Je moet een groep invullen. Party.Teleport.Dead=[RED]Je kan niet naar een dode speler teleporteren. Party.Teleport.Hurt=Je hebt schade opgelopen in de afgelopen {0} seconden en je kan niet teleporten. -Party.Teleport.Player=[[GREEN]] Je hebt geteleporteerd naar {0}. -Party.Teleport.Target=[[GREEN]]{0} is naar jou toe gedeporteerd. +Party.Teleport.Player=&a Je bent geteleporteerd naar {0}. +Party.Teleport.Target=&a{0} is naar jou toe geteleporteerd. Party.Teleport.Disabled={0} staat groeps-teleportaties niet toe. Party.Rename.Same=Dat is al de naam van uw groep! Party.Join.Self=Je kan niet meedoen met jezelf! -Party.Unlocked=[[GRAY]]Groep is ontgrendeld -Party.Disband=[[GRAY]] De partij werd ontbonden -Party.Status.Locked=[[DARK_RED]](ALLEEN-UITNODIGING) -Party.Status.Unlocked=[[DARK_GREEN]](OPEN) +Party.Unlocked=&7Groep is ontgrendeld +Party.Disband=&7 De partij werd ontbonden +Party.Status.Locked=&4(ALLEEN-UITNODIGING) +Party.Status.Unlocked=&2(OPEN) Party.ShareType.Xp=EXP Party.ShareType.Item=ITEM Party.ShareMode.None=NIKS @@ -370,53 +369,53 @@ Commands.XPGain.Swords=Monsters aanvallen Commands.XPGain.Taming=Dieren Temmen, of vechten met je wolven Commands.XPGain.Unarmed=Monsters aanvallen Commands.XPGain.Woodcutting=Bomen omhakken -Commands.XPGain=[[DARK_GRAY]]XP GEWONNEN: [[WHITE]]{0} -Commands.xplock.locked=[[GOLD]]Jou XP BALK is nu bevroren op {0}! -Commands.xplock.unlocked=[[GOLD]]Jou XP BALK is nu[[GREEN]]ONTGRENDELD[[GOLD]]! +Commands.XPGain=&8XP GEWONNEN: &f{0} +Commands.xplock.locked=&6Jou XP BALK is nu bevroren op {0}! +Commands.xplock.unlocked=&6Jou XP BALK is nu&aONTGRENDELD&6! Commands.xprate.over=mcMMO XP Verdubbeling Evenement is VOORBIJ!! -Commands.xprate.proper.0=Juiste gebruiking om de XP snelheid te veranderen is /xprate +Commands.xprate.proper.0=De juiste manier om de XP snelheid te veranderen is /xprate Commands.xprate.proper.1=De juiste manier om de XP rate te herstellen is /xprate reset -Commands.xprate.started.0=[[GOLD]]XP EVENEMENT VOOR MCMMO IS BEGONNEN! -XPRate.Event=[[GOLD]]mcMMO is momenteel in een XP verdubbeling evenement! XP verdubbeling is {0}x! +Commands.xprate.started.0=&6XP EVENEMENT VOOR MCMMO IS BEGONNEN! +XPRate.Event=&6mcMMO is momenteel in een XP verdubbeling evenement! XP verdubbeling is {0}x! Effects.Effects=EFFECTEN -Effects.Child=[[DARK_GRAY]]LVL: [[GREEN]]{0} -Effects.Parent=[[GOLD]]{0} - -Effects.Template=[[DARK_AQUA]]{0}: [[GREEN]]{1} -Guides.Header=[[GOLD]]-=[[GREEN]]{0} Handleiding[[GOLD]]=- +Effects.Child=&8LVL: &a{0} +Effects.Parent=&6{0} - +Effects.Template=&3{0}: &a{1} +Guides.Header=&6-=&a{0} Handleiding&6=- Guides.Page.Invalid=Geen geldig paginanummer! -Guides.Page.OutOfRange=Deze pagina bestaat niet, er zijn in totaal {0} pagina\'s. +Guides.Page.OutOfRange=Deze pagina bestaat niet. Er zijn in totaal {0} pagina\'s. Guides.Smelting.Section.0=Komt binnenkort... -Inspect.OfflineStats=mcMMO statistieken voor offline-speler [[YELLOW]]{0} -Inspect.Stats=[[GREEN]]mcMMO Statistieken voor [[YELLOW]]{0} +Inspect.OfflineStats=mcMMO statistieken voor offline-speler &e{0} +Inspect.Stats=&amcMMO Statistieken voor &e{0} Inspect.TooFar=Jij bent te ver weg om deze speler te inspecteren! Item.ChimaeraWing.Fail=**CHIMAERA VLEUGEL MISLUKT** Item.ChimaeraWing.Pass=**CHIMAERA VLEUGEL** Item.ChimaeraWing.Name=Chimaera Vleugel -Item.ChimaeraWing.Lore=[[GRAY]] Teleporteert je naar je bed. -Item.Injured.Wait=Je bent recent gewond geraakt en je moet wachter om dit te gebruiken. [[YELLOW]]({0}s) -Teleport.Commencing=[[GRAY]]Teleport poging in [[GOLD]]({0}) [[GRAY]]seconden, Sta stil AUB... -Skills.Disarmed=[[DARK_RED]]Je bent ontwapend! -Skills.NeedMore=[[DARK_RED]]Jij hebt te weinig [[GRAY]]{0} -Skills.TooTired=Jij bent te moe om die kracht opnieuw te gebruiken. [[YELLOW]]({0}s) -Stats.Header.Combat=[[GOLD]]-=Strijd Ervaring=- -Stats.Header.Gathering=[[GOLD]]-=VERZAMELAAR VAARDIGHEDEN=- -Stats.Header.Misc=[[GOLD]]-=MISC ERVARING=- -Stats.Own.Stats=[[GREEN]][mcMMO] Stats +Item.ChimaeraWing.Lore=&7 Teleporteert je naar je bed. +Item.Injured.Wait=Je bent recent gewond geraakt en je moet wachten om dit te gebruiken. &e({0}s) +Teleport.Commencing=&7Teleporteer poging in &6({0}) &7seconden, Sta stil AUB... +Skills.Disarmed=&4Je bent ontwapend! +Skills.NeedMore=&4Jij hebt te weinig &7{0} +Skills.TooTired=Jij bent te moe om die kracht opnieuw te gebruiken. &e({0}s) +Stats.Header.Combat=&6-=Strijd Ervaring=- +Stats.Header.Gathering=&6-=VERZAMELAAR VAARDIGHEDEN=- +Stats.Header.Misc=&6-=MISC ERVARING=- +Stats.Own.Stats=&a[mcMMO] Stats Perks.XP.Name=Ervaring Perks.XP.Desc=Ontvangt meer XP in bepaalde vaardigheden. Perks.Lucky.Name=Geluk -Perks.Lucky.Bonus=[[GOLD]] ({0} met Geluks Perk) +Perks.Lucky.Bonus=&6 ({0} met Geluks Perk) Perks.Cooldowns.Name=Snel Herstel Perks.Cooldowns.Desc=Vermindert de cooldown duur met {0}. Perks.ActivationTime.Name=Uithoudingsvermogen Perks.ActivationTime.Desc=Verhoogt het vermogen activering tijd met {0} seconden. Hardcore.Vampirism.Name=Vampirisme -MOTD.Donate=[[DARK_AQUA]]Donatie Info: -Smelting.SubSkill.FuelEfficiency.Name=Brandstof Effici\u00ebntie +MOTD.Donate=&3Donatie Info: +Smelting.SubSkill.FuelEfficiency.Name=Brandstof Efficiëntie Smelting.Listener=Smelten: Smelting.SkillName=SMELTEN Commands.Description.mcstats=Toon je mcMMO niveaus en XP -Commands.Description.party=Beheer verscheidene mcMMO groep instellingen +Commands.Description.party=Beheer verschillende mcMMO groep instellingen Commands.Description.ptp=Teleport naar een groepslid UpdateChecker.Outdated=U gebruikt een verouderde versie van mcMMO! UpdateChecker.NewAvailable=Er is een nieuwe versie beschikbaar op BukkitDev. @@ -429,3 +428,6 @@ Scoreboard.Misc.Level=Niveau Scoreboard.Misc.CurrentXP=Huidige XP Scoreboard.Misc.RemainingXP=Resterende XP Scoreboard.Misc.Overall=Globaal +Commands.XPBar.Usage=Proper usage is /mmoxpbar +Commands.Description.mmoxpbar=Player settings for mcMMO XP bars +Commands.Description.mmocompat=Information about mcMMO and whether or not its in compatibility mode or fully functional. diff --git a/src/main/resources/locale/locale_pl.properties b/src/main/resources/locale/locale_pl.properties index ea44c55fc..d62facf80 100644 --- a/src/main/resources/locale/locale_pl.properties +++ b/src/main/resources/locale/locale_pl.properties @@ -1,575 +1,1143 @@ -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]]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]]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= [[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= [[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] [[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= [[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 -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! +#I'm going to try to normalize our locale file, forgive the mess for now. + +#DO NOT USE COLOR CODES IN THE JSON KEYS +#COLORS ARE DEFINED IN advanced.yml IF YOU WISH TO CHANGE THEM +JSON.Rank=Ranga +JSON.DescriptionHeader=Opis +JSON.JWrapper.Header=Detale +JSON.Type.Passive=Pasywnie +JSON.Type.Active=Aktywne +JSON.Type.SuperAbility=Super umiejętność +JSON.Locked=-=[ZABLOKOWANE]=- +JSON.LevelRequirement=Wymagany poziom +JSON.JWrapper.Target.Type=Typ Celu: +JSON.JWrapper.Target.Block=Blok +JSON.JWrapper.Target.Player=Gracz +JSON.JWrapper.Perks.Header=&6Szczęśliwe Perki +JSON.JWrapper.Perks.Lucky={0}% Lepszej Szansy +JSON.Hover.Tips=Wskazówka +JSON.Acrobatics=Akrobatyka +JSON.Alchemy=Alchemia +JSON.Archery=Łucznictwo +JSON.Axes=Siekiery +JSON.Excavation=Wykopalisko +JSON.Fishing=Rybak +JSON.Herbalism=Zielarstwo +JSON.Mining=Górnictwo +JSON.Repair=Naprawiacz +JSON.Salvage=Odzyskiwacz +JSON.Swords=Miecze +JSON.Taming=Tresowanie +JSON.Unarmed=Niezręczność +JSON.Woodcutting=Drwal +JSON.URL.Website=Oficjalna strona mcMMO! +JSON.URL.Discord=Oficjalny discord mcMMO! +JSON.URL.Patreon=Wesprzyj nossr50 i jego projekt mcMMO na Patreon! +JSON.URL.Spigot=Oficjalna strona pluginu mcMMO na Spigot! +JSON.URL.Translation=Tłumaczenie mcMMO na inne języki! +JSON.URL.Wiki=Oficjalne wiki mcMMO! +JSON.SkillUnlockMessage=&6[ mcMMO&e @&3{0} &6Ranga &3{1}&6 Odblokowana! ] +JSON.Hover.Rank=&e&lRanga:&r &f{0} +JSON.Hover.NextRank=&7&oNastępne ulepszenie na poziomie {0} +# for JSON.Hover.Mystery you can add {0} to insert the level required into the name, I don't like how that looks so I'm not doing that atm +JSON.Hover.Mystery=&7??? +JSON.Hover.Mystery2=&e[&8{0}&e]&8???&r +JSON.Hover.SkillName=&3{0}&r +JSON.Hover.SuperAbility=&5{0}&r +JSON.Hover.MaxRankSkillName=&6{0}&r +JSON.Hover.AtSymbolSkills=&e@ +JSON.Hover.AtSymbolURL=&e@ + +#This is the message sent to players when an ability is activated +JSON.Notification.SuperAbility={0} + +#These are the JSON Strings used for SubSkills +JSON.Acrobatics.Roll.Interaction.Activated=Próba &cŁagodnego przewrotu +JSON.Acrobatics.SubSkill.Roll.Details.Tips=Jeśli będziesz kucał w czasie spadania, otrzymasz tylko połowę obrażeń! +Anvil.SingleItemStack=&cNie możesz odzyskać ani naprawić stosów przedmiotów, które zawierają więcej niż jeden przedmiot, najpierw podziel stos. + +#DO NOT USE COLOR CODES IN THE JSON KEYS +#COLORS ARE DEFINED IN advanced.yml IF YOU WISH TO CHANGE THEM + +mcMMO.Template.Prefix=&6(&amcMMO&6) &7{0} +# BEGIN STYLING +Ability.Generic.Refresh=&a**ODŚWIEŻONO UMIEJĘTNOŚCI!** +Ability.Generic.Template.Lock=&7{0} +# Skill Command Styling +Ability.Generic.Template=&3{0}: &a{1} +Ability.Generic.Template.Custom=&3{0} +Skills.Overhaul.Header=&c[]=====[]&a {0} &c[]=====[] 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. +Effects.SubSkills.Overhaul=Sub-umiejętności +Effects.Child.Overhaul=&3Child Lv.&e {0}&3: {1} +Effects.Child.ParentList=&a{0}&6(&3Lv.&e{1}&6) +Effects.Level.Overhaul=&6LVL: &e{0} &3XP&e(&6{1}&e/&6{2}&e) +Effects.Parent=&6{0} - +Effects.Template=&3{0}: &a{1} +Commands.Stats.Self.Overhaul=Statystyki +Commands.XPGain.Overhaul=&6ZYSK XP: &3{0} +MOTD.Version.Overhaul=&6[mcMMO] &3Era Remontu&6 - &3{0} +Overhaul.mcMMO.Header=&c[]=====[]&a mcMMO - Era Remontu &c[]=====[] +Overhaul.mcMMO.Url.Wrap.Prefix=&c[| +Overhaul.mcMMO.Url.Wrap.Suffix=&c|] +Overhaul.mcMMO.MmoInfo.Wiki=&e[&fZobacz tę umiejętność na wiki!&e] +# Overhaul.Levelup can take {0} - Skill Name defined in Overhaul.Name {1} - Amount of levels gained {2} - Level in skill +Overhaul.Levelup=&l{0} wzrosło/a do &r&a&l{2}&r&f. +Overhaul.Name.Acrobatics=Akrobatyka +Overhaul.Name.Alchemy=Alchemia +Overhaul.Name.Archery=Łucznictwo +Overhaul.Name.Axes=Siekiery +Overhaul.Name.Excavation=Wykopalisko +Overhaul.Name.Fishing=Rybak +Overhaul.Name.Herbalism=Zielarstwo +Overhaul.Name.Mining=Górnictwo +Overhaul.Name.Repair=Naprawiacz +Overhaul.Name.Salvage=Odzyskiwacz +Overhaul.Name.Smelting=Przepalanie +Overhaul.Name.Swords=Miecze +Overhaul.Name.Taming=Tresowanie +Overhaul.Name.Unarmed=Niezręczność +Overhaul.Name.Woodcutting=Drwal +# /mcMMO Command Style Stuff +Commands.mcc.Header=&c---[]&amcMMO Komendy&c[]--- +Commands.Other=&c---[]&aSPECJALNE KOMENDY&c[]--- +Commands.Party.Header=&c-----[]&aDRUŻYNA&c[]----- +Commands.Party.Features.Header=&c-----[]&aFUNKCJE&c[]----- +# XP BAR Allows for the following variables -- {0} = Skill Level, {1} Current XP, {2} XP Needed for next level, {3} Power Level, {4} Percentage of Level +# Make sure you turn on Experience_Bars.ThisMayCauseLag.AlwaysUpdateTitlesWhenXPIsGained if you want the XP bar title to update every time a player gains XP! +XPBar.Template={0} +XPBar.Template.EarlyGameBoost=&6Nauka nowej umiejętności... +XPBar.Acrobatics=Akrobatyka Lv.&6{0} +XPBar.Alchemy=Alchemia Lv.&6{0} +XPBar.Archery=Łucznictwo Lv.&6{0} +XPBar.Axes=Siekiery Lv.&6{0} +XPBar.Excavation=Wykopalisko Lv.&6{0} +XPBar.Fishing=Rybak Lv.&6{0} +XPBar.Herbalism=Zielarstwo Lv.&6{0} +XPBar.Mining=Górnictwo Lv.&6{0} +XPBar.Repair=Naprawiacz Lv.&6{0} +XPBar.Salvage=Odzyskiwacz Lv.&6{0} +XPBar.Smelting=Przepalanie Lv.&6{0} +XPBar.Swords=Miecze Lv.&6{0} +XPBar.Taming=Tresowanie Lv.&6{0} +XPBar.Unarmed=Niezręczność Lv.&6{0} +XPBar.Woodcutting=Drwal Lv.&6{0} +#This is just a preset template that gets used if the 'ExtraDetails' setting is turned on in experience.yml (off by default), you can ignore this template and just edit the strings above +XPBar.Complex.Template={0} &3 {4}&f% &3(&f{1}&3/&f{2}&3) +# XP BAR Allows for the following variables -- {0} = Skill Level, {1} Current XP, {2} XP Needed for next level, {3} Power Level, {4} Percentage of Level +# Make sure you turn on Experience_Bars.ThisMayCauseLag.AlwaysUpdateTitlesWhenXPIsGained if you want the XP bar title to update every time a player gains XP! +# END STYLING + +#ACROBATICS +Acrobatics.Ability.Proc=&a**Łaskawe Lądowanie** +Acrobatics.Combat.Proc=&a**Unik** +Acrobatics.SubSkill.Roll.Stats=&6Szansa na &e{0}%&6 Szansa na łąske&e {1}% +Acrobatics.SubSkill.Roll.Stat=Szansa na Przewrót +Acrobatics.SubSkill.Roll.Stat.Extra=Szansa na Łagodny Przewrót +Acrobatics.SubSkill.Roll.Name=Przewrót +Acrobatics.SubSkill.Roll.Description=Wyląduj strategicznie, aby uniknąć uszkodzeń. +Acrobatics.SubSkill.Roll.Chance=Szansa na Przewrót: &e{0} +Acrobatics.SubSkill.Roll.GraceChance=Szansa na łagodny przewrót: &e{0} +Acrobatics.SubSkill.Roll.Mechanics=&7Przewrót to biernie aktywna Sub-Umiejętność.\nZawsze kiedy otrzymujesz obrażenia od wysokości, jest szansa, że zostaną one zredukowane bazując na poziomie umiejętności, na poziomie &e{6}%&7 masz &e{0}%&7 szansy na zablokowanie obrażeń, i &e{1}%&7 jeśli aktywujesz łagony przewrót.\nSzansa na sukces jest skalowana w zależności od twojego poziomu umiejętności na liniowej krzywej, aż do poziomu &e{2}&7 gdzie osiąga maximum, każdy poziom akrobatyki daje Ci &e{3}%&7 szansy na sukces.\nPrzytrzymując przycisk skradania się, możesz podwoić swoje szanse, aby uniknąć obrażeń od upadku! Przytrzymywanie shiftu zamienia Przewrót na Łagodny Przewrót. +Acrobatics.SubSkill.GracefulRoll.Name=Łagodny przewrót +Acrobatics.SubSkill.GracefulRoll.Description=Podwaja efekt normalnego przewrotu. +Acrobatics.SubSkill.Dodge.Name=Unik +Acrobatics.SubSkill.Dodge.Description=Redukuje obrażenia od ataku o połowę +Acrobatics.SubSkill.Dodge.Stat=Szansa na Unik +Acrobatics.Listener=Akrobatyka: +Acrobatics.Roll.Text=&o**Przewrót** +Acrobatics.SkillName=AKROBATYKA +#ALCHEMY +Alchemy.SubSkill.Catalysis.Name=Kataliza +Alchemy.SubSkill.Catalysis.Description=Zwiększa szybkość warzenia mikstur. +Alchemy.SubSkill.Catalysis.Stat=Szybkość warzenia mikstur. +Alchemy.SubSkill.Concoctions.Name=Mikstury +Alchemy.SubSkill.Concoctions.Description=Warz mikstury z większą ilością składników. +Alchemy.SubSkill.Concoctions.Stat=Ranking mikstur: &a{0}&3/&a{1} +Alchemy.SubSkill.Concoctions.Stat.Extra=Składniki [&a{0}&3]: &a{1} +Alchemy.Listener=Alchemia: +Alchemy.Ability.Locked.0=ZABLOKOWANE DO {0}+ UMIEJĘTNOŚCI (KATALIZA) +Alchemy.SkillName=ALCHEMIA +#ARCHERY + + +Archery.SubSkill.SkillShot.Name=Umiejętne strzelanie +Archery.SubSkill.SkillShot.Description=Zwiększa obrażenia zadawane łukiem +Archery.SubSkill.SkillShot.Stat=Premia do obrażeń od łuku +Archery.SubSkill.Daze.Name=Oszołomienie +Archery.SubSkill.Daze.Description=Oszałamia wroga i zadaje dodatkowe obrażenia +Archery.SubSkill.Daze.Stat=Szansa na oszołomienie +Archery.SubSkill.ArrowRetrieval.Name=Odzyskiwanie strzał +Archery.SubSkill.ArrowRetrieval.Description=Szansa na odzyskanie strzał ze zwłok +Archery.SubSkill.ArrowRetrieval.Stat=Szansa na odzyskanie strzały +Archery.SubSkill.ArcheryLimitBreak.Name=Przełamywanie granic łucznictwa +Archery.SubSkill.ArcheryLimitBreak.Description=Przełam swoje limity. Znacznie zwiększa obrażenia zadawane przeciwnikom! +Archery.SubSkill.ArcheryLimitBreak.Stat=Maksymalne obrażenia Przełamywanie Limitów. +Archery.Listener=Łucznictwo: +Archery.SkillName=ŁUCZNICTWO +#AXES +Axes.Ability.Bonus.0=Mistrz Siekiery +Axes.Ability.Bonus.1=Bonusowe {0} obrażeń +Axes.Ability.Bonus.2=Uderzenie zbroi +Axes.Ability.Bonus.3=Zadaje {0} dodatkowych obrażeń zbroi +Axes.Ability.Bonus.4=Większy Wpływ +Axes.Ability.Bonus.5=Zadaje {0} dodatkowych obrażeń przeciwnikom bez zbroi. +Axes.Ability.Lower=&7Opuszczasz swój topór. +Axes.Ability.Ready=&6Przygotuj&3 swój topór. +Axes.Ability.Ready.Extra=&6Przygotuj&3 swój topór. &7({0} pozostało {1}s czasu odnowienia) +Axes.Combat.CritStruck=&4Zostałeś KRYTYCZNIE trafiony! +Axes.Combat.CriticalHit=KRYTYCZNE UDERZENIE! +Axes.Combat.GI.Proc=&a**UDERZAJ Z WIELKĄ SIŁĄ** +Axes.Combat.GI.Struck=**UDERZENIE Z WIĘKSZYM WPŁYWEM** +Axes.Combat.SS.Struck=&4Uderzono przez PRZECINACZ CZASZEK! +Axes.SubSkill.SkullSplitter.Name=Przecinacz czaszek +Axes.SubSkill.SkullSplitter.Description=Zadaje obrażenia AoE +Axes.SubSkill.SkullSplitter.Stat=Trwanie Przecinacza Czaszek +Axes.SubSkill.CriticalStrikes.Name=Trafienie krytyczne +Axes.SubSkill.CriticalStrikes.Description=Podwójne obrażenia +Axes.SubSkill.CriticalStrikes.Stat=Szansa na trafienie krytyczne +Axes.SubSkill.AxeMastery.Name=Mistrz Siekiery +Axes.SubSkill.AxeMastery.Description=Dodaje dodatkowe obrażenia +Axes.SubSkill.AxesLimitBreak.Name=Przełamanie limitów siekier +Axes.SubSkill.AxesLimitBreak.Description=Przełamujesz swoje granice. Zwiększa obrażenia zadawane przeciwnikom. +Axes.SubSkill.AxesLimitBreak.Stat=Maksymalne obrażenia Przełamanie Limitów +Axes.SubSkill.ArmorImpact.Name=Uderzenie pancerza +Axes.SubSkill.ArmorImpact.Description=Uderzenie z siłą wystarczającą do zniszczenia zbroi +Axes.SubSkill.GreaterImpact.Name=Większy wpływ +Axes.SubSkill.GreaterImpact.Description=Zadaje dodatkowe obrażenia dla bytów bez zbroi. +Axes.Listener=Siekiery: +Axes.SkillName=SIEKIERY +Axes.Skills.SS.Off=**Przecinacz Czaszek został zużyty** +Axes.Skills.SS.On=&a**Przecinacz Czaszek AKTYWOWANY** +Axes.Skills.SS.Refresh=&aTwój &ePrzecinacz Czaszek &azostał odświeżony! +Axes.Skills.SS.Other.Off=Przecinacz czaszek został zużyty na &e{0} +Axes.Skills.SS.Other.On=&a{0}&2 użył &cPrzecinacz Czaszek! +#EXCAVATION +Excavation.Ability.Lower=&7Opuszczasz swoją łopatę. +Excavation.Ability.Ready=&6Przygotowujesz&3 swoją Łopatę. +Excavation.SubSkill.GigaDrillBreaker.Name=Giga Wiertłol +Excavation.SubSkill.GigaDrillBreaker.Description=3x Częstotliwość dropu, 3x EXP, +Prędkość +Excavation.SubSkill.GigaDrillBreaker.Stat=Czas odnowienia Giga Wiertła +Excavation.SubSkill.Archaeology.Name=Archeologia +Excavation.SubSkill.Archaeology.Description=Odkryj tajemnice tego świata! Wysokie poziomy umiejętności zwiększają Twoje szanse na znalezienie kul doświadczenia, gdy znajdziesz skarb! +Excavation.SubSkill.Archaeology.Stat=Szansa Archeologii na kulę doświadczenia +Excavation.SubSkill.Archaeology.Stat.Extra=Liczba z Archeologii na kulę doświadczenia +Excavation.Listener=Wykopalisko: +Excavation.SkillName=WYKOPALISKO +Excavation.Skills.GigaDrillBreaker.Off=**Giga Wiertło przestało działać** +Excavation.Skills.GigaDrillBreaker.On=&a**GIGA WIERTŁO AKTYWOWANO** +Excavation.Skills.GigaDrillBreaker.Refresh=&aTwoja umiejętność &eGiga Wiertło &azostała odświeżona! +Excavation.Skills.GigaDrillBreaker.Other.Off=Giga Wiertło&a przestało działać na &e{0} +Excavation.Skills.GigaDrillBreaker.Other.On=&a{0}&2 użył/a &cGiga Wiertło! +#FISHING +Fishing.ScarcityTip=&e&oTen obszar cierpi z powodu przełowienia. Zarzuć wędkę w inne miejsce, aby złowić więcej ryb. Co najmniej {0} bloki dalej. +Fishing.Scared=&7&oChaotyczne ruchy odstraszają ryby! +Fishing.Exhausting=&c&oNiewłaściwe użycie wędki spowoduje zmęczenie i zużycie wędki! +Fishing.LowResourcesTip=&7Wyczuwasz, że na tym obszarze nie zostało wiele ryb. Spróbuj łowić co najmniej {0} bloki dalej. +Fishing.Ability.Info=Magic Hunter: &7 **Ulepsz z rangą Łowca Nagród** +Fishing.Ability.Locked.0=ZABLOKOWANE DO {0}+ UMIEJĘTNOŚĆ (POTRZĄSANIE) +Fishing.Ability.Locked.1=ZABLOKOWANE DO {0}+ UMIEJĘTNOŚĆ (MROŹNE POŁOWY) +Fishing.Ability.Locked.2=ZABLOKOWANE DO {0}+ UMIEJĘTNOŚĆ (MISTRZ ŁOWIENIA) +Fishing.SubSkill.TreasureHunter.Name=Łowca Nagród +Fishing.SubSkill.TreasureHunter.Description=Fish up misc. objects +Fishing.SubSkill.TreasureHunter.Stat=Ranga Łowcy Nagród: &a{0}&3/&a{1} +Fishing.SubSkill.TreasureHunter.Stat.Extra=Częstotliwość dropu: &7Zwykłe: &e{0} &aNiezwykłe: &e{1}\n&9Rzadkie: &e{2} &dEpickie: &e{3} &6Legendarne: &e{4} &bMityczne: &e{5} +Fishing.SubSkill.MagicHunter.Name=Łowca Magii +Fishing.SubSkill.MagicHunter.Description=Znajdź zaklęte przedmioty +Fishing.SubSkill.MagicHunter.Stat=Szansa łowcy magii +Fishing.SubSkill.Shake.Name=Potrząsanie +Fishing.SubSkill.Shake.Description=Strząśnij przedmioty z mobów lub wędki gracza. +Fishing.SubSkill.Shake.Stat=Szansa na Potrząśnięcie +Fishing.SubSkill.FishermansDiet.Name=Dieta rybaka +Fishing.SubSkill.FishermansDiet.Description=Poprawia głód przywracany z ryb +Fishing.SubSkill.FishermansDiet.Stat=Ranga Diety Rybaka:&a {0} +Fishing.SubSkill.MasterAngler.Name=Mistrz wędkarstwa +Fishing.SubSkill.MasterAngler.Description=Ryby łowione są częściej, lepiej sprawdza się podczas łowienia z łodzi. +Fishing.SubSkill.MasterAngler.Stat=Skrócenie czasu oczekiwania na wędkowanie: &a-{0} seconds +Fishing.SubSkill.MasterAngler.Stat.Extra=Skrócenie maksymalnego czasu oczekiwania na wędkowanie: &a-{0} seconds +Fishing.SubSkill.IceFishing.Name=Ice Fishing +Fishing.SubSkill.IceFishing.Description=Pozwala łowić w lodowatych biomach +Fishing.SubSkill.IceFishing.Stat=Mroźne Połowy +Fishing.Chance.Raining=&9 Premia za deszcz +Fishing.Listener=Wędkarstwo: +Fishing.Ability.TH.MagicFound=&7Z tym haczykiem czujesz odrobinę magii... +Fishing.Ability.TH.Boom=&7BOOM TIME!!! +Fishing.Ability.TH.Poison=&7 +Fishing.SkillName=WĘDKARSTWO +#HERBALISM +Herbalism.Ability.GTe.NeedMore=Potrzebujesz więcej nasion, aby rozprzestrzenić Zielona Tera. +Herbalism.Ability.GTh.Fail=**ZIELONA TERA ZAWODZI** +Herbalism.Ability.GTh=&a**ZIELONY LĄD** +Herbalism.Ability.Lower=&7Opuszczasz swoją motykę. +Herbalism.Ability.Ready=&6Przygotowujesz&3 swoją motykę. +Herbalism.Ability.ShroomThumb.Fail=**HALUCYNKI ZAWODZĄ** +Herbalism.SubSkill.GreenTerra.Name=Zielony Ląd +Herbalism.SubSkill.GreenTerra.Description=Rozprzestrzeń Terrę, 3x Drops, Boosts Green Thumb +Herbalism.SubSkill.GreenTerra.Stat=Czas odnowienia Zielonej Terry +Herbalism.SubSkill.GreenThumb.Name=Zielona Rączka +Herbalism.SubSkill.GreenThumb.Description=Automatycznie sadzi nasiona, kiedy uprawisz ziemię. +Herbalism.SubSkill.GreenThumb.Stat=Szansa na Zielona Rączka +Herbalism.SubSkill.GreenThumb.Stat.Extra=Etap Zielonej Rączki: &a Uprawy rosną w fazie {0} +Herbalism.Effect.4=Zielona Rączka (Bloki) +Herbalism.SubSkill.GreenThumb.Description.2=Spraw, aby cegły były omszałe lub spraw, aby trawa urosła +Herbalism.SubSkill.FarmersDiet.Name=Dieta Farmera +Herbalism.SubSkill.FarmersDiet.Description=Zwiększa głód przywracany z żywności uprawianej +Herbalism.SubSkill.FarmersDiet.Stat=Ranga Diety Farmera: &a {0} +Herbalism.SubSkill.DoubleDrops.Name=Podwójny łup +Herbalism.SubSkill.DoubleDrops.Description=Podwaja normalny łup +Herbalism.SubSkill.DoubleDrops.Stat=Szansa na podwójny drop +Herbalism.SubSkill.HylianLuck.Name=Wielkie Szczęście +Herbalism.SubSkill.HylianLuck.Description=Daje niewielką szansę na znaleźenie rzadkich przedmiotów +Herbalism.SubSkill.HylianLuck.Stat=Szansa na Wielkie Szczęście +Herbalism.SubSkill.ShroomThumb.Name=Halucynki +Herbalism.SubSkill.ShroomThumb.Description=Rozłóż grzybnię na ziemi i trawie +Herbalism.SubSkill.ShroomThumb.Stat=Szansa na Halucynki +Herbalism.HylianLuck=&aSzczęście Hyrule jest dziś z tobą! +Herbalism.SkillName=ZIELARSTWO +Herbalism.Skills.GTe.Off=**Zielona Terra wyłączyła się** +Herbalism.Skills.GTe.On=&a**ZIELONA TERRA AKTYWOWANA** +Herbalism.Skills.GTe.Refresh=&aTwoja umiejętność &eZielona Terra &azostała odświeżona! +Herbalism.Skills.GTe.Other.Off=Zielona Terra&a została wyłączona na &e{0} +Herbalism.Skills.GTe.Other.On=&a{0}&2 użył/a &cZielona Terra! +#MINING +Mining.Ability.Locked.0=ZABLOKOWANE DO {0}+ UMIEJĘTNOŚĆ (PODMUCH GÓRNICTWA) +Mining.Ability.Locked.1=ZABLOKOWANE DO {0}+ UMIEJĘTNOŚĆ (WIĘKSZE BOMBY) +Mining.Ability.Locked.2=ZABLOKOWANE DO {0}+ UMIEJĘTNOŚĆ (EKSPERTYZY ROZBIÓRKI) +Mining.Ability.Lower=&7Opuszczasz swój kilof. +Mining.Ability.Ready=&6Przygotowujesz&3 swój kilof. +Mining.SubSkill.SuperBreaker.Name=Super Niszczyciel +Mining.SubSkill.SuperBreaker.Description=Prędkość+, Szansa na potrójny łup +Mining.SubSkill.SuperBreaker.Stat=Trwanie: Super Niszczyciel +Mining.SubSkill.DoubleDrops.Name=Podwójny drop +Mining.SubSkill.DoubleDrops.Description=Podwaja normalny łup +Mining.SubSkill.DoubleDrops.Stat=Podwójna szansa na upuszczenie łupu +Mining.SubSkill.BlastMining.Name=Podmuch Górnictwa +Mining.SubSkill.BlastMining.Description=Premie do wydobywania z TNT +Mining.SubSkill.BlastMining.Stat=Ranga Podmuchu Górnictwa:&a {0}/{1} &7({2}) +Mining.SubSkill.BlastMining.Stat.Extra=Dodatkowy Zasięg Podmuchu Górnictwa: &a+{0} +Mining.SubSkill.BiggerBombs.Name=Większe bomby +Mining.SubSkill.BiggerBombs.Description=Zwiększa promień wybuchu +Mining.SubSkill.DemolitionsExpertise.Name=Ekspertyza Rozbiórki +Mining.SubSkill.DemolitionsExpertise.Description=Zmniejsza obrażenia zadawane TNT +Mining.SubSkill.DemolitionsExpertise.Stat=Zmniejszenie obrażeń od Eksperyza Rozbiórki +Mining.Listener=Górnictwo: +Mining.SkillName=GÓRNICTWO +Mining.Skills.SuperBreaker.Off=**Super Niszczyciel wyłączył się** +Mining.Skills.SuperBreaker.On=&a**SUPER NISZCZYCIEL AKTYWOWANY** +Mining.Skills.SuperBreaker.Other.Off=Super Niszczyciel&a wyłączył się na for &e{0} +Mining.Skills.SuperBreaker.Other.On=&a{0}&2 użył &cSuper Niszczyciel! +Mining.Skills.SuperBreaker.Refresh=&aTwoja umiejętność &eSuper Niszczyciel &azostała odświeżona! +#Blast Mining +Mining.Blast.Boom=&7**BOOM** +Mining.Blast.Cooldown= +Mining.Blast.Effect=+{0} ore yield, {1}x drops +Mining.Blast.Other.On=&a{0}&2 has used &cBlast Mining! +Mining.Blast.Refresh=&aYour &eBlast Mining &aability is refreshed! +#REPAIR +Repair.SubSkill.Repair.Name=Naprawa +Repair.SubSkill.Repair.Description=Naprawa Narzędzi i Zbroi +Repair.SubSkill.GoldRepair.Name=Naprawa Złota ({0}+ UMIEJĘTNOŚĆ) +Repair.SubSkill.GoldRepair.Description=Naprawa złotych narzędzi & zbroi +Repair.SubSkill.IronRepair.Name=Naprawa Żelaza ({0}+ UMIEJĘTNOŚĆ) +Repair.SubSkill.IronRepair.Description=Naprawa żelaznych narzędzi & zbroi +Repair.SubSkill.StoneRepair.Name=Naprawa Kamienia ({0}+ UMIEJĘTNOŚĆ) +Repair.SubSkill.StoneRepair.Description=Naprawa kamiennych narzędzi +Repair.SubSkill.RepairMastery.Name=Mistrz napraw +Repair.SubSkill.RepairMastery.Description=Zwiększona kwota naprawy +Repair.SubSkill.RepairMastery.Stat=Mistrz napraw: &aDodatkowo przywrócono {0} wytrzymałości. +Repair.SubSkill.SuperRepair.Name=Super Naprawa +RepairRepair.SubSkill.SuperRepair.Description=Podwojona skuteczność +Repair.SubSkill.SuperRepair.Stat=Szansa na Super Naprawę +Repair.SubSkill.DiamondRepair.Name=Naprawa Diamentów ({0}+ SKILL) +Repair.SubSkill.DiamondRepair.Description=Napraw diamentowe narzędzia i zbroję +Repair.SubSkill.ArcaneForging.Name=Tajemne Fałszowanie +Repair.SubSkill.ArcaneForging.Description=Naprawa magicznych przedmiotów +Repair.SubSkill.ArcaneForging.Stat=Ranga Tajemnego Fałszowania: &e {0}/{1} +Repair.SubSkill.ArcaneForging.Stat.Extra=&3Szansa na Tajemne Fałszowanie:&7 Powodzenie: &a{0}&7%, Niepowodzenie: &c{1}&7% +Repair.Error=&4mcMMO napotkał błąd podczas próby naprawy tego przedmiotu! +Repair.Listener.Anvil=&4r Umieściłeś kowadło, kowadła mogą naprawiać narzędzia i zbroję. +Repair.Listener=Naprawianie: +Repair.SkillName=NAPRAWIANIE +Repair.Skills.AdeptDiamond=&4Nie masz wystarczających umiejętności, aby naprawić Diament. +Repair.Skills.AdeptGold=&4Nie masz wystarczających umiejętności, aby naprawić złoto. +Repair.Skills.AdeptIron=&4Nie masz wystarczających umiejętności, aby naprawić żelazo. +Repair.Skills.AdeptStone=&4Nie masz wystarczających umiejętności, aby naprawić Stone. +Repair.Skills.Adept=&cMusisz mieć &e{0}&c poziom, aby naprawić &e{1} +Repair.Skills.FeltEasy=&7To było łatwe. +Repair.Skills.FullDurability=&7To znaczy przy pełnej trwałości. +Repair.Skills.StackedItems=&4Nie możesz naprawiać ułożonych w stos przedmiotów. +Repair.Pretty.Name=Naprawianie +#Arcane Forging +Repair.Arcane.Downgrade=W przypadku tego przedmiotu zmniejszono tajemną moc. +Repair.Arcane.Fail=Tajemna moc na stałe opuściła przedmiot. +Repair.Arcane.Lost=Nie miałeś wystarczających umiejętności, aby zachować jakiekolwiek zaklęcia. +Repair.Arcane.Perfect=&aUtrzymałeś/aś tajemną moc w tym przedmiocie. +#SALVAGE +Salvage.Pretty.Name=Odzyskiwanie +Salvage.SubSkill.UnderstandingTheArt.Name=Zrozumieć sztukę +Salvage.SubSkill.UnderstandingTheArt.Description=Nie tylko przekopujesz śmieci sąsiadów, ale także dbasz o środowisko. +\nWzmacnia różne właściwości Odzyskiwacza. +Salvage.SubSkill.ScrapCollector.Name=Zbieracz złomu +Salvage.SubSkill.ScrapCollector.Description=Odzyskaj materiały z przedmiotu, idealne odzyskanie zależy od umiejętności i szczęścia. +Salvage.SubSkill.ScrapCollector.Stat=Zbieracz złomu: &aOdzyskaj do & e {0} & jednej rzeczy. W grę wchodzi trochę szczęścia. +Salvage.SubSkill.ArcaneSalvage.Name=Tajemne odzyskiwanie +Salvage.SubSkill.ArcaneSalvage.Description=Wydobywaj zaklęcia z przedmiotów +Salvage.SubSkill.ArcaneSalvage.Stat=Ranga Tajemnego odzyskiwania: &e {0}/{1} +Salvage.Ability.Bonus.0=Zbieracz złomu +Salvage.Ability.Bonus.1= +Salvage.Arcane.ExtractFull=&7 Szansa na pełne zaklęcia +Salvage.Arcane.ExtractPartial=&7 Szansa na częściowe zaklęcia +Salvage.Skills.Success=&aOdzyskano przedmiot! +Salvage.Skills.Adept.Damaged=&4Nie masz wystarczających umiejętności, aby odzyskać uszkodzone przedmioty. +Salvage.Skills.Adept.Level=Musisz być na poziomie & e {0} & c, aby odzyskać & e {1} +Salvage.Skills.TooDamaged=&4Ten przedmiot jest zbyt uszkodzony, aby go uratować. +Salvage.Skills.ArcaneFailed=&cNie udało Ci się wydobyć wiedzy zawartej w tym elemencie. +Salvage.Skills.ArcanePartial=&cUdało Ci się tylko wydobyć część wiedzy zawartej w tym elemencie. +Salvage.Skills.ArcaneSuccess=&aJesteś w stanie wydobyć całą wiedzę zawartą w tym elemencie! +Salvage.Listener.Anvil=&4Umieściłeś/aś kowadło, użyj go do zbroi i narzędzi. +Salvage.Listener=Odzyskiwanie: +Salvage.SkillName=ODZYSKIWANIE +Salvage.Skills.Lottery.Normal=&6Udało Ci się odzyskać & 3 {0} & 6 materiałów z & e {1} & 6. +Salvage.Skills.Lottery.Perfect=&a&lPerfekcyjnie! & r & 6 Odzyskałeś/aś & 3 {1} & 6 bez wysiłku, odzyskując & 3 {0} & 6 materiałów. +Salvage.Skills.Lottery.Untrained=&7Nie jesteś odpowiednio przeszkolony w odzyskiwaniu. Udało Ci się odzyskać tylko & c {0} & 7 materiałów z & a {1} & 7. +#Anvil (Shared between SALVAGE and REPAIR) +Anvil.Unbreakable=Ten przedmiot jest niezniszczalny! +#SWORDS +Swords.Ability.Lower=&7Opuszczasz swój miecz. +Swords.Ability.Ready=&6Przygotowujesz&3 swój miecz. +Swords.Combat.Rupture.Note=&7NOTATKA: &ePęknięcie to okresowe obrażenia, które są zadawane 2 razy na sekunde oraz omijają one zbroję! +Swords.Combat.Bleeding.Started=&4 Krwawisz! +Swords.Combat.Bleeding.Stopped=&7Krwawienie już się zatrzymało&7! +Swords.Combat.Bleeding=&a**PRZECIWNIK KRWAWI** +Swords.Combat.Counter.Hit=&4Zaatakuj kontraatakiem! +Swords.Combat.Countered=&a**KONTRAATAK** +Swords.Combat.SS.Struck=&4Uderzone ZWĘZŁYMI STRIKAMI! +Swords.SubSkill.CounterAttack.Name=Kontratak +Swords.SubSkill.CounterAttack.Description=Odbij część obrażeń, gdy zostaniesz zaatakowany! +Swords.SubSkill.CounterAttack.Stat=Szansa na kontratak +Swords.SubSkill.SerratedStrikes.Name=Ząbkowane uderzenia +Swords.SubSkill.SerratedStrikes.Description=Zadaje dodatkowe obrażenia AoE z szansą na Potężne krwawienie! +Swords.SubSkill.SerratedStrikes.Stat=Ząbkowana długość uderzeń +Swords.SubSkill.Rupture.Name=Potężne krwawienie +Swords.SubSkill.Rupture.Description=Zastosuj potężne krwawienie DoT +Swords.SubSkill.Stab.Name=Sztylet +Swords.SubSkill.Stab.Description=Dodaje dodatkowe obrażenia do twoich ataków. +Swords.SubSkill.Stab.Stat=Obrażenia dźgnięcia +Swords.SubSkill.SwordsLimitBreak.Name=Przełamywanie limitów miecza +Swords.SubSkill.SwordsLimitBreak.Description=Przełamywanie limitów. Zwiększone obrażenia zadawane trudnym przeciwnikom. Przeznaczony dla PVP, zależnie od ustawień serwera, czy zwiększy obrażenia w PVE, czy nie. +Swords.SubSkill.SwordsLimitBreak.Stat=Przełamywanie limitów max obrażeń +Swords.SubSkill.Rupture.Stat=Szansa na Rozerwanie +Swords.SubSkill.Rupture.Stat.Extra=[[DARK_AQUA]]Czas Rozerwania: &a{0}s przeciwko Graczom, {1}s przeciwko Mobom. +Swords.SubSkill.Rupture.Stat.TickDamage=[[DARK_AQUA]]Obrażenia Rozerwania na tik: &e{0}&a przeciwko Graczom, &e{1}&a przeciwko Mobom. +Swords.SubSkill.Rupture.Stat.ExplosionDamage=[[DARK_AQUA]]Obrażenia eksplozji Rozerwania: &e{0}&a przeciwko Graczom, &e{1}&a przeciwko Mobom. +Swords.Effect.4=Krwawienie+ ząbkowane uderzenia +Swords.Effect.5={0} Tick Rupture +Swords.Listener=Miecze: +Swords.SkillName=MIECZE +Swords.Skills.SS.Off=**Ząbkowane Uderzenia przestały działać** +Swords.Skills.SS.On=&a**AKTYWOWANE ZĄBKOWANE UDERZENIA** +Swords.Skills.SS.Refresh=&aTwoje &eZąbkowane uderzenia zostały odświeżone! +Swords.Skills.SS.Other.Off=Ząbkowane uderzenia & a przestały działać na & e {0} +Swords.Skills.SS.Other.On=&a{0}&2użył & cZąbkowane uderzenia! +#TAMING +Taming.Ability.Bonus.0=Przyjazny środowisku +Taming.Ability.Bonus.1=Wilki unikają niebezpieczeństwa +Taming.Ability.Bonus.2=Grube futro +Taming.Ability.Bonus.3=1/{0} Obrażeń, odporność na ogień +Taming.Ability.Bonus.4=Odporność na wstrząsy +Taming.Ability.Bonus.5=Materiały wybuchowe zadają 1/{0} normalnych obrażeń +Taming.Ability.Bonus.6=Zaostrzone pazury +Taming.Ability.Bonus.7=+{0} Obrażeń +Taming.Ability.Bonus.8=Usługi Fast Food +Taming.Ability.Bonus.9={0} Szansy na uleczenie przy ataku +Taming.Ability.Bonus.10=Nieskalany Pies +Taming.Ability.Bonus.11=Odzyskuje zdrowie, gdy zostanie zraniony przez magię lub truciznę +Taming.Ability.Locked.0=ZABLOKOWANE DO {0}+ UMIEJĘTNOŚĆ (PRZYJAZNY ŚRODOWISKU) +Taming.Ability.Locked.1=ZABLOKOWANE DO {0}+ UMIEJĘTNOŚĆ (GRUBE FUTRO) +Taming.Ability.Locked.2=ZABLOKOWANE DO {0}+ UMIEJĘTNOŚĆ (ODPORNOŚĆ NA WSTRZĄSY) +Taming.Ability.Locked.3=ZABLOKOWANE DO {0}+ UMIEJĘTNOŚĆ (ZAOSTRZONE PAZURY) +Taming.Ability.Locked.4=ZABLOKOWANE DO {0}+UMIEJĘTNOŚĆ (SERWIS FAST FOOD) +Taming.Ability.Locked.5=ZABLOKOWANE DO {0}+ UMIEJĘTNOŚĆ (NIESKALANY PIES) +Taming.Combat.Chance.Gore=Szansa na Przelew Krwi +Taming.SubSkill.BeastLore.Name=Wiedza Bestii +Taming.SubSkill.BeastLore.Description=Walenie kością kontroluje koty i psy. +Taming.SubSkill.ShockProof.Name=Odporność na wstrząsy +Taming.SubSkill.ShockProof.Description=Redukcja obrażeń od wybuchu +Taming.SubSkill.CallOfTheWild.Name=Zew natury +Taming.SubSkill.CallOfTheWild.Description=Wzywa zwierze na Twoją stronę +Taming.SubSkill.CallOfTheWild.Description.2=&7Zew natury: Kucnij i kliknij lewym przyciskiem myszy \n {0} {1} (Kot), {2} {3} (Pies), {4} {5} (Koń) +Taming.SubSkill.FastFoodService.Name=Serwis Fast Food +Taming.SubSkill.FastFoodService.Description=Szansa wilków na uleczenie przy ataku +Taming.SubSkill.HolyHound.Name=Nieskalany Pies +Taming.SubSkill.HolyHound.Description=Uleczono przez Magię & Truciznę +Taming.SubSkill.Gore.Name=Przelew Krwi +Taming.SubSkill.Gore.Description=Krytyczne Uderzenie, które nakłada Rozerwanie. +Taming.SubSkill.SharpenedClaws.Name=Zaostrzone pazury +Taming.SubSkill.SharpenedClaws.Description=Dodatkowe obrażenia +Taming.SubSkill.EnvironmentallyAware.Name=Przyjazny środowisku +Taming.SubSkill.EnvironmentallyAware.Description=Kaktus/Lawa Fobia, Odporny na obrażenia od upadku. +Taming.SubSkill.ThickFur.Name=Grube futro +Taming.SubSkill.ThickFur.Description=Redukcja obrażeń, Odporność na ogień +Taming.SubSkill.Pummel.Name=Odepchnięcie +Taming.SubSkill.Pummel.Description=Twoje wilki mają szansę odepchnąć wrogów +Taming.SubSkill.Pummel.TargetMessage=Zostałeś/aś odepchnięty przez wilka! +Taming.Listener.Wolf=&8Twój wilk wraca do Ciebie... +Taming.Listener=Tresowanie: +Taming.SkillName=TRESOWANIE +Taming.Summon.COTW.Success.WithoutLifespan=&a(Zew natury) &7Wezwałeś/aś &6{0}&7 +Taming.Summon.COTW.Success.WithLifespan=&a(Zew natury) &7Wezwałeś/aś &6{0}&7 na czas &6{1}&7 sekund. +Taming.Summon.COTW.Limit=&a(Zew natury) &7Możesz mieć tylko &c{0} &7wezwanych &7{1} w tym samym czasie. +Taming.Summon.COTW.TimeExpired=&a(Zew natury) &7Czas się skończył, Twój &6{0}&7 odlatuje. +Taming.Summon.COTW.Removed=&a(Zew natury) &7Twój przywołany &6{0}&7 zniknął z tego świata :c +Taming.Summon.COTW.BreedingDisallowed=&a(Zew natury) &cNie możesz rozmnażać przywołanego zwierzęcia. +Taming.Summon.COTW.NeedMoreItems=&a(Zew natury) &7Potrzebujesz więcej &e{0}&7 o &3{1}&7(s) +Taming.Summon.Name.Format=&6(Zew natury) &f{0}'s {1} +#UNARMED +Unarmed.Ability.Bonus.0=Steel Arm Style +Unarmed.Ability.Bonus.1=+{0} DMG Upgrade +Unarmed.Ability.IronGrip.Attacker=Twój przeciwnik ma żelazny uścisk! +Unarmed.Ability.IronGrip.Defender=&aTwój żelazny uścisk uchronił cię przed rozbrojeniem! +Unarmed.Ability.Lower=&7Opuszczasz pięści. +Unarmed.Ability.Ready=&3You &6ready&3twoje pięści. +Unarmed.SubSkill.Berserk.Name=Szał +Unarmed.SubSkill.Berserk.Description=+50% DMG, Łamie słabe materiały +Unarmed.SubSkill.Berserk.Stat=Długość Szału +Unarmed.SubSkill.Disarm.Name=Rozbrajać +Unarmed.SubSkill.Disarm.Description=Upuszcza trzymany w dłoni przedmiot przeciwnika +Unarmed.SubSkill.Disarm.Stat=Szansa na rozbrojenie +Unarmed.SubSkill.UnarmedLimitBreak.Name=Nieuzbrojone przełamanie limitu +Unarmed.SubSkill.UnarmedLimitBreak.Description=Przełamywanie granic. Zwiększone obrażenia zadawane trudnym przeciwnikom. Przeznaczony dla PVP, zależnie od ustawień serwera, czy zwiększy obrażenia w PVE, czy nie. +Unarmed.SubSkill.UnarmedLimitBreak.Stat=Limit Break Max DMG +Unarmed.SubSkill.SteelArmStyle.Name=Styl stalowego ramienia +Unarmed.SubSkill.SteelArmStyle.Description=Z czasem twardnieje ramię +Unarmed.SubSkill.ArrowDeflect.Name=Odbicie strzał +Unarmed.SubSkill.ArrowDeflect.Description=Odbij strzały +Unarmed.SubSkill.ArrowDeflect.Stat=Szansa na odbicie strzały +Unarmed.SubSkill.IronGrip.Name=Iron Grip +Unarmed.SubSkill.IronGrip.Description=Zapobiega rozbrojeniu +Unarmed.SubSkill.IronGrip.Stat=Szansa na żelazny chwyt +Unarmed.SubSkill.BlockCracker.Name= +Unarmed.SubSkill.BlockCracker.Description=Rozbijaj skały pięściami +Unarmed.Listener=Niezręczność: +Unarmed.SkillName=NIEZRĘCZNOŚĆ +Unarmed.Skills.Berserk.Off=**Szał się skończył** +Unarmed.Skills.Berserk.On=&a**BERSERK AKTYWOWANY** +Unarmed.Skills.Berserk.Other.Off=Berserk&a has worn off for &e{0} +Unarmed.Skills.Berserk.Other.On=&a{0}&2 has used &cBerserk! +Unarmed.Skills.Berserk.Refresh=&aYour &eBerserk & Aability zostały odświeżone! + +#WOODCUTTING +Woodcutting.Ability.0=Dmuchawa do liści +Woodcutting.Ability.1=Zdmuchuje liście +Woodcutting.Ability.Locked.0=ZABLOKOWANE DO {0}+ UMIEJĘTNOŚĆ (DMUCHAWA DO LIŚCI) +Woodcutting.SubSkill.TreeFeller.Name=Ścinacz Drzew +Woodcutting.SubSkill.TreeFeller.Description=Spraw, by drzewa eksplodowały +Woodcutting.SubSkill.TreeFeller.Stat=Tree Feller Length +Woodcutting.SubSkill.LeafBlower.Name=Dmuchawa do liści +Woodcutting.SubSkill.LeafBlower.Description=Zdmuchuje liście +Woodcutting.SubSkill.KnockOnWood.Name=Stuknięcie w Drewno +Woodcutting.SubSkill.KnockOnWood.Description=Znajdź dodatkowe przedmioty podczas korzystania z Ścinacz Drzew +Woodcutting.SubSkill.KnockOnWood.Stat=Stuknięcie w Drewno +Woodcutting.SubSkill.KnockOnWood.Loot.Normal=Standardowy łup z drzewa +Woodcutting.SubSkill.KnockOnWood.Loot.Rank2=Standardowy łup z drzew i kul doświadczenia +Woodcutting.SubSkill.HarvestLumber.Name=Żniwa Budulca +Woodcutting.SubSkill.HarvestLumber.Description=Umiejętnie wydobywanie więcej drewna +Woodcutting.SubSkill.HarvestLumber.Stat=Podwójna szansa łupu +Woodcutting.SubSkill.Splinter.Name=Kawałki +Woodcutting.SubSkill.Splinter.Description=Cięcie drzew bardziej efektywnie. +Woodcutting.SubSkill.BarkSurgeon.Name=Chirurg Kory +Woodcutting.SubSkill.BarkSurgeon.Description=Wydobywaj przydatne materiały podczas ścinania drzew. +Woodcutting.SubSkill.NaturesBounty.Name=Nagroda natury +Woodcutting.SubSkill.NaturesBounty.Description=Zbieraj doświadczenie z natury. +Woodcutting.Listener=Drwal: +Woodcutting.SkillName=DRWAL +Woodcutting.Skills.TreeFeller.Off=**Ścinacz Drzew przestał działać** +Woodcutting.Skills.TreeFeller.On=&a**ŚCINACZ DRZEW AKTYWOWANY** +Woodcutting.Skills.TreeFeller.Refresh=&aTwoja umiejętnośś &eŚcinacz Drzew &azostała odświeżona! +Woodcutting.Skills.TreeFeller.Other.Off=Ścinacz Drzew&a przestał działać na &e{0} +Woodcutting.Skills.TreeFeller.Other.On=&a{0}&2 użył &cŚcinacz Drzew! +Woodcutting.Skills.TreeFeller.Splinter=TWÓJ TOPÓR ROZKLEJA SIĘ NA DZIESIĄTKI KAWAŁKÓW! +Woodcutting.Skills.TreeFeller.Threshold=To drzewo jest zbyt duże! +#ABILITIY + +#COMBAT +Combat.ArrowDeflect=&f**UGINANIE STRZAŁ** +Combat.BeastLore=&a**WIEDZA BESTII** +Combat.BeastLoreHealth=&3Zdrowie (&a{0}&3/{1}) +Combat.BeastLoreOwner=&3Właściciel (&c{0}&3) +Combat.BeastLoreHorseSpeed=&3Prędkość konia (&a{0} bloki/s&3) +Combat.BeastLoreHorseJumpStrength=&3Siła skoku konia (&aMax {0} bloków&3) +Combat.Gore=&a**ROZLANA KREW** +Combat.StruckByGore=**ZOSTAŁEŚ ZRANIONY** +Combat.TargetDazed=Cel był &4Oszołomiony +Combat.TouchedFuzzy=&4Czyć skołowanie. +#COMMANDS +##generic +mcMMO.Description=&3O &emcMMO&3 Projekt:,&6mcMMO jest to &cotwarty kod&6 RPG plugin stworzony w Styczniu 2011,&6przez &9nossr50&6. Celem jest zapewnienie wysokiej jakości wrażeń z gry RPG.,&3Wskazówki:,&6 - &aUżyj &c/mcmmo help&a by zobaczyć komendy,&6 - &aWpisz &c/NAZWA_UMIĘJĘTNOŚCI&a by zobaczyć detale konkertnej umiejętności,&3Deweloperzy:,&6 - &anossr50 &9(Twórca & Kierownik Projektu),&6 - &aelectronicboy &9(Dev),&6 - &akashike &9(Dev),&6 - &at00thpick1 &9(Opiekun wersji Classic) +mcMMO.Description.FormerDevs=&3Byli twórcy: &aGJ, NuclearW, bm01, TfT_02, Glitchfinder +Commands.addlevels.AwardAll.1=&aZostano nagrodzonym {0} we wszystkich poziomach! +Commands.addlevels.AwardAll.2=Wszystkie umiejętności zostały zmodyfikowane o {0}. +Commands.addlevels.AwardSkill.1=&aZostano nagrodzonym o {0} poziomy/ów w {1}! +Commands.addlevels.AwardSkill.2={0} zostało/a zmodyfikowana o {1}. +Commands.addxp.AwardAll=&aZostano nagrodzonym o {0} XP we wszystkich poziomach! +Commands.addxp.AwardSkill=&aZostano nagrodzonym o {0} XP w {1}! +Commands.Ability.Off=Używanie umiejętności: &cWyłączone +Commands.Ability.On=Używanie umiejętności &aWłączone +Commands.Ability.Toggle=Zmieniono używanie umiejętności dla &e{0} +Commands.AdminChat.Off=Admin Chat &cWłączone +Commands.AdminChat.On=Admin Chat &cWyłączone +Commands.AdminToggle=&a- Przełącz czat Adminów +Commands.Chat.Console=*Konsola* +Commands.Cooldowns.Header=&6--= &amcMMO Czas Odnowienia Umiejętności&6 =-- +Commands.Cooldowns.Row.N=\ &c{0}&f - &6Pozostało sekund: {1} +Commands.Cooldowns.Row.Y=\ &b{0}&f - &2Gotowe! +Commands.Database.CooldownMS=Musisz odczekać {0} milisekund zanim użyjesz tej komendy. +Commands.Database.Cooldown=Musisz odczekać {0} sekund zanim użyjesz tej komendy ponownie. +Commands.Database.Processing=Twoje poprzednie polecenie jest nadal przetwarzane. Proszę czekać. +Commands.Disabled=Ta komenda jest wyłączona. +Commands.DoesNotExist= &cTen gracz nie istnieje w bazie danych! +Commands.GodMode.Disabled=mcMMO Godmode Wyłączony +Commands.GodMode.Enabled=mcMMO Godmode Włączony +Commands.AdminChatSpy.Enabled=mcMMO Podglądanie czatów drużyn włączone +Commands.AdminChatSpy.Disabled=mcMMO Podglądanie czatów drużyn wyłączone +Commands.AdminChatSpy.Toggle=mcMMO Czat w grupie został przełączony dla &e{0} +Commands.AdminChatSpy.Chat=&6[SPY: &a{0}&6] &f{1} +Commands.GodMode.Forbidden=[mcMMO] Godmode nie jest dozwolony na tym świecie (Zobacz Permisje) +Commands.GodMode.Toggle=Tryb Godmode został przełączony dla &e{0} +Commands.Healthbars.Changed.HEARTS=[mcMMO] Twój typ wyświetlania paska zdrowia został zmieniony na &cZdrowie&f. +Commands.Healthbars.Changed.BAR=[mcMMO] Twój typ wyświetlania paska zdrowia został zmieniony na &eBar&f. +Commands.Healthbars.Changed.DISABLED=[mcMMO] Twoje paski zdrowia mobów zostały &7wyłączone&f. +Commands.Healthbars.Invalid=Błędny pasek zdrowia! +Commands.Inspect= &a- Zobacz szczegółowe informacje o graczu +Commands.Invite.Success=&aPomyślnie wysłano zaproszenie. +Commands.Leaderboards= &a- Rankingi +Commands.mcgod=&a- Przełącz GodMode +Commands.mchud.Invalid=To nie jest prawidłowy typ HUD. +Commands.mcpurge.Success=&aBaza danych została pomyślnie wyczyszczona! +Commands.mcrank.Heading=&6-=RANGI OSOBISTE=- +Commands.mcrank.Overall=Ogólne&a - &6Ranga &f#&a{0} +Commands.mcrank.Player=&eRanga gracza &f{0} +Commands.mcrank.Skill=&e{0}&a - &6Ranga &f#&a{1} +Commands.mcrank.Unranked=&fBez Rangi +Commands.mcrefresh.Success={0} - Czas odnowienia odświeżony. +Commands.mcremove.Success=&a{0} - Pomyślnie usunięto z bany danych! +Commands.mctop.Tip=&6Tip: Użyj &c/mcrank&6 aby wyświetlić wszystkie swoje osobiste rangi! +Commands.mmoedit=[player] &a - Modifikuj cel +Commands.mmoedit.AllSkills.1=&aPoziom wszystkich Twoim umiejętności zmieniono na {0}! +Commands.mmoedit.Modified.1=&aTwój poziom {0} zmieniono na {1}! +Commands.mmoedit.Modified.2={0} został/a zmodyfikowana dla {1}. +Commands.mcconvert.Database.Same=Już używasz bazy danych {0}! +Commands.mcconvert.Database.InvalidType={0} nie jest poprawnym typem bazy danych. +Commands.mcconvert.Database.Start=&7Rozpoczynanie konwersji z {0} do {1}... +Commands.mcconvert.Database.Finish=&7Migracja bazy danych zakończona; {1} ma teraz wszystkie dane z bazy danych {0}. +Commands.mmoshowdb=Aktualna baza danych w użyciu to &a{0} +Commands.mcconvert.Experience.Invalid=Nieznany typ formuły! Prawodłowe typy to: &aLINIOWY &ci &aEXPONENTIAL. +Commands.mcconvert.Experience.Same=Aktualny typ formuły to {0} +Commands.mcconvert.Experience.Start=&7Rozpoczynanie konwersji z {0} do {1} krzywej +Commands.mcconvert.Experience.Finish=&7Ukończono konwersję formuły; teraz korzystam z {0} średniejj XP. +Commands.ModDescription=&a- Przeczytaj krótki opis moda +Commands.NoConsole=Tej komendy nie możesz użyć przez konsolę. +Commands.Notifications.Off=Przełączono powiadomienia o umiejętnościach: &cWyłączono +Commands.Notifications.On=Przełączono powiadomienia o umiejętnościach: &aWłączono +Commands.Offline=Ta komenda nie działa na graczy off-line. +Commands.NotLoaded=Profil gracza nie jest jeszcze załadowany. +Commands.Party.Status=&8NAZWA: &f{0} {1} &8POZIOM: &3{2} +Commands.Party.Status.Alliance=&8SOJUSZNICY: &f{0} +Commands.Party.UnlockedFeatures=&8Odblokowane funkcje: &7&o{0} +Commands.Party.ShareMode=&8TRYB UDOSTĘPNIANIA: +Commands.Party.ItemShare=&7PRZEDMIOT &3({0}) +Commands.Party.ExpShare=&7EXP &3({0}) +Commands.Party.ItemShareCategories=&8Udostępnianie przedmiotów: &7&o{0} +Commands.Party.MembersNear=&8BLISKO CIEBIE &3{0}&8/&3{1} +Commands.Party.Accept=&a- Zaakceptuj zaproszenie do drużyny +Commands.Party.Chat.Off=Czat drużyny &cWyłączono +Commands.Party.Chat.On=Czat drużyny &aWłączono +Commands.Party.Commands=&c---[]&aKOMENDY DRUŻYNY&c[]--- +Commands.Party.Invite.0=&cALERT: &aOtrzymałeś zaproszenie do drużyny {0} od {1} +Commands.Party.Invite.1=&eWpisz &a/party accept&e aby zaakceptować zaproszenie +Commands.Party.Invite=&a- Wyślij zaproszenie do drużyny +Commands.Party.Invite.Accepted=&aZaproszenie Zaakceptowane. Dołączyłeś do drużyny {0} +Commands.Party.Join=&7Dołączył do drużyny: {0} +Commands.Party.PartyFull=&6{0}&c jest pełna! +Commands.Party.PartyFull.Invite=Nie możesz zaprosić &e{0}&c do &a{1}&c, ponieważ drużyna ma już &3{2}&c członków! +Commands.Party.PartyFull.InviteAccept=Nie możesz dołączyć do &a{0}&c, ponieważ drużyna ma już &3{1}&c członków! +Commands.Party.Create=&7Stworzone drużyny: {0} +Commands.Party.Rename=&7Nazwa drużyny zmieniona na: &f{0} +Commands.Party.SetSharing=&7Udostępnianie drużyny {0} ustawione na: &3{1} +Commands.Party.ToggleShareCategory=&7Udostępnianie przedmiotów drużyny &6{0} &7zostało &3{1} +Commands.Party.AlreadyExists=&4PDrużyna {0} już istnieje! +Commands.Party.Kick=&cZostałeś/aś wyrzucony/a z drużyny &a{0}&c! +Commands.Party.Leave=&eOpuszczono drużynę +Commands.Party.Members.Header=&c-----[]&aCZŁONKOWIE&c[]----- +Commands.Party.None=&cNie jesteś w drużynie. +Commands.Party.Quit=&a- Opuść swoją drużynę +Commands.Party.Teleport=&a- Teleportuj do członka drużyny +Commands.Party.Toggle=&a- Przełącz czat drużyny +Commands.Party1=&a- Stwórz nową drużynę +Commands.Party2=&a- Dołącz do drużyny +Commands.Party.Alliance.Header=&c-----[]&aSOJUSZ DRUŻYN&c[]----- +Commands.Party.Alliance.Ally=&f{0} &8JEST ZWIĄZANY/A Z: &f{1} +Commands.Party.Alliance.Members.Header=&c-----[]&aCZŁONKOWIE SOJUSZU&c[]----- +Commands.Party.Alliance.Invite.0=ALERT: &aOtrzymałeś zaproszenie do sojuszu w drużynie {0} do {1} +Commands.Party.Alliance.Invite.1=Wpisz &a/party alliance accept&e aby zaakceptować zaproszenie +Commands.Party.Alliance.Invite.Accepted=&aZaproszenie do sojuszu zaakceptowane. +Commands.Party.Alliance.None=&cTwoja drużyna nie ma sojuszu. +Commands.Party.Alliance.AlreadyAllies=&cTwoja drużyna ma już sojusz. Rozwiąż sojusz &3/party alliance disband +Commands.Party.Alliance.Help.0=&cTa drużyna nie zawarła jeszcze sojuszu. Możesz +Commands.Party.Alliance.Help.1=&czaprosić lidera używając &3/party alliance invite &c. +Commands.ptp.Enabled=Teleportowanie w drużynie &aewłączone +Commands.ptp.Disabled=Teleportowanie w drużynie &cwyłączone +Commands.ptp.NoRequests=&cNie masz aktualnie próśb o teleportację +Commands.ptp.NoWorldPermissions=&c[mcMMO] Nie masz permisji, aby zteleportować się do świata {0}. +Commands.ptp.Request1=&e{0} &awysłał/a prośbę o teleportację. +Commands.ptp.Request2=&aAby zaakceptować, wpisz &e/ptp accept&a. Prośba wygaśnie za &c{0} &asekund. +Commands.ptp.AcceptAny.Enabled=Potwierdzanie teleportowania w drużynie &awłączone +Commands.ptp.AcceptAny.Disabled=Potwierdzanie teleportowania w drużynie &cwyłączone +Commands.ptp.RequestExpired=&cProśba o teleport drużyny wygasła! +Commands.PowerLevel.Leaderboard=&e--mcMMO&9 Poziom Mocy &eliderów-- +Commands.PowerLevel.Capped=&4POZIOM MOCY: &a{0} &4MAX POZIOM: &e{1} +Commands.PowerLevel=&4POZIOM MOCY: &a{0} +Commands.Reset.All=&aWszystkie Twoje poziomy umiejętności pomyślnie zresetowano. +Commands.Reset.Single=&aPoziom Twojej umiejętności {0} pomyślnie zresetowano. +Commands.Reset=&a- Zresetuj poziom umiejętności do 0 +Commands.Scoreboard.Clear=&3mcMMO Tablica wyników oczyszczona. +Commands.Scoreboard.NoBoard=&cTablica wyników mcMMO jest nieaktywna. +Commands.Scoreboard.Keep=&3Tablica wyników mcMMO pozostanie, póki nie użyjesz &a/mcscoreboard clear&3. +Commands.Scoreboard.Timer=&3Tablica wyników mcMMO zostanie wyczyszona za &6{0}&3 sekund od teraz. +Commands.Scoreboard.Help.0=&6 == &aPomoc dla &c/mcscoreboard&6 == +Commands.Scoreboard.Help.1=&3/mcscoreboard&b clear &f - czyści tablicę wyników mcMMO +Commands.Scoreboard.Help.2=&3/mcscoreboard&b keep &f - utrzymuj tablicę wyników mcMMO +Commands.Scoreboard.Help.3=&3/mcscoreboard&b time [n] &f - wyczyść tablicę wyników McMMO za &dn&f sekund +Commands.Scoreboard.Tip.Keep=&6Wskazówka: Użyj &c/mcscoreboard keep&6 while the scoreboard is shown to keep it from going away. +Commands.Scoreboard.Tip.Clear=&6Wskazówka: Użyj &c/mcscoreboard clear&6 pozbyć się tablicy wyników. +Commands.XPBar.Reset=&6Ustawienia paska XP Bar dla mcMMO zostały zresetowane. +Commands.XPBar.SettingChanged=&6Ustawienia paska XP Bar dla &a{0}&6 został/a ustawiony/a na &a{1} +Commands.Skill.Invalid=To nie jest poprawna nazwa umiejętności! +Commands.Skill.ChildSkill=Umiejętności dziecka nie są ważne dla tego polecenia! +Commands.Skill.Leaderboard=--mcMMO &9{0}&e Tablica Wyników-- +Commands.SkillInfo=&a- Pokaż informacje dot. konkretnej umiejętności +Commands.Stats=&a- Pokaż swoje statystyki mcMMO +Commands.ToggleAbility=&a- Przełącz aktywację umiejętności prawym przyciskiem myszy +Commands.Usage.0=&cWłaściwe użycie to /{0} +Commands.Usage.1=&cWłaściwe użycie to /{0} {1} +Commands.Usage.2=&cWłaściwe użycie to /{0} {1} {2} +Commands.Usage.3=&cWłaściwe użycie to /{0} {1} {2} {3} +Commands.Usage.3.XP=&cWłaściwe użycie to /{0} {1} {2} {3}&7 (Możesz dodać -s, aby wykonać polecenie bez informowania o tym gracza) +Commands.Usage.FullClassName=nazwa klasy +Commands.Usage.Level=poziom +Commands.Usage.Message=wiadomość +Commands.Usage.Page=strona +Commands.Usage.PartyName=nazwa +Commands.Usage.Password=hasło +Commands.Usage.Player=gracz +Commands.Usage.Rate=ocena +Commands.Usage.Skill=umiejętność +Commands.Usage.SubSkill=sub-umiejętność +Commands.Usage.XP=xp +Commands.Description.mmoinfo=Przeczytaj szczegółowe informacje o umiejętności lub mechanice. +Commands.MmoInfo.Mystery=&7Nie odblokowałeś/aś jeszcze tej umiejętności, ale kiedy to zrobisz, będziesz mógł przeczytać o niej szczegóły tutaj! +Commands.MmoInfo.NoMatch=Ta sub-umiejętność nie istnieje! +Commands.MmoInfo.Header=&3-=[]=====[]&6 MMO Info &3[]=====[]=- +Commands.MmoInfo.SubSkillHeader=&6Nazwa:&e {0} +Commands.MmoInfo.DetailsHeader=&3-=[]=====[]&a Detale &3[]=====[]=- +Commands.MmoInfo.OldSkill=&7mcUmiejętności MMO są przekształcane w ulepszony modułowy system umiejętności, niestety ta umiejętność nie została jeszcze przekonwertowana i brakuje jej szczegółowych statystyk. Nowy system pozwoli na szybsze udostępnianie nowych umiejętności mcMMO i większą elastyczność w przypadku istniejących umiejętności. +Commands.MmoInfo.Mechanics=&3-=[]=====[]&6 Mechanika &3[]=====[]=- +Commands.MmoInfo.Stats=STATYSTKI: {0} +Commands.Mmodebug.Toggle=mcMMO Tryb Debugowania jest teraz &6{0}&7, użyj tej komendy ponownie, aby przełączyć. W trybie debugowania możesz klikać bloki, aby wyświetlić przydatne informacje używane do obsługi. +mcMMO.NoInvites=&cYou have no invites at this time +mcMMO.NoPermission=&4Niewystarczające uprawnienia. +mcMMO.NoSkillNote=&8Jeśli nie masz dostępu do danej umiejętności, nie zostanie ona tutaj pokazana. +##party +Party.Forbidden=[mcMMO] Drużyny nie są dozwolone na tym świecie (Zobacz permisje) +Party.Help.0=&cPrawidłowe użycie to &3{0} [hasło]. +Party.Help.1=&cAby stworzyć drużynę, użyj &3{0} [hasło]. +Party.Help.2=&cSkonsultuj się z &3{0} &cpo więcej informacji +Party.Help.3=&cużyj &3{0} [hasło] &caby dołączyć lub &3{1} &copuścić +Party.Help.4=&cAby zablokować lub odblokować drużynę, użyj &3{0} +Party.Help.5=&cAby zabezpieczyć swoją drużynę hasłem, użyj &3{0} +Party.Help.6=&cAby wyrzucić gracza z drużyny, użyj &3{0} +Party.Help.7=&cAby przenieść własność swojej drożyny, użyj &3{0} +Party.Help.8=&cAby rozwiązać swoją drużynę, użyj &3{0} +Party.Help.9=&cUżyj &3{0} &caby udostępniać przedmioty członkom drużyny +Party.Help.10=&cUżyj &3{0} &cudostępniać XP członkom drużyny +Party.InformedOnJoin={0} &adołączył/a do drużyny +Party.InformedOnQuit={0} &aopuścił/a drużynę +Party.InformedOnNameChange=&6{0} &austawił/a nazwę drużyny na &f{1} +Party.InvalidName=&4To nie jest prawidłowa nazwa drużyny. +Party.Invite.Self=&cNie możesz zaprosić samego siebie! +Party.IsLocked=&cTa drużyna jest zablokowana! +Party.IsntLocked=&cTa drużyna nie jest zablokowana! +Party.Locked=&cDrużyna jest zablokowana, tylko właściciel/ka może zaprosić nowych członków. +Party.NotInYourParty=&4{0} nie jest Twoją drużyną +Party.NotOwner=&4Nie jesteś właścicielem/ką drużyny. +Party.Target.NotOwner=&4{0} nie jest właścicielem/ką drużyny. +Party.Owner.New=&a{0} jest nowym/ą właścicielem/ką drużyny. +Party.Owner.NotLeader=&4Nie jesteś już właścicielem/ką drużyny. +Party.Owner.Player =&aJesteś teraz właścicielem/ką drużyny. +Party.Password.None=&cTa drużyna jest chroniona hasłem. Wpisz hasło, aby dołączyć. +Party.Password.Incorrect=&cNiepoprawne hasło. +Party.Password.Set=&aUstawiono hasło drużyny na {0} +Party.Password.Removed=&aUsunięto hasło drużyny. +Party.Player.Invalid=&cNie znaleziono takiego gracza. +Party.NotOnline=&4{0} nie jest on-line! +Party.Player.InSameParty=&c{0} już jest w Twojej drużynie! +Party.PlayerNotInParty=&4{0} nie jest w drużynie +Party.Specify=&cMusisz podać drużynę. +Party.Teleport.Dead=&cNie możesz się zteleportować do martwego przyjaciela. +Party.Teleport.Hurt=&cZostałeś/aś zraniony przez ostatnie {0} sekund i nie można się teleportować. +Party.Teleport.Player=&aTeleportowano do {0}. +Party.Teleport.Self=&cNie możesz się teleportować do siebie! +Party.Teleport.Target=&a{0} teleportował się do Ciebie. +Party.Teleport.Disabled=&c{0} nie pozwala na drużynowe teleportowanie. +Party.Rename.Same=&cWpisz inną nazwę jaskini, nie aktualną! +Party.Join.Self=&cNie możesz dołączyć do siebie! +Party.Unlocked=&7Drużyna jest odblokowana +Party.Disband=&7Drużyna została rozwiązana +Party.Alliance.Formed=&7Twoja drużyna jest w sojuszu z &a{0} +Party.Alliance.Disband=&7Twoja drużyna nie jest już w sojuszu z &c{0} +Party.Status.Locked=&4(TYLKO-ZAPROSZENI) +Party.Status.Unlocked=&2(OTWARTA) +Party.LevelUp=&eZwiększono poziom drużyny: {0}. Aktualnie: ({1}) +Party.Feature.Chat=Czat Drużyny +Party.Feature.Teleport=Teleport drużyny +Party.Feature.Alliance=Sojusze +Party.Feature.ItemShare=Udostępnianie przedmiotów +Party.Feature.XpShare=Udostępnianie XP +Party.Feature.Locked.Chat=ZABLOKOWANE DO {0}+ (CZAT DRUŻYNY) +Party.Feature.Locked.Teleport=ZABLOKOWANE DO {0}+ (TELEPORT DRUŻYNY) +Party.Feature.Locked.Alliance=ZABLOKOWANE DO {0}+ (SOJUSZE) +Party.Feature.Locked.ItemShare=ZABLOKOWANE DO {0}+ (UDOSTĘPNIANIE PRZEDMIOTÓW) +Party.Feature.Locked.XpShare=ZABLOKOWANE DO {0}+ UDOSTĘPNIANIE XP) +Party.Feature.Disabled.1=&cNie odblokowano jeszcze czatu dryżyny. +Party.Feature.Disabled.2=&cNie odblokowano jeszcze teleportu drużyny. +Party.Feature.Disabled.3=&cNie odblokowano jeszcze sojuszy dryżyny. +Party.Feature.Disabled.4=&cNie odblokowano jeszcze udostępniani przedmiotów. +Party.Feature.Disabled.5=&cNie odblokowano jeszcze udostępniania XP. +Party.ShareType.Xp=XP +Party.ShareType.Item=PRZEDMIOT +Party.ShareMode.None=ŻADEN +Party.ShareMode.Equal=RÓWNY +Party.ShareMode.Random=LOSOWY +Party.ItemShare.Category.Loot=łup +Party.ItemShare.Category.Mining=Górnictwo +Party.ItemShare.Category.Herbalism=Tresowanie +Party.ItemShare.Category.Woodcutting=Ścinanie Drzew +Party.ItemShare.Category.Misc=Różne +##xp +Commands.XPGain.Acrobatics=Spadanie z wysokości +Commands.XPGain.Alchemy=Warzenie Mikstur +Commands.XPGain.Archery=Atakowanie potworów +Commands.XPGain.Axes=Atakowanie potworów +Commands.XPGain.Child=Zyskuje poziomy dzięki głównym umiejętnością +Commands.XPGain.Excavation=Kopanie i znajdowanie skarbów +Commands.XPGain.Fishing=Łowienie +Commands.XPGain.Herbalism=Zbieranie ziół +Commands.XPGain.Mining=Kopanie kamienia & rud +Commands.XPGain.Repair=Naprawa używając specjalnego kowadła +Commands.XPGain.Swords=Atakowanie potworów +Commands.XPGain.Taming=Rozmnażanie zwierząt, albo walka w/ z twoimi psami +Commands.XPGain.Unarmed=Atakowanie potworów +Commands.XPGain.Woodcutting=Ścianie drzew +Commands.XPGain=&8ZDOBYWANIE XP: &f{0} +Commands.xplock.locked=&6Twój pasek XP jest teraz zablokowany na {0}! +Commands.xplock.unlocked=&6Twój pasek XP jest teraz &aODBLOKOWANY&6! +Commands.xprate.modified=&cMNOŻNIK XP został zmieniony na {0} +Commands.xprate.over=&cEvent mcMMO XP właśnie się skończył!! +Commands.xprate.proper.0=&cWłaściwe użycie do zmieny częstości XP to /xprate +Commands.xprate.proper.1=&cWłaściwe użycie do zresetowania gęstości XP to /xprate reset +Commands.xprate.proper.2=&cPodaj wartość true lub false, aby wskazać, czy jest to event XP, czy nie. +Commands.NegativeNumberWarn=Nie używaj liczb na minusie! +Commands.Event.Start=&amcMMO&6 Event! +Commands.Event.Stop=&amcMMO&3 Event Zakończony! +Commands.Event.Stop.Subtitle=&aMam nadzieję, że miło się bawiliście! +Commands.Event.XP=&3Mnożnik XP to teraz &6{0}&3x +Commands.xprate.started.0=&6XP EVENT mcMMO WŁAŚNIE SIĘ ROZPOCZĄŁ! +Commands.xprate.started.1=&6MNOŻNIK mcMMO XP WYNOSI TERAZ {0}x! + +# Admin Notifications +Server.ConsoleName=&e[Server] +Notifications.Admin.XPRate.Start.Self=&7Ustawiłeś/aś globalny mnożnik XP na &6{0}x +Notifications.Admin.XPRate.End.Self=&7Zakończyłeś/aś event mnożnika XP. +Notifications.Admin.XPRate.End.Others={0} &7zakończył/a event mcMMO XP. +Notifications.Admin.XPRate.Start.Others={0} &7rozpoczął/ęła lub zmodyfikował/a wydarzenie związane z XP z globalnym mnożnikiem {1}x +Notifications.Admin.Format.Others=&6(&amcMMO &3Admin&6) &7{0} +Notifications.Admin.Format.Self=&6(&amcMMO&6) &7{0} + +# Event +XPRate.Event=&6aAktualnie jest wydarzenie mcMMO event! Mnożnik XP to {0}x! + +#GUIDES +Guides.Available=&7Poradnik dla {0} jest dostępny - Wpisz /{1} ? [strona] +Guides.Header=&6-=&a{0} PORADNIK&6=- +Guides.Page.Invalid=Nieprawidłowy numer strony! +Guides.Page.OutOfRange=Ta strona nie istnieje, jest/są tylko {0} stron/a/y. +Guides.Usage= Prawodłowe użycie to /{0} ? [strona] +##Acrobatics +Guides.Acrobatics.Section.0=&3O Akrobatyce:\n&eakrobatyka to sztuka poruszania się z wdziękiem w mcMMO.\n&eZapewnia premie bojowe i premie do obrażeń otoczenia.\n\n&3ZDOBYWANIE XP:\n&eAby zdobyć PD w tej umiejętności, musisz wykonać unik\n&ew walce lub przetrwać upadki z wysokości, które cię ranią. +Guides.Acrobatics.Section.1=&3Jak działa Przewrót??\n&eMasz pasywną szansę, gdy odniesiesz obrażenia od upadku, aby zneutralizować zadane obrażenia. Możesz przytrzymać przycisk skradania się, aby podwoić swoje szanse podczas upadku. To wyzwala Ŋgodny Przwrót zamiast standardowego. Łagodne Przewroty są jak zwykłe, ale prawdopodobieństwo wystąpienia Przewrotu jest dwukrotnie większe i zapewnia większe bezpieczeństwo obrażeń niż zwykłe Przewroty.\n&eSzansa na przewrót zależy od poziomu Twojej umiejętności. +Guides.Acrobatics.Section.2=&3Jak działa unik?\n&eUnik to pasywna szansa na zmniejszenie o połowę otrzymywanych obrażeń, gdy odniesiesz obrażenia w walce. Jest to powiązane z Twoim poziomem umiejętności. +##Alchemy +Guides.Alchemy.Section.0=&3O Alchemi:\n&eAlchemia polega na warzeniu mikstur.\n&eZapewnia przyspieszenie czasu warzenia mikstury,\n&ea także dodanie nowych (wcześniej) nieosiągalnych mikstur. \n\n\n&3ZDOBYWANIE XP:\n&eAby zdobyć XP tej umiejętności, musisz warzyć mikstury. +Guides.Alchemy.Section.1=&3Jak działa Kataliza?\n&eSzybkość katalizy procesu warzenia, z maksymalną prędkością 4x na poziomie 1000. Ta umiejętność jest domyślnie odblokowywana na poziomie 100. +Guides.Alchemy.Section.2=&3Jak działają Mikstury?\n&eMikstury pozwalają na warzenie większej liczby mikstur z niestandardowych składników. To, które specjalne składniki zostaną odblokowane, zależy od Twojej rangi. Do odblokowania jest 8 stopni. +Guides.Alchemy.Section.3=&3Składniki mikstur tieru 1:\n&ePłomienny Proszek, Fermentowane Oko Pająka, Łza Ghasta, Redstone,\n&eJasnopył, Cukier, Pozłacany Arbuz, Złota Marchewka,\n&eMagmowy Krem, Brodawka, Oko Pająka, Proch, Lilia Wodna,\n&eRozdymka\n&e(Mikstury Wanilla) +Guides.Alchemy.Section.4=&3Składniki mikstur tieru 2:\n&eMarchwka (Miktura Szybkości)\n&eKulka Szlamu (Miktura Otępienia)\n\n&3Składniki mikstur tieru 3:\n&eKwarc (Miksutra Absorpcji)\n&eMuchomor (Mikstura Skoku) +Guides.Alchemy.Section.5=&3Składniki mikstur tieru 4:\n&eJabłko (Mikstura boostu zdrowia)\n&eZgniłe Mięso (PMiksutra Głodu)\n\n&3Składniki mikstur tieru 5:\n&eBrązowy Grzyb (Mikstura Mdłości)\n&eAtrament (Mikstura Oślepienia) +Guides.Alchemy.Section.6=&3Składniki mikstur tieru 6:\n&ePaproć (Mikstura Nasycenia)\n\n&3Składniki mikstur tieru 7:\n&eZatruty Ziemniak (Mikstura Rozkładu)\n\n&3Składniki mikstur tieru 8:\n&eZłote Jabłko (Mikstura Odporności) +##Archery +Guides.Archery.Section.0=&3O Łucznictwie:\n&eŁucznictwo polega na strzelaniu z łuku strzał.\n&eZapewnia różne bonusy bojowe, takie jak zwiększenie obrażeń,\n&ektóre skaluje się z twoim poziomem i daje możliwość oszołomienia\n&eprzeciwników w PvP. W dodatku możesz odzyskać\n&eczęść strzał z martwych wrogów.\n\n\n&3ZDOBYWANIE XP:\n&eAby zdobyć XP w tej umiejętności, musisz strzelać do mobów lub\n&edo innych graczy. +Guides.Archery.Section.1=&3Jak działa Umiejętne Strzelanie??\n&eUmiejętne strzelanie zapewnia dodatkowe obrażenia strzałom.\n&eDodatkowe obrażenia rosną wraz z poziomem Łucznictwa.\n&ePrzy domyślnych ustawieniach twoje obrażenia zwiększają się o 10% co 50 poziomów, do maksymalnie 200% dodatkowych obrażeń. +Guides.Archery.Section.2=&3Jak działa Oszołomienie?\n&eMasz pasywną szansę oszołomienia innych graczy, gdy do nich strzelasz. Aktywacja Oszołomienia zmusza przeciwników do patrzenia prosto w górę przez krótki czas. Strzała oszołomiająca zadaje dodatkowe 4 obrażenia (2 serca). +Guides.Archery.Section.3=&3Jak działa Odzyskiwanie Strzał?\n&eMasz pasywną szansę na odzyskanie niektórych strzał, gdy zabijesz łukiem. Ta szansa rośnie wraz ze zdobywaniem kolejnych poziomów w Łucznictwie. Domyślnie zdolność ta rośnie o 0,1% na poziom, do 100% na poziomie 1000. +##Axes +Guides.Axes.Section.0=&3O Siekierach:\n&eZ umiejętnością Topory możesz zrobić coś więcej\n&eniż niszczyć lasy! Możesz hakować i siekać moby\n&ei graczy, aby zdobywać XP, musisz atakować moby siekierą z efektem\n&eodrzucenie i zadać śmiertelny cios.\n&eTwój topór również staje się ręcznym rębakiem,\n&eponieważ bardzo obniżasz poziom zbroi\n&eprzeciwnikom wraz z poziomiem umiejętności.\n&3ZDOBYWANIE XP:\n&eAby zdobywać XP musisz atakować moby\n&elub graczy siekierą. +Guides.Axes.Section.1=&3Jak działa Przecinacz Czaszek?\n&eTa umiejętność pozwala Ci zadać obrażenia AoE (Obszarowe). Obrażenia obszarowe zadają połowę Twoich obrażeń, co czyni je dobrym sposobem do zabijania grup mobów. +Guides.Axes.Section.2=&3Jak działa Trafienie Krytyczne?\n&eTrafienia krytyczne jest to pasywna umiejętność, która daje Ci możliwość zadania dodatkowych obrażeń. Przy domyślnych ustawieniach co 2 poziom umiejętności daje Ci 0.1% szansy na trafienie krytyczne, które zadaje 2x mobom lub 1.5x przeciwko graczom. +Guides.Axes.Section.3=&3Jak działa Mistrz Siekier?\n&eJest to umiejętność pasywna, która daje Ci możliwość zadania dodatkowych obrażeń przy użyciu toporka. Obrażenia zwiększają się o 1 co 50 poziomów, do maksymalnie 4 obrażeń na poziomie 200. +Guides.Axes.Section.4=&3Jak działa Uderzenie Pancerza?\n&eUderz z wystarczającą siłą, aby rozbić zbroję! Uderzenie Pancerza posiada pasywną umiejętność, która może uszkodzić pancerz Twojego przeciwnika. Obrażenia te są zwiększanie wraz z poziomem Siekiery. +Guides.Axes.Section.5=&3Jak działa Większy Wpływ?\n&eZ każdym uderzeniem masz coraz większą szanse na aktywacje Większy Wpływ, gdy uderzasz gracza lub moba skiekierą. Domyślna szansa wynosi 25%. Pasywna umiejętność posiada extremalny efekt odrzutu, podobny do Odrzutu II, jednakże zadaje ona więcej obrażeń\n&eenchantment. Ponadto zadaje dodatkowe obrażenia celowi. +##Excavation +Guides.Excavation.Section.0=&3O Wykopalisku:\n&eWykopaliska to czynność polegająca na wykopywaniu ziemi w celu znalezienia skarbów..\n&eIm więcej będziesz kopać, tym więcej znajdziesz skarbów.\n\n&3ZDOBYWANIE XP:\n&eAby zdobyć XP w tej umiejętności należy kopać łopatą. Tylko niektóre rzeczy można wykopać, aby zdobyć skarby i EXP. Aby przygotować narzędzie wciśnij prawy przycisk myszy z łopatą w dłoni. +Guides.Excavation.Section.1=&3Kompatybilne Materiały:\n&eTrawa, Ziemia, Piasek, Glina, Żwir, Mycelinium, Piasek Dusz, Śnieg +Guides.Excavation.Section.2=&3Jak użyć Giga Wiertło:\n&eKliknij prawy przycisk z łopatą w ręce, aby aktywować Giga Wiertło.\n&eGdy znajdziesz się w tym stanie, masz około 4 sekund na kontakt z materiałami kompatybilnymi z Wykopalisko, aktywuje to Giga Wiertło. +Guides.Excavation.Section.3=&3Co to Giga Wiertło?\n&eGiga Wiertło to umiejętność posiadająca czas odnowienia. Daje Ci potrójną szansę na znalezienie skarbów oraz umożliwia natychmiastowe kopanie. +Guides.Excavation.Section.4=&3Jak działa Archeologia?\n&eKażdy skarb posiada swój wymagany poziom, dlatego otrzymujesz skarb w zależlości od Twojego poziomu umiejętności. Pamiętaj im wyższy jest Twój poziom umiejętności, tym więcej skarbów możesz znaleźć. Każdy skarb, wykopywany z różnych materiałów posiada swoją unikalna listę przedmiotów, które się w nim znajdują. Inny skarb otrzymasz z bruku, a zupełnie inny ze żwiru. +Guides.Excavation.Section.5=&3Notatki o Wykopaliskach:\n&ePrzedmioty z wykopalisk są w pełni konfigurowalne, tak więc wyniki różnią się między serwerami. +##Fishing +Guides.Fishing.Section.0=&3O Wędkarstwie:\n&eDzięki umiejętności Wędkarstwo, wędkarstwo znów jest ekscytujące! Znajdź ukryte skarby i strząśnij przedmioty z mobów.\n\n&3ZDOBYWANIE XP:\n&eŁowienie ryb. +Guides.Fishing.Section.1=&3Jak działa Łowca Skarbów?\n&eTa umiejętność pozwala ci znaleźć skarb z łowienia z niewielką szansą na zaklęcie przedmiotów. Każdy możliwy skarb dla wędkarzy ma szansę spaść na dowolnym poziomie. Zależy to jednak od rzadkości przedmiotu, jak często będzie on wypadał. Im wyższy poziom umiejętności Łowienie ryb, tym większe masz szanse na znalezienie lepszych skarbów. +Guides.Fishing.Section.2=&3Jak działają Mroźne Połowy?\n&eTa umiejętność pasywna pozwala łowić ryby w lodowych jeziorach! Wrzuć wędkę do lodowego jeziora, a stworzysz w lodzie małą dziurę do łowienia. +Guides.Fishing.Section.3=&3Jak działa Mistrz Wędkarstwa?\n&eTa umiejętność pasywna zwiększa szansę brania podczas łowienia. Po odblokowaniu tej umiejętności łowienie na łodzi zwiększa szanse na złowienie ryby. +Guides.Fishing.Section.4=&3Jak działa Potrząsanie?\n&eTa aktywna umiejętność pozwala strząsać przedmioty z mobów poprzez zaczepienie ich wędką. Moby upuszczają przedmioty, które normalnie upuszczają po śmierci. Możliwe jest również zdobycie czaszek mobów, które normalnie są nieosiągalne w trybie przetrwania. +Guides.Fishing.Section.5=&3Jak działa Dieta Rybaka?\n&eTa umiejętność pasywna zwiększa ilość przywracanego głodu po jedzeniu ryby. +Guides.Fishing.Section.6=&3Notatki o Wędkarstwie:\n&ePrzedmioty z łowienia są w pełni konfigurowalne, tak więc wyniki różnią się między serwerami. +##Herbalism +Guides.Herbalism.Section.0=&3O Zielarstwie:\n&eZielarstwo polega na zbieraniu ziół i roślin.\n\n\n&3ZDOBYWANIE XP:\n&eZbieraj rośliny i zioła. +Guides.Herbalism.Section.1=&3Kompatybilne rośliny:\n&eSiano, Ziemniaki, Marchewki, Arbuzy, \n&eDynie, Trzcina Cukrowa, Kakao, Kwiaty, Kaktusy, Grzyby,\n&eBrodawka, Lilie Wodne, i Liany. +Guides.Herbalism.Section.2=&3Jak działa Zielona Terra?\n&eZielona Terra to umiejętność aktywna, możesz przytrzymać motykę prawym przyciskiem myszy, aby aktywować Zieloną Terrę. Zielona Terra daje graczom szansę na zdobycie 3x przedmiotów ze zbioru roślin. Daje także graczom możliwość dzielenia życia na bloki i przekształcania ich za pomocą nasion z ekwipunku. +Guides.Herbalism.Section.3=&3Jak działa Zielona Rączka (Nasiona)?\n&eTa pasywna umiejętność automatycznie przesadza plony podczas zbioru. Twoja szansa na sukces zależy od umiejętności zielarstwa. +Guides.Herbalism.Section.4=&3Jak działa Zielona Rączka (Bruk/Kamienne Cegły/Ziemia)?\n&eTa aktywna zdolność pozwala zamienić bloki w ich odpowiedniki „związane z roślinami”. Możesz to zrobić, klikając prawym przyciskiem myszy blok, trzymając jednocześnie nasiona. To pochłonie 1 ziarno. +Guides.Herbalism.Section.5=&3Jak działa Dieta Farmera?\n&eTa umiejętność pasywna zwiększa ilość przywracanego głodu podczas jedzenia chleba, ciastek, arbuzów, zupy grzybowej, marchwi i ziemniaków. +Guides.Herbalism.Section.6=&3Jak działa Wielkie Szczęście?\n&eTa pasywna umiejętność daje ci szansę na znalezienie rzadkich przedmiotów, gdy niektóre bloki zostaną rozbite mieczem. +Guides.Herbalism.Section.7=&3Jak działa Podwójny Łup?\n&eTa pasywna umiejętność zapewnia graczom większe plony. +##Mining +Guides.Mining.Section.0=&3O Górnictwie:\n&eGórnictwo obejmuje wydobywanie kamienia i rud. Zapewnia bonusy do ilości upuszczanych materiałów podczas wydobywania.\n\n&3ZDOBYWANIE XP:\n&eAby zdobyć XP w tej umiejętności, musisz kopać z kilofem w dłoni. Tylko niektóre bloki zapewniają XP . +Guides.Mining.Section.1=&3Kompatybilne Minerały:\n&eKamień, Ruda Węgla, Ruda Żelaza, Ruda Złota, Ruda Diamentu, Ruda Redstone,\n&eRuda Lapisu, Obsydian, Zamszony Bruk, Kamień Endu,\n&eJasnogłaz, i Netherrack. +Guides.Mining.Section.2=&3Jak użyć Super Niszczyciela:\n&eKliknij prawy przycisk z kilofem w ręce, aby aktywować Super Niszczyciel.\n&eGdy znajdziesz się w tym stanie, masz około 4 sekund na kontakt z materiałami kompatybilnymi z Wykopalisko, aktywuje to Super Niszczyciel. +Guides.Mining.Section.3=&3Co to Super Niszczyciel?\n&eSuper Niszczyciel to umiejętność, której czas odnowienia jest powiązany z umiejętnością Górnictwo. Potroi szansę na upuszczenie dodatkowych przedmiotów i umożliwia natychmiastowe niszczenie przy wydobywaniu materiałów. +Guides.Mining.Section.4=&3Jak użyć Podmóch Górnictwa:\n&eZ kilofem w dłoni kucnij i kliknij prawym przyciskiem myszy na TNT z daleka. Spowoduje to natychmiastową eksplozję TNT. +Guides.Mining.Section.5=&3Jak działą Podmóch Górnictwa?\n&ePodmóch Górnictwa to umiejętność, której czas odnowienia jest powiązany z umiejętnością Górnictwo. Daje bonusy podczas wydobywania z TNT i pozwala zdalnie zdetonować TNT. Podmóch Górnictwa składa się z trzech części. Pierwsza część to Większe Bomby, która zwiększa zasięg rażenia. Druga to Eksportyza Rozbiórki, która zmniejsza obrażenia od wybuchów TNT. Trzecia część po prostu zwiększa ilość rud zrzucanych z trotylu i zmniejsza ilość upuszczanych gruzu. +##Repair +Guides.Repair.Section.0=&3O Naprawianiu:\n&eNaprawa umożliwia użycie żelaznego bloku do naprawy zbroi i narzędzi .\n\n&3ZDOBYWANIE XP:\n&eNapraw narzędzia lub zbroję za pomocą kowadła mcMMO. Jest to domyślnie żelazny blok i nie należy go mylić z kowadłem Vanilla. +Guides.Repair.Section.1=&3Jak naprawiać w mcMMO?\n&ePołóż kowadło mcMMO i kliknij prawym przyciskiem myszy, aby naprawić przedmiot, który aktualnie trzymasz. Przy każdym użyciu zużywa 1 przedmiot (Na przykład przy żelaznych narzędziach zużyje jedno żelazo). +Guides.Repair.Section.2=&3Jak działa Mistrz Napraw?\n&ePoziom Mistrza Napraw zwiększa się wraz z naprawianymi przedmiotami. Dodatkową przywróconą wytrzymałość zależy od poziomu Naprawianie. +Guides.Repair.Section.3=&3Jak działa Super Naprawa?\n&eSuper Naprawa to umiejętność pasywna. Podczas naprawy przedmiotu daje graczom szansę na naprawienie przedmiotu z podwójną skutecznością. +Guides.Repair.Section.4=&3Jak działa Tajemne Fałszowanie?\n&eTa pasywna umiejętność pozwala naprawiać przedmioty z pewną szansą na utrzymanie zaklęć. Zaklęcia mogą pozostać na dotychczasowych poziomach, zdegradowane do niższych lub całkowicie utracone. +##Salvage +Guides.Salvage.Section.0=&3O odzyskiwaniu:\n&eUmieściłeś odzyskiwanie pozwala ci użyś złotego bloku do odzyskania zbroi i narzędzi..\n\n&3ZDOBYWANIE XP:\n&eOdzyskiwanie to umiejętność podrzędna Naprawy i Wędkarstwa, więc Twój poziom umiejętności Odzyskiwania jest oparty na twoich poziomach umiejętności Wędkarstwa i Naprawy. +Guides.Salvage.Section.1=&3Jak użwać Odzyskiwanie?\n&ePołóż kowadło mcMMO (tj. złoty blok) i kliknij prawym przyciskiem myszy, aby odzyskać przedmioty z narzędzia, który aktualnie trzymasz. Spowoduje to zniszczenie przedmiotu i zwrócenie materiałów użytych do wytworzenia przedmiotu. +Guides.Salvage.Section.2=&3Jak działa Zaawansowane Odzyskiwanie?\n&ePo odblokowaniu umiejętność ta pozwala na odzyskanie uszkodzonych przedmiotów. Procent zysku rośnie wraz ze wzrostem poziomu. Wyższa wydajność oznacza, że można odzyskać więcej materiałów. Dzięki zaawansowanemu odzyskowi zawsze otrzymasz 1 materiał z powrotem, chyba że przedmiot jest zbyt uszkodzony. Nie musisz więc martwić się o niszczenie przedmiotów, nie otrzymując niczego w zamian. +Guides.Salvage.Section.3=&3Aby pokazać przykład, tutaj go opisujemy:\n&ePowiedzmy, że odzyskujemy złoty kilof, który jest uszkodzony o 20%, co oznacza, że maksymalna kwota, jaką możesz zdobyć, to tylko 2 (ponieważ kilof jest tworzony z 3 sztabek - każdy wart 33,33% wytrzymałości), co jest równe 66% . Jeśli Twój procent wytrzymałości jest niższy niż 66%, nie jesteś w stanie uzyskać 2 sztabek. Jeśli jest powyżej tej wartości, możesz uzyskać „pełną kwotę”, co oznacza, że otrzymasz 2 sztabki. +Guides.Salvage.Section.4=&3Jak działa Tajemne Odzyskiwanie?\n&eTa umiejętność pozwala zdobyć zaklęte książki podczas odzyskiwania zaklętych przedmiotów. W zależności od twojego poziomu, szansa na pomyślne wyodrębnienie pełnego lub częściowego zaklęcia jest różna.\n\n&eKiedy zaklęcie zostanie częściowo wydobyte, księga zaklęć będzie miała niższy poziom zaklęcia w porównaniu z tym, co znajdowało się na przedmiocie. +##Smelting +Guides.Smelting.Section.0=Wkrótce... +##Swords +Guides.Swords.Section.0=&3O Mieczach:\n&eTa umiejętność zapewnia premie bojowe każdemu, kto walczy mieczem..\n\n&3ZDOBYWANIE XP:\n&eXP jest zdobywane w oparciu o ilość obrażeń zadanych mobom lub innym graczom, gdy dzierżysz miecz. . +Guides.Swords.Section.1=&3Jak działają Ząbkowane Uderzenia?\n&eZąbkowane Uderzenia to umiejętność aktywna, którą można aktywować, klikając prawym przyciskiem myszy mieczem. Ta umiejętność pozwala na zadanie trafienia obszarowego. Ten obszar działania zadaje dodatkowe 25% obrażeń i wywoła efekt krwawienia trwający 5 tików. +Guides.Swords.Section.2=&3Jak działa Kontraatak?\n&eKontratak to aktywna umiejętność. Podczas blokowania i przyjmowania trafień od mobów, będziesz miał szansę odbić 50% otrzymanych obrażeń. +Guides.Swords.Section.3=&3Jak działa Rozerwanie?\n&eRozerwanie powoduje, że wrogowie otrzymują obrażenia co dwie sekundy. Cel będzie krwawił do momentu ustąpienia efektu lub śmierci, w zależności od tego, co nastąpi wcześniej. Poziom umiejętności Miecze zwiększa czas trwania krwawienia. +##Taming +Guides.Taming.Section.0=&3O Oswajaniu:\n&eOswajanie zapewni graczom różne bonusy bojowe podczas używania oswojonych wilków.\n\n&3ZDOBYWANIE XP:\n&eAby zdobyć XP w tej umiejętności, musisz oswoić wilki lub oceloty i wyruszyć do walki ze swoimi sprzymierzeńcami. +Guides.Taming.Section.1=&3Jak działa Zew Natury?\n&eZew Natury to aktywna umiejętność, która pozwoli ci przywołać wilka lub ocelota do swojego boku. Możesz to zrobić kucając (shift) + kliknięcie lewym przyciskiem myszy, trzymając kości lub rybę. +Guides.Taming.Section.2=&3Jak działa Wiedza Bestii?\n&eWiedza Bestii pozwala graczom na zbadanie zwierzaków i sprawdzanie stanu wilków i ocelotów. Kliknij lewym przyciskiem myszy na wilka lub ocelota, aby użyć Wiedzy Bestii. +Guides.Taming.Section.3=&3How does Gore work?\n&eKrwawienie to pasywna umiejętność, która ma szansę wywołać efekt krwawienia na celach przez Twoich wilków. +Guides.Taming.Section.4=&3Jak działają Zaostrzone Pazury?\n&eZaostrzone Pazury zapewnia premię do obrażeń zadawanych przez wilki. Premia do obrażeń zależy od Twojego poziomu Oswajania. +Guides.Taming.Section.5=&3Jak działa Sprzymierzeniec Natury?\n&eTa pasywna umiejętność pozwoli wilkom teleportować się do ciebie, gdy zbliżą się do niebezpieczeństw, takich jak kaktusy czy lawa. Zapewni także wilkom odporność na obrażenia od upadku. +Guides.Taming.Section.6=&3Jak działa grube futro??\n&eTa pasywna umiejętność zmniejszy obrażenia i sprawi, że wilki będą odporne na ogień. +Guides.Taming.Section.7=&3Jak działa odporność na wstrząsy?\n&eTa umiejętność pasywna zmniejsza obrażenia zadawane wilkom od eksplozji. +Guides.Taming.Section.8=&3Jak działa serwis Fast Food??\n&eTa pasywna umiejętność daje wilkom szansę na uleczenie się, gdy wykonają atak. +##Unarmed +Guides.Unarmed.Section.0=&3About Unarmed:\n&eUnarmed will give players various combat bonuses when using\n&eyour fists as a weapon. \n\n&3XP GAIN:\n&eXP is gained based on the amount of damage dealt to mobs \n&eor other players when unarmed. +Guides.Unarmed.Section.1=&3How does Berserk work?\n&eBeserk is an active ability that is activated by\n&eright-clicking. While in Beserk mode, you deal 50% more\n&edamage and you can break weak materials instantly, such as\n&eDirt and Grass. +Guides.Unarmed.Section.2=&3How does Steel Arm Style work?\n&eSteel Arm Style increases the damage dealt when hitting mobs or\n&eplayers with your fists. +Guides.Unarmed.Section.3=&3How does Arrow Deflect work?\n&eArrow Deflect is a passive ability that gives you a chance\n&eto deflect arrows shot by Skeletons or other players.\n&eThe arrow will fall harmlessly to the ground. +Guides.Unarmed.Section.4=&3How does Iron Grip work?\n&eIron Grip is a passive ability that counters disarm. As your\n&eunarmed level increases, the chance of preventing a disarm increases. +Guides.Unarmed.Section.5=&3How does Disarm work?\n&eThis passive ability allows players to disarm other players,\n&ecausing the target's equipped item to fall to the ground. +##Woodcutting +Guides.Woodcutting.Section.0=&3O Drwalu:\n&eDrwal polega na wycinaniu drzew.\n\n&3ZDOBYWANIE XP:\n&eXP jest zdobywany za każdym razem, gdy niszczysz bloki kłód. +Guides.Woodcutting.Section.1=&3Jak działa Ścinacz Drzew?\n&eŜinacz Drzew to aktywna umiejętność, moćna kliknąć prawym przyciskiem trzymając siekierę, aby aktywować Ŝinacz Drzew. Spowoduje to natychmiastowe zniszczenie całego drzewa, zrzucając jednocześnie wszystkie kłody. +Guides.Woodcutting.Section.2=&3Jak działa Dmuchawa Do Liści?\n&eDmuchawa do liści to umiejętność pasywna, która powoduje, że bloki liści natychmiast się niszczą po uderzeniu siekierą. Umiejętność ta domyślnie odblokowuje się na poziomie 100. +Guides.Woodcutting.Section.3=&3Jak działa Podwójny Łup?\n&eTa pasywna umiejętność daje ci szansę na uzyskanie dodatkowego bloku za każdą posiekaną kłodę. +#INSPECT +Inspect.Offline= &cNie masz uprawnień do sprawdzania graczy offline! +Inspect.OfflineStats=Statystyki mcMMO dla gracza off-line &e{0} +Inspect.Stats=&Statystyki amcMMO dla &e{0} +Inspect.TooFar=Jesteś za daleko, aby sprawdzić tego gracza! +#ITEMS +Item.ChimaeraWing.Fail=&c**CHIMAERA WING FAILED!** +Item.ChimaeraWing.Pass=**CHIMAERA WING** +Item.ChimaeraWing.Name=Chimaera Wing +Item.ChimaeraWing.Lore=&7Teleportuje Cię do łóżka. +Item.ChimaeraWing.NotEnough=Potrzebujesz &e{0}&c więcej o &6{1}&c! +Item.NotEnough=Potrzebujesz &e{0}&c więcej o &6{1}&c! +Item.Generic.Wait=Musisz odczekać zanim ponownie to użyjesz! &e({0}s) +Item.Injured.Wait=Niedawno byłeś kontuzjowany i musisz poczekać, zanim to wykorzystasz. &e({0}s) +Item.FluxPickaxe.Name=Topiący Kilof +Item.FluxPickaxe.Lore.1=&7Ma szanse na natychmiastowe przepalenie rudy. +Item.FluxPickaxe.Lore.2=&7Wymaga poziomu &6Przepalania: &7{0}+ +#TELEPORTATION +Teleport.Commencing=&7Rozpoczynanie teleportacji… Przez &6({0}) &7sekund, nie ruszaj się... +Teleport.Cancelled=&4Teleportacja anulowana! +#SKILLS +Skills.Child=&6(SUB-UMIEJĘTNOŚCI) +Skills.Disarmed=&4Zostałeś rozbrojony! +Skills.Header=-----[] &a{0}&c []----- +Skills.NeedMore=&4Potrzebujesz więcej &7{0} +Skills.NeedMore.Extra=&4Potrzebujesz więcej &7{0}{1} +Skills.Parents= UMIEJĘTNOŚĆ +Skills.Stats={0}&a{1}&3 XP(&7{2}&3/&7{3}&3) +Skills.ChildStats={0}&a{1} +Skills.MaxXP=Max +Skills.TooTired=Jesteś zbyt zmęczony, aby ponownie użyć tej zdolności. &e({0}s) +Skills.TooTired.Named=&7(&6{0}&e {1}s&7) +Skills.TooTired.Extra=&6{0} &eCzas Odnowienia Super Umiejętności - {1} +Skills.Cancelled=&6{0} &canulowano! +Skills.ConfirmOrCancel=&aKliknij Prawy-przycisk-myszy, aby potwierdzić &6{0}&a. Lewy, aby anulować. +Skills.AbilityGateRequirementFail=&7Potrzebujesz większy poziom o &e{0}&7, aby użyć super umiejętność &3{1}&7. +#STATISTICS +Stats.Header.Combat=&6-=UMIEJĘTNOŚCI WALKI=- +Stats.Header.Gathering=&6-=ZBIÓR UMIEJĘTNOŚCI=- +Stats.Header.Misc=&6-=RÓŻNE UMIEJĘTNOŚCI=- +Stats.Own.Stats=&a[mcMMO] Statystyki +#PERKS +Perks.XP.Name=Doświadczenie +Perks.XP.Desc=Otrzymuj zwiększone XP w niektórych wiadomościach. +Perks.Lucky.Name=Szczęście +Perks.Lucky.Desc=Daje {0} umiejętności i zdolności o 33.3% większej szansy na aktywacje. +Perks.Lucky.Desc.Login=Daje niektórym umiejętnościom i zdolnościom o 33,3% większą szansę na aktywację. +Perks.Lucky.Bonus=&6 ({0} z perkiem Szczęście) +Perks.Cooldowns.Name=Szybki powrót do zdrowia +Perks.Cooldowns.Desc=Skraca czas odnowienia o {0}. +Perks.ActivationTime.Name=Wytrzymałość +Perks.ActivationTime.Desc=Zwiększa czas aktywacji umiejętności o {0} sekund. +Perks.ActivationTime.Bonus=&6 ({0}s z perkiem Wytrzymałość) +#HARDCORE +Hardcore.Mode.Disabled=&6[mcMMO] Hardcore mode {0} wyłączony dla {1}. +Hardcore.Mode.Enabled=&6[mcMMO] Hardcore mode {0} włączony dla {1}. +Hardcore.DeathStatLoss.Name=Skill Death Penalty +Hardcore.DeathStatLoss.PlayerDeath=&6[mcMMO] &4Straciłeś/aś &9{0}&4 poziomów przez śmierć. +Hardcore.DeathStatLoss.PercentageChanged=&6[mcMMO] Procent utraty statystyk został zmieniony na {0}. +Hardcore.Vampirism.Name=Wampiryzm +Hardcore.Vampirism.Killer.Failure=&6[mcMMO] &e{0}&7 był/a zbyt niewykwalifikowany, aby udzielić ci jakiejkolwiek wiedzy. +Hardcore.Vampirism.Killer.Success=&6[mcMMO] &3Ukradłeś/aś &9{0}&3 poziomów od &e{1}. +Hardcore.Vampirism.Victim.Failure=&6[mcMMO] &e{0}&7 nie był wstanie Ci ukraść umiejętności! +Hardcore.Vampirism.Victim.Success=&6[mcMMO] &e{0}&4 ukradł/a &9{1}&4 poziomów od Ciebie! +Hardcore.Vampirism.PercentageChanged=&6[mcMMO] Procent wampiryzmu został zmieniony na {0}. +#MOTD +MOTD.Donate=&3Info o Donacjach: +MOTD.Hardcore.Enabled=&6[mcMMO] &3Hardcore Mode włączony: &4{0} +MOTD.Hardcore.DeathStatLoss.Stats=&6[mcMMO] &3Skill Death Penalty: &4{0}% +MOTD.Hardcore.Vampirism.Stats=&6[mcMMO] &3Vampirism Stat Leech: &4{0}% +MOTD.PerksPrefix=&6[mcMMO Perki] +MOTD.Version=&6[mcMMO] Wersja: &3{0} +MOTD.Website=&6[mcMMO] &a{0}&e - Strona Internetowa mcMMO +#SMELTING +Smelting.SubSkill.UnderstandingTheArt.Name=Zrozumieć Sztukę +Smelting.SubSkill.UnderstandingTheArt.Description=Może spędzasz za dużo czasu przepalając rudy w jaskini.\nTa umiejętność wzmacnia różne właściwości wytapiania. +Smelting.SubSkill.UnderstandingTheArt.Stat=Mnożnik XP z piecyków: &e{0}x +Smelting.Ability.Locked.0=ZABLOKOWANE DO {0}+ UMIEJĘTNOŚĆ (WZMOCNIEENIE XP VANILLA) +Smelting.Ability.Locked.1=ZABLOKOWANE DO {0}+ UMIEJĘTNOŚĆ (GÓRNICZE PRZEPALANIE) +Smelting.SubSkill.FuelEfficiency.Name=Efektywność Paliwa +Smelting.SubSkill.FuelEfficiency.Description=Zwiększa czas po jakim spala się paliwo używane w piecyku. +Smelting.SubSkill.FuelEfficiency.Stat=Mnożnik efektywności paliwa: &e{0}x +Smelting.SubSkill.SecondSmelt.Name=Podwójne przepalanie +Smelting.SubSkill.SecondSmelt.Description=Podwaja zasoby przepalone w piecyku +Smelting.SubSkill.SecondSmelt.Stat=Druga szansa na przepalenie +Smelting.Effect.4=Wzmocnienie XP vanilla +Smelting.Effect.5=Zwiększa XP dostawane za przepalanie w piecykach +Smelting.SubSkill.FluxMining.Name=Górnicze Przepalanie +Smelting.SubSkill.FluxMining.Description=Szansa na przepalenie rudy po jej wykopaniu +Smelting.SubSkill.FluxMining.Stat=Szansa na przepalenie +Smelting.Listener=Przepalanie: +Smelting.SkillName=PRZEPALANIE +#COMMAND DESCRIPTIONS +Commands.Description.addlevels=Dodaj poziomy mcMMO do użytkownika +Commands.Description.adminchat=Włącz/wyłącz czat administratora mcMMO lub wysyłanie wiadomości na czacie administracyjnym +Commands.Description.addxp=Dodano mcMMO XP graczowi +Commands.Description.hardcore=Zmodyfikuj procent hardcore mcMMO lub włącz/wyłącz tryb hardcore +Commands.Description.inspect=Wyświetl szczegółowe informacje mcMMO o innym graczu +Commands.Description.mcability=Włącz/wyłącz przygotowywanie umiejętności mcMMO po kliknięciu prawym przyciskiem myszy +Commands.Description.mccooldown=Zobacz wszystkie czasy odnowienia zdolności mcMMO +Commands.Description.mcchatspy=Włącz/wyłącz mcMMO spy czatów drużynowych +Commands.Description.mcgod=Przełącz mcMMO god-mode: włącz/wyłącz +Commands.Description.mchud=Zmień swój styl mcMMO HUD +Commands.Description.mcmmo=Pokaż krótki opis mcMMO +Commands.Description.mcnotify=Włącz/wyłącz mcMMO wyświetlanie powiadomień o umiejętnościach na czacie +Commands.Description.mcpurge=Usuń użytkowników bez poziomów umiejętności mcMMO i użytkowników, którzy nie nawiązali połączenia od ponad {0} miesięcy z bazą danych mcMMO. +Commands.Description.mcrank=Pokaż ranking mcMMO dla gracza +Commands.Description.mcrefresh=Odśwież wszystkie czasy odnowienia mcMMO +Commands.Description.mcremove=Usuń gracza z bazy danych mcMMO +Commands.Description.mcscoreboard=Zarządzaj tablicą wyników mcMMO +Commands.Description.mcstats=Pokaż swoje poziomy i XP w mcMMO +Commands.Description.mctop=Pokaż tablice liderów mcMMO +Commands.Description.mmoedit=Edytuj poziomy mcMMO dla użytkownika +Commands.Description.mmodebug=Przełącz tryb debugowania, który wyświetla przydatne informacje po trafieniu w bloki +Commands.Description.mmoupdate=Przeprowadź migrację bazy danych mcMMO ze starej bazy danych do bieżącej +Commands.Description.mcconvert=Konwertuje typy baz danych lub typy formuł doświadczenia +Commands.Description.mmoshowdb=Pokaż nazwę bieżącego typu bazy danych (do późniejszego użycia /mmoupdate) +Commands.Description.party=Kontroluj różne ustawienia drużyn mcMMO +Commands.Description.partychat=Włącz / wyłącz czat grupy mcMMO lub wysyłanie wiadomości czatu w grupie +Commands.Description.ptp=Teleportuj się do członka drużyny mcMMO +Commands.Description.Skill=Wyświetl szczegółowe informacje o umiejętnościach mcMMO dla gracza {0} +Commands.Description.skillreset=Zresetuj poziomy mcMMO dla użytkownika +Commands.Description.vampirism=Zmodyfikuj procent wampiryzmu mcMMO lub włącz/wyłącz tryb wampiryzmu +Commands.Description.xplock=Zablokuj pasek mcMMO XP na określonej umiejętności mcMMO +Commands.Description.xprate=Zmień ilość mcMMO XP lub rozpocznij wydarzenie mcMMO XP +#UPDATE CHECKER +UpdateChecker.Outdated=Używasz przestarzałej wersji mcMMO! +UpdateChecker.NewAvailable=Jest nowa wersja dostępna na Spigot. +#SCOREBOARD HEADERS +Scoreboard.Header.PlayerStats=&emcMMO Statystyki +Scoreboard.Header.PlayerCooldowns=&emcMMO Czas Odnowienia +Scoreboard.Header.PlayerRank=&emcMMO Rangi +Scoreboard.Header.PlayerInspect=&emcMMO Statystyki: {0} +Scoreboard.Header.PowerLevel=&cPoziom Mocy +Scoreboard.Misc.PowerLevel=&6Poziom Poziomu +Scoreboard.Misc.Level=&3Poziom +Scoreboard.Misc.CurrentXP=&aAktualne XP +Scoreboard.Misc.RemainingXP=&eBrakujące XP +Scoreboard.Misc.Cooldown=&dCzas Odnowienia +Scoreboard.Misc.Overall=&6Ogólne +Scoreboard.Misc.Ability=Umiejętność +#DATABASE RECOVERY +Profile.PendingLoad=&cTwoja baza danych graczy mcMMO nie została jeszcze załadowana. +Profile.Loading.Success=&aTwój profil mcMMO został załadowany. +Profile.Loading.FailurePlayer=&cmcMMO is having trouble loading your data, we have attempted to load it &a{0}&c times.&c You may want to contact the server admins about this issue. mcMMO will attempt to load your data until you disconnect, you will not gain XP or be able to use skills while the data is not loaded. +Profile.Loading.FailureNotice=&4[A]&c mcMMO nie mógł załadować danych odtwarzacza dla &e{0}&c. &dSprawdź konfigurację bazy danych. Próby podjęte do tej pory: {1}. +#Holiday +Holiday.AprilFools.Levelup=&6{0} jest teraz na poziomie &a{1}&6! +Holiday.Anniversary=&9Szczęśliwej {0} rocznicy!\n&9Na cześć całej pracy nossr50 i wszystkich twórców, oto pokaz sztucznych ogni! +#Reminder Messages +Reminder.Squelched=&7Przypomnienie: Obecnie nie otrzymujesz powiadomień od mcMMO, aby włączyć powiadomienia, uruchom ponownie komendę /mcnotify. To jest automatyczne przypomnienie godzinowe. +#Locale +Locale.Reloaded=&aPliki lokalne przeładowane! +#Player Leveling Stuff +LevelCap.PowerLevel=&6(&amcMMO&6) &eOsiągnąłeś maksymalny poziom mocy wynoszący &c{0}&e. Od tego momentu przestaniesz zdobywać kolejne poziomy od tej umiejętności. +LevelCap.Skill=&6(&amcMMO&6) &eOsiągnąłeś maksymalny poziom &c{0}&e dla &6{1}&e. Od tego momentu przestaniesz zdobywać kolejne poziomy tej umiejętności. +Commands.XPBar.Usage=Prawidłowe użycie to /mmoxpbar +Commands.Description.mmoxpbar=Ustawienia paska mcMMO XP dla gracza +Commands.Description.mmocompat=Informacje o mcMMO i czy jest w trybie zgodności lub w pełni funkcjonalna. +Compatibility.Layer.Unsupported=&6Kompatybilność dla &a{0}&6 is nie jest wspierana dla tej wersji Minecraft. +Compatibility.Layer.PartialSupport=&6Kompatybilność dla &a{0}&6 nie jest w pełni wspierana dla tej wersji Minecraft, ale mcMMO uruchamia dodatkowy system, aby emulować niektóre brakujące funkcje. +Commands.XPBar.DisableAll=&6 Wszystkie paski mcMMO XP są teraz wyłączone, użyj /mmoxpbar reset, aby przywrócić ustawienia domyślne. +#Modern Chat Settings +Chat.Style.Admin=&b(A) &r{0} &b→ &r{1} +Chat.Style.Party=&a(P) &r{0} &a→ &r{1} +Chat.Style.Party.Leader=&a(P) &r{0} &6→ &r{1} +Chat.Identity.Console=&6* Konsola * +Chat.Channel.On=&6(&amcMMO-Chat&6) &eTwoje wiadomości czatu będą teraz automatycznie dostarczane do kanału &a{0}&e. +Chat.Channel.Off=&6(&amcMMO-Chat&6) &7Twoje wiadomości na czacie nie będą już automatycznie dostarczane do określonych kanałów czatu. +Chat.Spy.Party=&6[&eSPY&6-&a{2}&6] &r{0} &b→ &r{1} +Broadcasts.LevelUpMilestone=&6(&amcMMO&6) {0}&7 osiągnął poziom &a{1}&7 w &3{2}&7! +Broadcasts.PowerLevelUpMilestone=&6(&amcMMO&6) {0}&7 osiągnął poziom mocy &a{1}&7! +Scoreboard.Recovery=Próba odzyskania tablicy wyników mcMMO... diff --git a/src/main/resources/locale/locale_pt_BR.properties b/src/main/resources/locale/locale_pt_BR.properties index 95c800825..cb8a98cd3 100644 --- a/src/main/resources/locale/locale_pt_BR.properties +++ b/src/main/resources/locale/locale_pt_BR.properties @@ -1,578 +1,1171 @@ +#Não use códigos de cores nas KEYS do Json +#Caso queira mudar as cores, elas são definidas em advanced.yml +JSON.Rank=Rank +JSON.DescriptionHeader=Descrição +JSON.JWrapper.Header=Detalhes +JSON.Type.Passive=Passivo +JSON.Type.Active=Ativo +JSON.Type.SuperAbility=Super Habilidade +JSON.Locked=-=[TRANCADO]=- +JSON.LevelRequirement=Nível necessário +JSON.JWrapper.Target.Type=Tipo do alvo: +JSON.JWrapper.Target.Block=Bloco +JSON.JWrapper.Target.Player=Jogador +JSON.JWrapper.Perks.Header=&6Vantagens de sorte +JSON.JWrapper.Perks.Lucky={0}% de melhores chances +JSON.Hover.Tips=Dicas +JSON.Acrobatics=Acrobacia +JSON.Alchemy=Alquimia +JSON.Archery=Arquearia +JSON.Axes=Machados +JSON.Excavation=Escavação +JSON.Fishing=Pesca +JSON.Herbalism=Herbalismo +JSON.Mining=Mineração +JSON.Repair=Reparação +JSON.Salvage=Recuperação +JSON.Swords=Espadas +JSON.Taming=Adestramento +JSON.Unarmed=Desarmado +JSON.Woodcutting=Lenhador +JSON.URL.Website=O site oficial do McMMO! +JSON.URL.Discord=O servidor de discord oficial do McMMO! +JSON.URL.Patreon=Ajude nossr50 e seu trabalho no mcMMO pelo Patreon! +JSON.URL.Spigot=A Resource Page para Spigot oficial do mcMMO! +JSON.URL.Translation=Traduza o mcMMO para outras línguas! +JSON.URL.Wiki=A wiki oficial do McMMO! +JSON.SkillUnlockMessage=&6[ mcMMO&e @&3{0} &6Rank &3{1}&6 Desbloqueado! ] +JSON.Hover.Rank=&e&lRank:&r &f{0} +JSON.Hover.NextRank=&7&oPróximo aprimoramento no nível {0} +# No JSON.Hover.Mystery você pode adicionar {0} para inserir o nível necessário no nome, eu não gosto de como ficou, então por enquanto, vou deixar assim +JSON.Hover.Mystery=&7??? +JSON.Hover.Mystery2=&e[&8{0}&e]&8???&r +JSON.Hover.SkillName=&3{0}&r +JSON.Hover.SuperAbility=&5{0}&r +JSON.Hover.MaxRankSkillName=&6{0}&r +JSON.Hover.AtSymbolSkills=&e@ +JSON.Hover.AtSymbolURL=&e@ + +#Essa é a mensagem enviada para jogadores quando uma habilidade é ativada +JSON.Notification.SuperAbility={0} + +#Essas são as JSON Strings usadas nas Sub-Habilidades +JSON.Acrobatics.Roll.Interaction.Activated=Teste &cRolou Teste +JSON.Acrobatics.SubSkill.Roll.Details.Tips=Se você estiver segurando o botão de agachar enquanto cai, pode evitar até o dobro do dano que você normalmente receberia! +Anvil.SingleItemStack=&cVocê não pode recuparar ou reparar pilhas de itens com mais de um item, divida a pilha de itens primeiro. + +#Não use códigos de cores nas KEYS do Json +#Caso queira mudar as cores, elas são definidas em advanced.yml + +mcMMO.Template.Prefix=&6(&amcMMO&6) &7{0} +# ESTILIZAÇÃO DO COMEÇO +Ability.Generic.Refresh=&a**HABILIDADES RECARREGADAS!** +Ability.Generic.Template.Lock=&7{0} +# ESTILIZAÇÃO DO COMANDO Skill +Ability.Generic.Template=&3{0}: &a{1} +Ability.Generic.Template.Custom=&3{0} +Skills.Overhaul.Header=&c[]=====[]&a {0} &c[]=====[] +Effects.Effects=EFEITOS +Effects.SubSkills.Overhaul=Sub-Habilidades +Effects.Child.Overhaul=&3Dependente Nv.&e {0}&3: {1} +Effects.Child.ParentList=&a{0}&6(&3Nv.&e{1}&6) +Effects.Level.Overhaul=&6Nv: &e{0} &3XP&e(&6{1}&e/&6{2}&e) +Effects.Parent=&6{0} - +Effects.Template=&3{0}: &a{1} +Commands.Stats.Self.Overhaul=Estatísticas +Commands.XPGain.Overhaul=&6XP RECEBIDA: &3{0} +MOTD.Version.Overhaul=&6[mcMMO] &3Versão do plugin&6 - &3{0} +Overhaul.mcMMO.Header=&c[]=====[]&a mcMMO - Versão do plugin &c[]=====[] +Overhaul.mcMMO.Url.Wrap.Prefix=&c[| +Overhaul.mcMMO.Url.Wrap.Suffix=&c|] +Overhaul.mcMMO.MmoInfo.Wiki=&e[&fVeja essa habilidade na wiki!&e] +# Overhaul.Levelup pode usar {0} - Nome da Habilidade definida em Overhaul.Name {1} - Número de níveis ganhados {2} - Nível da habilidade +Overhaul.Levelup=&l{0} subiu para &r&a&l{2}&r&f. +Overhaul.Name.Acrobatics=Acrobacia +Overhaul.Name.Alchemy=Alquimia +Overhaul.Name.Archery=Arquearia +Overhaul.Name.Axes=Machados +Overhaul.Name.Excavation=Escavação +Overhaul.Name.Fishing=Pesca +Overhaul.Name.Herbalism=Herbalismo +Overhaul.Name.Mining=Mineração +Overhaul.Name.Repair=Reparação +Overhaul.Name.Salvage=Recuperação +Overhaul.Name.Smelting=Fundição +Overhaul.Name.Swords=Espadas +Overhaul.Name.Taming=Adestramento +Overhaul.Name.Unarmed=Desarmado +Overhaul.Name.Woodcutting=Lenhador +# /mcMMO Command Style Stuff +Commands.mcc.Header=&c---[]&aComandos do McMMO&c[]--- +Commands.Other=&c---[]&aCOMANDOS ESPECIAIS&c[]--- +Commands.Party.Header=&c-----[]&aGRUPO&c[]----- +Commands.Party.Features.Header=&c-----[]&aRECURSOS&c[]----- +# Pode ser usado as seguintes variáveis em XP BAR -- {0} = Nível da Habilidade, {1} XP atual, {2} XP necessária para o próximo nível, {3} Power Level, {4} Porcentagem do nível +# Certifique-se de ligar Experience_Bars.ThisMayCauseLag.AlwaysUpdateTitlesWhenXPIsGained se você quiser que o title de xp do jogador atualize sempre que ele ganhar xp! +XPBar.Template={0} +XPBar.Template.EarlyGameBoost=&6Aprendendo uma nova habilidade... +XPBar.Acrobatics=Acrobacia Nv.&6{0} +XPBar.Alchemy=Alquimia Nv.&6{0} +XPBar.Archery=Arquearia Nv.&6{0} +XPBar.Axes=Machados Nv.&6{0} +XPBar.Excavation=Escavação Nv.&6{0} +XPBar.Fishing=Pesca Nv.&6{0} +XPBar.Herbalism=Herbalismo Nv.&6{0} +XPBar.Mining=Mineração Nv.&6{0} +XPBar.Repair=Reparação Nv.&6{0} +XPBar.Salvage=Recuperação Nv.&6{0} +XPBar.Smelting=Fundição Nv.&6{0} +XPBar.Swords=Espadas Nv.&6{0} +XPBar.Taming=Adestramento Nv.&6{0} +XPBar.Unarmed=Desarmado Nv.&6{0} +XPBar.Woodcutting=Lenhador Nv.&6{0} +#Este é apenas um modelo predefinido que é usado se a configuração 'ExtraDetails' estiver ativada em experience.yml (desativada por padrão), você pode ignorar este modelo e apenas editar as strings acima +XPBar.Complex.Template={0} &3 {4}&f% &3(&f{1}&3/&f{2}&3) +# Pode ser usado as seguintes variáveis em XP BAR -- {0} = Nível da Habilidade, {1} XP atual, {2} XP necessária para o próximo nível, {3} Power Level, {4} Porcentagem do nível +# Certifique-se de ligar Experience_Bars.ThisMayCauseLag.AlwaysUpdateTitlesWhenXPIsGained se você quiser que o title de xp do jogador atualize sempre que ele ganhar xp! +# FIM DA ESTILIZAÇÃO #ACROBACIA -Acrobatics.Ability.Proc=[[GREEN]]**Aterrissagem Elegante** -Acrobatics.Combat.Proc=[[GREEN]]**Esquivou** -Acrobatics.DodgeChance=[[RED]]Chance de Esquivar: [[YELLOW]]{0} -Acrobatics.Effect.0=Rolamento -Acrobatics.Effect.1=Reduz ou nega o dano de queda -Acrobatics.Effect.2=Rolamento Melhor -Acrobatics.Effect.3=Duas vezes mais efetivo que um rolamento simples -Acrobatics.Effect.4=Esquivar -Acrobatics.Effect.5=Reduz o dano de ataque pela metade +Acrobatics.Ability.Proc=&a**Aterrissagem graciosa** +Acrobatics.Combat.Proc=&a**Esquivou** +Acrobatics.SubSkill.Roll.Stats=&6Chance de rolar &e{0}%&6 Chance de rolar graciosamente&e {1}% +Acrobatics.SubSkill.Roll.Stat=Chance de rolar +Acrobatics.SubSkill.Roll.Stat.Extra=Chance de rolar graciosamente +Acrobatics.SubSkill.Roll.Name=Rolamento +Acrobatics.SubSkill.Roll.Description=Aterrisse estrátegicamente para evitar dano. +Acrobatics.SubSkill.Roll.Chance=Chance de rolar: &e{0} +Acrobatics.SubSkill.Roll.GraceChance=Chance de rolar graciosamente: &e{0} +Acrobatics.SubSkill.Roll.Mechanics=&7Rolar é uma sub-habilidade ativa com um componente passivo.\nQuando você sofre dano de queda, você tem a chance de negar completamente o dano baseado no nível da sua habilidade, no nível &e{6}%&7 você tem &e{0}%&7 de chance de prevenir dano, e &e{1}%&7 se você ativar o rolamento gracioso.\nA chance de sucesso é determinado pelo nível da sua habilidade em uma curva linear até o nível &e{2}&7 que é quando ela chega em seu máximo, cada nível de Acrobacia te dá uma chance de &e{3}%&7 de sucesso.\nSegurando o botão de agachar, você consegue dobrar suas chances de evitar danos de queda e também consegue evitar até o dobro do dano de queda! Segurar o botão de agachar irá transformar seu teste normal em um Teste Gracioso.\nRolar irá prevenir até &c{4}&7 de dano. Rolagens graciosas evitarão até &a{5}&7 de dano. +Acrobatics.SubSkill.GracefulRoll.Name=Rolamento Gracioso +Acrobatics.SubSkill.GracefulRoll.Description=Duas vezes mais efetivo do que um rolamento normal +Acrobatics.SubSkill.Dodge.Name=Esquiva +Acrobatics.SubSkill.Dodge.Description=Reduz o dano de ataques pela metade +Acrobatics.SubSkill.Dodge.Stat=Chance de esquivar Acrobatics.Listener=Acrobacia: -Acrobatics.Roll.Chance=[[RED]]Chance de Rolar: [[YELLOW]]{0} -Acrobatics.Roll.GraceChance=[[RED]]Chance de Rolar Melhor: [[YELLOW]]{0} -Acrobatics.Roll.Text=**Rolou** +Acrobatics.Roll.Text=&o**Rolou** Acrobatics.SkillName=ACROBACIA -Acrobatics.Skillup=[[YELLOW]]Habilidade de Acrobacia aumentada para {0}. Total ({1}) #ALQUIMIA -Alchemy.Effect.0=Catalise -Alchemy.Effect.1=Aumenta a velocidade de infusao de pocao -Alchemy.Effect.2=Misturas -Alchemy.Effect.3=Pocoes de fermentacao com mais ingredientes +Alchemy.SubSkill.Catalysis.Name=Catálise +Alchemy.SubSkill.Catalysis.Description=Aumenta a velocidade de preparação da poção +Alchemy.SubSkill.Catalysis.Stat=Velocidade de preparação +Alchemy.SubSkill.Concoctions.Name=Misturas +Alchemy.SubSkill.Concoctions.Description=Prepara poções com mais ingredientes +Alchemy.SubSkill.Concoctions.Stat=Rank das misturas: &a{0}&3/&a{1} +Alchemy.SubSkill.Concoctions.Stat.Extra=Ingredientes [&a{0}&3]: &a{1} Alchemy.Listener=Alquimia: -Alchemy.Ability.Locked.0=TRANCADO ATE O NIVEL {0}+ (CATALISE) -Alchemy.Catalysis.Speed=[[RED]]Velocidade de Infusao: [[YELLOW]]{0} -Alchemy.Concoctions.Rank=[[RED]]Classificacao de misturas: [[YELLOW]]{0}/{1} -Alchemy.Concoctions.Ingredients=[[RED]]Ingredientes [[[YELLOW]]{0}[[RED]]]: [[YELLOW]]{1} +Alchemy.Ability.Locked.0=BLOQUEADO ATÉ CHEGAR NO NÍVEL {0}+ HABILIDADE (CAT\U00e1LISE) Alchemy.SkillName=ALQUIMIA -Alchemy.Skillup=[[YELLOW]]Habilidade de Alquimia aumentada para {0}. Total ({1}) -#ARCO -Archery.Combat.DazeChance=[[RED]]Chance de Atordoar: [[YELLOW]]{0} -Archery.Combat.RetrieveChance=[[RED]]Chance de Recuperar Flechas: [[YELLOW]]{0} -Archery.Combat.SkillshotBonus=[[RED]]Dano Extra da Habilidade de Atirar: [[YELLOW]]{0} -Archery.Effect.0=Habilidade de Tiro -Archery.Effect.1=Aumenta o dano feito com arcos -Archery.Effect.2=Atordoar (Jogadores) -Archery.Effect.3=Desorienta inimigos e oferece {0} de dano -Archery.Effect.4=Recuperacao de Flechas -Archery.Effect.5=Chance de recuperar flechas de caDaveres -Archery.Listener=Arco: -Archery.SkillName=ARCO -Archery.Skillup=[[YELLOW]]Habilidade com Arcos aumentada para {0}. Total ({1}) +#ARQUEARIA +Archery.SubSkill.SkillShot.Name=Proficiência em Tiro +Archery.SubSkill.SkillShot.Description=Aumenta o dano com o arco +Archery.SubSkill.SkillShot.Stat=Bônus de dano com Proficiência em Tiro +Archery.SubSkill.Daze.Name=Atordoamento +Archery.SubSkill.Daze.Description=Atordoa inimigos e causa mais DANO +Archery.SubSkill.Daze.Stat=Chance de Atordoamento +Archery.SubSkill.ArrowRetrieval.Name=Recuperação de Flechas +Archery.SubSkill.ArrowRetrieval.Description=Chance de recuperar flechas dos corpos +Archery.SubSkill.ArrowRetrieval.Stat=Chance de recuperação de flechas +Archery.SubSkill.ArcheryLimitBreak.Name=Quebra de Limite com arco +Archery.SubSkill.ArcheryLimitBreak.Description=Quebre seus limites. Aumento de dano contra inimigos difíceis. Feito para PVP, Fica a crité das configurações do servidor se vai ou não aumentar o dano no PVE. +Archery.SubSkill.ArcheryLimitBreak.Stat=DANO máximo com a quebra de limite +Archery.Listener=Arquearia: +Archery.SkillName=ARQUEARIA #MACHADOS -Axes.Ability.Bonus.0=Dominio do Machado -Axes.Ability.Bonus.1=Bonus de {0} de dano -Axes.Ability.Bonus.2=Impacto -Axes.Ability.Bonus.3=Oferece {0} de dano extra a armadura -Axes.Ability.Bonus.4=Impacto Maior -Axes.Ability.Bonus.5=Oferece {0} de dano extra aos inimigos desarmados -Axes.Ability.Lower=[[GRAY]]**VOCE ABAIXA SEU MACHADO** -Axes.Ability.Ready=[[GREEN]]**VOCE PREPARA SEU MACHADO** -Axes.Combat.CritStruck=[[DARK_RED]]Voce levou um dano CRITICO! -Axes.Combat.CritChance=[[RED]]Chance de ataque critico: [[YELLOW]]{0} -Axes.Combat.CriticalHit=[[RED]]DANO CRITICO! -Axes.Combat.GI.Proc=[[GREEN]]**GOLPEADO COM UMA GRANDE FORCA** -Axes.Combat.GI.Struck=[[RED]]**ATINGIDO POR UM GRANDE IMPACTO** -Axes.Combat.SS.Struck=[[DARK_RED]]Atingido por RACHA CRANIOS! -Axes.Combat.SS.Length=[[RED]]Duracao do Racha Cranios: [[YELLOW]]{0}s -Axes.Effect.0=Racha Cranios (Habilidade) -Axes.Effect.1=Oferece dano AoE -Axes.Effect.2=Ataques craticos -Axes.Effect.3=Dano em dobro -Axes.Effect.4=Dominio do Machado -Axes.Effect.5=Adiciona dano extra -Axes.Effect.6=Impacto -Axes.Effect.7=Atacar com grande forca para quebrar armaduras -Axes.Effect.8=Impacto Maior -Axes.Effect.9=Oferece dano extra aos inimigos desarmados +Axes.Ability.Bonus.0=Maestria com Machado +Axes.Ability.Bonus.1=Bônus de {0} de dano +Axes.Ability.Bonus.2=Impacto na armadura +Axes.Ability.Bonus.3=Causa {0} de dano extra em armadura +Axes.Ability.Bonus.4=Grande impacto +Axes.Ability.Bonus.5=Causa {0} de DANO extra em inimigos desarmados +Axes.Ability.Lower=Você abaixou seu Machado. +Axes.Ability.Ready=&7Você está com seu Machado &6pronto. +Axes.Ability.Ready.Extra=&3Você &6está com seu&3 Machado pronto. &7({0} está em recarga por {1}s) +Axes.Combat.CritStruck=&4Você recebey um dano CRÍTICO! +Axes.Combat.CriticalHit=&cDANO CRITÍCO! +Axes.Combat.GI.Proc=&a**GOLPEADO COM UMA GRANDE FORÇA** +Axes.Combat.GI.Struck=&c**ATINGIDO POR UM GRANDE IMPACTO** +Axes.Combat.SS.Struck=&4Atingido por RACHA CRÂNIO! +Axes.SubSkill.SkullSplitter.Name=Racha Crânio +Axes.SubSkill.SkullSplitter.Description=Deu dano em área +Axes.SubSkill.SkullSplitter.Stat=Duração do Racha Crânio +Axes.SubSkill.CriticalStrikes.Name=Golpes críticos +Axes.SubSkill.CriticalStrikes.Description=Dobra o dano +Axes.SubSkill.CriticalStrikes.Stat=Chance de Golpe crítico +Axes.SubSkill.AxeMastery.Name=Maestria com Machado +Axes.SubSkill.AxeMastery.Description=Adiciona dano extra +Axes.SubSkill.AxesLimitBreak.Name=Quebra de limite com machados +Axes.SubSkill.AxesLimitBreak.Description=Quebre seus limites. Aumento de dano contra inimigos difíceis. Feito para PVP, Fica a crité das configurações do servidor se vai ou não aumentar o dano no PVE. +Axes.SubSkill.AxesLimitBreak.Stat=DANO máximo com a quebra de limite +Axes.SubSkill.ArmorImpact.Name=Impacto na Armadura +Axes.SubSkill.ArmorImpact.Description=Ataca com força suficiente para quebrar armadura +Axes.SubSkill.GreaterImpact.Name=Grande Impacto +Axes.SubSkill.GreaterImpact.Description=Causa dano extra contra inimigos desarmados Axes.Listener=Machados: Axes.SkillName=MACHADOS -Axes.Skills.SS.Off=[[RED]]**Racha Cranios foi desagastado** -Axes.Skills.SS.On=[[GREEN]]**Racha Cranios ATIVADO** -Axes.Skills.SS.Refresh=[[GREEN]]Sua habilidade [[YELLOW]]Racha Cranios [[GREEN]]foi refrescada! -Axes.Skills.SS.Other.Off=[[RED]]Racha Cranios[[GREEN]] foi desgastado para [[YELLOW]]{0} -Axes.Skills.SS.Other.On=[[GREEN]]{0}[[DARK_GREEN]] usou [[RED]]Racha Cranios! -Axes.Skillup=[[YELLOW]]Habilidade com Machados foi aumentada para {0}. Total ({1}) +Axes.Skills.SS.Off=**Racha Crânio foi desativado** +Axes.Skills.SS.On=&a**Racha Crânio ATIVADO** +Axes.Skills.SS.Refresh=&aSua habilidade &eRacha Crânio &afoi recarregada! +Axes.Skills.SS.Other.Off=Racha Crânio&a foi desativada por &e{0} +Axes.Skills.SS.Other.On=&a{0}&2 usou &cRacha Crânio! -#EXCAVAcaO -Excavation.Ability.Lower=[[GRAY]]**VOCE ABAIXA SUA PA** -Excavation.Ability.Ready=[[GREEN]]**VOCE PREPARA SUA PA** -Excavation.Effect.0=Britadeira (HABILIDADE) -Excavation.Effect.1=3x Taxa de Drop, 3x EXP, +Velocidade -Excavation.Effect.2=Cacador de Tesouros -Excavation.Effect.3=Habilidade de cavar para o tesouro -Excavation.Effect.Length=[[RED]]Duracao da Britadeira: [[YELLOW]]{0}s -Excavation.Listener=Excavacao: -Excavation.SkillName=ESCAVACAO -Excavation.Skills.GigaDrillBreaker.Off=[[RED]]**Britadeira foi desgastada** -Excavation.Skills.GigaDrillBreaker.On=[[GREEN]]**BRITADEIRA ATIVADA** -Excavation.Skills.GigaDrillBreaker.Refresh=[[GREEN]]Sua habilidade [[YELLOW]]Britadeira [[GREEN]]foi refrescada! -Excavation.Skills.GigaDrillBreaker.Other.Off=[[RED]]Britadeira[[GREEN]] foi desativada para [[YELLOW]]{0} -Excavation.Skills.GigaDrillBreaker.Other.On=[[GREEN]]{0}[[DARK_GREEN]] usou [[RED]]Britadeira! -Excavation.Skillup=[[YELLOW]]Habilidade de Escavacao aumentada para {0}. Total ({1}) +#ESCAVAÇÃO +Excavation.Ability.Lower=&7Você abaixou sua pá. +Excavation.Ability.Ready=Você está com a sua pá &6pronta.&3 +Excavation.SubSkill.GigaDrillBreaker.Name=Super Broca +Excavation.SubSkill.GigaDrillBreaker.Description=3x Taxa de Drop, 3x EXP, +Velocidade +Excavation.SubSkill.GigaDrillBreaker.Stat=Duração da Super Broca +Excavation.SubSkill.Archaeology.Name=Arqueologia +Excavation.SubSkill.Archaeology.Description=Descubra os segredos escondidos na terra! Nível alto dessa habilidade aumenta as suas chances de encontrar orbes de experiência ao encontrar um tesouro! +Excavation.SubSkill.Archaeology.Stat=Chance de orbes de experiência de Arqueologia +Excavation.SubSkill.Archaeology.Stat.Extra=Quantidade de orbes de experiência de Arqueologia +Excavation.Listener=Escavação: +Excavation.SkillName=ESCAVAÇÃO +Excavation.Skills.GigaDrillBreaker.Off=**Super Broca foi desativado** +Excavation.Skills.GigaDrillBreaker.On=&a**SUPER BROCA ATIVADA** +Excavation.Skills.GigaDrillBreaker.Refresh=&aSua habilidade &eSuper Broca &afoi recarregada! +Excavation.Skills.GigaDrillBreaker.Other.Off=Super Broca&a foi desativada por &e{0} +Excavation.Skills.GigaDrillBreaker.Other.On=&a{0}&2 usou &cSuper Broca! #PESCA -Fishing.Ability.Chance=[[RED]]Chance de Mordida: [[YELLOW]]{0} -Fishing.Ability.Info=[[RED]]Cacador Magico: [[GRAY]] **Melhora o Rank de Cacador de Tesouro** -Fishing.Ability.Locked.0=TRANCADO ATE O NIVEL {0}+ (SACUDIDA) -Fishing.Ability.Locked.1=TRANCADO ATE O NIVEL {0}+ (PESCANDO NO GELO) -Fishing.Ability.Locked.2=TRANCADO ATE O NIVEL {0}+ (MASTER ANGLER) -Fishing.Ability.Rank=[[RED]]Rank de Cacador de Tesouro: [[YELLOW]]{0}/{1} -Fishing.Ability.TH.DropRate=[[RED]] Chance de Drop: [[DARK_RED]]Armadilhas: [[YELLOW]]{0} [[GRAY]]Comum: [[YELLOW]]{1} [[GREEN]]Incomum: [[YELLOW]]{2}\n[[BLUE]]Raro: [[YELLOW]]{3} [[LIGHT_PURPLE]]epico: [[YELLOW]]{4} [[GOLD]]LegenDario: [[YELLOW]]{5} [[AQUA]]Registro: [[YELLOW]]{6} -Fishing.Ability.TH.MagicRate=[[RED]]Chance de Cacador Magico: [[YELLOW]]{0} -Fishing.Ability.Shake=[[RED]]Chance de Sacudida: [[YELLOW]]{0} -Fishing.Ability.IceFishing=[[RED]]Pescando no Gelo: VA pescar no gelo -Fishing.Ability.FD=[[RED]]Dieta do Pescador: [[YELLOW]]Rank {0} -Fishing.Effect.0=Cacador de Tesouros (Passivo) -Fishing.Effect.1=Pesca de objetos variados -Fishing.Effect.2=Cacador Magico -Fishing.Effect.3=Encontrar itens Encantados -Fishing.Effect.4=Sacudida (vs. Entidades) -Fishing.Effect.5=Sacode itens para fora dos mobs com a vara de pescar -Fishing.Effect.6=Dieta do Pescador -Fishing.Effect.7=Melhora a fome restaurada vindo de peixes -Fishing.Effect.8=Master Angler -Fishing.Effect.9=Melhora a chance de conseguir uma mordida enquanto pesca -Fishing.Effect.10=Pescando no Gelo -Fishing.Effect.11=Permite VOCE pescar em biomas de Gelo -Fishing.Chance.Raining=[[BLUE]] Bonus de Chuva +Fishing.ScarcityTip=&e&oEsta área está sofrendo de pesca excessiva, pesque em outro lugar para pegar mais peixes. No minímo {0} blocos de distância. +Fishing.Scared=&7&oMovimentos caóticos irão assustar os peixes! +Fishing.Exhausting=&c&oUso impróprio da vara de pesca vai causar fadiga e irá desgastar a vara! +Fishing.LowResourcesTip=&7Você sente que talvez não tenha muitos peixes sobrando nessa área. Tente pescar à no mínimo {0} blocos de distância. +Fishing.Ability.Info=Caçador Mágico: &7 **Aumenta com o rank de Caçador de Tesouros** +Fishing.Ability.Locked.0=BLOQUEADO ATÉ CHEGAR NO NÍVEL {0}+ HABILIDADE (SACUDIR) +Fishing.Ability.Locked.1=BLOQUEADO ATÉ CHEGAR NO NÍVEL {0}+ HABILIDADE (PESCA NO GELO) +Fishing.Ability.Locked.2=BLOQUEADO ATÉ CHEGAR NO NÍVEL {0}+ HABILIDADE (MESTRE PESCADOR) +Fishing.SubSkill.TreasureHunter.Name=Caçador de Tesouros +Fishing.SubSkill.TreasureHunter.Description=Pesca itens diversos +Fishing.SubSkill.TreasureHunter.Stat=Rank de Caçador de Tesouros: &a{0}&3/&a{1} +Fishing.SubSkill.TreasureHunter.Stat.Extra=Taxa de drop: &7Comum: &e{0} &aIncomum: &e{1}\n&9Raro: &e{2} &d: &eÉpico{3} &6Lendário: &e{4} &bMístico: &e{5} +Fishing.SubSkill.MagicHunter.Name=Caçador Mágico +Fishing.SubSkill.MagicHunter.Description=Encontra itens de encantamentos +Fishing.SubSkill.MagicHunter.Stat=Chance do Caçador Mágico +Fishing.SubSkill.Shake.Name=Sacudir +Fishing.SubSkill.Shake.Description=Sacode mobs ou jogadores para derrubar itens com a vara de pesca +Fishing.SubSkill.Shake.Stat=Chance de Sacudir +Fishing.SubSkill.FishermansDiet.Name=Dieta de Pescador +Fishing.SubSkill.FishermansDiet.Description=Aumenta a fome restaurada de comidas feitas com peixes +Fishing.SubSkill.FishermansDiet.Stat=Dieta de Pescador:&a Rank {0} +Fishing.SubSkill.MasterAngler.Name=Mestre Pescador +Fishing.SubSkill.MasterAngler.Description=Pesca peixes mais frequentemente, funciona melhor quando se pesca de barco. +Fishing.SubSkill.MasterAngler.Stat=Redução de tempo de espera mínima do peixe: &a-{0} segundos +Fishing.SubSkill.MasterAngler.Stat.Extra=Redução de tempo de espera máxima do peixe: &a-{0} segundos +Fishing.SubSkill.IceFishing.Name=Pesca no Gelo +Fishing.SubSkill.IceFishing.Description=Permite pescar em biomas gélidos +Fishing.SubSkill.IceFishing.Stat=Pesca no Gelo +Fishing.Chance.Raining=&9 Bônus de chuva Fishing.Listener=Pesca: -Fishing.Ability.TH.MagicFound=[[GRAY]]VOCE sentiu um toque de magia nesta pescada... -Fishing.Ability.TH.Boom=[[GRAY]]EPOCA DE CRESCIMENTO!!! -Fishing.Ability.TH.Poison=[[GRAY]]Algo nao cheira bem... +Fishing.Ability.TH.MagicFound=&7você sente um toque de mágica com essa fisgada... +Fishing.Ability.TH.Boom=&7HORA DO CRESCIMENTO!!! +Fishing.Ability.TH.Poison=&7Algo não cheira bem... Fishing.SkillName=PESCA -Fishing.Skillup=[[YELLOW]]Habilidade de Pesca aumentada para {0}. Total ({1}) #HERBALISMO -Herbalism.Ability.DoubleDropChance=[[RED]]Chance de Drop Duplo: [[YELLOW]]{0} -Herbalism.Ability.FD=[[RED]]Dieta do Fazendeiro: [[YELLOW]]Rank {0} -Herbalism.Ability.GTe.Length=[[RED]]Duracao da Terra Verde: [[YELLOW]]{0}s -Herbalism.Ability.GTe.NeedMore=[[RED]]VOCE precisa de mais sementes para usar Terra Verde. -Herbalism.Ability.GTh.Chance=[[RED]]Chance de Dedao Verde: [[YELLOW]]{0} -Herbalism.Ability.GTh.Fail=[[RED]]**DEDAO VERDE FALHOU** -Herbalism.Ability.GTh.Stage=[[RED]]Estagio do Dedao Verde: [[YELLOW]] As plantas crescem em estagio {0} -Herbalism.Ability.GTh=[[GREEN]]**DEDAO VERDE** -Herbalism.Ability.HylianLuck=[[RED]]Chance de Sorte de Hylian: [[YELLOW]]{0} -Herbalism.Ability.Lower=[[GRAY]]**VOCE ABAIXA SUA ENXADA** -Herbalism.Ability.Ready=[[GREEN]]**VOCE PREPARA SUA ENXADA** -Herbalism.Ability.ShroomThumb.Chance=[[RED]]Chance de Dedo Cogumelo: [[YELLOW]]{0} -Herbalism.Ability.ShroomThumb.Fail=[[RED]]**DEDO COGUMELO FALHOU** -Herbalism.Effect.0=Terra Verde (HABILIDADE) -Herbalism.Effect.1=Espalha a Terra, 3x Drops -Herbalism.Effect.2=Dedao Verde (Trigo) -Herbalism.Effect.3=Auto-Planta na hora da colheita -Herbalism.Effect.4=Dedao Verde (Blocos) -Herbalism.Effect.5=Coloca Musgo nos Tijolos ou faz a Grama Crescer -Herbalism.Effect.6=Dieta do Fazendeiro -Herbalism.Effect.7=Restaura a fome apartir dos alimentos plantados -Herbalism.Effect.8=Drop Duplo (Todas as Plantas) -Herbalism.Effect.9=Dobra o Saque normal -Herbalism.Effect.10=Sorte de Hylian -Herbalism.Effect.11=Da uma pequena chance de encontrar itens raros -Herbalism.Effect.12=Dedo Cogumelo -Herbalism.Effect.13=Espalha Cogumelos Marrons pela Terra ou Grama -Herbalism.HylianLuck=[[GREEN]]A Sorte de Hylian esta com VOCE hoje! +Herbalism.Ability.GTe.NeedMore=Você precisa de mais sementes para espalhar Terra Verde. +Herbalism.Ability.GTh.Fail=**POLEGAR VERDE FALHOU** +Herbalism.Ability.GTh=&a**POLEGAR VERDE** +Herbalism.Ability.Lower=&7Você abaixou sua enxada. +Herbalism.Ability.Ready=&3Você está com a sua enxada &6pronta. +Herbalism.Ability.ShroomThumb.Fail=**POLEGAR DE COGUMELO FALHOU** +Herbalism.SubSkill.GreenTerra.Name=Terra Verde +Herbalism.SubSkill.GreenTerra.Description=Espalha a Terra, 3x Drops, melhora o Polegar Verde +Herbalism.SubSkill.GreenTerra.Stat=Duração da Terra Verde +Herbalism.SubSkill.GreenThumb.Name=Polegar Verde +Herbalism.SubSkill.GreenThumb.Description=Planta automaticamente ao colher com a enxada +Herbalism.SubSkill.GreenThumb.Stat=Chance do Polegar Verde +Herbalism.SubSkill.GreenThumb.Stat.Extra=Estágio do Polegar Verde: &a Plantações crescem no estágio {0} +Herbalism.Effect.4=Polegar Verde (Blocos) +Herbalism.SubSkill.GreenThumb.Description.2=Make Faz tijolos ficarem com musgo ou faz crescer grama +Herbalism.SubSkill.FarmersDiet.Name=Dieta de Fazendeiro +Herbalism.SubSkill.FarmersDiet.Description=Aumenta a vida restaurada por comida feito com alimentos cultivados +Herbalism.SubSkill.FarmersDiet.Stat=Dieta de Fazendeiro: &aRank {0} +Herbalism.SubSkill.DoubleDrops.Name=Drops duplos +Herbalism.SubSkill.DoubleDrops.Description=Dobra o loot normal +Herbalism.SubSkill.DoubleDrops.Stat=Chance de Drops duplos +Herbalism.SubSkill.HylianLuck.Name=Sorte de Hylian +Herbalism.SubSkill.HylianLuck.Description=Dá uma pequena chance de encontrar itens raros +Herbalism.SubSkill.HylianLuck.Stat=Chance de Sorte de Hylian +Herbalism.SubSkill.ShroomThumb.Name=Polegar de Cogumelo +Herbalism.SubSkill.ShroomThumb.Description=Espalha micélio na terra e na grama +Herbalism.SubSkill.ShroomThumb.Stat=Chance do Polegar de Cogumelo +Herbalism.HylianLuck=&aA sorte de Hylian está com você hoje! Herbalism.Listener=Herbalismo: Herbalism.SkillName=HERBALISMO -Herbalism.Skills.GTe.Off=[[RED]]**Terra Verde foi desagastado** -Herbalism.Skills.GTe.On=[[GREEN]]**TERRA VERDE ATIVADO** -Herbalism.Skills.GTe.Refresh=[[GREEN]]Sua Habilidade [[YELLOW]]Terra Verde [[GREEN]]foi refrescada! -Herbalism.Skills.GTe.Other.Off=[[RED]]Terra Verde[[GREEN]] foi desgastada para [[YELLOW]]{0} -Herbalism.Skills.GTe.Other.On=[[GREEN]]{0}[[DARK_GREEN]] usou [[RED]]Terra Verde! -Herbalism.Skillup=[[YELLOW]]Habilidade de Herbalismo aumentada para {0}. Total ({1}) +Herbalism.Skills.GTe.Off=**Terra Verde foi desativada** +Herbalism.Skills.GTe.On=&a**Terra verde ATIVADA** +Herbalism.Skills.GTe.Refresh=&aSua habilidade &eTerra Verde &afoi recarregada! +Herbalism.Skills.GTe.Other.Off=Terra Verde&a foi desativada por &e{0} +Herbalism.Skills.GTe.Other.On=&a{0}&2 usou &cTerra Verde! -#MINERAcaO -Mining.Ability.Length=[[RED]]Duracao do Super Quebrador: [[YELLOW]]{0}s -Mining.Ability.Locked.0=TRANCADO ATE O NIVEL {0}+ (Mineracao EXPLOSIVA) -Mining.Ability.Locked.1=TRANCADO ATE O NIVEL {0}+ (BOMBAS MAIORES) -Mining.Ability.Locked.2=TRANCADO ATE O NIVEL {0}+ (PERICIA EM DEMOLICAO) -Mining.Ability.Lower=[[GRAY]]**VOCE ABAIXA SUA PICARETA** -Mining.Ability.Ready=[[GREEN]]**VOCE PREPARA SUA PICARETA** -Mining.Effect.0=Super Quebrador (HABILIDADE) -Mining.Effect.1=Velocidade Maior, Chance Tripla de Drop -Mining.Effect.2=Drops em dobro -Mining.Effect.3=Dobra a pilhagem normal -Mining.Effect.4=Mineracao Explosiva -Mining.Effect.5=Bonus em minerar com TNT -Mining.Effect.6=Bombas Maiores -Mining.Effect.7=Aumenta o raio de explosao da TNT -Mining.Effect.8=Pericia em Demolicao -Mining.Effect.9=Diminui o dano das explosoes da TNT -Mining.Effect.Decrease=[[RED]]Diminuicao de Dano da Pericia em Demolicao: [[YELLOW]]{0} -Mining.Effect.DropChance=[[RED]]Chance de Drop em Dobro: [[YELLOW]]{0} -Mining.Listener=Mineracao: -Mining.SkillName=MINERACAO -Mining.Skills.SuperBreaker.Off=[[RED]]**Super Quebrador foi desgastado** -Mining.Skills.SuperBreaker.On=[[GREEN]]**SUPER QUEBRADOR ATIVADO** -Mining.Skills.SuperBreaker.Other.Off=[[RED]]Super Quebrador[[GREEN]] foi desgastado para [[YELLOW]]{0} -Mining.Skills.SuperBreaker.Other.On=[[GREEN]]{0}[[DARK_GREEN]] usou [[RED]]Super Quebrador! -Mining.Skills.SuperBreaker.Refresh=[[GREEN]]Sua Habilidade [[YELLOW]]Super Quebrador [[GREEN]]foi refrescada! -Mining.Skillup=[[YELLOW]]Habilidade de Mineracao foi aumentada para {0}. Total ({1}) +#MINERAÇÃO +Mining.Ability.Locked.0=BLOQUEADO ATÉ CHEGAR NO NÍVEL {0}+ HABILIDADE (MINERAÇÃO EXPLOSIVA) +Mining.Ability.Locked.1=BLOQUEADO ATÉ CHEGAR NO NÍVEL {0}+ HABILIDADE (BOMBAS MAIORES) +Mining.Ability.Locked.2=BLOQUEADO ATÉ CHEGAR NO NÍVEL {0}+ HABILIDADE (ESPECIALISTA EM DEMOLIÇÃO) +Mining.Ability.Lower=&7Você abaixou sua picareta. +Mining.Ability.Ready=&3Você está com a sua picareta &6pronta. +Mining.SubSkill.SuperBreaker.Name=Super Quebra +Mining.SubSkill.SuperBreaker.Description=+Velocidade, Chance de drop triplicada +Mining.SubSkill.SuperBreaker.Stat=Duração da Super Quebra +Mining.SubSkill.DoubleDrops.Name=Drops duplos +Mining.SubSkill.DoubleDrops.Description=Dobra a quantidade de minerios que caem +Mining.SubSkill.DoubleDrops.Stat=Chance de Drops Duplos +Mining.SubSkill.BlastMining.Name=Mineração Explosiva +Mining.SubSkill.BlastMining.Description=Bônus ao minerar com TNT +Mining.SubSkill.BlastMining.Stat=Mineração Explosiva:&a Rank {0}/{1} &7({2}) +Mining.SubSkill.BlastMining.Stat.Extra=Aumenta o raio das explosões: &a+{0} +Mining.SubSkill.BiggerBombs.Name=Bombas Maiores +Mining.SubSkill.BiggerBombs.Description=Aumenta o raio das explosões de TNT +Mining.SubSkill.DemolitionsExpertise.Name=Especialista em Demolição +Mining.SubSkill.DemolitionsExpertise.Description=Diminui o dano recebido por explosões de TNT +Mining.SubSkill.DemolitionsExpertise.Stat=Diminuição de dano do Especialista em Demolição -#Mineracao Explosiva -Mining.Blast.Boom=[[GRAY]]**BOOM** -Mining.Blast.Effect=+{0} Rendimento de Minerios, {1}x drops -Mining.Blast.Radius.Increase=[[RED]]Aumento no Raio de explosao: [[YELLOW]]+{0} -Mining.Blast.Rank=[[RED]]Mineracao Explosiva: [[YELLOW]] Rank {0}/{1} [[GRAY]]({2}) -Mining.Blast.Other.On=[[GREEN]]{0}[[DARK_GREEN]] usou [[RED]]Mineracao Explosiva! -Mining.Blast.Refresh=[[GREEN]]Sua Habilidade [[YELLOW]]Mineracao Explosiva [[GREEN]]foi refrescada! +Mining.Listener=Mineração: +Mining.SkillName=MINERAÇÃO +Mining.Skills.SuperBreaker.Off=**Super Quebra foi desligada** +Mining.Skills.SuperBreaker.On=&a**SUPER QUEBRA ATIVADA** +Mining.Skills.SuperBreaker.Other.Off=Super Quebra&a foi desligado por &e{0} +Mining.Skills.SuperBreaker.Other.On=&a{0}&2 usou &cSuper Quebra! +Mining.Skills.SuperBreaker.Refresh=&aSua habilidade &eSuper Quebra &afoi recarregada! -#REPARAR -Repair.Effect.0=Reparar -Repair.Effect.1=Reparar Ferramentas & Armaduras -Repair.Effect.10=Reparar com Ouro ({0}+ HABILIDADE) -Repair.Effect.11=Reparar Ferramentas de Ouro & Armadura -Repair.Effect.12=Reparar com Ferro ({0}+ HABILIDADE) -Repair.Effect.13=Reparar Ferramentas de Ferro & Armadura -Repair.Effect.14=Reparar com Pedra ({0}+ HABILIDADE) -Repair.Effect.15=Reparar Ferramentas de Pedra -Repair.Effect.2=Dominio de Reparacao -Repair.Effect.3=Aumenta a Quantidade de Reparacao -Repair.Effect.4=Super Reparo -Repair.Effect.5=Dobra a efetividade -Repair.Effect.6=Reparar com Diamante ({0}+ HABILIDADE) -Repair.Effect.7=Reparar Ferramentas de Diamante & Armadura -Repair.Effect.8=Forjamento Secreto -Repair.Effect.9=Repara items Magicos -Repair.Error=[[DARK_RED]]mcMMO encontrou um erro ao reparar este item! -Repair.Listener.Anvil=[[DARK_RED]]VOCE colocou uma bigorna, bigornas podem reparar ferramentas e armaduras. -Repair.Listener=Reparacao: -Repair.SkillName=REPARACAO -Repair.Skills.AdeptDiamond=[[DARK_RED]]VOCE nao tem habilidade suficiente para reparar Diamante. -Repair.Skills.AdeptGold=[[DARK_RED]]VOCE nao tem habilidade suficiente para reparar Ouro. -Repair.Skills.AdeptIron=[[DARK_RED]]VOCE nao tem habilidade suficiente para reparar Ferro. -Repair.Skills.AdeptStone=[[DARK_RED]]VOCE nao tem habilidade suficiente para reparar Pedra. -Repair.Skills.Adept=[[RED]]VOCE precisa do NIVEL [[YELLOW]]{0}[[RED]] para reparar [[YELLOW]]{1} -Repair.Skills.FeltEasy=[[GRAY]]Isso foi facil. -Repair.Skills.FullDurability=[[GRAY]]A durabilidade disto esta completa. -Repair.Skills.Mastery=[[RED]]Dominio de Reparacao: [[YELLOW]]{0} de durabilidade restaurada a mais. -Repair.Skills.StackedItems=[[DARK_RED]]VOCE nao pode reparar items empilhados. -Repair.Skills.Super.Chance=[[RED]]Chance de Super Reparo: [[YELLOW]]{0} -Repair.Skillup=[[YELLOW]]Habilidade de Reparacao aumentada para {0}. Total ({1}) -Repair.Pretty.Name=Reparar +#Mineração Explosiva +Mining.Blast.Boom=&7**BOOM** +Mining.Blast.Cooldown= +Mining.Blast.Effect=+{0} minérios de rendimento, {1}x drops +Mining.Blast.Other.On=&a{0}&2 usou &cMineração Explosiva! +Mining.Blast.Refresh=&aSua habilidade &eMineração Explosiva &afoi recarregada! -#Forjamento Misterioso -Repair.Arcane.Chance.Downgrade=[[GRAY]]Chance de rebaixar o FS: [[YELLOW]]{0}% -Repair.Arcane.Chance.Success=[[GRAY]]Taxa de Sucesso do FS: [[YELLOW]]{0}% -Repair.Arcane.Downgrade=[[RED]]Poder Misterioso foi diminuido para esse item. -Repair.Arcane.Fail=[[RED]]Poder Misterioso saiu permanentemente do item. -Repair.Arcane.Lost=[[RED]]VOCE nao foi habil suficiente para manter todos os encantamentos. -Repair.Arcane.Perfect=[[GREEN]]VOCE sustentou suas energias secretas neste item. -Repair.Arcane.Rank=[[RED]]Forjamento Secreto: [[YELLOW]]Rank {0}/{1} +#REPARAÇÃO +Repair.SubSkill.Repair.Name=Reparação +Repair.SubSkill.Repair.Description=Repara ferramentas e armaduras +Repair.SubSkill.GoldRepair.Name=Reparação de Ouro ({0}+ HABILIDADE) +Repair.SubSkill.GoldRepair.Description=Repara ferramentas e armaduras de ouro +Repair.SubSkill.IronRepair.Name=Reparação de Ferro ({0}+ HABILIDADE) +Repair.SubSkill.IronRepair.Description=Repara ferramentas e armaduras de ferro +Repair.SubSkill.StoneRepair.Name=Reparação de pedra ({0}+ HABILIDADE) +Repair.SubSkill.StoneRepair.Description=Repara ferramentas de pedra +Repair.SubSkill.RepairMastery.Name=Maestria em Reparo +Repair.SubSkill.RepairMastery.Description=Aumenta a quantidade de reparo +Repair.SubSkill.RepairMastery.Stat=Maestria em Reparo: &aMais {0} de durabilidade restaurada +Repair.SubSkill.SuperRepair.Name=Super Reparo +Repair.SubSkill.SuperRepair.Description=Dobra a efetividade +Repair.SubSkill.SuperRepair.Stat=Chance de Super Reparo +Repair.SubSkill.DiamondRepair.Name=Reparo de Diamante ({0}+ HABILIDADE) +Repair.SubSkill.DiamondRepair.Description=Repara ferramentas e armaduras de diamante +Repair.SubSkill.ArcaneForging.Name=Forja Arcana +Repair.SubSkill.ArcaneForging.Description=Repara itens mágicos +Repair.SubSkill.ArcaneForging.Stat=Forja Arcana: &eRank {0}/{1} +Repair.SubSkill.ArcaneForging.Stat.Extra=&3Chance de Forja Arcana:&7 Sucesso &a{0}&7%, Falha &c{1}&7% +Repair.Error=&4mcMMO encontrou um erro ao tentar reparar esse item! +Repair.Listener.Anvil=&4Você colocou uma bigorna, bigorna pode reparar ferramentas e armaduras. +Repair.Listener=Reparação: +Repair.SkillName=REPARAÇÃO +Repair.Skills.AdeptDiamond=&4Você não tem habilidade o suficiente para reparar Diamante. +Repair.Skills.AdeptGold=&4Você não tem habilidade o suficiente para reparar Ouro. +Repair.Skills.AdeptIron=&4Você não tem habilidade o suficiente para reparar Ferro. +Repair.Skills.AdeptStone=&4Você não tem habilidade o suficiente para reparar Pedra. +Repair.Skills.Adept=&cVocê deve estar no nível &e{0}&c para reparar &e{1} +Repair.Skills.FeltEasy=&7Isso pareceu fácil. +Repair.Skills.FullDurability=&7Isso já está com durabilidade máxima. +Repair.Skills.StackedItems=&4Você não pode reparar itens empilhados. +Repair.Pretty.Name=Reparação -#SALVAMENTO -Salvage.Pretty.Name=Salvamento -Salvage.Effect.0=Salvamento Avancado -Salvage.Effect.1=Itens de Salvamento Danificados -Salvage.Effect.2=Salvamento Misterioso -Salvage.Effect.3=Extrair encantamentos dos itens -Salvage.Ability.Locked.0=TRANCADO ATE O NIVEL {0}+ (SALVAMENTO Avancado) -Salvage.Ability.Bonus.0=Salvamento Avancado -Salvage.Ability.Bonus.1=Rendimento Maximo de {0} do item destruicao -Salvage.Arcane.Rank=[[RED]]Salvamento Misterioso: [[YELLOW]]Rank {0}/{1} -Salvage.Arcane.ExtractFull=[[GRAY]]Possibilidade de ENCANTAMENTO-Maximo do FS -Salvage.Arcane.ExtractPartial=[[GRAY]]Possibilidade de ENCANTAMENTO-PARCIAL do FS -Salvage.Skills.Success=[[GREEN]]Item salvo! -Salvage.Skills.Adept.Damaged=[[DARK_RED]]VOCE nao tem habilidade suficiente para salvar os itens danificados. -Salvage.Skills.Adept.Level=[[RED]]VOCE precisa do NIVEL [[YELLOW]]{0}[[RED]] para salvar [[YELLOW]]{1} -Salvage.Skills.TooDamaged=[[DARK_RED]]Este item esta muito gasto para ser salvo. -Salvage.Skills.ArcaneFailed=[[RED]]VOCE nao foi capaz de extrair o conhecimento contido neste item. -Salvage.Skills.ArcanePartial=[[YELLOW]]VOCE so foi capaz de extrair alguns conhecimentos contidos neste item. -Salvage.Skills.ArcaneSuccess=[[GREEN]]VOCE e capaz de extrair todo o conhecimento contido neste item. -Salvage.Listener.Anvil=[[DARK_RED]]VOCE colocou uma Bigorna de Salvamento, use isto para salvar Ferramentas e Armaduras. -Salvage.Listener=Salvamento: -Salvage.SkillName=SALVAMENTO +#Forja Arcana +Repair.Arcane.Downgrade=O poder arcano diminuiu neste item. +Repair.Arcane.Fail=O poder arcano desapareceu por completo deste item. +Repair.Arcane.Lost=Você não foi habilidoso o suficiente para manter os encantamentos. +Repair.Arcane.Perfect=&aVocê manteve as energias arcanas neste item. + +#RECUPERAÇÃO +Salvage.Pretty.Name=Recuperação +Salvage.SubSkill.UnderstandingTheArt.Name=Entendendo a Arte +Salvage.SubSkill.UnderstandingTheArt.Description=Você não está só vasculhando o lixo de seus vizinhos, mas também está cuidando do meio ambiente.\nAumenta várias propriedades de Recuperação. +Salvage.SubSkill.ScrapCollector.Name=Coletor de Sucata +Salvage.SubSkill.ScrapCollector.Description=Recupera materiais de um item, uma recuperação perfeita depende de habilidade e sorte. +Salvage.SubSkill.ScrapCollector.Stat=Scrap Collector: &aRecuperou &e{0}&a itens. Teve um pouco de sorte envolvida. +Salvage.SubSkill.ArcaneSalvage.Name=Recuperação Arcana +Salvage.SubSkill.ArcaneSalvage.Description=Extrai encantamentos de um item +Salvage.SubSkill.ArcaneSalvage.Stat=Recuperação Arcana: &eRank {0}/{1} +Salvage.Ability.Bonus.0=Coletor de Sucata +Salvage.Ability.Bonus.1=&aRecuperou &e{0}&a itens. Teve um pouco de sorte envolvida. +Salvage.Arcane.ExtractFull=&7Chance de encantamento total +Salvage.Arcane.ExtractPartial=&7Chance de encantamento parcial +Salvage.Skills.Success=&aItem recuperado! +Salvage.Skills.Adept.Damaged=&4Você não é habilidoso o suficiente para recuperar itens danificados. +Salvage.Skills.Adept.Level=Você deve estar no nível &e{0}&c para recuperar &e{1} +Salvage.Skills.TooDamaged=&4Esse item está muito danificado para ser recuperado. +Salvage.Skills.ArcaneFailed=&cVocê não conseguiu extrair o conhecimento contido dentro deste item. +Salvage.Skills.ArcanePartial=&cVocê só conseguiu extrair um pouco do conhecimento contido dentro deste item. +Salvage.Skills.ArcaneSuccess=&aVocê conseguiu extrair todo o conhecimento contido dentro deste item! +Salvage.Listener.Anvil=&4Você colocou uma birgona de recuperação, use ela para recuperar ferramentas e armaduras. +Salvage.Listener=Recuperação: +Salvage.SkillName=RECUPERAÇÃO +Salvage.Skills.Lottery.Normal=&6Você conseguiu recuperar &3{0}&6 materiais de &e{1}&6. +Salvage.Skills.Lottery.Perfect=&a&lPerfeito!&r&6 Você recuperou &3{1}&6 sem esfoço algum, reavendo &3{0}&6 materiais. +Salvage.Skills.Lottery.Untrained=&7Você não está bem treinado em recuperação. Só conseguiu recuperar &c{0}&7 materiais de &a{1}&7. + +#Bigorna (Compartilhado entre RECUPERAÇÃO E REPARAÇÃO) +Anvil.Unbreakable=Este item é inquebravél! #ESPADAS -Swords.Ability.Lower=[[GRAY]]**VOCE ABAIXA SUA ESPADA** -Swords.Ability.Ready=[[GREEN]]**VOCE PREPARA SUA ESPADA** -Swords.Combat.Bleed.Chance=[[RED]]Chance de Sangramento: [[YELLOW]]{0} -Swords.Combat.Bleed.Length=[[RED]]Tempo de Sangramento: [[YELLOW]]{0} ticks -Swords.Combat.Bleed.Note=[[GRAY]]NOTA: [[YELLOW]]1 Tick e igual a 2 segundos -Swords.Combat.Bleeding.Started=[[DARK_RED]] VOCE esta sangrando! -Swords.Combat.Bleeding.Stopped=[[GRAY]]O Sangramento [[GREEN]]parou[[GRAY]]! -Swords.Combat.Bleeding=[[GREEN]]**INIMIGO SANGRANDO** -Swords.Combat.Counter.Chance=[[RED]]Chance de Contra-Ataque: [[YELLOW]]{0} -Swords.Combat.Counter.Hit=[[DARK_RED]]Bateu como Contra-Ataque! -Swords.Combat.Countered=[[GREEN]]**CONTRA-ATACADO** -Swords.Combat.SS.Struck=[[DARK_RED]]Golpeado pelo ATAQUE CORTANTE! -Swords.Effect.0=Contra Ataque -Swords.Effect.1=Reflete {0} de dano tomado -Swords.Effect.2=Ataques Cortantes (HABILIDADE) -Swords.Effect.3={0} de dano AoE, Sangra+ AoE -Swords.Effect.4=Ataques Cortantes Sangra+ -Swords.Effect.5={0} Ticks de Sangramento -Swords.Effect.6=Sangue -Swords.Effect.7=Aplica um sangramento DoT +Swords.Ability.Lower=&7Você abaixou sua espada. +Swords.Ability.Ready=&3Você está com a sua espada &6pronta. +Swords.Combat.Rupture.Note.Update.One=&7(Nota de ruptura): O dano periódico não é letal, acontece duas vezes por segundo e ignora armadura +Swords.Combat.Bleeding.Started=&4 Você está sangrando! +Swords.Combat.Bleeding.Stopped=&7O sangramento &aparou&7! +Swords.Combat.Bleeding=&a**INIMIGO SANGRANDO** +Swords.Combat.Counter.Hit=&4Fez um contra-ataque! +Swords.Combat.Countered=&a**CONTRA ATACADO** +Swords.Combat.SS.Struck=&4Golpeado com ATAQUE CORTANTE! +Swords.SubSkill.CounterAttack.Name=Contra-ataque +Swords.SubSkill.CounterAttack.Description=Reflete uma parte do dano quando atacado! +Swords.SubSkill.CounterAttack.Stat=Chance de Contra-ataque +Swords.SubSkill.SerratedStrikes.Name=Ataques cortantes +Swords.SubSkill.SerratedStrikes.Description=Dá uma parte do dano em área com chance de aplicar Ruptura! +Swords.SubSkill.SerratedStrikes.Stat=Duração dos Ataques Cortantes +Swords.SubSkill.Rupture.Name=Ruptura +Swords.SubSkill.Rupture.Description=Efeito de dano ao longo do tempo que acaba explosivamente +Swords.SubSkill.Stab.Name=Estocada +Swords.SubSkill.Stab.Description=Adiciona dano extra nos seus ataques. +Swords.SubSkill.Stab.Stat=Dano da Estocada +Swords.SubSkill.SwordsLimitBreak.Name=Quebra de Limite com Espadas +Swords.SubSkill.SwordsLimitBreak.Description=Quebre seus limites. Aumento de dano contra inimigos difíceis. Feito para PVP, Fica a crité das configurações do servidor se vai ou não aumentar o dano no PVE. +Swords.SubSkill.SwordsLimitBreak.Stat=DANO máximo da Quebra de Limite +Swords.SubSkill.Rupture.Stat=Chance de Ruptura +Swords.SubSkill.Rupture.Stat.Extra=[[DARK_AQUA]]Duração da Ruptura: &e{0}s&a vs Jogadores, &e{1}s&a vs Mobs. +Swords.SubSkill.Rupture.Stat.TickDamage=[[DARK_AQUA]]Dano puro da Ruptura por tempo: &e{0}&a vs Jogadores, &e{1}&a vs Mobs. +Swords.SubSkill.Rupture.Stat.ExplosionDamage=[[DARK_AQUA]]Dano explosivo da Ruptura: &e{0}&a vs Jogadores, &e{1}&a vs Mobs +Swords.Effect.4=Ruptura com Golpes Cortantes+ +Swords.Effect.5={0} Tempo Ruptura Swords.Listener=Espadas: Swords.SkillName=ESPADAS -Swords.Skills.SS.Off=[[RED]]**Ataques Cortantes desgastados** -Swords.Skills.SS.On=[[GREEN]]**ATAQUES CORTANTES ATIVADO** -Swords.Skills.SS.Refresh=[[GREEN]]Sua habilidade [[YELLOW]]Ataques Cortantes [[GREEN]]foi refrescada! -Swords.Skills.SS.Other.Off=[[RED]]Ataques Cortantes[[GREEN]] foi desgastado para [[YELLOW]]{0} -Swords.Skills.SS.Other.On=[[GREEN]]{0}[[DARK_GREEN]] usou [[RED]]Ataque Cortantes! -Swords.Skillup=[[YELLOW]]Habilidade com espadas aumentada para {0}. Total ({1}) -Swords.SS.Length=[[RED]]Duracao dos Ataques Cortantes: [[YELLOW]]{0}s +Swords.Skills.SS.Off=**Ataques Cortantes foi desligado** +Swords.Skills.SS.On=&a**ATAQUES CORTANTES ATIVADO** +Swords.Skills.SS.Refresh=&aSua habilidade &eAtaques Cortantes &afoi recarregada! +Swords.Skills.SS.Other.Off=Ataques Cortantes&a foi desligado por &e{0} +Swords.Skills.SS.Other.On=&a{0}&2 usou &cAtaques Cortantes! -#DOMAR -Taming.Ability.Bonus.0=Consciencia Ambiental -Taming.Ability.Bonus.1=Lobos evitam perigo -Taming.Ability.Bonus.2=Pele Grossa -Taming.Ability.Bonus.3=1/{0} Dano, Resistencia ao Fogo -Taming.Ability.Bonus.4=Prova de Impacto -Taming.Ability.Bonus.5=Explosivos dao apenas 1/{0} do dano normal +#ADESTRAMENTO +Taming.Ability.Bonus.0=Consciência Ambiental +Taming.Ability.Bonus.1=Lobos evitam o perigo +Taming.Ability.Bonus.2=Pelo Grosso +Taming.Ability.Bonus.3=1/{0} Dano, Resistência ao fogo +Taming.Ability.Bonus.4=ResistênCIA a impactos +Taming.Ability.Bonus.5=Explosivos dão 1/{0} do dano normal Taming.Ability.Bonus.6=Garras Afiadas -Taming.Ability.Bonus.7=+{0} de Dano -Taming.Ability.Bonus.8=Servico Fast Food -Taming.Ability.Bonus.9={0} de chance de cura no ataque -Taming.Ability.Bonus.10=Cao Piedoso -Taming.Ability.Bonus.11=Recupera a vida quando e danificado por magia ou veneno -Taming.Ability.Locked.0=TRAVADO ATE O NIVEL {0}+ (Consciencia AMBIENTAL) -Taming.Ability.Locked.1=TRAVADO ATE O NIVEL {0}+ (PELE GROSSA) -Taming.Ability.Locked.2=TRAVADO ATE O NIVEL {0}+ (PROVA DE IMPACTO) -Taming.Ability.Locked.3=TRAVADO ATE O NIVEL {0}+ (GARRAS AFIADAS) -Taming.Ability.Locked.4=TRAVADO ATE O NIVEL {0}+ (SERVICO FAST FOOD) -Taming.Ability.Locked.5=TRAVADO ATE O NIVEL {0}+ (CAO DE CACA) -Taming.Combat.Chance.Gore=[[RED]]Chance de Coagulacao: [[YELLOW]]{0} -Taming.Effect.0=Conhecimento Besta -Taming.Effect.1=Osso Colossal examina lobos e jaguatiricas -Taming.Effect.10=Prova de Impacto -Taming.Effect.11=Reducao de Dano Explosivos -Taming.Effect.12=Chamada Selvagem -Taming.Effect.13=Invoca um animal ao seu lado -Taming.Effect.14=[[GRAY]]COTW: Agache e use clique-esquerdo com\n {0} {1} (Jaguatirica), {2} {3} (Lobo), {4} {5} (Cavalo) -Taming.Effect.16=Servico Fast Food -Taming.Effect.17=Chance para lobos se curarem ao atacar -Taming.Effect.18=Cao Piedoso -Taming.Effect.19=Curado por Magia & Veneno -Taming.Effect.2=Coagulacao -Taming.Effect.3=Ataque critico que causa sangramento -Taming.Effect.4=Garras Afiadas -Taming.Effect.5=Dano Extra -Taming.Effect.6=Consciencia Ambiental -Taming.Effect.7=Fobia de Cacto/Lava, Imune a Danos de Altura -Taming.Effect.8=Pelo Grosso -Taming.Effect.9=Reducao de Dano, Resistencia ao Fogo -Taming.Listener.Wolf=[[DARK_GRAY]]Seu lobo fugiu de volta para VOCE... -Taming.Listener=Domesticar: -Taming.SkillName=DOMESTICAR -Taming.Skillup=[[YELLOW]]Habilidade de Domesticar aumentada para {0}. Total ({1}) -Taming.Summon.Complete=[[GREEN]]Invocacao completa -Taming.Summon.Lifespan=[[YELLOW]] ({0}s de Vida util) -Taming.Summon.Fail.Ocelot=[[RED]]VOCE tem muitas jaguatiricas por perto para invocar mais. -Taming.Summon.Fail.Wolf=[[RED]]VOCE tem muitos lobos por perto para invocar mais. -Taming.Summon.Fail.Horse=[[RED]]VOCE tem muitos cavalos por perto para invocar mais. -Taming.Summon.Fail.TooMany=[[RED]]VOCE atingiu o limite Maximo para poder invocar mais animais. [[YELLOW]]({0}) -Taming.Summon.Name.Format={0}''s {1} +Taming.Ability.Bonus.7=+{0} Dano +Taming.Ability.Bonus.8=Serviço de Fast Food +Taming.Ability.Bonus.9={0} Chance de curar ao atacar +Taming.Ability.Bonus.10=Cão Piedoso +Taming.Ability.Bonus.11=Recupere vida ao tomar dano mágico ou por veneno +Taming.Ability.Locked.0=BLOQUEADO ATÉ CHEGAR NO NÍVEL {0}+ HABILIDADE (CONSCIÊNCIA AMBIENTAL) +Taming.Ability.Locked.1=BLOQUEADO ATÉ CHEGAR NO NÍVEL {0}+ HABILIDADE (PELO GROSSO) +Taming.Ability.Locked.2=BLOQUEADO ATÉ CHEGAR NO NÍVEL {0}+ HABILIDADE (RESISTÊNCIA A IMPACTOS) +Taming.Ability.Locked.3=BLOQUEADO ATÉ CHEGAR NO NÍVEL {0}+ HABILIDADE(GARRAS AFIADAS) +Taming.Ability.Locked.4=BLOQUEADO ATÉ CHEGAR NO NÍVEL {0}+ HABILIDADE (SERVIÇO DE FAST FOOD) +Taming.Ability.Locked.5=BLOQUEADO ATÉ CHEGAR NO NÍVEL {0}+ HABILIDADE (CÃO PIEDOSO) +Taming.Combat.Chance.Gore=Chance de mordida +Taming.SubSkill.BeastLore.Name=Conhecimento de Feras +Taming.SubSkill.BeastLore.Description=farinha de osso verifica lobos e jaguatiricas +Taming.SubSkill.ShockProof.Name=Resistência a impactos +Taming.SubSkill.ShockProof.Description=Redução de dano de explosivo +Taming.SubSkill.CallOfTheWild.Name=Chamado da Natureza +Taming.SubSkill.CallOfTheWild.Description=Invoca um animal do seu lado +Taming.SubSkill.CallOfTheWild.Description.2=&7CDN: Agache e aperte com o botão direito com\n {0} {1} (Jaguatirica), {2} {3} (Lobo), {4} {5} (Cavalo) +Taming.SubSkill.FastFoodService.Name=Serviço de Fast Food +Taming.SubSkill.FastFoodService.Description=Chance de lobos curaram ao atacar +Taming.SubSkill.HolyHound.Name=Cão Piedoso +Taming.SubSkill.HolyHound.Description=Curado por magia e veneno +Taming.SubSkill.Gore.Name=Mordida +Taming.SubSkill.Gore.Description=Ataque crítico que aplica Ruptura +Taming.SubSkill.SharpenedClaws.Name=Garras Afiadas +Taming.SubSkill.SharpenedClaws.Description=Bônus de dano +Taming.SubSkill.EnvironmentallyAware.Name=Consciência Ambiental +Taming.SubSkill.EnvironmentallyAware.Description=Fobia de Cacto/Lava, Imune à dano de queda +Taming.SubSkill.ThickFur.Name=Pelo Grosso +Taming.SubSkill.ThickFur.Description=Redução de DANO, Resistência ao fogo +Taming.SubSkill.Pummel.Name=Patada +Taming.SubSkill.Pummel.Description=Seus lobos têm chance de repelir inimigos +Taming.SubSkill.Pummel.TargetMessage=Você foi repelido por um lobo! +Taming.Listener.Wolf=&8Seu lobo corre de volta para você... +Taming.Listener=Adestramento: +Taming.SkillName=ADESTRAMENTO +Taming.Summon.COTW.Success.WithoutLifespan=&a(Chamado da Natureza) &7Você invocou um &6{0}&7 +Taming.Summon.COTW.Success.WithLifespan=&a(Call Of The Wild) &7Você invocou um &6{0}&7 e ele tem uma duração de &6{1}&7 segundos. +Taming.Summon.COTW.Limit=&a(Call Of The Wild) &7Você só pode ter &c{0} &7animais &7{1} invocados ao mesmo tempo. +Taming.Summon.COTW.TimeExpired=&a(Call Of The Wild) &7O tempo acabou, seu &6{0}&7 foi embora. +Taming.Summon.COTW.Removed=&a(Call Of The Wild) &7O seu &6{0} invocado&7 saiu deste mundo. +Taming.Summon.COTW.BreedingDisallowed=&a(Call Of The Wild) &cVocê não pode procriar animais invocados. +Taming.Summon.COTW.NeedMoreItems=&a(Chamado da Natureza) &7Você precisa de &e{0}&7 mais &3{1}&7(s) +Taming.Summon.Name.Format=&6(COTW) &f{1} de {0} #DESARMADO -Unarmed.Ability.Berserk.Length=[[RED]]Duracao da Furia: [[YELLOW]]{0}s -Unarmed.Ability.Bonus.0=Estilo Braco de Ferro -Unarmed.Ability.Bonus.1=+{0} de Dano Aprimorado -Unarmed.Ability.Chance.ArrowDeflect=[[RED]]Chance de Desviar de Flechas: [[YELLOW]]{0} -Unarmed.Ability.Chance.Disarm=[[RED]]Chance de Desarmar: [[YELLOW]]{0} -Unarmed.Ability.Chance.IronGrip=[[RED]]Chance de Punho de Ferro: [[YELLOW]]{0} -Unarmed.Ability.IronGrip.Attacker=[[RED]]Seu oponente tem um Punho de Ferro! -Unarmed.Ability.IronGrip.Defender=[[GREEN]]O seu punho de ferro impediu de ser desarmado! -Unarmed.Ability.Lower=[[GRAY]]**VOCE ABAIXA SEUS PUNHOS** -Unarmed.Ability.Ready=[[GREEN]]**VOCE PREPARA SEUS PUNHOS** -Unarmed.Effect.0=Furia (HABILIDADE) -Unarmed.Effect.1=+50% de Dano, Quebra materiais fracos -Unarmed.Effect.2=Desarme (Jogadores) -Unarmed.Effect.3=Dropa o item que o inimigo esta segurando na mao -Unarmed.Effect.4=Estilo Braco de Ferro -Unarmed.Effect.5=Endurece seu braco ao longo do tempo -Unarmed.Effect.6=Desvio de Flechas -Unarmed.Effect.7=Desvia de Flechas -Unarmed.Effect.8=Punho de Ferro -Unarmed.Effect.9=Protege VOCE de ser desarmado +Unarmed.Ability.Bonus.0=Estilo braço de Aço +Unarmed.Ability.Bonus.1=+{0} DANO aprimorado +Unarmed.Ability.IronGrip.Attacker=Seu oponente tem Punho de Ferro! +Unarmed.Ability.IronGrip.Defender=&aSeu punho de ferro impediu de você ser desarmado! +Unarmed.Ability.Lower=&7Você abaixou seus punhos. +Unarmed.Ability.Ready=&3Você está com seus punhos &6prontos.. +Unarmed.SubSkill.Berserk.Name=Fúria +Unarmed.SubSkill.Berserk.Description=+50% de DANO, quebra materiais frágeis +Unarmed.SubSkill.Berserk.Stat=Duração da Fúria +Unarmed.SubSkill.Disarm.Name=Desarmar +Unarmed.SubSkill.Disarm.Description=Derruba o item que o inimigo tem nas mãos +Unarmed.SubSkill.Disarm.Stat=Chance de Desarmar +Unarmed.SubSkill.UnarmedLimitBreak.Name=Quebra de Limite Desarmado +Unarmed.SubSkill.UnarmedLimitBreak.Description=Quebre seus limites. Aumento de dano contra inimigos difíceis. Feito para PVP, Fica a crité das configurações do servidor se vai ou não aumentar o dano no PVE. +Unarmed.SubSkill.UnarmedLimitBreak.Stat=Dano máximo da quebra de limite +Unarmed.SubSkill.SteelArmStyle.Name=Estilo braço de Aço +Unarmed.SubSkill.SteelArmStyle.Description=Deixa seu braço mais duro com o tempo +Unarmed.SubSkill.ArrowDeflect.Name=Desviar Flechas +Unarmed.SubSkill.ArrowDeflect.Description=Desvia Flechas +Unarmed.SubSkill.ArrowDeflect.Stat=Chance de Desviar Flechas +Unarmed.SubSkill.IronGrip.Name=Punho de ferro +Unarmed.SubSkill.IronGrip.Description=Previne que você seja desarmado +Unarmed.SubSkill.IronGrip.Stat=Chance de Punhod de Ferro +Unarmed.SubSkill.BlockCracker.Name=Quebra Blocos +Unarmed.SubSkill.BlockCracker.Description=Quebre pedra com os punhos Unarmed.Listener=Desarmado: Unarmed.SkillName=DESARMADO -Unarmed.Skills.Berserk.Off=[[RED]]**Furia foi desgastada** -Unarmed.Skills.Berserk.On=[[GREEN]]**FuRIA ATIVADA** -Unarmed.Skills.Berserk.Other.Off=[[RED]]Furia[[GREEN]] foi desgastada para [[YELLOW]]{0} -Unarmed.Skills.Berserk.Other.On=[[GREEN]]{0}[[DARK_GREEN]] usou [[RED]]Furia! -Unarmed.Skills.Berserk.Refresh=[[GREEN]]Sua habilidade [[YELLOW]]Furia [[GREEN]]foi refrescada! -Unarmed.Skillup=[[YELLOW]]Habilidade de Desarmado aumentada para {0}. Total ({1}) +Unarmed.Skills.Berserk.Off=**Fúria foi desativada** +Unarmed.Skills.Berserk.On=&a**FÚRIA ATIVADA** +Unarmed.Skills.Berserk.Other.Off=Fúria&a foi desativada por &e{0} +Unarmed.Skills.Berserk.Other.On=&a{0}&2 usou &cBerserk! +Unarmed.Skills.Berserk.Refresh=&aSua &aHabilidade &eFúria foi recarregada! -#WOODCUTTING +#C0RTE DE ÁRVORE Woodcutting.Ability.0=Soprador de Folhas Woodcutting.Ability.1=Sopra as folhas para longe -Woodcutting.Ability.Chance.DDrop=[[RED]]Chance de Drop Duplo: [[YELLOW]]{0} -Woodcutting.Ability.Length=[[RED]]Duracao do Derrubador de arvores: [[YELLOW]]{0}s -Woodcutting.Ability.Locked.0=TRAVADO ATE O NIVEL {0}+ (SOPRADOR DE FOLHAS) -Woodcutting.Effect.0=Derrubador de arvores (HABILIDADE) -Woodcutting.Effect.1=Faz as arvores explodirem -Woodcutting.Effect.2=Soprador de Folhas -Woodcutting.Effect.3=Sopra as folhas para longe -Woodcutting.Effect.4=Drops em Dobro -Woodcutting.Effect.5=Dobra a pilhagem normal -Woodcutting.Listener=Cortar Madeira: -Woodcutting.SkillName=LENHADOR -Woodcutting.Skills.TreeFeller.Off=[[RED]]**Derrubador de arvores foi desgastado** -Woodcutting.Skills.TreeFeller.On=[[GREEN]]**DERRUBADOR DE arvores FOI ATIVADO** -Woodcutting.Skills.TreeFeller.Refresh=[[GREEN]]Sua habilidade [[YELLOW]]Derrubador de arvores [[GREEN]]foi refrescada! -Woodcutting.Skills.TreeFeller.Other.Off=[[RED]]Derrubador de arvores[[GREEN]] foi desgastado para [[YELLOW]]{0} -Woodcutting.Skills.TreeFeller.Other.On=[[GREEN]]{0}[[DARK_GREEN]] usou [[RED]]Derrubador de arvores! -Woodcutting.Skills.TreeFeller.Splinter=[[RED]]SEU MACHADO SE DESPEDACOU EM DEZENAS DE PEDACOS! -Woodcutting.Skills.TreeFeller.Threshold=[[RED]]Esta arvore e muito grande! -Woodcutting.Skillup=[[YELLOW]]Habilidade de Cortar Madeira aumentada para {0}. Total ({1}) +Woodcutting.Ability.Locked.0=BLOQUEADO ATÉ CHEGAR NO NÍVEL {0}+ HABILIDADE (SOPRADOR DE FOLHAS) +Woodcutting.SubSkill.TreeFeller.Name=Lenhador +Woodcutting.SubSkill.TreeFeller.Description=Explode Árvores +Woodcutting.SubSkill.TreeFeller.Stat=Duração do Lenhador +Woodcutting.SubSkill.LeafBlower.Name=Soprador de Folhas +Woodcutting.SubSkill.LeafBlower.Description=Sopra as folhas para longe +Woodcutting.SubSkill.KnockOnWood.Name=Bater na Madeira +Woodcutting.SubSkill.KnockOnWood.Description=Encontre itens adicionais usando Lenhador +Woodcutting.SubSkill.KnockOnWood.Stat=Encontre itens adicionais usando Lenhador +Woodcutting.SubSkill.KnockOnWood.Loot.Normal=Drop normal de árvores +Woodcutting.SubSkill.KnockOnWood.Loot.Rank2=Drop normal de árvores e de orbes de experiência +Woodcutting.SubSkill.HarvestLumber.Name=Colheita de Madeira +Woodcutting.SubSkill.HarvestLumber.Description=Extrai habilmente mais madeira +Woodcutting.SubSkill.HarvestLumber.Stat=Dobra a chance de drop +Woodcutting.SubSkill.Splinter.Name=Lascar +Woodcutting.SubSkill.Splinter.Description=Derruba Árvore de forma mais eficiênte. +Woodcutting.SubSkill.BarkSurgeon.Name=Cirurgião de Tronco +Woodcutting.SubSkill.BarkSurgeon.Description=Extrai materiais úteis ao remover Árvores. +Woodcutting.SubSkill.NaturesBounty.Name=Generosidade da Natureza +Woodcutting.SubSkill.NaturesBounty.Description=Ganhe experiência da natureza. +Woodcutting.Listener=Lenhador: +Woodcutting.SkillName=Lenhador +Woodcutting.Skills.TreeFeller.Off=**Lenhador foi desligado** +Woodcutting.Skills.TreeFeller.On=&a**TREE FELLER ACTIVATED** +Woodcutting.Skills.TreeFeller.Refresh=&aSua &aHabilidade &eLenhador foi recarregada! +Woodcutting.Skills.TreeFeller.Other.Off=Lenhador foi desligado por &e{0} +Woodcutting.Skills.TreeFeller.Other.On=&a{0}&2 usou &cLenhador! +Woodcutting.Skills.TreeFeller.Splinter=SEU MACHADO SE ESTILHAÇOU EM VÁRIOS PEDAÇOS! +Woodcutting.Skills.TreeFeller.Threshold=Essa Árvore é muito grande! -#ABILITIY -##generic -Ability.Generic.Refresh=[[GREEN]]**HABILIDADES REFRESCADAS!** -Ability.Generic.Template.Lock=[[GRAY]]{0} -Ability.Generic.Template=[[RED]]{0}: [[YELLOW]]{1} +#HABILIDADE -#COMBAT -Combat.ArrowDeflect=[[WHITE]]**DESVIOU-SE DA FLECHA** -Combat.BeastLore=[[GREEN]]**CONHECIMENTO TOSCO** -Combat.BeastLoreHealth=[[DARK_AQUA]]Vida ([[GREEN]]{0}[[DARK_AQUA]]/{1}) -Combat.BeastLoreOwner=[[DARK_AQUA]]Dono ([[RED]]{0}[[DARK_AQUA]]) -Combat.Gore=[[GREEN]]**MORDIDA** -Combat.StruckByGore=[[RED]]**VOCE FOI MORDIDO** -Combat.TargetDazed=Alvo foi [[DARK_RED]]Atordoado -Combat.TouchedFuzzy=[[DARK_RED]]Visoo turva. Sente tonturas. +#COMBATE +Combat.ArrowDeflect=&f**DESVIOU DA FLECHA** +Combat.BeastLore=&a**CONHECIMENTO DE FERAS** +Combat.BeastLoreHealth=&3Vida (&a{0}&3/{1}) +Combat.BeastLoreOwner=&3Dono (&c{0}&3) +Combat.BeastLoreHorseSpeed=&3Velocidade de movimento do cavalo (&a{0} blocos/s&3) +Combat.BeastLoreHorseJumpStrength=&3força do pulo do cavalo (&aMaxímo de {0} blocos&3) +Combat.Gore=&a**Mordido** +Combat.StruckByGore=**VOCÊ FOI Mordido** +Combat.TargetDazed=Alvo está &4atordoado +Combat.TouchedFuzzy=&4visão turva. Sente tonturas. +#COMANDOS +##genérico +mcMMO.Description=&3Sobre o Projeto &emcMMO &3:,&6mcMMO é um &6mod de RPG &cOpen Source &6criado em fevereiro de 2011, &6pelo &9nossr50 &6.O objetivo dele é fornecer uma experiência de RPG de qualidade. &3Dicas:&6 - &aUse &c/mcmmo help&a para ver os comandos,&6 - &aDigite &c/NOMEDAHABILIDADE&a para ver informações detalhadas sobre as habilidades, &3Desenvolvedores:&6 - &anossr50 &9(Criador e Líder do Projeto),&6 - &aelectronicboy &9(Dev),&6 - &akashike &9(Dev),&6 - &at00thpick1 &9(Responsável pela versão clássica) +mcMMO.Description.FormerDevs=&3Antigos desenvolvedores: &aGJ, NuclearW, bm01, TfT_02, Glitchfinder +Commands.addlevels.AwardAll.1=&aVocê foi presenteado com {0} níveis em todas as habilidades! +Commands.addlevels.AwardAll.2=Todas as habilidades foram modificas por {0}. +Commands.addlevels.AwardSkill.1=&aVocê foi presenteado com {0} níveis em {1}! +Commands.addlevels.AwardSkill.2={0} foi modificada(o) por {1}. +Commands.addxp.AwardAll=&aVocê foi presenteado com {0} de experiência em todas as habilidades! +Commands.addxp.AwardSkill=&aVocê foi presenteado com {0} de experiência em {1}! +Commands.Ability.Off=Uso de habilidade &cDesativado +Commands.Ability.On=Uso de habilidade &Dtivado +Commands.Ability.Toggle=Uso de habilidade for alterado por &e{0} +Commands.AdminChat.Off=Chat só para Admins &cDesativado +Commands.AdminChat.On=Chat só para Admins &aAtivado +Commands.AdminToggle=&a- Alterou chat para Admin +Commands.Chat.Console=*Console* +Commands.Cooldowns.Header=&6--= &aCooldowns de Habilidades do mcMMO&6 =-- +Commands.Cooldowns.Row.N=\ &c{0}&f - &6{1} segundos restantes +Commands.Cooldowns.Row.Y=\ &b{0}&f - &2Pronto! +Commands.Database.CooldownMS=Você deve esperar {0} millisegundos antes de usar esse comando de novo. +Commands.Database.Cooldown=Você deve esperar {0} segundos antes de usar esse comando de novo. +Commands.Database.Processing=O comando anterior que você usou ainda está sendo processado. Por favor, aguarde. +Commands.Disabled=Este comando está desabilitado. +Commands.DoesNotExist= &cJogador não existe no banco de dados! +Commands.GodMode.Disabled=Godmode do mcMMO desativado +Commands.GodMode.Enabled=Godmode do mcMMO ativado +Commands.AdminChatSpy.Enabled=Espionar chat de Grupo do mcMMO habilitado +Commands.AdminChatSpy.Disabled=Espionar chat de Grupo do mcMMO desabilitado +Commands.AdminChatSpy.Toggle=Espionar chat de grupo do mcMMO foi alterado por &e{0} +Commands.AdminChatSpy.Chat=&6[Espião: &a{0}&6] &f{1} +Commands.GodMode.Forbidden=[mcMMO] God Mode não pode ser usado nesse mundo (Veja as permissões) +Commands.GodMode.Toggle=God mode foi alterado por &e{0} +Commands.Healthbars.Changed.HEARTS=[mcMMO] O tipo da barra de vida dos mobs foi alterada para &cCorações&f. +Commands.Healthbars.Changed.BAR=[mcMMO] O tipo da barra de vida dos mobs foi alterada para &eBarras&f. +Commands.Healthbars.Changed.DISABLED=[mcMMO] O tipo da barra de vida dos mobs foi alterada para &7desabilitada&f. +Commands.Healthbars.Invalid=Tipo de barra de vida inválido! +Commands.Inspect= &a- veja informações detalhadas do jogador +Commands.Invite.Success=&aConvite enviado com sucesso. +Commands.Leaderboards= &a- Leaderboards +Commands.mcgod=&a- GodMod alterado +Commands.mchud.Invalid=Esse não é um tipo de HUD válido. +Commands.mcpurge.Success=&aO banco de dados foi limpo com sucesso! +Commands.mcrank.Heading=&6-=RANKINGS PESSOAL=- +Commands.mcrank.Overall=Rank&a - &6Geral &f#&a{0} +Commands.mcrank.Player=&eRankings para &f{0} +Commands.mcrank.Skill=&e{0}&a - &6Rank &f#&a{1} +Commands.mcrank.Unranked=&fSem Rank +Commands.mcrefresh.Success=cooldowns de {0} foram recarregados. +Commands.mcremove.Success=&a{0} foi removido com sucesso do banco de dados! +Commands.mctop.Tip=&6Tip: Use &c/mcrank&6 para ver todos os seus ranks pessoais! +Commands.mmoedit=[jogador] &a - modifica o alvo +Commands.mmoedit.AllSkills.1=&aOs níveis de todas suas habilidades foram definidos para {0}! +Commands.mmoedit.Modified.1=&aSeu nível em {0} foi definido para {1}! +Commands.mmoedit.Modified.2={0} foi modificado para {1}. +Commands.mcconvert.Database.Same=Você já está usando o banco de dados {0}! +Commands.mcconvert.Database.InvalidType={0} não é um tipo de banco de dados válido. +Commands.mcconvert.Database.Start=&7Começãndo a conversão de {0} para {1}... +Commands.mcconvert.Database.Finish=&7Migração de banco de dados concluída; o banco de dados {1} agora tem todos os dados do banco de dados {0}. +Commands.mmoshowdb=O banco de dados usado atualmente é &a{0} +Commands.mcconvert.Experience.Invalid=Tipo de fórmula de xp desconhecida! Os tipos válidos são: &aLINEAR &ce &aEXPONENCIAL. +Commands.mcconvert.Experience.Same=Já está usando a fórmula {0} +Commands.mcconvert.Experience.Start=&7Começãndo a conversão de {0} para curva {1} +Commands.mcconvert.Experience.Finish=&7Conversão de fórmula concluída; usando agora a curva {0} XP. +Commands.ModDescription=&a- Leia a descrição resumida do mod +Commands.NoConsole=Este comando não pode ser usado no console. +Commands.Notifications.Off=Notificações de habilidade &cdesativada +Commands.Notifications.On=Notificações de habilidade &aativada +Commands.Offline=Este comando não funciona para jogadores offline. +Commands.NotLoaded=O perfil do jogador ainda não foi carregada. +Commands.Party.Status=&8NOME: &f{0} {1} &8NÍVEL: &3{2} +Commands.Party.Status.Alliance=&8ALIANÇA: &f{0} +Commands.Party.UnlockedFeatures=&8Recursos desbloqueados: &7&o{0} +Commands.Party.ShareMode=&8MODO DE COMPARTILHAMENTO: +Commands.Party.ItemShare=&7ITEM &3({0}) +Commands.Party.ExpShare=&7EXP &3({0}) +Commands.Party.ItemShareCategories=&8Itens compartilhados: &7&o{0} +Commands.Party.MembersNear=&8PERTO DE VOCÊ &3{0}&8/&3{1} +Commands.Party.Accept=&a- Aceitou o convite para entrar no grupo +Commands.Party.Chat.Off=Chat de apenas Grupo &cdesativado +Commands.Party.Chat.On=Chat de apenas Grupo &aativado +Commands.Party.Commands=&c---[]&aCOMANDOS DE GRUPO&c[]--- +Commands.Party.Invite.0=&cALERT: &aYou have received a party invite for {0} from {1} +Commands.Party.Invite.1=&eDigite &a/party accept&e para aceitar o convite +Commands.Party.Invite=&a- Envia convite para entrar em grupo +Commands.Party.Invite.Accepted=&aConvite aceito. Você entrou no grupo {0} +Commands.Party.Join=&7Entrou no Grupo: {0} +Commands.Party.PartyFull=&6{0}&c está cheio! +Commands.Party.PartyFull.Invite=Voce não pode convidar &e{0}&c para &a{1}&c porque já tem &3{2}&c jogadores nela! +Commands.Party.PartyFull.InviteAccept=Você não pode entrar em &a{0}&c porque já tem &3{1}&c jogadores nela! +Commands.Party.Create=&7Grupo criado: {0} +Commands.Party.Rename=&7Nome do grupo alterado para: &f{0} +Commands.Party.SetSharing=&7Compartilhamento do grupo {0} definido para: &3{1} +Commands.Party.ToggleShareCategory=&7Compartilhamento de itens do grupo &6{0} &7foi modificado &3{1} +Commands.Party.AlreadyExists=&4Grupo {0} já existe! +Commands.Party.Kick=&cVocê foi kickado do grupo &a{0}&c! +Commands.Party.Leave=&eVocê saiu do grupo +Commands.Party.Members.Header=&c-----[]&aMEMBROS&c[]----- +Commands.Party.None=&cVocê não está em um grupo. +Commands.Party.Quit=&a- Sai do seu grupo atual +Commands.Party.Teleport=&a- Teletransporta para um membro do grupo +Commands.Party.Toggle=&a- Alterou o chat de grupo +Commands.Party1=&a- Cria um novo grupo +Commands.Party2=&a- Entra no grupo de um jogador +Commands.Party.Alliance.Header=&c-----[]&aALIANÇÃ DO GRUPO&c[]----- +Commands.Party.Alliance.Ally=&f{0} &8IS ALIADO COM: &f{1} +Commands.Party.Alliance.Members.Header=&c-----[]&aMEMBROS DA ALIANÇA&c[]----- +Commands.Party.Alliance.Invite.0=ALERTa: &aVocê recebeu um convite de aliançã de {0} do grupo {1} +Commands.Party.Alliance.Invite.1=Digite &a/party alliance accept&e para aceitar o convite +Commands.Party.Alliance.Invite.Accepted=&aConvite de aliançã aceito. +Commands.Party.Alliance.None=&cO seu grupo não possui aliançãs. +Commands.Party.Alliance.AlreadyAllies=&cSeu grupo já possui uma aliançã. desfaça a aliançã digitando &3/party alliance disband +Commands.Party.Alliance.Help.0=&cEsse grupo não possui uma aliançã. Convide o líder do grupo para formar a aliançã +Commands.Party.Alliance.Help.1=&c para um aliançã digitando &3/party alliance invite &c. +Commands.ptp.Enabled=Teletransporte do grupo &aativado +Commands.ptp.Disabled=Teletransporte do grupo &cdisativado +Commands.ptp.NoRequests=&cVocê não possui pedidos de teletransporte no momento +Commands.ptp.NoWorldPermissions=&c[mcMMO] Você não tem permissão para teletransportar para o mundo {0}. +Commands.ptp.Request1=&e{0} &asolicitou teletransporte para você. +Commands.ptp.Request2=&aPara teletransportar, digite &e/ptp accept&a. Pedido expira em &c{0} &asegundos. +Commands.ptp.AcceptAny.Enabled=Confirmação de teletransporte de grupo &aativado +Commands.ptp.AcceptAny.Disabled=Confirmação de teletransporte de grupo &cdesativado +Commands.ptp.RequestExpired=&cPedido de teletransporte de grupo expirou! +Commands.PowerLevel.Leaderboard=&e--mcMMO &eLeaderboard de &9 Nível de Poder-- +Commands.PowerLevel.Capped=&4NÍVEL DE PODER: &a{0} &4NÍVEL MÁXIMO: &e{1} +Commands.PowerLevel=&4NÍVEL DE PODER: &a{0} +Commands.Reset.All=&aTodos os seus níveis de habilidade foram resetados com sucesso. +Commands.Reset.Single=&aSeu nível da hablidade {0} foi resetado com sucesso. +Commands.Reset=&a- Reseta o nível de uma habilidade para 0 +Commands.Scoreboard.Clear=&3Scoreboard do mcMMO foi limpo. +Commands.Scoreboard.NoBoard=&cO scoreboard do mcMMO não está ativo. +Commands.Scoreboard.Keep=&3O scoreboard do mcMMO ficará assim até que você use o comando &a/mcscoreboard clear&3. +Commands.Scoreboard.Timer=&3O scoreboard do mcMMO será limpo daqui &6{0}&3 segundos. +Commands.Scoreboard.Help.0=&6 == &aAjuda para &c/mcscoreboard&6 == +Commands.Scoreboard.Help.1=&3/mcscoreboard&b clear &f - limpa o scoreboard do mcMMO +Commands.Scoreboard.Help.2=&3/mcscoreboard&b keep &f - mantém o scoreboard do mc MMO +Commands.Scoreboard.Help.3=&3/mcscoreboard&b time [n] &f - limpa o scoreboard do mcMMO depois de &dx&f segundos +Commands.Scoreboard.Tip.Keep=&6Tip: Use &c/mcscoreboard keep&6 enquanto o scoreboard está sendo exibido para evitar que ele suma. +Commands.Scoreboard.Tip.Clear=&6Tip: Use &c/mcscoreboard clear&6 para limpar o scoreboard. +Commands.XPBar.Reset=&6As configurações da Barra de XP do mcMMO foram resetadas. +Commands.XPBar.SettingChanged=&6configurações da Barra de XP de &a{0}&6 agora foi definida para &a{1} +Commands.Skill.Invalid=Esse não é um nome de habilidade válido! +Commands.Skill.ChildSkill=Habilidades dependentes não são válidas para esse comando! +Commands.Skill.Leaderboard=--mcMMO &9{0}&e Leaderboard-- +Commands.SkillInfo=&a- Veja informações detalhadas sobre uma habilidade +Commands.Stats=&a- Veja as suas estatísticas do mcMMO +Commands.ToggleAbility=&a- Altere a ativação da habilidade com o botão direito +Commands.Usage.0=&cO jeito certo de usar é /{0} +Commands.Usage.1=&cO jeito certo de usar é /{0} {1} +Commands.Usage.2=&cO jeito certo de usar é /{0} {1} {2} +Commands.Usage.3=&cO jeito certo de usar é /{0} {1} {2} {3} +Commands.Usage.3.XP=&cO jeito certo de usar é /{0} {1} {2} {3}&7 (você pode colocar -s no fim para executar o comando sem informar o jogador, silenciando-o efetivamente) +Commands.Usage.FullClassName=nome da classe +Commands.Usage.Level=nível +Commands.Usage.Message=mensagem +Commands.Usage.Page=página +Commands.Usage.PartyName=nome +Commands.Usage.Password=senha +Commands.Usage.Player=jogador +Commands.Usage.Rate=taxa +Commands.Usage.Skill=habilidade +Commands.Usage.SubSkill=sub-habilidade +Commands.Usage.XP=xp +Commands.Description.mmoinfo=Leia detalhes sobre uma habilidade ou mecânica. +Commands.MmoInfo.Mystery=&7Você ainda não liberou essa habilidade, mas quando á-la, conseguirá ler detalhes sobre ela aqui! +Commands.MmoInfo.NoMatch=Essa sub-habilidade não existe! +Commands.MmoInfo.Header=&3-=[]=====[]&6 Informações do MMO &3[]=====[]=- +Commands.MmoInfo.SubSkillHeader=&6Nome:&e {0} +Commands.MmoInfo.DetailsHeader=&3-=[]=====[]&a Detalhes &3[]=====[]=- +Commands.MmoInfo.OldSkill=&7As habilidades do mcMMO estão sendo convertidas para um sistema modular de habilidades aprimorado, infelizmente essa habilidade ainda não foi convertida e não possui estatísticas detalhadas. O novo sistema permitirá liberações mais rápidas de novas habilidades do mcMMO e maior flexibilidade com as habilidades existentes. +Commands.MmoInfo.Mechanics=&3-=[]=====[]&6 Mecânicas &3[]=====[]=- +Commands.MmoInfo.Stats=Estatísticas: {0} +Commands.Mmodebug.Toggle=Modo de Debug do mcMMO agora é &6{0}&7, use esse comando novamente para ativar ou desativar. Com o modo ativado, você pode bater em blocos para exibir informações úteis usadas para ajuda. +mcMMO.NoInvites=&cVocê não possui convites no momento +mcMMO.NoPermission=&4permissões insuficientes. +mcMMO.NoSkillNote=&8Se você não tiver acesso a uma habilidade, ela não aparecerá aqui. -Commands.addlevels.AwardAll.1=[[GREEN]]Voce ganhou {0} leveis em todas suas skills! -Commands.addlevels.AwardAll.2=[[RED]]Todas suas skills foram alteradas para {0}. -Commands.addlevels.AwardSkill.1=[[GREEN]]Voce ganhou {0} leveis em {1}! -Commands.addlevels.AwardSkill.2=[[RED]]{0} foi modificado para {1}. -Commands.addxp.AwardAll=[[GREEN]]Voce ganhou {0} experiencias em todas skills! -Commands.addxp.AwardSkill=[[GREEN]]Voce ganhou {0} experiencias em {1}! -Commands.AdminChat.Off=Chat Admin [[RED]]Desligado -Commands.AdminChat.On=Chat de Admin [[GREEN]]Ligado -Commands.AdminToggle=[[RED]]- Liga o Admin chat -Commands.Disabled=[[RED]]Este comando esta desabilitado. -Commands.DoesNotExist=[[RED]]Player nao existe na database! -Commands.GodMode.Disabled=[[YELLOW]]mcMMO Modo God desabilitado -Commands.GodMode.Enabled=[[YELLOW]]mcMMO Godmode Ligado -Commands.Invite.Accepted=[[GREEN]]Convite aceito. Voce se juntou ao grupo {0} -Commands.mmoedit=[player] [[RED]] - Modifica alvo -Commands.ModDescription=[[RED]]- Leia a descricao breve do mod -Commands.NoConsole=Esse comando nao suporta uso no console -Commands.Party.Accept=[[RED]]- Aceitar convite de grupo -Commands.Party.Chat.Off=Chat de grupo [[RED]]Desligado -Commands.Party.Commands=[[GREEN]]--COMANDOS DE GRUPO-- -Commands.Party.Invite.0=[[RED]]ALERTA: [[GREEN]]Voce recebeu um convite para o grupo {0} de {1} -Commands.Party.Kick=[[RED]]Voce foi kickado do grupo {0}! -Commands.Party.Leave=[[RED]]Voce saiu do grupo -Commands.Party.None=[[RED]]Voce nao esta em um grupo. -Commands.Party.Quit=[[RED]]- Deixe seu grupo atual -Commands.PowerLevel.Leaderboard=[[YELLOW]]--mcMMO[[BLUE]] Nivel de Poder [[YELLOW]]Podium-- -Commands.PowerLevel=[[DARK_RED]]N\u00cdVEL DE PODER: [[GREEN]]{0} -Commands.Scoreboard.Clear=[[DARK_AQUA]]mcMMO scoreboard sumiu. -Commands.Scoreboard.NoBoard=[[RED]]The mcMMO scoreboard nao esta ativo. -Commands.Scoreboard.Keep=[[DARK_AQUA]]O mcMMO scoreboard vai estar visivel ate voce usar [[GREEN]]/mcscoreboard clear[[DARK_AQUA]]. -Commands.Scoreboard.Timer=[[DARK_AQUA]]O mcMMO scoreboard vai sumir em [[GOLD]]{0}[[DARK_AQUA]] segundos. -Commands.Scoreboard.Help.0=[[GOLD]] == [[GREEN]]Ajuda para [[RED]]/mcscoreboard[[GOLD]] == -Commands.Scoreboard.Help.1=[[DARK_AQUA]]/mcscoreboard[[AQUA]] clear [[WHITE]] - oculta o McMMO scoreboard -Commands.Scoreboard.Help.2=[[DARK_AQUA]]/mcscoreboard[[AQUA]] keep [[WHITE]] - mantem o McMMO scoreboard visivel -Commands.Scoreboard.Help.3=[[DARK_AQUA]]/mcscoreboard[[AQUA]] time [n] [[WHITE]] - oculta o McMMO scoreboard depois de [[LIGHT_PURPLE]]n[[WHITE]] segundos -Commands.Scoreboard.Tip.Keep=[[GOLD]]Dica: Use [[RED]]/mcscoreboard keep[[GOLD]] enquanto ele estiver visivel para fazer com que ele fique sempre visivel . -Commands.Scoreboard.Tip.Clear=[[GOLD]]Dica: Use [[RED]]/mcscoreboard clear[[GOLD]] para ocultar o McMMO scoreboard. -Commands.Stats.Self=SEUS STATS -mcMMO.NoPermission=[[DARK_RED]]Permissoes insuficientes. - -##party -Party.Forbidden=[mcMMO] Partys nao soo permitidas nesse mundo (Veja as Permissoes) -Party.Help.0=[[RED]]O Correto e [[DARK_AQUA]]{0} [password]. -Party.Help.1=[[RED]]Para criar uma party, use [[DARK_AQUA]]{0} [password]. -Party.Help.2=[[RED]]Consulte [[DARK_AQUA]]{0} [[RED]]para mais informacao -Party.Help.3=[[RED]]Use [[DARK_AQUA]]{0} [password] [[RED]]para entrar ou [[DARK_AQUA]]{1} [[RED]]para sair -Party.Help.4=[[RED]]Para travar ou destravar a party, use [[DARK_AQUA]]{0} -Party.Help.5=[[RED]]Para proteger sua party com senha, use [[DARK_AQUA]]{0} -Party.Help.6=[[RED]]Para chutar um player da party, use [[DARK_AQUA]]{0} -Party.Help.7=[[RED]]Para transferir o cargo de dono da party, use [[DARK_AQUA]]{0} -Party.Help.8=[[RED]]Para deletar sua party, use [[DARK_AQUA]]{0} -Party.Help.9=[[RED]]Use [[DARK_AQUA]]{0} [[RED]]para compartilhar items com os membros da party -Party.Help.10=[[RED]]Use [[DARK_AQUA]]{0} [[RED]]para compartilhar XP com os membros da party -Party.InformedOnJoin={0} [[GREEN]]entrou na sua party -Party.InformedOnQuit={0} [[GREEN]]saiu da sua party -Party.InformedOnNameChange=[[GOLD]]{0} [[GREEN]]mudou o nome da party para [[WHITE]]{1} -Party.InvalidName=[[DARK_RED]]Isso nao e um nome VAlido. -Party.Invite.Self=[[RED]]VOCE nao pode convidar VOCE mesmo! -Party.IsLocked=[[RED]]Esta party ja esta travada! -Party.IsntLocked=[[RED]]Esta party nao esta travada. -Party.Locked=[[RED]]A party esta travada, somente os lideres podem convidar membros. -Party.NotInYourParty=[[DARK_RED]]{0} nao esta na sua party -Party.NotOwner=[[DARK_RED]]VOCE nao e o lider da party. -Party.Target.NotOwner=[[DARK_RED]]{0} nao e o lider da party. -Party.Owner.New=[[GREEN]]{0} e o novo lider da party. -Party.Owner.NotLeader=[[DARK_RED]]VOCE nao e mais o lider da party. -Party.Owner.Player =[[GREEN]]Agora VOCE e o lider da party. -Party.Password.None=[[RED]]Esta party esta protegida com senha. Informe a senha para entrar. -Party.Password.Incorrect=[[RED]]A senha da party esta incorreta. -Party.Password.Set=[[GREEN]]Senha da party mudada para {0} -Party.Password.Removed=[[GREEN]]A senha da party foi removida. -Party.Player.Invalid=[[RED]]Isto nao e um player VAlido. -Party.NotOnline=[[DARK_RED]]{0} nao esta online! -Party.Player.InSameParty=[[RED]]{0} ja esta na sua party! -Party.PlayerNotInParty=[[DARK_RED]]{0} nao esta na party -Party.Specify=[[RED]]VOCE precisa especificar a party. -Party.Teleport.Dead=[[RED]]VOCE nao pode teleportar a um membro morto. -Party.Teleport.Hurt=[[RED]]VOCE levou dano nos ultimos {0} segundos e nao pode teleportar. -Party.Teleport.Player=[[GREEN]]VOCE teleportou para {0}. -Party.Teleport.Self=[[RED]]VOCE nao pode teleportar VOCE mesmo! -Party.Teleport.Target=[[GREEN]]{0} teleportou para VOCE. -Party.Teleport.Disabled=[[RED]]{0} nao permitiu o teleporty por party. -Party.Rename.Same=[[RED]]Este ja e o nome da sua party! -Party.Join.Self=[[RED]]VOCE nao pode convidar VOCE mesmo! -Party.Unlocked=[[GRAY]]Party nao esta mais travada -Party.Disband=[[GRAY]]A party foi removida -Party.Alliance.Formed=[[GRAY]]Sua party agora e aliada de [[GREEN]]{0} -Party.Alliance.Disband=[[GRAY]]Sua party nao tem alianca com [[RED]]{0} -Party.Status.Locked=[[DARK_RED]](SOMENTE-CONVIDA) -Party.Status.Unlocked=[[DARK_GREEN]](ABERTO) -Party.LevelUp=[[YELLOW]]NIVEL de party aumentada para {0}. Total ({1}) -Party.Feature.Chat=Chat de Party -Party.Feature.Teleport=Teleporte por Party -Party.Feature.Alliance=Aliancas -Party.Feature.ItemShare=Compartilhar Item -Party.Feature.XpShare=Compartilhar XP -Party.Feature.Locked.Chat=TRAVADO ATE O NIVEL {0}+ (PARTY CHAT) -Party.Feature.Locked.Teleport=TRAVADO ATE O NIVEL {0}+ (PARTY TELEPORTE) -Party.Feature.Locked.Alliance=TRAVADO ATE O NIVEL {0}+ (ALIANCAS) -Party.Feature.Locked.ItemShare=TRAVADO ATE O NIVEL {0}+ (COMPARTILHAR ITEM) -Party.Feature.Locked.XpShare=TRAVADO ATE O NIVEL {0}+ (COMPARTILHAR XP) -Party.Feature.Disabled.1=[[RED]]Chat de Party nao esta destravado ainda. -Party.Feature.Disabled.2=[[RED]]Teleporte de Party nao esta destravado ainda. -Party.Feature.Disabled.3=[[RED]]Alianca de Party nao esta destravado ainda. -Party.Feature.Disabled.4=[[RED]]Compartilhar item nao esta destravado ainda. -Party.Feature.Disabled.5=[[RED]]Compartilhar XP nao esta destravado ainda. +##grupo +Party.Forbidden=[mcMMO] Grupos não são permitidos neste mundo (Veja as permissões) +Party.Help.0=&cO jeito certo de usar é &3{0} [senha]. +Party.Help.1=&cPara criar um grupo, use &3{0} [senha]. +Party.Help.2=&cConsulte &3{0} &cpara mais informações +Party.Help.3=&cUse &3{0} [senha] &cpara entrar ou &3{1} &cpara sair +Party.Help.4=&cPara fechar ou abrir seu grupo, use &3{0} +Party.Help.5=&cPara proteger seu grupo com senha, use &3{0} +Party.Help.6=&cPara expulsar um jogador do seu grupo, use &3{0} +Party.Help.7=&cPara transferir a posse do seu grupo, use &3{0} +Party.Help.8=&cPara desfazer o seu grupo, use &3{0} +Party.Help.9=&cUse &3{0} &cpara compartilhar itens com os membros do grupo +Party.Help.10=&cUse &3{0} &cpara habilitar o compartilhamento de xp com membros do grupo +Party.InformedOnJoin={0} &aentrou no seu grupo +Party.InformedOnQuit={0} &asaiu do seu grupo +Party.InformedOnNameChange=&6{0} &adefiniu o nome do grupo para &f{1} +Party.InvalidName=&4Esse não é um nome grupo válido. +Party.Invite.Self=&cVocê não pode se convidar para seu próprio grupo! +Party.IsLocked=&cEste grupo já está fechado! +Party.IsntLocked=&cEste grupo não está fechado! +Party.Locked=&cGrupo fechado, apenas o líder pode convidar. +Party.NotInYourParty=&4{0} não está no seu grupo. +Party.NotOwner=&4você não é o líder do grupo. +Party.Target.NotOwner=&4{0} não é o líder do grupo. +Party.Owner.New=&a{0} é o novo líder do grupo. +Party.Owner.NotLeader=&4Você não é mais o líder do grupo. +Party.Owner.Player =&aAgora você é o líder do grupo. +Party.Password.None=&cEste grupo está protegido por senha. Por favor, insira a senha para entrar. +Party.Password.Incorrect=&cA senha do grupo está incorreta. +Party.Password.Set=&aSenha do grupo definida como {0} +Party.Password.Removed=&aGrupo não tem mais senha. +Party.Player.Invalid=&cEsse não é um jogador válido. +Party.NotOnline=&4{0} não está online! +Party.Player.InSameParty=&c{0} já está no seu grupo! +Party.PlayerNotInParty=&4{0} não está em um grupo +Party.Specify=&cVocê tem que especificar o grupo. +Party.Teleport.Dead=&cVocê não pode se teletransportar para um jogador morto. +Party.Teleport.Hurt=&cVocê recebeu dano nos últimos {0} segundos e não pode se teletransportar. +Party.Teleport.Player=&aVocê se teletransportou para {0}. +Party.Teleport.Self=&cVocê não pode se teletransportar para si mesmo! +Party.Teleport.Target=&a{0} se teletransportou para você. +Party.Teleport.Disabled=&c{0} não permite teletransporte para membros do grupo. +Party.Rename.Same=&cEsse já é o nome do seu grupo! +Party.Join.Self=&cVocê não pode jutar-se a si mesmo! +Party.Unlocked=&7Grupo está aberto +Party.Disband=&7O grupo foi desfeito +Party.Alliance.Formed=&7O seu grupo agora é aliado de &a{0} +Party.Alliance.Disband=&7O seu grupo não é mais aliado de &c{0} +Party.Status.Locked=&4(APENAS POR CONVITE) +Party.Status.Unlocked=&2(ABERTO) +Party.LevelUp=&eO nível do grupo subiu para {0}. Total ({1}) +Party.Feature.Chat=Chat do grupo +Party.Feature.Teleport=Teletransporte de grupo +Party.Feature.Alliance=Alianças +Party.Feature.ItemShare=Compartilhamento de itens +Party.Feature.XpShare=Compartilhamento de XP +Party.Feature.Locked.Chat=BLOQUEADO ATÉ CHEGAR NO NÍVEL {0}+ (CHAT D0 GRUPO) +Party.Feature.Locked.Teleport=BLOQUEADO ATÉ CHEGAR NO NÍVEL {0}+ (TELETRANSPORTE DE GRUPO) +Party.Feature.Locked.Alliance=BLOQUEADO ATÉ CHEGAR NO NÍVEL {0}+ (ALIANÇAS) +Party.Feature.Locked.ItemShare=BLOQUEADO ATÉ CHEGAR NO NÍVEL {0}+ (COMPARTILHAMENTO DE ITENS) +Party.Feature.Locked.XpShare=BLOQUEADO ATÉ CHEGAR NO NÍVEL {0}+ (COMPARTILHAMENTO DE XP) +Party.Feature.Disabled.1=&cChat do grupo ainda não foi desbloqueado. +Party.Feature.Disabled.2=&cTeletransporte de grupo ainda não foi desbloqueado. +Party.Feature.Disabled.3=&cAliançs ainda não está desbloqueada. +Party.Feature.Disabled.4=&cCompartilhamento de itens com o grupo ainda não foi desbloqueado. +Party.Feature.Disabled.5=&cCompartilhamento de XP com o grupo ainda não foi desbloqueado. Party.ShareType.Xp=XP Party.ShareType.Item=ITEM Party.ShareMode.None=NENHUM -Party.ShareMode.Equal=EQUAL -Party.ShareMode.Random=ALEATERIO +Party.ShareMode.Equal=IGUAL +Party.ShareMode.Random=ALEATÓRIO Party.ItemShare.Category.Loot=Saque -Party.ItemShare.Category.Mining=Minerar +Party.ItemShare.Category.Mining=Mineração Party.ItemShare.Category.Herbalism=Herbalismo -Party.ItemShare.Category.Woodcutting=Cortar arvores -Party.ItemShare.Category.Misc=Variado +Party.ItemShare.Category.Woodcutting=Corte de árvore +Party.ItemShare.Category.Misc=Diversos -Commands.XPGain.Acrobatics=CAINDO +##xp +Commands.XPGain.Acrobatics=Caindo +Commands.XPGain.Alchemy=Preparando Poções Commands.XPGain.Archery=Atacando Monstros Commands.XPGain.Axes=Atacando Monstros -Commands.XPGain.Excavation=Cavando e achando tesouros -Commands.XPGain.Herbalism=Colhendo Ervas -Commands.XPGain.Mining=Minerar Pedra & Min\u00e9rio +Commands.XPGain.Child=Ganhando níveis pelas habilidades principais +Commands.XPGain.Excavation=Cavando e encontrando tesouros +Commands.XPGain.Fishing=Pescando (vá descobrir!) +Commands.XPGain.Herbalism=Colhendo ervas +Commands.XPGain.Mining=Minerando pedras e minérios +Commands.XPGain.Repair=Reparando Commands.XPGain.Swords=Atacando Monstros -Commands.XPGain.Taming=Domesticar animais, ou combater com os seus lobos -Commands.XPGain=[[DARK_GRAY]]XP ADQUIRIDO: [[WHITE]]{0} -Commands.xplock.locked=[[GOLD]]Sua barra de XP BAR est\u00e1 travada em {0}! -Commands.xplock.unlocked=[[GOLD]]Sua barra de XP foi [[GREEN]]DESTRAVADA[[GOLD]]! -Commands.xprate.over=[[RED]]Evento de XP Rate acabou!! +Commands.XPGain.Taming=Adestrando animais, ou lutando junto com os seus lobos +Commands.XPGain.Unarmed=Atacando Monstros +Commands.XPGain.Woodcutting=Cortando árvores +Commands.XPGain=&8XP GANHO: &f{0} +Commands.xplock.locked=&6Sua BARRA DE XP agora está em {0}! +Commands.xplock.unlocked=&6Sua BARRA DE XP agora está &aDESBLOQUEADA&6! +Commands.xprate.modified=&cA TAXA DE XP foi modificada para {0} +Commands.xprate.over=&O Evento de taxa de XP do mcMMO ACABOU!! +Commands.xprate.proper.0=&cO jeito certo de alterar a taxa de XP é /xprate +Commands.xprate.proper.1=&cO jeito certo de voltar para a configuração padrão da taxa de XP é /xprate reset +Commands.xprate.proper.2=&cPor favor, coloque true ou false para indicar se isso é um evento de XP ou não +Commands.NegativeNumberWarn=Nã use números negativos! +Commands.Event.Start=&6Evento do &amcMMO! +Commands.Event.Stop=&3Evento do &amcMMO &3acabou! +Commands.Event.Stop.Subtitle=&aEspero que tenha se divertido! +Commands.Event.XP=&3Taxa de Xp agora é &6{0}&3x +Commands.xprate.started.0=&6EVENTO DE XP DO mcMMO COMEÇOU! +Commands.xprate.started.1=&6TAXA DE XP DO mcMMO AGORA É {0}x! +# Notificações para Admins +Server.ConsoleName=&e[Servidor] +Notifications.Admin.XPRate.Start.Self=&7Você definiu o multiplicador da taxa de XP global para &6{0}x +Notifications.Admin.XPRate.End.Self=&7Você finalizou o evento de taxa de XP. +Notifications.Admin.XPRate.End.Others={0} &7finalizou o evento de taxa de XP +Notifications.Admin.XPRate.Start.Others={0} &7iniciou ou modificou um evento de taxa de XP com multiplicador global de {1}x +Notifications.Admin.Format.Others=&6(&3Admin do &amcMMO&6) &7{0} +Notifications.Admin.Format.Self=&6(&amcMMO&6) &7{0} -XPRate.Event=[[GOLD]]mcMMO esta em um evento de XP aumentada! O aumento de XP e {0}x! -Effects.Effects=EFEITOS -Inspect.OfflineStats=Estatisticas do mcMMO para o player offline [[YELLOW]]{0} -Inspect.Stats=[[GREEN]]Estatisticas do mcMMO para [[YELLOW]]{0} -Inspect.TooFar=[[RED]]Voce esta muito longe para inspecionar este Player! -Item.ChimaeraWing.Fail=**ASAS DE QUIMERA FALHARAM!** -Item.ChimaeraWing.Pass=**ASAS DE QUIMERA** -Item.Injured.Wait=Voce foi ferido recentemente e deve esperar para usar isto. [[YELLOW]]({0}s) +# Evento +XPRate.Event=&6mcMMO atualmente está tendo evento de taxa de XP! a taxa de XP atual é {0}x! -Skills.Disarmed=[[DARK_RED]]Voce foi Desarmado! -Skills.NeedMore=[[DARK_RED]]Voce precisa de mais -Skills.TooTired=[[RED]]Voce esta cansado pra usar essa habilidade. -Skills.Cancelled=[[RED]]{0} cancelado! +##GUIAS +Guides.Available=&7Guia de {0} disponível - digite /{1} ? [página] +Guides.Header=&6-=&a{0} Guia&6=- +Guides.Page.Invalid=Não é um número de página válida! +Guides.Page.OutOfRange=Essa página não existe, tem apenas {0} páginas totais. +Guides.Usage= Para usar digite /{0} ? [página] +##Acrobacia +Guides.Acrobatics.Section.0=&3Sobre a acrobácia:\n&eAcrobacia é a arte de se mover graciosamente no mcMMO.\n&eEla dá bônus de combate e bônus de dano no ambiente.\n\n&3COMO GANHAR XP:\n&ePara ganhar XP nesta habilidade, você precisa se esquivar\n&eem um combate ou sobreviver a quedas de alturas que te dõo dano. +Guides.Acrobatics.Section.1=&3Como rolar funciona?\n&eVocê tem uma chance passiva quando sofre dano de queda\n&ede negar o dano. Você pode segurar o botão de se agachar para\n&edobrar suas chances durante uma queda.\n&eIsso aciona um rolamento gracioso ao invés de um normal.\n&eRolamentos graciosos são como rolamentos normais, mas tem duas vezes mais probabilidade de\n&eocorrerem e fornecem mais segurançã contra danos do que os rolamentos normais.\n&eA chance do rolamento está ligada ao seu nível de habilidade +Guides.Acrobatics.Section.2=&3Como a esquiva funciona?\n&eEsquiva é uma chance passiva de que quando você receber\n&edano em combate ele seja reduzido pela metade.\n&eIsso está ligado ao seu nível de habilidade. +##Alquimia +Guides.Alchemy.Section.0=[[DARK_AQUA]]Sobre a alquimia:\n[[YELLOW]]Alquimia é sobre preparações de alquimia.\n[[YELLOW]]Ela dá um aumento na velocidade do tempo de preparação\n de poções bem como\n[[YELLOW]] a adição de novas poções(antigamente) impossíveis de \nse conseguir no modo sobrevivência.\n\n\n[[DARK_AQUA]]COMO GANHAR XP:\n[[YELLOW]]Para ganhar xp nessa habilidade, você precisa preparar poções. +Guides.Alchemy.Section.1=[[DARK_AQUA]]Como a catálise funciona?\n[[YELLOW]]Catálise aumenta o processo de preparação, com a\n[[YELLOW]]velocidade máxima de 4x no nível 1000.\n[[YELLOW]]Essa habilidade é desbloqueada por padrão no nível 100. +Guides.Alchemy.Section.2=[[DARK_AQUA]]Como as Misturas funcionam?\n[[YELLOW]]As misturas permitem a preparação de mais poções com ingredientes personalizados.\n[[YELLOW]]Quais ingredientes especiais são desbloqueados é determinado\n[[YELLOW]]pelo seu Rank. Existem 8 ranks para se desbloquear. +Guides.Alchemy.Section.3=[[DARK_AQUA]]Mistura de nível 1, ingredientes:\n[[YELLOW]]Pó de Blaze, Olho de Aranha Fermentado, Lágrima de ghast, Redstone,\n[[YELLOW]]Pó de pedra luminosa, Açúar, Fatia de Melancia Reluzente, Cenoura Dourada,\n[[YELLOW]]Creme de Magma, Fungo do Nether, Olho de aranha, Enxofre, Vítoria-régia,\n[[YELLOW]]Baiacu\n[[YELLOW]](Poções Clássicas) +Guides.Alchemy.Section.4=[[DARK_AQUA]]Mistura de nível 2, ingredientes:\n[[YELLOW]]Cenoura (Poção de Pressa)\n[[YELLOW]]Slimeball (Poção de Dullness)\n\n[[DARK_AQUA]]Mistura de nível 3, ingredientes:\n[[YELLOW]]Quartzo (Poção de Absorção)\n[[YELLOW]]Pé de coelho (Poção de Salto) +Guides.Alchemy.Section.5=[[DARK_AQUA]]Mistura de nível 4, ingredientes:\n[[YELLOW]]Maçã (Poção de Vida Extra)\n[[YELLOW]]Carne podre (Poção da Fome)\n\n[[DARK_AQUA]]Mistura de nível 5, ingredientes:\n[[YELLOW]]Cogumelo Marrom (Poção da Náusea)\n[[YELLOW]]Bolsa de Tinta (Poção da Cegueira) +Guides.Alchemy.Section.6=[[DARK_AQUA]]Mistura de nível 6, ingredientes:\n[[YELLOW]]Samambaia (Poção da Saturação)\n\n[[DARK_AQUA]]Mistura de nível 7, ingredientes:\n[[YELLOW]]Batata venenosa (Poção de Decaimento)\n\n[[DARK_AQUA]]Mistura de nível 8, ingredientes:\n[[YELLOW]]Maçã dourada normal (Poção de Resistência) +##Arquearia +Guides.Archery.Section.0=&3Sobre arquearia:\n&eArquearia é sobre atirar com arco e flecha\n&eEssa habilidade dá vários bônus de combate, como bônus de dano\n&eque escala com o seu nível e a habilidade de atordoar seus\n&eoponentes no PvP. Além disso, você consegue recuperar\n&ealgumas das suas flechas usadas dos corpos de seus inimigos.\n\n\n&3COMO GANHAR XP:\n&ePara ganhar XP nessa habilidade, você precisa atirar em mobs ou\n&eoutros jogadores. +Guides.Archery.Section.1=&3Proficiência em Tiro?\n&eA habilidade Proficiência em Tiro dá dano adicional aos seus tiros.\n&eO bônus de dano da Proficiência em Tiro aumenta conforme você\n&esobe de nível em arquearia.\n&eCom as configurações padrão, o seu dano com flechas aumenta em 10%\n&ea cada nível, até um máximo de 200% de bônus de dano. +Guides.Archery.Section.2=&3Como o Atordoamento funciona?\n&eVocê tem uma chance passiva de atordoar outros jogadores quando\n&eatira neles. Quando o Atordoamento é ativado, ele força o inimigo\n&ea olhar para cima por um curto período de tempo.\n&eUm tiro Atordoante também tem um dano adiconal de 4 (2 corações). +Guides.Archery.Section.3=&3Como Recuperação de Flechas funciona?\n&eVocê tem uma chance passiva de recuperar algumas flechas\n&equando você mata um mob com o arco.\n&eEssa chance aumenta conforme você sobe de nível em Arquearia.\n&ePor padrão, essa habilidade aumenta 0.1% por nível, até um máximo de 100%\n&eno nível 1000. +##Machados +Guides.Axes.Section.0=&3Sobre Machados:\n&eCom a habilidade de Machados você pode usar seu machado para muito mais coisas do que\n&eapenas desflorestamento! Você pode fazer picadinho de mobs \n&ee de jogadores para ganhar XP, batendo nos mobs com o efeito de\n&erepulsão e inflingir críticos MORTAIS em mobs e jogadores\n&eSeu machado também se torna um cortador de madeira portátil,\n&equebre a armadura dos inimigos com facilidade conforme seu nível\n&eaumenta.\n&3COMO GANHAR XP:\n&ePara ganhar XP nesta habilidade, você precisa acertar mobs ou outros jogadores\n&eCom um machado. +Guides.Axes.Section.1=&3Como Racha Crânio funciona?\n&eEssa habilidade te permite dar dano em área.\n&eEsse dano em área da metade do dano que você deu\n&eno alvo principal, então é bom para matar grandes hordas de mobs. +Guides.Axes.Section.2=&3Como Golpes críticos funciona?\n&eGolpes críticos é uma habildiade passiva que concede ao jogador a\n&echance de dar dano adicional.\n&eCom as configurações padrão, cada 2 níveis te concede\n&e0.1% de chance de dar um Golpe crítico, dano 2.0 vezes mais dano\n&eem mobs ou 1.5 vezes mais dano contra outros jogadores. +Guides.Axes.Section.3=&3Como Maestria com Machado funciona?\n&eMaestria com Machado é uma habildiade passiva que concede dano adicional\n&eao seus golpes quando se está usando um Machado.\n&eCom as configurações padrão, esse dano adicional aumenta em 1 a cada 50 níveis,\n&eaté um máximo de 4 no nível 200. +Guides.Axes.Section.4=&3Como o Impacto na armadura funciona?\n&eAtaca com força suficiente para quebrar uma armadura!\n&eImpacto na armadura tem uma chance passiva de danificar\n&ea armadura do seu oponente. Esse dano aumenta conforme você sobe de nível em Machados. +Guides.Axes.Section.5=&3Como Grande Impacto funciona?\n&eVocê tem uma chance passiva de dar um Grande Impacto quando\n&ebate em um mob ou jogador com o seu machado.\n&ePor padrão essa chance é de 25%. Essa habilidade passiva tem um\n&eefeito de repulsão muito grande, parecido com o encamento de\n&eRepulsão II. Além disso, ele dá dano adicional no alvo. +##ESCAVAÇÃO +Guides.Excavation.Section.0=&3Sobre Escavação:\n&eEscavação é o ato de cavar terra para encontrar tesouros.\n&eAo escavar você encontrará tesouros.\n&eQuanto mais você faz isso, mais tesouros pode encontrar.\n\n&3COMO GANHAR XP:\n&ePara ganhar XP nesta habilidade, você deve cavar com uma pá.\n&eApenas certos materiais podem ser cavados para tesouros e XP. +Guides.Excavation.Section.1=&3Máterias compatíveis:\n&eGrama, Terra, Areia, Argila, Cascalho, Micélio, Areia das Almas, Neve +Guides.Excavation.Section.2=&3Como usar a Super Broca:\n&eCom uma pá na mão, clique com o botão direito para preparar sua ferramenta\n&eQuando estiver neste estado, você tem cerca de 4 segundos para entrar\n&entrar em contato com Máterias compatíveis com Escavação, isso irá\n&eativar a Super Broca. +Guides.Excavation.Section.3=&3O que é Super Broca?\n&eSuper Broca é uma hablidade com cooldown\n&eligada com a habilidade de Escavação. Ela triplica sua chance\n&ede encontrar tesouros e ativa quebra instantânea\n&ede Máterias de Escavação. +Guides.Excavation.Section.4=&3Como arqueologia funciona?\n&eCada tipo de tesouro de Escavação tem sue próprio\n&enível de habilidade necessário para dropar, assim é\n&e difícil dizer o quanto isso está te ajudando.\n&eApenas tenha em mente que quanto maior for sua habilidade de Escavação\n&mais tesouros podem ser encontrados.\n&eE também tenha em mente que cada tipo de material compatível com\n&eEscavação tem sua própria lista única de tesouros.\n&eIResumindo, você encontrará diferentes tesouros em Terra\n&edo que em cascalho. +Guides.Excavation.Section.5=&3Notas sobre Escavação:\n&eOs drops de Escavação são totalmente costumizáveis\n&eEntão os resultados variam de servidor para servidor. +##Pesca +Guides.Fishing.Section.0=&3Sobre Pesca:\n&eCom a habilidade de pesca, Pesca é emocionante de novo!\n&eEncontre tesouros escondidos, and sacuda itens de mobs.\n\n&3COMO GANHAR XP:\n&ePesque peixes. +Guides.Fishing.Section.1=&3Como o Caçador de Tesouros funciona?\n&eEsta habilidade te permite achar tesouros pescando\n&ecom uma pequena chance dos itens serem encantados.\n&eTodos os tipos possíveis podem\n&edropar em qualquer nível. No entanto, depende da raridade do item e da frequência com que ele dropa.\n&eQuanto maior for o nível de pesca, melhor\n&esão suas chances de encontrar tesouros. +Guides.Fishing.Section.2=&3Como Pesca no Gelo funciona?\n&eEsta habilidade passiva permite que você pesque em lagos de gelo!\n&eUse sua vara de pesca em um lago de gelo e a habilidade irá\n&ecriar um pequeno buraco no gelo onde você poderá pescar. +Guides.Fishing.Section.3=&3Como Mestre Pescador funciona?\n&eEssa habilidade passiva aumenta a chance de fisgar um peixe durante a pesca.\n&eQuando você desbloquear esta habilidade, pescar enquanto estiver\n&edentro de um barco aumenta as chances de pegar um peixe. +Guides.Fishing.Section.4=&3Como Sacudir funciona?\n&eEsta habilidade ativa permite que você sacuda mobs fazendo-os derrubar itens\n&eHookando eles com a vara de pescar.\n&eMobs vão dropar itens que normalmente dropariam ao morrer.\n&eTambém é possível conseguir crânios de mobs, que normalmente são\n&eimpossíveis de serem obtidos no modo de sobrevivência. +Guides.Fishing.Section.5=&3Como Dieta de Pescador funciona?\n&eEsta é uma habilidade passiva que aumenta a quantidade de fome restaurada \n&ecomendo peixe. +Guides.Fishing.Section.6=&3Notas sobre Pesca:\n&eOs drops de Pesca são totalmente costumizáveis\n&eEntão os resultados variam de servidor para servidor. +##Herbalismo +Guides.Herbalism.Section.0=&3Sobre Herbalismo:\n&eHerbalismo é sobre coletar ervas e plantas.\n\n\n&3COMO GANHAR XP:\n&eColete plantas e ervas. +Guides.Herbalism.Section.1=&3Blocos compatíveis\n&eTrigo, Batatas, Cenouras, Melancias, \n&eAbóbora, Cana-de-açúcar, Sementes de Cacau, Flores, Cacto, Cogumelos,\n&eFundo do Nether, Vítoria-régia, and Trepadeiras. +Guides.Herbalism.Section.2=&3Como Terra Verde Funciona?\n&eTerra Verde é uma habildade ativa, você pode clicar com o botão direito\n&eenquanto segura uma enxada para ativar a Terra Verde.\n&eTerra Verde concede aos jgoadores a chance de obter 3x mais drops de\n&ecolheitas. Também da ao jogador a habilidade de\n&eespalhar a vida em blocos e transformá-lo usando sementes\n&edo seu inventário. +Guides.Herbalism.Section.3=&3Como Polegar Verde funciona (em plantação)?\n&eEsta habilidade passiva vai replantar automaticamente a colheita quando\n&eestiver colhendo.\n&eA chance de sucesso depende da sua habilidade de Herbalismo. +Guides.Herbalism.Section.4=&3Como Polegar Verde funciona (em Pedregulho/Tijolo de Pedra/Terra)?\n&eEssa habilidade permite que você transforme esses blocos\n&e em suas contra-partes"com plantas". Você consegue fazer isso usando o botão direito em\n&eum bloco, enquanto segura sementes. Isto irá consumir 1 semente. +Guides.Herbalism.Section.5=&3Como Dieta de Fazendeiro Funciona?\n&eEssa habilidade passiva aumenta a quantidade de fome restaurada \n&equando se come pães, Biscoito, Melancia, Sopa de cogumelos, Cenouras,\n&ee batatas. +Guides.Herbalism.Section.6=&3Como sorte de Hylian funciona?\n&eEssa habilidade passiva concede a chance de encontrar itens raros\n&equando certos blocos são quebrados com uma espada. +Guides.Herbalism.Section.7=&3Como funciona Dobra de Drops?\n&eEsta habilidade passiva concede aos jogadores mais rendimento em suas\n&ecolheitas. +##Mineração +Guides.Mining.Section.0=&3Sobre Mineração:\n&eMineração consiste em minerar pedras e minérios. Fornece bônus\n&ena quantidade de materiais dropados enquanto minera.\n\n&3COMO GANHAR XP:\n&ePara ganhar XP nesta habilidade, você deve minerar com uma picareta na mão.\n&eApenas alguns blocos dão XP. +Guides.Mining.Section.1=&3Materiais compatíveis:\n&ePedra, Minério de Carvão, Minério de Ferro, Minério de Ouro, Minério de diamante, Minério de Redstone,\n&eMinério de lápis-lazúli, Obsidiana, Pedregulho Musgoso, Pedra do End,\n&ePedra Luminosa, and Netherrack. +Guides.Mining.Section.2=&3Como usar Super Quebra:\n&eCom uma picareta em mãos, clique com o botão direito para deixar sua picareta preparada.\n&eQuando ela estiver nesse estado, você tem cerca de 4 segundos para fazer contato\n&ecom materiais compatíveis com mineração, o que irá ativar a Super\n&eQuebra. +Guides.Mining.Section.3=&3O que é Super Quebra?\n&eSuper Quebra é uma habilidade com cooldown vinculado a habilidade\n&eMineração. Ele triplica sua chance de itens extras serem dropados e\n&ehabilita a quebra instantânea de materiais de Mineração +Guides.Mining.Section.4=&3Como usar Mineração Explosiva:\n&eCom uma picareta na mão,\n&eagache-se e clique com o botão direito do mouse em uma TNT à distância. Isso fará com que a TNT\n&eexploda instantaneamente. +Guides.Mining.Section.5=&3Como Mineração Explosiva funciona?\n&eMineração é uma habilidade com um cooldown vinculado a habilidade\n&eMineração. A habilidade dá bônus ao minerar com TNT e permite que você\n&edetone TNT remotamente. Tem 3 partes da Mineração Explosiva.\n&eA primeira é Bombas Maiores\n&eA segunda é Especialista em Demolição, que diminui o dano\n&eproveniente de explosões de TNT. A terceira simplesmente aumenta a\n&equantidade de minérios dropados usando TNT e diminui os\n&edetritos dropados. +##Reparação +Guides.Repair.Section.0=&3Sobre Reparação:\n&eReparação peemite que você use um bloco de ferro para reparar armadura e\n&eferramentas.\n\n&3COMO GANHAR XP:\n&eRepare ferramentas ou armadura usando a bigorna do mcMMO. A bigorna do mcMMO é um\n&epor padrão, um bloco de ferro e não deve ser confundido com\n&eA bigorna do Minecraft clássico. +Guides.Repair.Section.1=&3Como posso usar a Reparação?\n&eColoque uma bigorna do mcMMO e clique com o botão direito para reparar o item\n&eque você está segurando no momento. Isso consome 1 item a cada uso. +Guides.Repair.Section.2=&3Como funciona Maestria em Reparo?\n&eA Maestria em Reparo aumenta a quantidade de reparo. A quantia extra\n&ereparada é influenciada pelo seu nível de habilidade de Reparação. +Guides.Repair.Section.3=&3Como Super Reparo Funciona?\n&eSuper Reparo é uma habilidade passiva. Ao reparar um item,\n&ea habilidade da chance do jogador reparam um item com\n&eo dobro de efetividade. +Guides.Repair.Section.4=&3Como funciona Forja Arcana?\n&eEssa habilidade passiva permite que o você conserte itens com uma certa chance de\n&emanter seus encantamentos. Os encantamentos podem\n&emanter seus níveis atuais, diminuir de nível,\n&eou perder totalmente o encantamento. +##Recuperação +Guides.Salvage.Section.0=&3Sobre Recuperação:\n&eRecuperação permite que você use um bloco de ouro para recuperar armaduras e\n&eferramentas.\n\n&3COMO GANHAR XP:\n&eRecuperação é uma habilidade dependente de Reparação e Pesca, seu nível de Reparação é baseado em seus níveis das habilidades Pesca e Reparação. +Guides.Salvage.Section.1=&3Como posso usar Reparação?\n&eColoque uma bigorna de Recuperação do mcMMO e clique com o botão direito para Recuperar\n&eo item que você está segurando no momento. Isso irá quebrar o item,\n&ee irá te devolver os materiais usados para fabricar o item.\n\n&ePor exemplo, recuperar uma picareta de ferro lhe dará barras de ferro. +Guides.Salvage.Section.2=&3Como Reparação avançada funciona?\n&eQuando desbloqueada, essa habilidade permite que você repare itens danificados.\n&eA porcentagem de rendimento aumenta conforme você sobe de nível. Um rendimento maior\n&e=significa que você pode obter mais materiais de volta.\n&eCom a Reparação avançada, você sempre receberá 1 material de volta,\n&ea menos que o item esteja muito danificado. Então não tem que se preocupar\n&eem destruir um item sem recuperar nada. +Guides.Salvage.Section.3=&3Para ilustrar como isso funciona, aqui está um exemplo:\n&eDigamos que Recuperamos uma picareta de ouro que estava 20% danificada,\n&eisso significa que o valor máximo que você pode obter de volta é apenas 2\n&e(Porque a picareta é feita com 3 barras - cada uma conrespondendo a\n&e33,33% de durabilidade) O que é igual a 66%. Se a sua porcentagem de\n&erendimento estiver abaixo de 66% você não vai conseguir recuperar 2 barras.\n&eSe estiver acima desse valor, você pode receber o "valor total",\n&eo que significa que você receberá 2 barras. +Guides.Salvage.Section.4=&3Como funciona Recuperação Arcana?\n&eEssa habilidade permite que você obtenha livros de encantamentos ao recuperar\n&eitens encantados. dependendo do seu nível, a chance de\n&eextrair com sucesso um encantamento total ou parcial varia.\n\n&eQuando um encantamento é parcialmente extraído, o livro de\n&encantamento terá um nível de encantamento menor em comparação\n&ecom o encantamento original do item. +##Fundição +Guides.Smelting.Section.0=Em breve... +##Espadas +Guides.Swords.Section.0=&3Sobre Espadas:\n&eEsta habilidade concede bônus de combate para aqueles que lutam com uma\n&eespada.\n\n&3COMO GANHAR XP:\n&eXP é obtida com base na quantidade de dano causado aos mobs ou \n&eoutros jogadores ao empunhar uma espada. +Guides.Swords.Section.1=&3Como Ataques cortantes funciona?\n&eAtaques cortantes é uma habilidade ativa, você pode ativá-la\n&eclicando com o botão direito com uma espada. Esta habilidade te permite dar \n&edano em área. Esse dano em área 25% de dano\n&ebônus e pode causar Ruptura. +Guides.Swords.Section.2=&3Como Contra-Ataque funciona?\n&eContra-Ataque é uma habilidade ativa. quando bloquear e receber\n&egolpes de mobs, você terá uma chance de refletir 50%\n&edo dano que recebeu. +Guides.Swords.Section.3=&3Como Ruptura funciona?\n&eRuptura faz com que os inimigos recebam dano a cada dois segundos. O \n&ealvo irá sangrar atÉ que o efeito acabe, ou ele morra, \n&eo que vier primeiro.\n&eA duração do sangramento aumenta com o nível da sua habilidade de Espadas. +##Adestramento +Guides.Taming.Section.0=&3Sobre Adestramento:\n&eAdestramento dará aos jogadores vários bônus de combate ao usar\n&elobos domados.\n\n&3COMO GANHAR XP:\n&epara ganhar XP nessa habilidade você terá que domar lobos/jaguatiricas or\n&eou lutar junto com seus lobos. +Guides.Taming.Section.1=&3Como Chamado da Natureza funciona?\n&eChamado da Natureza é uma habilidade que te permite invocar\n&eum lobo ou uma jaguatirica do seu lado. Você pode fazer isso \n&eagachando + clicando com o botão esquerdo enquanto segura ossos ou peixes. +Guides.Taming.Section.2=&3Como Conhecimento de Feras funciona?\n&eConhecimento de feras permite que os jogadores inspecionem animais de estimação e verifiquem as\n&estatísticas de lobos e jaguatiricas. Clique com o botão esquerdo em um lobo ou jaguatirica para usar\n&eConhecimento de Feras. +Guides.Taming.Section.3=&3Como mordida funciona?\n&eMordida é uma habilidade passiva que tem a chance de infligir o\n&eefeito de sangramento nos alvos dos seus lobos. +Guides.Taming.Section.4=&3Como Garras Afiadas funciona?\n&eGarras Afiadas dá bônus de dano para o dano causado\n&epor lobos. O bônus de dano depende do seu nível de Adestramento. +Guides.Taming.Section.5=&3Como Consciência Ambiental funciona?\n&eEssa habilidade passiva permitirá que seus lobos se teletransportem para você quando\n&eeles se aproximarem de coisas perigosas como cacto e Lava. Também dará\n&eimunidade a dano por queda para os lobos. +Guides.Taming.Section.6=&3Como Pelo Grosso funciona?\n&eEsta habilidade passiva reduzirá o dano e faz os lobos serem \n&eresistentes ao fogo. +Guides.Taming.Section.7=&3Como Resistência a impactos funciona?\n&eEsta habilidade passiva reduz o dano recebido pelos lobos\n&ede explosões. +Guides.Taming.Section.8=&3Como Serviço de Fast Food funciona?\n&eEsta habilidade passiva dá aos lobos chance de se curarem sempre que\n&eatacarem. +##Desarmado +Guides.Unarmed.Section.0=&3Sobre Desarmado:\n&eDesarmado dá aos jogadores vários bônus de combate ao usar\n&eseus punhos como armas. \n\n&3GANHO DE XP:\n&eXP é recebida baseada na quantidade de dano causada a mobs\n&eou em outros jogadores quando você está desarmado. +Guides.Unarmed.Section.1=&3Como Fúria funciona?\n&eFúria é uma habilidade ativa que é ativada\n&e clicando com o botão direito. Enquanto estiver no modo de Fúria você dará 50% mais de\n&edano e poderá quebrar materiais frágeis instantaneamente, como\n&eTerra e Grama. +Guides.Unarmed.Section.2=&3Como Estilo braço de Aço funciona?\n&eEstilo braço de Aço aumenta o dano causado ao atingir mobs ou\n&ejogadores com os seus punhos. +Guides.Unarmed.Section.3=&3Como Desviar Flechas funciona?\n&eDesviar Flechas é uma habilidade passiva que te dá chance\n&ede refletir flechas atiradas por Esqueletos ou outros jogadores.\n&eA flecha cairá no chão sem causar danos ao jogador. +Guides.Unarmed.Section.4=&3Como Punho de ferro funciona?\n&ePunho de ferro é uma habilidade passiva que neutraliza a habilidade desarmamento. Conforme seu \n&enível de desarmado aumenta, a chance de prevenir que você seja desarmado também aumenta. +Guides.Unarmed.Section.5=&3Como Desarmar funciona?\n&eEsta habilidade passiva permite que jogares desarmem outros jogadores,\n&efazendo com que o item que o alvo estava segurando caia no chão. +##Corte de Árvore +Guides.Woodcutting.Section.0=&3Sobre Lenhador:\n&eLenhador é sobre derrubar Árvores.\n\n&3COMO GANHAR XP:\n&eXP é obtida sempre que você quebra blocos de madeira. +Guides.Woodcutting.Section.1=&3Como Lenhador funciona?\n&eLenhador é uma habilidade ativa, você pode clicar com o botão direito\n&eenquanto segura um machado para ativar a habilidade Lenhador. Irá\n&efazer com que a Árvore inteira seja quebrada instantaneamente, dropando todos\n&eos blocos de madeira de uma vez só. +Guides.Woodcutting.Section.2=&3Como Soprador de Folhas funciona?\n&eSoprador de Folhas é uma habilidade passiva que fará com que os blocos de\n&efolha se quebrem instantaneamente uando atingido por um machado. Por padrão\n&eessa habilidade é desbloqueada no nível 100. +Guides.Woodcutting.Section.3=&3Como Drops duplos funcionam?\n&eEsta habilidade passiva te dá a chance de obter um bloco\n&eextra para cada bloco de madeira que você corta. -Stats.Header.Combat=[[GOLD]]-=SKILLS DE COMBATE=- -Stats.Header.Gathering=[[GOLD]]-=SKILLS DE RECOLHA=- -Stats.Header.Misc=[[GOLD]]-=OUTRAS SKILLS=- -Scoreboard.Header.PlayerCooldowns=[[YELLOW]]mcMMO Restantes -Scoreboard.Misc.CurrentXP=[[GREEN]]XP Atual -Scoreboard.Misc.RemainingXP=[[YELLOW]]XP Restante -Scoreboard.Misc.Cooldown=[[LIGHT_PURPLE]]Faltando -Scoreboard.Misc.Overall=[[GOLD]]Geral +#INSPECIONAR +Inspect.Offline= &cVocê não tem permissão para inspecionar jogadores offline! +Inspect.OfflineStats=Estatísticas do mcMMO do jogador offline &e{0} +Inspect.Stats=&aEstatísticas do mcMMO do jogador &e{0} +Inspect.TooFar=Você está muito longe para inspecionar esse jogador! -#DATABASE RECOVERY -Profile.Loading.Success=[[GREEN]]Seu perfil mcMMO foi carregado. -Profile.Loading.Failure=[[RED]]mcMMO still cannot load your data. You may want to [[AQUA]]contact the server owner.\n[[YELLOW]]You can still play on the server, but you will have [[BOLD]]no mcMMO levels[[YELLOW]] and any XP you get [[BOLD]]will not be saved[[YELLOW]]. -Profile.Loading.AdminFailureNotice=[[DARK_RED]][A][[RED]] mcMMO was unable to load the player data for [[YELLOW]]{0}[[RED]]. [[LIGHT_PURPLE]]Please inspect your database setup. +#ITEMS +Item.ChimaeraWing.Fail=&c**ASA DE QUIMERA FALHARAM!** +Item.ChimaeraWing.Pass=**ASA DE QUIMERA** +Item.ChimaeraWing.Name=Asa de quimera +Item.ChimaeraWing.Lore=&7Teleporta você para a sua cama. +Item.ChimaeraWing.NotEnough=Você precisa &e{0}&c mais &6{1}&c! +Item.NotEnough=Você precisa &e{0}&c mais &6{1}&c! +Item.Generic.Wait=Você precisa esperar para poder usar isso de novo! &e({0}s) +Item.Injured.Wait=Você recebeu dano recentemente e deve esperar para usar isso. &e({0}s) +Item.FluxPickaxe.Name=Picareta Derretedora +Item.FluxPickaxe.Lore.1=&7Tem chance de fundir instantaneamente minérios. +Item.FluxPickaxe.Lore.2=&7Necessita de fundição nível {0}+ + +#TELETANSPORTE +Teleport.Commencing=&7Começãndo o teletransporte em &6({0}) &7segundos, por favor, fique parado... +Teleport.Cancelled=&4Teletransporte cancelado! + +#HABILIDADES +Skills.Child=&6(HABILIDADES DEPENDENTES) +Skills.Disarmed=&4Você foi desarmado! +Skills.Header=-----[] &a{0}&c []----- +Skills.NeedMore=&4Você precisa de mais &7{0} +Skills.NeedMore.Extra=&4Você precisa de mais &7{0}{1} +Skills.Parents= PRINCIPAIS +Skills.Stats={0}&a{1}&3 XP(&7{2}&3/&7{3}&3) +Skills.ChildStats={0}&a{1} +Skills.MaxXP=Máximo +Skills.TooTired=Você está muito cansado para usar essa habilidade de novo. &e({0}s) +Skills.TooTired.Named=&7(&6{0}&e {1}s&7) +Skills.TooTired.Extra=&6{0} &eCooldowns de Super Habilidades - {1} +Skills.Cancelled=&6{0} &ccancelado! +Skills.ConfirmOrCancel=&aclique no botão direito de novo para confirmar &6{0}&a. clique no botão esquerdo para cancelar. +Skills.AbilityGateRequirementFail=&7Você precisa de mais &e{0}&7 níveis de &3{1}&7 para usar essa Super Habilidade. + +#ESTATÍSTICAS +Stats.Header.Combat=&6-=HABILIDADES DE COMBATE=- +Stats.Header.Gathering=&6-=HABILIDADES DE COLETA=- +Stats.Header.Misc=&6-=HABILIDADES DIVERSAS=- +Stats.Own.Stats=&a[mcMMO] Estatísticas + +#VANTAGENS +Perks.XP.Name=Experiência +Perks.XP.Desc=Receba bônus de XP em certas habilidades. +Perks.Lucky.Name=Sorte +Perks.Lucky.Desc=Dá 33.3% a mais de chance de ativar habilidades {0}. +Perks.Lucky.Desc.Login=Dá 33.3% a mais de chance de ativar habilidades certas habilidades. +Perks.Lucky.Bonus=&6 ({0} com a vantagem de Sorte) +Perks.Cooldowns.Name=Recuperação rápida +Perks.Cooldowns.Desc=Diminui o cooldown em {0}. +Perks.ActivationTime.Name=Resistência +Perks.ActivationTime.Desc=Aumenta o tempo de ativação de habilidades por {0} segundos. +Perks.ActivationTime.Bonus=&6 ({0}s com a vantagem de resistência) + +#HARDCORE +Hardcore.Mode.Disabled=&6[mcMMO] Modo Hardcore {0} desabilitador por {1}. +Hardcore.Mode.Enabled=&6[mcMMO] Modo Hardcore {0} habilitado por {1}. +Hardcore.DeathStatLoss.Name=Penalidade de habilidade quando Morre +Hardcore.DeathStatLoss.PlayerDeath=&6[mcMMO] &4Você perdeu &9{0}&4 níveis por ter morrido. +Hardcore.DeathStatLoss.PercentageChanged=&6[mcMMO] A porcentagem de perda de estatísticas foi mudada para {0}. +Hardcore.Vampirism.Name=Vampirismo +Hardcore.Vampirism.Killer.Failure=&6[mcMMO] &e{0}&7 Era muito pouco qualificado para te conceder qualquer tipo de conhecimento. +Hardcore.Vampirism.Killer.Success=&6[mcMMO] &3Você robou &9{0}&3 níveis de &e{1}. +Hardcore.Vampirism.Victim.Failure=&6[mcMMO] &e{0}&7 não conseguiu roubar conhecimento de você! +Hardcore.Vampirism.Victim.Success=&6[mcMMO] &e{0}&4 roubou &9{1}&4 níveis de você! +Hardcore.Vampirism.PercentageChanged=&6[mcMMO] A porcentagem de roubo de estatísticas foi alterada para {0}. + +#MOTD +MOTD.Donate=&3Informações de Doação: +MOTD.Hardcore.Enabled=&6[mcMMO] &3Modo Hardcore habilitado: &4{0} +MOTD.Hardcore.DeathStatLoss.Stats=&6[mcMMO] &3Penalidade de habilidade por morrer: &4{0}% +MOTD.Hardcore.Vampirism.Stats=&6[mcMMO] &3Roubo de estatísticas por Vampirismo: &4{0}% +MOTD.PerksPrefix=&6[Vantagens do mcMMO] +MOTD.Version=&6[mcMMO] Rodando na versão &3{0} +MOTD.Website=&6[mcMMO] &a{0}&e - Site do mcMMO + +#FUNDIÇÃO +Smelting.SubSkill.UnderstandingTheArt.Name=Compreendendo a Arte +Smelting.SubSkill.UnderstandingTheArt.Description=Talvez você esteja gastando muito tempo fundindo nas cavernas.\nAumenta várias propriedades de fundição. +Smelting.SubSkill.UnderstandingTheArt.Stat=Multiplicador de XP Clássico: &e{0}x +Smelting.Ability.Locked.0=BLOQUEADO ATÉ CHEGAR NO NÍVEL {0}+ HABILIDADE (Multiplicador de XP Clássico) +Smelting.Ability.Locked.1=BLOQUEADO ATÉ CHEGAR NO NÍVEL {0}+ HABILIDADE (MINERAÇÃO DERRETEDORA) +Smelting.SubSkill.FuelEfficiency.Name=Eficiência do combustível +Smelting.SubSkill.FuelEfficiency.Description=Aumenta o tempo de queima do combustível usando fornalhas durante a fundição +Smelting.SubSkill.FuelEfficiency.Stat=Multiplicador de eficiência de combustível: &e{0}x +Smelting.SubSkill.SecondSmelt.Name=Segunda fundição +Smelting.SubSkill.SecondSmelt.Description=Dobra os recursos obtidos com fundição +Smelting.SubSkill.SecondSmelt.Stat=Chance da segunda fundição +Smelting.Effect.4=Aumento de Xp clássico +Smelting.Effect.5=Aumenta a XP clássica obtida durante a fundição +Smelting.SubSkill.FluxMining.Name=Mineração Derretedora +Smelting.SubSkill.FluxMining.Description=Chance de que os minérios sejam fundidos instantaneamente durante a mineração +Smelting.SubSkill.FluxMining.Stat=Chance de mineração derretedora +Smelting.Listener=Fundição: +Smelting.SkillName=FUNDIÇÃO + +#DESRIÇÃO DOS COMANDOS +Commands.Description.addlevels=Adiciona níveis do mcMMO a um jogador +Commands.Description.adminchat=Ative/desative o chat de admin do mcMMO ou envie mensagens no chat de admin +Commands.Description.addxp=Adiciona XP do mcMMO a um jogador +Commands.Description.hardcore=Modifica a porcentagem do hardcore ou ative/desative o modo Hardcore +Commands.Description.inspect=Veja informações detalhadas do mcMMO de outro jogador +Commands.Description.mcability=Ative/destive habilidades usadas com o botão direito do mcMMO +Commands.Description.mccooldown=Veja todos os cooldowns de habilidades do mcMMO +Commands.Description.mcchatspy=Ative/desative o espionar chat de grupo do mcMMO +Commands.Description.mcgod=Ative/desative o god mode do mcMMO +Commands.Description.mchud=Mude o estilo do HUD do mcMMO +Commands.Description.mcmmo=Mostra uma descrição resumida do mcMMO +Commands.Description.mcnotify=Ative/desative as notificações de bate-papo das habilidades do mcMMO +Commands.Description.mcpurge=Retira jogadores sem níveis do mcMMO e jogadores que não se conectam a {0} meses do banco de dados do mcMMO +Commands.Description.mcrank=Mostra o rank de um jogador do mcMMO +Commands.Description.mcrefresh=Recarrega todos os cooldowns do mcMMO +Commands.Description.mcremove=Remove um jogador do banco de dados do mcMMO +Commands.Description.mcscoreboard=Gerencie seu Scoreboard do mcMMO +Commands.Description.mcstats=Mostre seu nível do mcMMO e XP +Commands.Description.mctop=Mostra a leaderboard do mcMMO +Commands.Description.mmoedit=Edita o nível do mcMMO de um jogador +Commands.Description.mmodebug=Ativa/desativa o modo de debug que mostra informações úteis quando você bate em blocos +Commands.Description.mmoupdate=Migra um banco de dados antigo do mcMMO para um atual +Commands.Description.mcconvert=Converte os tipos de banco de dados ou os tipos de fórmula de XP +Commands.Description.mmoshowdb=Mostra o nome do tipo atual do banco de dados (para uso posterior use /mmoupdate) +Commands.Description.party=Controla várias configurações de grupo do mcMMO +Commands.Description.partychat=Ativa/desativa o chat de grupo do mcMMO ou envia mensagens no chat de grupo +Commands.Description.ptp=Teleporte-se para um membro do seu grupo do mcMMO +Commands.Description.Skill=Mostra informações detalhadas de habilidades do mcMMO para {0} +Commands.Description.skillreset=Reseta os níveis do mcMMO de um jogador +Commands.Description.vampirism=Modifica a porcentagem de vampirismo do mcMMO ou ativa/desativa o vampirismo +Commands.Description.xplock=Trava sua barra de XP do mcMMO de uma habilidade específica do mcMMO +Commands.Description.xprate=Modifique a taxa de XP do mcMMO ou inicie um exento de XP do mcMMO + +#VERIFICAÇÃO DE ATUALIZAÇÃO +UpdateChecker.Outdated=Você está usando uma versão antiga do mcMMO! +UpdateChecker.NewAvailable=Tem uma nova versão disponível no Spigot. + +#CABEÇALHO DO SCOREBOARD +Scoreboard.Header.PlayerStats=&eEstatísticas do mcMMO +Scoreboard.Header.PlayerCooldowns=&eCooldowns do mcMMO +Scoreboard.Header.PlayerRank=&eRanks do mcMMO +Scoreboard.Header.PlayerInspect=&eEstatísticas do mcMMO: {0} +Scoreboard.Header.PowerLevel=&cNível de poder +Scoreboard.Misc.PowerLevel=&6Nível de poder +Scoreboard.Misc.Level=&3Nível +Scoreboard.Misc.CurrentXP=&aXP atual +Scoreboard.Misc.RemainingXP=&eXP que ainda falta +Scoreboard.Misc.Cooldown=&dCooldown +Scoreboard.Misc.Overall=&6Geral +Scoreboard.Misc.Ability=Habilidade + +#RECUPERAÇÃO DE BANCO DE DADOS +Profile.PendingLoad=&cOs seus dados de jogador do mcMMO ainda não foram carregados. +Profile.Loading.Success=&aO seu perfil mcMMO foi carregado com sucesso. +Profile.Loading.FailurePlayer=&cmcMMO está tendo problemas para carregar seus dados, nós tentamos carregá-lo &a{0}&c vezes.&c Você pode tentar entrar em contato com os admins do servidor para falar sobre esse problema.O mcMMO tentará carregar seus dados até que você se desconecte, você não ganhará e nem será capaz de usar suas habilidades enquanto os dados não estiverem carregados. +Profile.Loading.FailureNotice=&4[A]&c mcMMO não conseguiu carregar os dados do jogador &e{0}&c. &dPor favor, verifique a configuração do seu banco de dados. Quantidade de tentativas feitas até agora {1}. +#Feriados +Holiday.AprilFools.Levelup=&6{0} agora está no nível &a{1}&6! +Holiday.Anniversary=&9Feliz Aniversário de {0} anos!\n&9 em homenagem a todo o trabalho de nossr50 e todos os seus desenvolvedores, aqui está um show pirotécnico! +#Mensagens de lembrete +Reminder.Squelched=&7Reminder: No momento, você não está recebendo notificações do mcMMO, para habilitar as notificações, digite /mcnotify de novo. Este é um lembrete automático de hora em hora. +#Linguagem +Locale.Reloaded=&aLinguagem recarregada! +#Coisas de level up dos jogadores +LevelCap.PowerLevel=&6(&amcMMO&6) &eVocê chegou no Nível de Poder máximo em &c{0}&e. Você irá parar de subir de nível de habilidades de agora em diante. +LevelCap.Skill=&6(&amcMMO&6) &eVocê chegou no nível máxima de &c{0}&e em &6{1}&e. Você irá parar de subir de nível de agora em diante. +Commands.XPBar.Usage=O jeito certo de usar é /mmoxpbar +Commands.Description.mmoxpbar=Configurações da barra de XP do Jogador do mcMMO +Commands.Description.mmocompat=Informações sobre o mcMMO e se está ou não em modo de compatibilidade ou totalmente funcional. +Compatibility.Layer.Unsupported=&6Compatibilidade com &a{0}&6 não é funcional com esta versão do Minecraft. +Compatibility.Layer.PartialSupport=&6Compatibilidade com &a{0}&6 não é totalmente funcional com esta versão do Minecraft, mas o mcMMO está executando um sistema secundário para emular alguns dos recursos ausentes. +Commands.XPBar.DisableAll=&6 Todas as barras de XP do mcMMO estão desativadas agora, use /mmoxpbar reset para restaurar as configurações padrão. +#Configurações do Chat Moderno +Chat.Style.Admin=&b(A) &r{0} &b→ &r{1} +Chat.Style.Party=&a(G) &r{0} &a→ &r{1} +Chat.Style.Party.Leader=&a(G) &r{0} &6→ &r{1} +Chat.Identity.Console=&6* Console * +Chat.Channel.On=&6(&amcMMO-Chat&6) &eSuas mensagens digitadas no chat serão enviadas automaticamente para o chat &a{0}. +Chat.Channel.Off=&6(&amcMMO-Chat&6) &7Suas mensagens digitadas não serão mais enviadas automaticamente para chats específicos. +Chat.Spy.Party=&6[&eESPIÃO&6-&a{2}&6] &r{0} &b→ &r{1} +Broadcasts.LevelUpMilestone=&6(&amcMMO&6) {0}&7 chegou no nível &a{1}&7 em &3{2}&7! +Broadcasts.PowerLevelUpMilestone=&6(&amcMMO&6) {0}&7 chegou no Nível de Poder &a{1}&7! +Scoreboard.Recovery=Tentando recuperar o scoreboard do mcMMO... diff --git a/src/main/resources/locale/locale_ru.properties b/src/main/resources/locale/locale_ru.properties index 2710d8151..8950be8fe 100644 --- a/src/main/resources/locale/locale_ru.properties +++ b/src/main/resources/locale/locale_ru.properties @@ -1,1166 +1,1144 @@ -#\u041a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u0439 \u0438\u0437 \u0430\u043c\u0435\u0440\u0438\u043a\u0430\u043d\u0441\u043a\u043e\u0433\u043e \u0444\u0430\u0439\u043b\u0430 \u043b\u043e\u043a\u0430\u043b\u0438 #I'm going to try to normalize our locale file, forgive the mess for now. #DO NOT USE COLOR CODES IN THE JSON KEYS #COLORS ARE DEFINED IN advanced.yml IF YOU WISH TO CHANGE THEM -JSON.Rank=\u0420\u0430\u043d\u0433 -JSON.DescriptionHeader=\u041e\u043f\u0438\u0441\u0430\u043d\u0438\u0435 -JSON.JWrapper.Header=\u041f\u043e\u0434\u0440\u043e\u0431\u043d\u0435\u0435 -JSON.Type.Passive=\u041f\u0430\u0441\u0441\u0438\u0432\u043d\u044b\u0439 -JSON.Type.Active=\u0410\u043a\u0442\u0438\u0432\u043d\u044b\u0439 -JSON.Type.SuperAbility=\u0421\u0443\u043f\u0435\u0440 \u0421\u043f\u043e\u0441\u043e\u0431\u043d\u043e\u0441\u0442\u044c -JSON.Locked=-=[\u0417\u0410\u0411\u041b\u041e\u041a\u0418\u0420\u041e\u0412\u0410\u041d\u041e]=- -JSON.LevelRequirement=\u041d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u044b\u0439 \u0423\u0440\u043e\u0432\u0435\u043d\u044c -JSON.JWrapper.Target.Type=\u0422\u0438\u043f \u0446\u0435\u043b\u0438: -JSON.JWrapper.Target.Block=\u0411\u043b\u043e\u043a -JSON.JWrapper.Target.Player=\u0418\u0433\u0440\u043e\u043a -JSON.JWrapper.Perks.Header=[[GOLD]]\u0423\u0434\u0430\u0447\u0430 -JSON.JWrapper.Perks.Lucky={0}% \u0423\u043b\u0443\u0447\u0448\u0435\u043d\u043d\u044b\u0439 \u0428\u0430\u043d\u0441 -JSON.Hover.Tips=\u041f\u043e\u0434\u0441\u043a\u0430\u0437\u043a\u0438 -JSON.Acrobatics=\u0410\u043a\u0440\u043e\u0431\u0430\u0442\u0438\u043a\u0430 -JSON.Alchemy=\u0410\u043b\u0445\u0438\u043c\u0438\u044f -JSON.Archery=\u041b\u0443\u043a\u0438 -JSON.Axes=\u0422\u043e\u043f\u043e\u0440\u044b -JSON.Excavation=\u0420\u0430\u0441\u043a\u043e\u043f\u043a\u0438 -JSON.Fishing=\u0420\u044b\u0431\u043e\u043b\u043e\u0432\u0441\u0442\u0432\u043e -JSON.Herbalism=\u0422\u0440\u0430\u0432\u043d\u0438\u0447\u0435\u0441\u0442\u0432\u043e -JSON.Mining=\u0428\u0430\u0445\u0442\u0435\u0440\u0441\u0442\u0432\u043e -JSON.Repair=\u041f\u043e\u0447\u0438\u043d\u043a\u0430 -JSON.Salvage=\u041f\u0435\u0440\u0435\u0440\u0430\u0431\u043e\u0442\u043a\u0430 -JSON.Swords=\u041c\u0435\u0447\u0438 -JSON.Taming=\u0423\u043a\u0440\u043e\u0449\u0435\u043d\u0438\u0435 -JSON.Unarmed=\u0411\u0435\u0437\u043e\u0440\u0443\u0436\u043d\u044b\u0439 -JSON.Woodcutting=\u041b\u0435\u0441\u043e\u0440\u0443\u0431\u0441\u0442\u0432\u043e -JSON.URL.Website=\u041e\u0444\u0438\u0446\u0438\u0430\u043b\u044c\u043d\u044b\u0439 \u0441\u0430\u0439\u0442 mcMMO! -JSON.URL.Discord=\u041e\u0444\u0438\u0446\u0438\u0430\u043b\u044c\u043d\u044b\u0439 Discord \u0441\u0435\u0440\u0432\u0435\u0440 mcMMO! -JSON.URL.Patreon=\u041f\u043e\u0434\u0434\u0435\u0440\u0436\u0430\u0442\u044c nossr50 \u0438 \u0435\u0433\u043e \u0440\u0430\u0431\u043e\u0442\u0443 \u043d\u0430\u0434 mcMMO \u043d\u0430 \u041f\u0430\u0442\u0440\u0435\u043e\u043d\u0435! -JSON.URL.Spigot=\u041e\u0444\u0438\u0446\u0438\u0430\u043b\u044c\u043d\u0430\u044f \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0430 mcMMO \u043d\u0430 Spigot! -JSON.URL.Translation=\u041f\u0435\u0440\u0435\u0432\u043e\u0434 mcMMO \u043d\u0430 \u0434\u0440\u0443\u0433\u0438\u0435 \u044f\u0437\u044b\u043a\u0438! -JSON.URL.Wiki=\u041e\u0444\u0438\u0446\u0438\u0430\u043b\u044c\u043d\u0430\u044f wiki \u043f\u043e mcMMO! -JSON.SkillUnlockMessage=[[GOLD]][ mcMMO[[YELLOW]] @[[DARK_AQUA]]{0} [[GOLD]]\u0420\u0430\u043d\u0433 [[DARK_AQUA]]{1}[[GOLD]] \u0420\u0430\u0437\u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u0430\u043d! ] -JSON.Hover.Rank=&e&l\u0420\u0430\u043d\u0433:&r &f{0} -JSON.Hover.NextRank=&7&o\u0421\u043b\u0443\u0434\u0443\u044e\u0449\u0435\u0435 \u0443\u043b\u0443\u0447\u0448\u0435\u043d\u0438\u0435 \u043d\u0430 \u0443\u0440\u043e\u0432\u043d\u0435 {0} +JSON.Rank=Ранг +JSON.DescriptionHeader=Описание +JSON.JWrapper.Header=Подробнее +JSON.Type.Passive=Пассивный +JSON.Type.Active=Активный +JSON.Type.SuperAbility=Суперумение +JSON.Locked=-=[ЗАБЛОКИРОВАНО]=- +JSON.LevelRequirement=Необходимый уровень +JSON.JWrapper.Target.Type=Тип цели: +JSON.JWrapper.Target.Block=Блок +JSON.JWrapper.Target.Player=Игрок +JSON.JWrapper.Perks.Header=&6С удачей +JSON.JWrapper.Perks.Lucky=Шанс выше на {0}% +JSON.Hover.Tips=Подсказки +JSON.Acrobatics=Акробатика +JSON.Alchemy=Алхимия +JSON.Archery=Стрельба +JSON.Axes=Топоры +JSON.Excavation=Раскопки +JSON.Fishing=Рыболовство +JSON.Herbalism=Травничество +JSON.Mining=Шахтерство +JSON.Repair=Починка +JSON.Salvage=Разборка +JSON.Swords=Мечи +JSON.Taming=Укрощение +JSON.Unarmed=Безоружный +JSON.Woodcutting=Лесорубство +JSON.URL.Website=Официальный сайт mcMMO! +JSON.URL.Discord=Официальный Discord сервер mcMMO! +JSON.URL.Patreon=Поддержите nossr50 и его работу над mcMMO на Patreon! +JSON.URL.Spigot=Официальная страница mcMMO на Spigot! +JSON.URL.Translation=Перевести mcMMO на другие языки! +JSON.URL.Wiki=Официальная wiki по mcMMO! +JSON.SkillUnlockMessage=&6[ mcMMO&e @&3{0} &6Ранг &3{1}&6 разблокирован! ] +JSON.Hover.Rank=&e&lРанг:&r &f{0} +JSON.Hover.NextRank=&7&oСледующее улучшение на уровне {0} # for JSON.Hover.Mystery you can add {0} to insert the level required into the name, I don't like how that looks so I'm not doing that atm -JSON.Hover.Mystery=[[GRAY]]\u0423\u0440. {0}+ -JSON.Hover.Mystery2=[[YELLOW]][[[DARK_GRAY]]{0}[[YELLOW]]][[DARK_GRAY]]???&r -JSON.Hover.SkillName=[[DARK_AQUA]]{0}&r -JSON.Hover.SuperAbility=[[DARK_PURPLE]]{0}&r -JSON.Hover.MaxRankSkillName=[[GOLD]]{0}&r -JSON.Hover.AtSymbolSkills=[[YELLOW]]@ -JSON.Hover.AtSymbolURL=[[YELLOW]]@ +JSON.Hover.Mystery=&7??? +JSON.Hover.Mystery2=&e[&8{0}&e]&8???&r +JSON.Hover.SkillName=&3{0}&r +JSON.Hover.SuperAbility=&5{0}&r +JSON.Hover.MaxRankSkillName=&6{0}&r +JSON.Hover.AtSymbolSkills=&e@ +JSON.Hover.AtSymbolURL=&e@ + #This is the message sent to players when an ability is activated JSON.Notification.SuperAbility={0} #These are the JSON Strings used for SubSkills -JSON.Acrobatics.Roll.Interaction.Activated=\u0422\u0435\u0441\u0442 [[RED]]Rolled \u0422\u0435\u0441\u0442 -JSON.Acrobatics.SubSkill.Roll.Details.Tips=\u0415\u0441\u043b\u0438 \u0432\u044b \u043f\u0440\u0438\u0441\u044f\u0434\u0438\u0442\u0435 \u0432\u043e \u0432\u0440\u0435\u043c\u044f \u043f\u0430\u0434\u0435\u043d\u0438\u044f, \u0442\u043e \u0441\u043c\u043e\u0436\u0435\u0442\u0435 \u043d\u0438\u0432\u0435\u043b\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0432\u043f\u043b\u043e\u0442\u044c \u0434\u043e \u043f\u043e\u043b\u043e\u0432\u0438\u043d\u044b \u0443\u0440\u043e\u043d\u0430 \u043e\u0442 \u043f\u0430\u0434\u0435\u043d\u0438\u044f! -Anvil.SingleItemStack=[[RED]]\u0412\u044b \u043d\u0435 \u043c\u043e\u0436\u0435\u0442\u0435 \u0447\u0438\u043d\u0438\u0442\u044c \u0438\u043b\u0438 \u043f\u0435\u0440\u0435\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0442\u044c \u043f\u0440\u0435\u0434\u043c\u0435\u0442\u044b \u0432 \u0441\u0442\u0430\u043a\u0430\u0445, \u0440\u0430\u0437\u043b\u043e\u0436\u0438\u0442\u0435 \u0438\u0445 \u043f\u043e \u043e\u0434\u043d\u043e\u043c\u0443. +JSON.Acrobatics.Roll.Interaction.Activated=Тест &cКувырок Тест +JSON.Acrobatics.SubSkill.Roll.Details.Tips=Если вы присядите во время падения, то сможете нивелировать вплоть до половины урона от падения! +Anvil.SingleItemStack=&cВы не можете чинить или перерабатывать предметы в стаках - разложите их по одному. -mcMMO.Template.Prefix=[[GOLD]]([[GREEN]]mcMMO[[GOLD]]) [[GRAY]]{0} +#DO NOT USE COLOR CODES IN THE JSON KEYS +#COLORS ARE DEFINED IN advanced.yml IF YOU WISH TO CHANGE THEM -#ACROBATICS -Acrobatics.Ability.Proc=[[GREEN]]**\u0418\u0437\u044f\u0449\u043d\u043e\u0435 \u041f\u0440\u0438\u0437\u0435\u043c\u043b\u0435\u043d\u0438\u0435 ** -Acrobatics.Combat.Proc=[[GREEN]]**\u0423\u043a\u043b\u043e\u043d\u0435\u043d\u0438\u0435** -Acrobatics.DodgeChance=\u0428\u0430\u043d\u0441 \u0423\u043a\u043b\u043e\u043d\u0438\u0442\u044c\u0441\u044f: [[YELLOW]]{0} % -Acrobatics.SubSkill.Roll.Name=\u0421\u043a\u043e\u043b\u044c\u0436\u0435\u043d\u0438\u0435 -Acrobatics.SubSkill.Roll.Description=\u0423\u043c\u0435\u043d\u044c\u0448\u0430\u0435\u0442 \u0438\u043b\u0438 \u0438\u0433\u043d\u043e\u0440\u0438\u0440\u0443\u0435\u0442 \u043f\u043e\u0432\u0440\u0435\u0436\u0434\u0435\u043d\u0438\u044f \u043e\u0442 \u043f\u0430\u0434\u0435\u043d\u0438\u044f -Acrobatics.SubSkill.Roll.Stats=[[GOLD]]\u0428\u0430\u043d\u0441 \u0441\u043a\u043e\u043b\u044c\u0436\u0435\u043d\u0438\u044f [[YELLOW]]{0}%[[GOLD]] \u0428\u0430\u043d\u0441 \u0438\u0437\u044f\u0449\u043d\u043e\u0433\u043e \u0441\u043a\u043e\u043b\u044c\u0436\u0435\u043d\u0438\u044f[[YELLOW]] {1}% -Acrobatics.SubSkill.Roll.Stat=\u0428\u0430\u043d\u0441 \u0441\u043a\u043e\u043b\u044c\u0436\u0435\u043d\u0438\u044f -Acrobatics.SubSkill.Roll.Stat.Extra=\u0428\u0430\u043d\u0441 \u0438\u0437\u044f\u0449\u043d\u043e\u0433\u043e \u0441\u043a\u043e\u043b\u044c\u0436\u0435\u043d\u0438\u044f -Acrobatics.SubSkill.Roll.Mechanics=[[GRAY]]\u0421\u043a\u043e\u043b\u044c\u0436\u0435\u043d\u0438\u0435 \u044d\u0442\u043e \u043f\u0430\u0441\u0441\u0438\u0432\u043d\u044b\u0439 \u043f\u043e\u0434-\u0441\u043a\u0438\u043b\u043b \u0441 \u0430\u043a\u0442\u0438\u0432\u043d\u044b\u043c \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u043e\u043c.\n\u041a\u0430\u043a \u0442\u043e\u043b\u044c\u043a\u043e \u0432\u044b \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442\u0435 \u0443\u0440\u043e\u043d \u043e\u0442 \u043f\u0430\u0434\u0435\u043d\u0438\u044f, \u0442\u043e \u0443 \u0432\u0430\u0441 \u0435\u0441\u0442\u044c \u043d\u0430\u0448\u0441 \u043f\u043e\u043b\u043d\u043e\u0441\u0442\u044c\u044e \u043d\u0438\u0432\u0435\u043b\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0443\u0440\u043e\u043d \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 \u0443\u0440\u043e\u0432\u043d\u044f \u0441\u043f\u043e\u0441\u043e\u0431\u043d\u043e\u0441\u0442\u0438, \u043d\u0430 \u0443\u0440\u043e\u0432\u043d\u0435 50 \u0443 \u0432\u0430\u0441 \u0435\u0441\u0442\u044c [[YELLOW]]{0}%[[GRAY]] \u0448\u0430\u043d\u0441 \u0438\u0437\u0431\u0435\u0436\u0430\u0442\u044c \u0443\u0440\u043e\u043d, \u0438 [[YELLOW]]{1}%[[GRAY]] \u0435\u0441\u043b\u0438 \u0430\u043a\u0442\u0438\u0432\u0438\u0440\u043e\u0432\u0430\u043d\u043e \u0418\u0437\u044f\u0449\u043d\u043e\u0435 \u0441\u043a\u043e\u043b\u044c\u0436\u0435\u043d\u0438\u0435.\n\u0428\u0430\u043d\u0441 \u0443\u0432\u0435\u043b\u0438\u0432\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u043b\u0438\u043d\u0435\u0439\u043d\u043e \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 \u0432\u0430\u0448\u0435\u0433\u043e \u0443\u0440\u043e\u0432\u043d\u044f \u0432\u043f\u043b\u043e\u0442\u044c \u0434\u043e \u0443\u0440\u043e\u0432\u043d\u044f [[YELLOW]]{2}[[GRAY]] \u043a\u043e\u0433\u0434\u0430 \u043e\u043d \u0434\u043e\u0441\u0442\u0438\u0433\u0430\u0435\u0442 \u043c\u0430\u043a\u0441\u0438\u043c\u0443\u043c\u0430, \u043a\u0430\u0436\u0434\u044b\u0439 \u0443\u0440\u043e\u0432\u0435\u043d\u044c \u0410\u043a\u0440\u043e\u0431\u0430\u0442\u0438\u043a\u0438 \u0434\u0430\u0435\u0442 \u0432\u0430\u043c [[YELLOW]]{3}%[[GRAY]] \u0448\u0430\u043d\u0441\u0430 \u0443\u0441\u043f\u0435\u0445\u0430.\n\u0417\u0430\u0436\u0430\u0432 \u043a\u043d\u043e\u043f\u043a\u0443 \u043a\u0440\u0430\u0441\u0442\u044c\u0441\u044f \u0432\u044b \u043c\u043e\u0436\u0435\u0442\u0435 \u0443\u0434\u0432\u043e\u0438\u0442\u044c \u0441\u0432\u043e\u0438 \u0448\u0430\u043d\u0441\u044b \u043d\u0430 \u0438\u0437\u0431\u0435\u0436\u0430\u043d\u0438\u0435 \u0443\u0440\u043e\u043d\u0430 \u043e\u0442 \u043f\u0430\u0434\u0435\u043d\u0438\u044f! \u0417\u0430\u0436\u0430\u0442\u0438\u0435 \u043a\u043d\u043e\u043f\u043a\u0438 \u043a\u0440\u0430\u0441\u0442\u044c\u0441\u044f \u043f\u0435\u0440\u0435\u0432\u0435\u0434\u0435\u0442 \u0432\u0430\u0448\u0443 \u0441\u043f\u0430\u0441\u043e\u0431\u043d\u043e\u0441\u0442\u044c \u0421\u043a\u043e\u043b\u044c\u0436\u0435\u043d\u0438\u0435 \u0441 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u0418\u0437\u044f\u0449\u043d\u043e\u0433\u043e \u0421\u043a\u043e\u043b\u044c\u0436\u0435\u043d\u0438\u044f.\n\u0421\u043a\u043e\u043b\u044c\u0436\u0435\u043d\u0438\u0435 \u043c\u043e\u0436\u0435\u0442 \u043d\u0438\u0432\u0435\u043b\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0432\u043f\u043b\u043e\u0442\u044c \u0434\u043e [[RED]]{4}[[GRAY]] \u0443\u0440\u043e\u043d\u0430. \u0418\u0437\u044f\u0449\u043d\u043e\u0435 \u0441\u043a\u043e\u043b\u044c\u0436\u0435\u043d\u0438\u0435 \u043c\u043e\u0436\u0435\u0442 \u043d\u0438\u0432\u0435\u043b\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0432\u043f\u043b\u043e\u0442\u044c \u0434\u043e [[GREEN]]{5}[[GRAY]] \u0443\u0440\u043e\u043d\u0430. -Acrobatics.SubSkill.GracefulRoll.Name=\u0418\u0437\u044f\u0449\u043d\u043e\u0435 \u0421\u043a\u043e\u043b\u044c\u0436\u0435\u043d\u0438\u0435 -Acrobatics.SubSkill.GracefulRoll.Description=\u042d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u0435\u0435 \u043e\u0431\u044b\u0447\u043d\u043e\u0433\u043e \u0441\u043a\u043e\u043b\u044c\u0436\u0435\u043d\u0438\u044f \u0432 \u0434\u0432\u0430 \u0440\u0430\u0437\u0430. -Acrobatics.SubSkill.Dodge.Name=\u0423\u043a\u043b\u043e\u043d\u0435\u043d\u0438\u0435 -Acrobatics.SubSkill.Dodge.Description=\u0423\u043c\u0435\u043d\u044c\u0448\u0430\u0435\u0442 \u0423\u0440\u043e\u043d \u0432 \u0434\u0432\u0430 \u0440\u0430\u0437\u0430 -Acrobatics.SubSkill.Dodge.Stat=\u0428\u0430\u043d\u0441 \u0443\u043a\u043b\u043e\u043d\u0435\u043d\u0438\u044f -Acrobatics.Listener=\u0410\u043a\u0440\u043e\u0431\u0430\u0442\u0438\u043a\u0430: -Acrobatics.SubSkill.Roll.Chance=\u0428\u0430\u043d\u0441 \u0421\u043a\u043e\u043b\u044c\u0436\u0435\u043d\u0438\u044f: [[YELLOW]]{0} % -Acrobatics.SubSkill.Roll.GraceChance=\u0428\u0430\u043d\u0441 \u0418\u0437\u044f\u0449\u043d\u043e\u0433\u043e \u0421\u043a\u043e\u043b\u044c\u0436\u0435\u043d\u0438\u044f: [[YELLOW]]{0} % -Acrobatics.Roll.Text=**\u0421\u043a\u043e\u043b\u044c\u0436\u0435\u043d\u0438\u0435** -Acrobatics.SkillName=\u0410\u041a\u0420\u041e\u0411\u0410\u0422\u0418\u041a\u0410 -Acrobatics.Skillup=\u0423\u0440\u043e\u0432\u0435\u043d\u044c \u043d\u0430\u0432\u044b\u043a\u0430 \"\u0410\u043a\u0440\u043e\u0431\u0430\u0442\u0438\u043a\u0430\" \u0443\u0432\u0435\u043b\u0438\u0447\u0435\u043d \u043d\u0430 {0}. \u0412\u0441\u0435\u0433\u043e ({1}) -#ALCHEMY -Alchemy.SubSkill.Catalysis.Name=\u041a\u0430\u0442\u0430\u043b\u0438\u0437\u0430\u0442\u043e\u0440 -Alchemy.SubSkill.Catalysis.Description=\u0423\u0432\u0435\u043b\u0438\u0447\u0438\u0432\u0430\u0435\u0442 \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u044c \u043f\u0440\u0438\u0433\u043e\u0442\u043e\u0432\u043b\u0435\u043d\u0438\u044f \u0437\u0435\u043b\u0438\u0439 -Alchemy.SubSkill.Catalysis.Stat=\u0421\u043a\u043e\u0440\u043e\u0441\u0442\u044c \u0433\u043e\u0442\u043e\u0432\u043a\u0438 \u0437\u0435\u043b\u0438\u0439 -Alchemy.SubSkill.Concoctions.Name=\u041e\u0442\u0432\u0430\u0440\u044b -Alchemy.SubSkill.Concoctions.Description=\u0413\u043e\u0442\u043e\u0432\u043a\u0430 \u0437\u0435\u043b\u0438\u0439 \u0438\u0437 \u0431\u043e\u043b\u044c\u0448\u0435\u0433\u043e \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u0430 \u0438\u043d\u0433\u0440\u0438\u0434\u0438\u0435\u043d\u0442\u043e\u0432 -Alchemy.SubSkill.Concoctions.Stat=\u0420\u0430\u043d\u0433 \u043e\u0442\u0432\u0430\u0440\u043e\u0432: [[GREEN]]{0}[[DARK_AQUA]]/[[GREEN]]{1} -Alchemy.SubSkill.Concoctions.Stat.Extra=\u0418\u043d\u0433\u0440\u0438\u0434\u0438\u0435\u043d\u0442\u044b [[[GREEN]]{0}[[DARK_AQUA]]]: [[GREEN]]{1} -Alchemy.Listener=\u0410\u043b\u0445\u0438\u043c\u0438\u044f: -Alchemy.Ability.Locked.0=\u0417\u0410\u0411\u041b\u041e\u041a\u0418\u0420\u041e\u0412\u0410\u041d\u041d\u041e \u0414\u041e {0}+ \u0421\u041f\u041e\u0421\u041e\u0411\u041d\u041e\u0421\u0422\u0418 (\u041a\u0410\u0422\u0410\u041b\u0418\u0417\u0410\u0422\u041e\u0420) -Alchemy.SkillName=\u0410\u041b\u0425\u0418\u041c\u0418\u042f -#ARCHERY -Archery.Combat.DazeChance=\u0428\u0430\u043d\u0441 \u0428\u043e\u043a\u0438\u0440\u043e\u0432\u0430\u0442\u044c: [[YELLOW]]{0} % -Archery.Combat.RetrieveChance=\u0428\u0430\u043d\u0441 \u0418\u0437\u0432\u043b\u0435\u0447\u044c \u0421\u0442\u0440\u0435\u043b\u044b: [[YELLOW]]{0}% -Archery.Combat.SkillshotBonus=\u0414\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u0423\u0440\u043e\u043d \u043f\u0440\u0438 \u0423\u043c\u0435\u043b\u043e\u043c \u0412\u044b\u0441\u0442\u0440\u0435\u043b\u0435: [[YELLOW]]{0} -Archery.SubSkill.SkillShot.Name=\u0423\u043c\u0435\u043b\u044b\u0439 \u0412\u044b\u0441\u0442\u0440\u0435\u043b -Archery.SubSkill.SkillShot.Description=\u0423\u0432\u0435\u043b\u0438\u0447\u0438\u0432\u0430\u0435\u0442 \u0443\u0440\u043e\u043d \u043d\u0430\u043d\u043e\u0441\u0438\u043c\u044b\u0439 \u043b\u0443\u043a\u043e\u043c -Archery.SubSkill.SkillShot.Stat=\u0414\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u0423\u0440\u043e\u043d \u043e\u0442 \u0423\u043c\u0435\u043b\u043e\u0433\u043e \u0412\u044b\u0441\u0442\u0440\u0435\u043b\u0430 -Archery.SubSkill.Daze.Name=\u0428\u043e\u043a\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 (\u0418\u0433\u0440\u043e\u043a\u043e\u0432) -Archery.SubSkill.Daze.Description=\u0414\u0435\u0437\u043e\u0440\u0435\u043d\u0442\u0438\u0440\u0443\u0435\u0442 \u0432\u0440\u0430\u0433\u043e\u0432 \u0438 \u043d\u0430\u043d\u043e\u0441\u0438\u0442 {0} \u0443\u0440\u043e\u043d\u0430 -Archery.SubSkill.Daze.Stat=\u0428\u0430\u043d\u0441 \u0428\u043e\u043a\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f -Archery.SubSkill.ArrowRetrieval.Name=\u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0435\u043d\u0438\u0435 \u0421\u0442\u0440\u0435\u043b -Archery.SubSkill.ArrowRetrieval.Description=\u0428\u0430\u043d\u0441 \u0438\u0437\u0432\u043b\u0435\u0447\u044c \u0441\u0442\u0440\u0435\u043b\u044b \u0438\u0437 \u0442\u0440\u0443\u043f\u043e\u0432 -Archery.SubSkill.ArrowRetrieval.Stat=\u0428\u0430\u043d\u0441 \u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0435\u043d\u0438\u044f \u0421\u0442\u0440\u0435\u043b -Archery.SubSkill.ArcheryLimitBreak.Name=\u0421\u0442\u0435\u0440\u043b\u044c\u0431\u0430 \u041f\u0440\u0435\u0432\u043e\u0441\u0445\u043e\u0434\u043d\u043e -Archery.SubSkill.ArcheryLimitBreak.Description=\u0412\u044b \u043f\u0440\u0435\u043f\u043e\u0441\u0445\u043e\u0434\u0438\u0442\u0435 \u0441\u0432\u043e\u0438 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438. \u0423\u0432\u0435\u043b\u0438\u0447\u0438\u0432\u0430\u0435\u0442 \u0443\u0440\u043e\u043d \u043f\u0440\u043e\u0442\u0438\u0432 \u0441\u043b\u043e\u0436\u043d\u044b\u0445 \u043f\u0440\u043e\u0442\u0438\u0432\u043d\u0438\u043a\u043e\u0432. \u0420\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0432 \u041f\u0412\u041f \u0432 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 \u043e\u0442 \u043d\u0430\u0441\u0442\u0440\u043e\u0435\u043a \u0441\u0435\u0440\u0432\u0435\u0440\u0430, \u043d\u043e \u0432\u0441\u0435\u0433\u0434\u0430 \u0443\u0432\u0435\u043b\u0438\u0447\u0438\u0432\u0430\u0435\u0442 \u0443\u0440\u043e\u043d \u0432 \u041f\u0412\u0415. -Archery.SubSkill.ArcheryLimitBreak.Stat=\u041f\u0440\u0435\u0432\u043e\u0441\u0445\u043e\u0434\u043d\u043e\u0435 \u0412\u043b\u0430\u0434\u0435\u043d\u0438\u0435 \u041c\u0430\u043a\u0441. \u0423\u0440\u043e\u043d -Archery.Listener=\u041b\u0443\u043a\u0438: -Archery.SkillName=\u041b\u0423\u041a\u0418 -Archery.Skillup=\u0423\u0440\u043e\u0432\u0435\u043d\u044c \u043d\u0430\u0432\u044b\u043a\u0430 \"\u041b\u0443\u043a\u0438\" \u0443\u0432\u0435\u043b\u0438\u0447\u0435\u043d \u043d\u0430 {0}. \u0412\u0441\u0435\u0433\u043e ({1}) -#AXES -Axes.Ability.Bonus.0=\u041c\u0430\u0441\u0442\u0435\u0440 \u0422\u043e\u043f\u043e\u0440\u0430 -Axes.Ability.Bonus.1= \u041d\u0430\u043d\u043e\u0441\u0438\u0442 {0} \u0414\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0433\u043e \u0423\u0440\u043e\u043d\u0430 -Axes.Ability.Bonus.2=\u0411\u0440\u043e\u043d\u0435\u0431\u043e\u0439\u043d\u044b\u0439 \u0423\u0434\u0430\u0440 -Axes.Ability.Bonus.3=\u041d\u0430\u043d\u043e\u0441\u0438\u0442 {0} \u0414\u043e\u043f\u043e\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0433\u043e \u0423\u0440\u043e\u043d\u0430 \u0431\u0440\u043e\u043d\u0435 -Axes.Ability.Bonus.4=\u0412\u0435\u043b\u0438\u043a\u0438\u0439 \u0423\u0434\u0430\u0440 -Axes.Ability.Bonus.5=\u041d\u0430\u043d\u043e\u0441\u0438\u0442 {0} \u0414\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0433\u043e \u0423\u0440\u043e\u043d\u0430 \u0431\u0435\u0437\u043e\u0440\u0443\u0436\u043d\u044b\u043c \u0432\u0440\u0430\u0433\u0430\u043c -Axes.Ability.Lower=[[GREEN]]**\u0422\u041e\u041f\u041e\u0420 \u0412 \u041e\u0411\u042b\u0427\u041d\u041e\u041c \u0421\u041e\u0421\u0422\u041e\u042f\u041d\u0418\u0418** -Axes.Ability.Ready=[[GREEN]]**\u0422\u041e\u041f\u041e\u0420 \u0412 \u0421\u041e\u0421\u0422\u041e\u042f\u041d\u0418\u0418 \u0413\u041e\u0422\u041e\u0412\u041d\u041e\u0421\u0422\u0418** -Axes.Combat.CritStruck=[[DARK_RED]]\u0412\u0430\u043c \u043d\u0430\u043d\u0435\u0441\u0435\u043d\u043e \u041a\u0420\u0418\u0422\u0418\u0427\u0415\u0421\u041a\u041e\u0415 \u043f\u043e\u0432\u0440\u0435\u0436\u0434\u0435\u043d\u0438\u0435! -Axes.Combat.CritChance=\u0428\u0430\u043d\u0441 \u043d\u0430\u043d\u0435\u0441\u0442\u0438 \u043a\u0440\u0438\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u0443\u0434\u0430\u0440: [[YELLOW]]{0}% -Axes.Combat.CriticalHit=\u041a\u0420\u0418\u0422\u0418\u0427\u0415\u0421\u041a\u0418\u0419 \u0423\u0414\u0410\u0420! -Axes.Combat.GI.Proc=[[GREEN]]**\u0423\u0414\u0410\u0420 \u0421 \u041e\u0413\u0420\u041e\u041c\u041d\u041e\u0419 \u0421\u0418\u041b\u041e\u0419** -Axes.Combat.GI.Struck=**\u041f\u041e\u0420\u0410\u0416\u0415\u041d \u0412\u0415\u041b\u0418\u041a\u0418\u041c \u0423\u0414\u0410\u0420\u041e\u041c** -Axes.Combat.SS.Struck=[[DARK_RED]]\u041f\u043e\u0440\u0430\u0436\u0435\u043d \u0420\u0410\u0421\u041a\u0410\u041b\u042b\u0412\u0410\u0422\u0415\u041b\u0415\u041c \u0427\u0415\u0420\u0415\u041f\u041e\u0412! -Axes.Combat.SS.Length=\u041f\u0440\u043e\u0434\u043e\u043b\u0436\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u0443\u043c\u0435\u043d\u0438\u044f \"\u0420\u0430\u0441\u043a\u0430\u043b\u044b\u0432\u0430\u0442\u0435\u043b\u044c \u0427\u0435\u0440\u0435\u043f\u043e\u0432\": [[YELLOW]]{0}\u0441. -Axes.SubSkill.SkullSplitter.Name=\u0420\u0430\u0441\u043a\u0430\u043b\u044b\u0432\u0430\u0442\u0435\u043b\u044c \u0427\u0435\u0440\u0435\u043f\u043e\u0432 (\u0423\u043c\u0435\u043d\u0438\u0435) -Axes.SubSkill.SkullSplitter.Description=\u041d\u0430\u043d\u043e\u0441\u0438\u0442 \u0421\u043f\u043b\u044d\u0448 \u0423\u0434\u0430\u0440 -Axes.SubSkill.SkullSplitter.Stat=\u0420\u0430\u0441\u043a\u0430\u043b\u044b\u0432\u0430\u0442\u0435\u043b\u044c \u0427\u0435\u0440\u0435\u043f\u043e\u0432 \u041f\u0440\u043e\u0434\u043e\u043b\u0436\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c -Axes.SubSkill.CriticalStrikes.Name=\u041a\u0440\u0438\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u0423\u0434\u0430\u0440 -Axes.SubSkill.CriticalStrikes.Description=\u0414\u0432\u043e\u0439\u043d\u043e\u0439 \u0423\u0440\u043e\u043d -Axes.SubSkill.CriticalStrikes.Stat=\u041a\u0440\u0438\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u0423\u0434\u0430\u0440 \u0428\u0430\u043d\u0441 -Axes.SubSkill.AxeMastery.Name=\u041c\u0430\u0441\u0442\u0435\u0440 \u0422\u043e\u043f\u043e\u0440\u0430 -Axes.SubSkill.AxeMastery.Description=\u041d\u0430\u043d\u043e\u0441\u0438\u0442 \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u0443\u0440\u043e\u043d -Axes.SubSkill.AxesLimitBreak.Name=\u0422\u043e\u043f\u043e\u0440\u044b \u041f\u0440\u0435\u0432\u043e\u0441\u0445\u043e\u0434\u043d\u043e -Axes.SubSkill.AxesLimitBreak.Description=\u0412\u044b \u043f\u0440\u0435\u043f\u043e\u0441\u0445\u043e\u0434\u0438\u0442\u0435 \u0441\u0432\u043e\u0438 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438. \u0423\u0432\u0435\u043b\u0438\u0447\u0438\u0432\u0430\u0435\u0442 \u0443\u0440\u043e\u043d \u043f\u0440\u043e\u0442\u0438\u0432 \u0441\u043b\u043e\u0436\u043d\u044b\u0445 \u043f\u0440\u043e\u0442\u0438\u0432\u043d\u0438\u043a\u043e\u0432. \u0420\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0432 \u041f\u0412\u041f \u0432 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 \u043e\u0442 \u043d\u0430\u0441\u0442\u0440\u043e\u0435\u043a \u0441\u0435\u0440\u0432\u0435\u0440\u0430, \u043d\u043e \u0432\u0441\u0435\u0433\u0434\u0430 \u0443\u0432\u0435\u043b\u0438\u0447\u0438\u0432\u0430\u0435\u0442 \u0443\u0440\u043e\u043d \u0432 \u041f\u0412\u0415. -Axes.SubSkill.AxesLimitBreak.Stat=\u041f\u0440\u0435\u0432\u043e\u0441\u0445\u043e\u0434\u043d\u043e\u0435 \u0412\u043b\u0430\u0434\u0435\u043d\u0438\u0435 \u041c\u0430\u043a\u0441. \u0423\u0440\u043e\u043d -Axes.SubSkill.ArmorImpact.Name=\u0411\u0440\u043e\u043d\u0435\u0431\u043e\u0439\u043d\u044b\u0439 \u0423\u0434\u0430\u0440 -Axes.SubSkill.ArmorImpact.Description=\u0423\u0434\u0430\u0440 \u0441 \u0442\u0430\u043a\u043e\u0439 \u0441\u0438\u043b\u043e\u0439, \u0447\u0442\u043e \u0440\u0430\u0437\u0440\u0443\u0448\u0430\u0435\u0442 \u0431\u0440\u043e\u043d\u044e -Axes.SubSkill.GreaterImpact.Name=\u0412\u0435\u043b\u0438\u043a\u0438\u0439 \u0423\u0434\u0430\u0440 -Axes.SubSkill.GreaterImpact.Description=\u041d\u0430\u043d\u043e\u0441\u0438\u0442 \u0414\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u0423\u0440\u043e\u043d \u0431\u0435\u0437\u043e\u0440\u0443\u0436\u043d\u044b\u043c \u0432\u0440\u0430\u0433\u0430\u043c -Axes.Listener=\u0422\u043e\u043f\u043e\u0440\u044b: -Axes.SkillName=\u0422\u041e\u041f\u041e\u0420\u042b -Axes.Skills.SS.Off=**\u0423\u043c\u0435\u043d\u0438\u0435 \"\u0420\u0430\u0441\u043a\u0430\u043b\u044b\u0432\u0430\u0442\u0435\u043b\u044c \u0427\u0435\u0440\u0435\u043f\u043e\u0432\" \u043f\u0440\u0435\u043a\u0440\u0430\u0442\u0438\u043b\u043e \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0435** -Axes.Skills.SS.On=[[GREEN]]**\u0423\u043c\u0435\u043d\u0438\u0435 \"\u0420\u0430\u0441\u043a\u0430\u043b\u044b\u0432\u0430\u0442\u0435\u043b\u044c \u0427\u0435\u0440\u0435\u043f\u043e\u0432\" \u0410\u041a\u0422\u0418\u0412\u0418\u0420\u041e\u0412\u0410\u041d\u041e** -Axes.Skills.SS.Refresh=[[GREEN]]\u0412\u0430\u0448\u0435 \u0443\u043c\u0435\u043d\u0438\u0435 [[YELLOW]]\"\u0420\u0430\u0441\u043a\u0430\u043b\u044b\u0432\u0430\u0442\u0435\u043b\u044c\u0427\u0435\u0440\u0435\u043f\u043e\u0432\" [[GREEN]]\u0432\u043e\u0441\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u043e! -Axes.Skills.SS.Other.Off=\u0423\u043c\u0435\u043d\u0438\u0435 \"\u0420\u0430\u0441\u043a\u0430\u043b\u044b\u0432\u0430\u0442\u0435\u043b\u044c \u0427\u0435\u0440\u0435\u043f\u043e\u0432\"[[GREEN]] \u043f\u0440\u0435\u043a\u0440\u0430\u0442\u0438\u043b\u043e \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0435 \u0443 [[YELLOW]]{0} -Axes.Skills.SS.Other.On=[[GREEN]]{0}[[DARK_GREEN]] \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b \u0443\u043c\u0435\u043d\u0438\u0435[[RED]]\"\u0420\u0430\u0441\u043a\u0430\u043b\u044b\u0432\u0430\u0442\u0435\u043b\u044c \u0427\u0435\u0440\u0435\u043f\u043e\u0432\"! -Axes.Skillup=\u0423\u0440\u043e\u0432\u0435\u043d\u044c \u043d\u0430\u0432\u044b\u043a\u0430 \"\u0422\u043e\u043f\u043e\u0440\u044b\" \u0443\u0432\u0435\u043b\u0438\u0447\u0435\u043d \u043d\u0430 {0}. \u0412\u0441\u0435\u0433\u043e ({1}) -#EXCAVATION -Excavation.Ability.Lower=[[GREEN]]**\u041b\u041e\u041f\u0410\u0422\u0410 \u0412 \u041e\u0411\u042b\u0427\u041d\u041e\u041c \u0421\u041e\u0421\u0422\u041e\u042f\u041d\u0418\u0418** -Excavation.Ability.Ready=[[GREEN]]**\u041b\u041e\u041f\u0410\u0422\u0410 \u0412 \u0421\u041e\u0421\u0422\u041e\u042f\u041d\u0418\u0418 \u0413\u041e\u0422\u041e\u0412\u041d\u041e\u0421\u0422\u0418** -Excavation.SubSkill.GigaDrillBreaker.Name=\u041c\u0435\u0433\u0430 \u0411\u0443\u0440 (\u0423\u041c\u0415\u041d\u0418\u0415) -Excavation.SubSkill.GigaDrillBreaker.Description=\u0422\u0440\u043e\u0439\u043d\u043e\u0439 \u0414\u0440\u043e\u043f, \u0422\u0440\u043e\u0439\u043d\u043e\u0439 \u041e\u043f\u044b\u0442, \u0443\u0432\u0435\u043b\u0438\u0447\u0435\u043d\u0430\u044f \u0421\u043a\u043e\u0440\u043e\u0441\u0442\u044c \u0420\u0430\u0441\u043a\u043e\u043f\u043e\u043a -Excavation.SubSkill.GigaDrillBreaker.Stat=\u041c\u0435\u0433\u0430 \u0411\u0443\u0440 \u041f\u0440\u043e\u0434\u043e\u043b\u0436\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c -Excavation.SubSkill.TreasureHunter.Name=\u041e\u0445\u043e\u0442\u043d\u0438\u043a \u0437\u0430 \u0421\u043e\u043a\u0440\u043e\u0432\u0438\u0449\u0430\u043c\u0438 -Excavation.SubSkill.TreasureHunter.Description=\u0412\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0438\u0441\u043a\u0430\u0442\u044c \u0441\u043e\u043a\u0440\u043e\u0432\u0438\u0449\u0430 -Excavation.SubSkill.Archaeology.Name=\u0410\u0440\u0445\u0435\u043e\u043b\u043e\u0433\u0438\u044f -Excavation.SubSkill.Archaeology.Description=\u0420\u0430\u0441\u043a\u0440\u043e\u0439 \u0442\u0430\u0439\u043d\u044b \u0437\u0435\u043b\u0438! \u041f\u043e\u0432\u044b\u0448\u0435\u043d\u0438\u0435 \u0443\u0440\u043e\u0432\u0435\u043d\u044f \u0443\u0432\u0435\u043b\u0438\u0447\u0438\u0432\u0430\u0435\u0442 \u0448\u0430\u043d\u0441\u044b \u043d\u0430\u0439\u0442\u0438 \u0448\u0430\u0440\u044b \u043e\u043f\u044b\u0442\u0430 \u043f\u0440\u0438 \u043d\u0430\u0445\u043e\u0436\u0434\u0435\u043d\u0438\u0438 \u0441\u043e\u043a\u0440\u043e\u0432\u0438\u0449\u0430! -Excavation.SubSkill.Archaeology.Stat=\u0410\u0440\u0445\u0435\u043e\u043b\u043e\u0433\u0438\u044f \u0428\u0430\u043d\u0441 \u0428\u0430\u0440\u0430 \u041e\u043f\u044b\u0442\u0430 -Excavation.SubSkill.Archaeology.Stat.Extra=\u0410\u0440\u0445\u0435\u043e\u043b\u043e\u0433\u0438\u044f \u041a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0428\u0430\u0440\u043e\u0432 \u041e\u043f\u044b\u0442\u0430 -Excavation.Effect.Length=\u041f\u0440\u043e\u0434\u043e\u043b\u0436\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u0443\u043c\u0435\u043d\u0438\u044f \"\u041c\u0435\u0433\u0430 \u0411\u0443\u0440\": [[YELLOW]]{0}\u0441. -Excavation.Listener=\u0420\u0430\u0441\u043a\u043e\u043f\u043a\u0438: -Excavation.SkillName=\u0420\u0430\u0441\u043a\u043e\u043f\u043a\u0438 -Excavation.Skills.GigaDrillBreaker.Off=**\u0423\u043c\u0435\u043d\u0438\u0435 \"\u041c\u0435\u0433\u0430 \u0411\u0443\u0440\" \u043f\u0440\u0435\u043a\u0440\u0430\u0442\u0438\u043b\u043e \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0435** -Excavation.Skills.GigaDrillBreaker.On=[[GREEN]]**\u0423\u043c\u0435\u043d\u0438\u0435 \"\u041c\u0435\u0433\u0430 \u0411\u0443\u0440\" \u0410\u041a\u0422\u0418\u0412\u0418\u0420\u041e\u0412\u0410\u041d\u041e** -Excavation.Skills.GigaDrillBreaker.Refresh=[[GREEN]]\u0412\u0430\u0448\u0435 \u0443\u043c\u0435\u043d\u0438\u0435 [[YELLOW]]\"\u041c\u0435\u0433\u0430 \u0411\u0443\u0440\" [[GREEN]]\u0432\u043e\u0441\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u043e! -Excavation.Skills.GigaDrillBreaker.Other.Off=\u0423\u043c\u0435\u043d\u0438\u0435 \"\u041c\u0435\u0433\u0430 \u0411\u0443\u0440\"[[GREEN]] \u043f\u0440\u0435\u043a\u0440\u0430\u0442\u0438\u043b\u043e \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0435 \u0443 [[YELLOW]]{0} -Excavation.Skills.GigaDrillBreaker.Other.On=[[GREEN]]{0}[[DARK_GREEN]] \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b \u0443\u043c\u0435\u043d\u0438\u0435[[RED]]\"\u041c\u0435\u0433\u0430 \u0411\u0443\u0440\"! -Excavation.Skillup=\u0423\u0440\u043e\u0432\u0435\u043d\u044c \u043d\u0430\u0432\u044b\u043a\u0430 \"\u0420\u0430\u0441\u043a\u043e\u043f\u043a\u0438\" \u0443\u0432\u0435\u043b\u0438\u0447\u0435\u043d \u043d\u0430 {0}. \u0412\u0441\u0435\u0433\u043e ({1}) -#FISHING -Fishing.ScarcityTip=[[YELLOW]]&o\u042d\u0442\u0430 \u0437\u043e\u043d\u0430 \u0441\u0442\u0440\u0430\u0434\u0430\u0435\u0442 \u043f\u0435\u0440\u0435\u0438\u0437\u0431\u044b\u0442\u043a\u043e\u043c \u0440\u044b\u0431\u0430\u043b\u043a\u0438, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0439 \u0443\u0434\u043e\u0447\u043a\u0443 \u0432 \u0434\u0440\u0443\u0433\u043e\u043c \u043c\u0435\u0441\u0442\u0435. \u0425\u043e\u0442\u044f\u0431\u044b \u0434\u0430\u043b\u044c\u0448\u0435 {0} \u0431\u043b\u043e\u043a\u043e\u0432 \u043e\u0442\u0441\u044e\u0434\u0430. -Fishing.Scared=[[GRAY]]&o\u0425\u0430\u043e\u0442\u0438\u0447\u043d\u044b\u0435 \u0434\u0432\u0438\u0436\u0435\u043d\u0438\u044f \u0438\u0441\u043f\u0443\u0433\u0430\u044e\u0442 \u0440\u044b\u0431\u0443! -Fishing.Exhausting=[[RED]]&o\u041d\u0435\u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u043e\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u0443\u0434\u043e\u0447\u043a\u0438 \u0431\u0443\u0434\u0435\u0442 \u0432\u044b\u0437\u044b\u0432\u0430\u0442\u044c \u0443\u0441\u0442\u0430\u043b\u043e\u0441\u0442\u044c \u0438 \u0432\u044b\u043a\u0438\u0434\u044b\u0432\u0430\u043d\u0438\u0435 \u0443\u0434\u043e\u0447\u043a\u0438! -Fishing.LowResourcesTip=[[GRAY]]\u0422\u044b \u0447\u0443\u0432\u0441\u0442\u0432\u0443\u0435\u0448\u044c \u0447\u0442\u043e \u0432 \u044d\u0442\u043e\u0439 \u043e\u0431\u043b\u0430\u0441\u0442\u0438 \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u043c\u0430\u043b\u043e \u0440\u044b\u0431\u044b. \u041f\u043e\u043f\u0440\u043e\u0431\u0443\u0439 \u043f\u043e\u0440\u044b\u0431\u0430\u0447\u0438\u0442\u044c \u0445\u043e\u0442\u044f\u0431\u044b \u0434\u0430\u043b\u044c\u0448\u0435 {0} \u0431\u043b\u043e\u043a\u043e\u0432 \u043e\u0442\u0441\u044e\u0434\u0430. -Fishing.Ability.Chance=\u0428\u0430\u043d\u0441 \u041f\u043e\u043a\u043b\u0435\u0432\u043a\u0438: [[YELLOW]]{0} -Fishing.Ability.Info=\u041e\u0445\u043e\u0442\u043d\u0438\u043a \u0417\u0430 \u041c\u0430\u0433\u0438\u0435\u0439: [[GRAY]] **\u0423\u0441\u043e\u0432\u0435\u0440\u0448\u0435\u043d\u0441\u0442\u0432\u0443\u0435\u0442\u0441\u044f \u0441 \u0440\u0430\u0437\u0432\u0438\u0442\u0438\u0435\u043c \u0440\u0430\u043d\u0433\u0430 \u041e\u0445\u043e\u0442\u043d\u0438\u043a\u0430 \u0437\u0430 \u0421\u043e\u043a\u0440\u043e\u0432\u0438\u0449\u0430\u043c\u0438** -Fishing.Ability.Locked.0=\u0417\u0410\u0411\u041b\u041e\u041a\u0418\u0420\u041e\u0412\u0410\u041d\u041e \u0414\u041e \u0414\u041e\u0421\u0422\u0418\u0416\u0415\u041d\u0418\u042f {0}+ \u0423\u0420\u041e\u0412\u041d\u042f \u041d\u0410\u0412\u042b\u041a\u0410 (\u0412\u0421\u0422\u0420\u042f\u0421\u041a\u0410) -Fishing.Ability.Locked.1=\u0417\u0410\u0411\u041b\u041e\u041a\u0418\u0420\u041e\u0412\u0410\u041d\u041e \u0414\u041e \u0414\u041e\u0421\u0422\u0418\u0416\u0415\u041d\u0418\u042f {0}+ \u0423\u0420\u041e\u0412\u041d\u042f \u041d\u0410\u0412\u042b\u041a\u0410 (\u041f\u041e\u0414\u041b\u0415\u0414\u041d\u0410\u042f \u0420\u042b\u0411\u0410\u041b\u041a\u0410) -Fishing.Ability.Locked.2=\u0417\u0410\u0411\u041b\u041e\u041a\u0418\u0420\u041e\u0412\u0410\u041d\u041e \u0414\u041e \u0414\u041e\u0421\u0422\u0418\u0416\u0415\u041d\u0418\u042f {0}+ \u0423\u0420\u041e\u0412\u041d\u042f \u041d\u0410\u0412\u042b\u041a\u0410 (\u041c\u0410\u0421\u0422\u0415\u0420 \u0420\u042b\u0411\u041e\u041b\u041e\u0412) -Fishing.Ability.Rank=\u0420\u0430\u043d\u0433 \u041e\u0445\u043e\u0442\u043d\u0438\u043a\u0430 \u0437\u0430 \u0421\u043e\u043a\u0440\u043e\u0432\u0438\u0449\u0430\u043c\u0438: [[YELLOW]]{0}/5 -Fishing.Ability.TH.DropRate=\u0428\u0430\u043d\u0441\u044b \u0414\u0440\u043e\u043f\u0430: [[DARK_RED]]\u041b\u043e\u0432\u0443\u0448\u043a\u0430: [[YELLOW]]{0} [[GRAY]]\u041e\u0431\u044b\u0447\u043d\u044b\u0439: [[YELLOW]]{1} [[GREEN]]\u041d\u0435\u043e\u0431\u044b\u0447\u043d\u044b\u0439: [[YELLOW]]{2}\n[[BLUE]]\u0420\u0435\u0434\u043a\u0438\u0439: [[YELLOW]]{3} [[LIGHT_PURPLE]]\u042d\u043f\u0438\u0447\u0435\u0441\u043a\u0438\u0439: [[YELLOW]]{4} [[GOLD]]\u041b\u0435\u0433\u0435\u043d\u0434\u0430\u0440\u043d\u044b\u0439: [[YELLOW]]{5} [[AQUA]]\u041f\u043b\u0430\u0441\u0442\u0438\u043d\u043a\u0430: [[YELLOW]]{6} -Fishing.Ability.TH.MagicRate=\u0428\u0430\u043d\u0441 \u041e\u0445\u043e\u0442\u043d\u0438\u043a\u0430 \u0437\u0430 \u041c\u0430\u0433\u0438\u0435\u0439: [[YELLOW]]{0} -Fishing.Ability.Shake=\u0428\u0430\u043d\u0441 \u0412\u0441\u0442\u0440\u044f\u0441\u043a\u0438: [[YELLOW]]{0}% -Fishing.Ability.IceFishing=\u041f\u043e\u0434\u043b\u0435\u0434\u043d\u0430\u044f \u0420\u044b\u0431\u0430\u043b\u043a\u0430: \u0418\u0434\u0438\u0442\u0435 \u0440\u044b\u0431\u0430\u0447\u0438\u0442\u044c \u043d\u0430 \u043b\u0435\u0434 -Fishing.Ability.FD=\u0420\u044b\u0431\u0430\u0446\u043a\u0430\u044f \u0414\u0438\u0435\u0442\u0430: [[YELLOW]]\u0420\u0430\u043d\u0433 {0} -Fishing.SubSkill.TreasureHunter.Name=\u041e\u0445\u043e\u0442\u043d\u0438\u043a \u0437\u0430 \u0421\u043e\u043a\u0440\u043e\u0432\u0438\u0449\u0430\u043c\u0438 (\u041f\u0430\u0441\u0441\u0438\u0432\u043d\u043e\u0435) -Fishing.SubSkill.TreasureHunter.Description=\u041b\u043e\u0432\u043b\u044f \u0440\u0430\u0437\u043d\u044b\u0445 \u043f\u0440\u0435\u0434\u043c\u0435\u0442\u043e\u0432 -Fishing.SubSkill.TreasureHunter.Stat=\u0420\u0430\u043d\u0433 \u041e\u0445\u043e\u0442\u043d\u0438\u043a\u0430 \u0437\u0430 \u0421\u043e\u043a\u0440\u043e\u0432\u0438\u0449\u0430\u043c\u0438: [[GREEN]]{0}[[DARK_AQUA]]/[[GREEN]]{1} -Fishing.SubSkill.TreasureHunter.Stat.Extra=\u0428\u0430\u043d\u0441 \u0434\u0440\u043e\u043f\u0430: [[GRAY]]\u041e\u0431\u044b\u0447\u043d\u044b\u0439: [[YELLOW]]{0} [[GREEN]]\u041d\u0435\u043e\u0431\u044b\u0447\u043d\u044b\u0439: [[YELLOW]]{1}\n[[BLUE]]\u0420\u0435\u0434\u043a\u0438\u0439: [[YELLOW]]{2} [[LIGHT_PURPLE]]\u042d\u043f\u0438\u0447\u0435\u0441\u043a\u0438\u0439: [[YELLOW]]{3} [[GOLD]]\u041b\u0435\u0433\u0435\u043d\u0434\u0430\u0440\u043d\u044b\u0439: [[YELLOW]]{4} [[AQUA]]\u041f\u043b\u0430\u0441\u0442\u0438\u043d\u043a\u0430: [[YELLOW]]{5} -Fishing.SubSkill.MagicHunter.Name=\u041e\u0445\u043e\u0442\u043d\u0438\u043a \u0417\u0430 \u041c\u0430\u0433\u0438\u0435\u0439 -Fishing.SubSkill.MagicHunter.Description=\u041d\u0430\u0445\u043e\u0434\u043a\u0430 \u0417\u0430\u0447\u0430\u0440\u043e\u0432\u0430\u043d\u044b\u0445 \u041f\u0440\u0435\u0434\u043c\u0435\u0442\u043e\u0432 -Fishing.SubSkill.MagicHunter.Stat=\u041e\u0445\u043e\u0442\u043d\u0438\u043a \u0417\u0430 \u041c\u0430\u0433\u0438\u0435\u0439 \u0428\u0430\u043d\u0441 -Fishing.SubSkill.Shake.Name=\u0412\u0441\u0442\u0440\u044f\u0441\u043a\u0430 (\u0421\u0443\u0449\u0435\u0441\u0442\u0432) -Fishing.SubSkill.Shake.Description=\u0412\u044b\u0442\u0440\u044f\u0445\u0438\u0432\u0430\u0439\u0442\u0435 \u0432\u0435\u0449\u0438 \u0438\u0437 \u043c\u043e\u0431\u043e\u0432 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0443\u0434\u043e\u0447\u043a\u0438 -Fishing.SubSkill.Shake.Stat=\u0412\u0441\u0442\u0440\u044f\u0441\u043a\u0430 \u0428\u0430\u043d\u0441 -Fishing.SubSkill.FishermansDiet.Name=\u0420\u044b\u0431\u0430\u0446\u043a\u0430\u044f \u0414\u0438\u0435\u0442\u0430 -Fishing.SubSkill.FishermansDiet.Description=\u0423\u0432\u0435\u043b\u0438\u0447\u0438\u0432\u0430\u0435\u0442 \u0443\u0442\u043e\u043b\u0435\u043d\u0438\u0435 \u0433\u043e\u043b\u043e\u0434\u0430 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0440\u044b\u0431\u0430\u0446\u043a\u043e\u0439 \u0435\u0434\u044b -Fishing.SubSkill.FishermansDiet.Stat=\u0420\u044b\u0431\u0430\u0446\u043a\u0430\u044f \u0414\u0438\u0435\u0442\u0430:[[GREEN]] \u0420\u0430\u043d\u0433 {0} -Fishing.SubSkill.MasterAngler.Name=\u041c\u0430\u0441\u0442\u0435\u0440 \u0420\u044b\u0431\u043e\u043b\u043e\u0432 -Fishing.SubSkill.MasterAngler.Description=\u0423\u0432\u0435\u043b\u0438\u0447\u0438\u0432\u0430\u0435\u0442 \u0448\u0430\u043d\u0441 \u043f\u043e\u043a\u043b\u0435\u0432\u043a\u0438 \u0432\u043e \u0432\u0440\u0435\u043c\u044f \u0440\u044b\u0431\u0430\u043b\u043a\u0438 -Fishing.SubSkill.MasterAngler.Stat=\u0423\u0432\u0435\u043b\u0438\u0447\u0438\u0432\u0430\u0435\u0442 \u0448\u0430\u043d\u0441 \u043a\u043b\u0435\u0432\u0430 \u0432 \u0442\u0435\u043a\u0443\u0449\u0435\u0439 \u043e\u0431\u0441\u043b\u0430\u0441\u0442\u0438: [[GREEN]]+{0} -Fishing.SubSkill.IceFishing.Name=\u041f\u043e\u0434\u043b\u0435\u0434\u043d\u0430\u044f \u0420\u044b\u0431\u0430\u043b\u043a\u0430 -Fishing.SubSkill.IceFishing.Description=\u041f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0432\u0430\u043c \u0440\u044b\u0431\u0430\u0447\u0438\u0442\u044c \u0432 \u0441\u043d\u0435\u0436\u043d\u044b\u0445 \u0431\u0438\u043e\u043c\u0430\u0445 -Fishing.SubSkill.IceFishing.Stat=\u041f\u043e\u0434\u043b\u0435\u0434\u043d\u0430\u044f \u0420\u044b\u0431\u0430\u043b\u043a\u0430 -Fishing.Chance.Raining=[[BLUE]] \u0411\u043e\u043d\u0443\u0441 \u0414\u043e\u0436\u0434\u044f -Fishing.Listener=\u0420\u044b\u0431\u043e\u043b\u043e\u0432\u0441\u0442\u0432\u043e: -Fishing.Ability.TH.MagicFound=[[GRAY]]\u0422\u044b \u0447\u0443\u0432\u0441\u0442\u0432\u0443\u0435\u0448\u044c \u043f\u0440\u0438\u043a\u043e\u0441\u043d\u043e\u0432\u0435\u043d\u0438\u0435 \u043c\u0430\u0433\u0438\u0438 \u043e\u0442 \u044d\u0442\u043e\u0433\u043e \u0443\u043b\u043e\u0432\u0430... -Fishing.Ability.TH.Boom=[[GRAY]]\u0412\u0420\u0415\u041c\u042f \u0412\u0417\u0420\u042b\u0412\u0410\u0422\u042c!!! -Fishing.Ability.TH.Poison=[[GRAY]]\u0427\u0442\u043e-\u0442\u043e \u0437\u0434\u0435\u0441\u044c \u043d\u0435 \u0442\u0430\u043a... -Fishing.SkillName=\u0420\u042b\u0411\u041e\u041b\u041e\u0412\u0421\u0422\u0412\u041e -Fishing.Skillup=\u0423\u0440\u043e\u0432\u0435\u043d\u044c \u043d\u0430\u0432\u044b\u043a\u0430 \"\u0420\u044b\u0431\u043e\u043b\u043e\u0432\u0441\u0442\u0432\u043e\" \u0443\u0432\u0435\u043b\u0438\u0447\u0435\u043d \u043d\u0430 {0}. \u0412\u0441\u0435\u0433\u043e ({1}) -#HERBALISM -Herbalism.Ability.DoubleDropChance=\u0428\u0430\u043d\u0441 \u0414\u0432\u043e\u0439\u043d\u043e\u0433\u043e \u0414\u0440\u043e\u043f\u0430: [[YELLOW]]{0} % -Herbalism.Ability.FD=\u0424\u0435\u0440\u043c\u0435\u0440\u0441\u043a\u0430\u044f \u0414\u0438\u0435\u0442\u0430: [[YELLOW]]\u0420\u0430\u043d\u0433 {0} -Herbalism.Ability.GTe.Length=\u041f\u0440\u043e\u0434\u043e\u043b\u0436\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u0443\u043c\u0435\u043d\u0438\u044f \"\u041e\u0437\u0435\u043b\u0435\u043d\u0435\u043d\u0438\u0435\": [[YELLOW]]{0}\u0441. -Herbalism.Ability.GTe.NeedMore=\u0412\u0430\u043c \u043d\u0443\u0436\u043d\u043e \u0431\u043e\u043b\u044c\u0448\u0435 \u0441\u0435\u043c\u044f\u043d \u0434\u043b\u044f \u0440\u0430\u0441\u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u041e\u0437\u0435\u043b\u0435\u043d\u0435\u043d\u0438\u044f. -Herbalism.Ability.GTh.Chance=\u0428\u0430\u043d\u0441 \u0416\u0438\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0433\u043e \u041f\u0440\u0438\u043a\u043e\u0441\u043d\u043e\u0432\u0435\u043d\u0438\u044f: [[YELLOW]]{0} -Herbalism.Ability.GTh.Fail=**\u0416\u0418\u0412\u0418\u0422\u0415\u041b\u042c\u041d\u041e\u0415 \u041f\u0420\u0418\u041a\u041e\u0421\u041d\u041e\u0412\u0415\u041d\u0418\u0415 \u041d\u0415 \u0423\u0414\u0410\u041b\u041e\u0421\u042c** -Herbalism.Ability.GTh.Stage=\u0421\u0442\u0430\u0434\u0438\u044f \u0416\u0438\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0433\u043e \u041f\u0440\u0438\u043a\u043e\u0441\u043d\u043e\u0432\u0435\u043d\u0438\u044f: [[YELLOW]] \u0420\u0430\u0441\u0442\u0435\u043d\u0438\u044f \u0440\u0430\u0441\u0442\u0443\u0442 \u043d\u0430 \u0441\u0442\u0430\u0434\u0438\u0438 {0} -Herbalism.Ability.GTh=[[GREEN]]**\u0416\u0418\u0412\u0418\u0422\u0415\u041b\u042c\u041d\u041e\u0415 \u041f\u0420\u0418\u041a\u041e\u0421\u041d\u041e\u0412\u0415\u041d\u0418\u0415** -Herbalism.Ability.HylianLuck=\u0428\u0430\u043d\u0441 \u0425\u0430\u0439\u043b\u0438\u0430\u043d\u0441\u043a\u043e\u0439 \u0423\u0434\u0430\u0447\u0438: [[YELLOW]]{0} -Herbalism.Ability.Lower=[[GREEN]]**\u041c\u041e\u0422\u042b\u0413\u0410 \u0412 \u041e\u0411\u042b\u0427\u041d\u041e\u041c \u0421\u041e\u0421\u0422\u041e\u042f\u041d\u0418\u0418** -Herbalism.Ability.Ready=[[GREEN]]**\u041c\u041e\u0422\u042b\u0413\u0410 \u0412 \u0421\u041e\u0421\u0422\u041e\u042f\u041d\u0418\u0418 \u0413\u041e\u0422\u041e\u0412\u041d\u041e\u0421\u0422\u0418** -Herbalism.Ability.ShroomThumb.Chance=\u0428\u0430\u043d\u0441 \u0413\u0440\u0438\u0431\u043d\u043e\u0433\u043e \u041f\u0440\u0438\u043a\u043e\u0441\u043d\u043e\u0432\u0435\u043d\u0438\u044f: [[YELLOW]]{0} -Herbalism.Ability.ShroomThumb.Fail=**\u0413\u0420\u0418\u0411\u041d\u041e\u0415 \u041f\u0420\u0418\u041a\u041e\u0421\u041d\u041e\u0412\u0415\u041d\u0418\u0415 \u041f\u0420\u041e\u0412\u0410\u041b** -Herbalism.SubSkill.GreenTerra.Name=\u041e\u0437\u0435\u043b\u0435\u043d\u0435\u043d\u0438\u0435 (\u0423\u041c\u0415\u041d\u0418\u0415) -Herbalism.SubSkill.GreenTerra.Description=\u0420\u0430\u0441\u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0435\u043d\u0438\u0435 \u0417\u0435\u043c\u043b\u0438, \u0422\u0440\u043e\u0439\u043d\u043e\u0439 \u0414\u0440\u043e\u043f -Herbalism.SubSkill.GreenTerra.Stat=\u041e\u0437\u0435\u043b\u0435\u043d\u0435\u043d\u0438\u0435 \u0414\u043b\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c -Herbalism.SubSkill.GreenThumb.Name=\u0416\u0438\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0435 \u041f\u0440\u0438\u043a\u043e\u0441\u043d\u043e\u0432\u0435\u043d\u0438\u0435 (\u041f\u0448\u0435\u043d\u0438\u0446\u0430) -Herbalism.SubSkill.GreenThumb.Description=\u0410\u0432\u0442\u043e-\u041f\u043e\u0441\u0430\u0434\u043a\u0430 \u0440\u0430\u0441\u0442\u0435\u043d\u0438\u0439 \u043f\u0440\u0438 \u0443\u0431\u043e\u0440\u043a\u0435 \u0443\u0440\u043e\u0436\u0430\u044f -Herbalism.SubSkill.GreenThumb.Stat=\u0416\u0438\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0435 \u041f\u0440\u0438\u043a\u043e\u0441\u043d\u043e\u0432\u0435\u043d\u0438\u0435 \u0428\u0430\u043d\u0441 -Herbalism.SubSkill.GreenThumb.Stat.Extra=\u0416\u0438\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0435 \u041f\u0440\u0438\u043a\u043e\u0441\u043d\u043e\u0432\u0435\u043d\u0438\u0435 \u042d\u0442\u0430\u043f: [[GREEN]] \u0423\u0440\u043e\u0436\u0430\u0439 \u0432\u044b\u0440\u0430\u0441\u0442\u0430\u0435\u0442 \u043d\u0430 \u0441\u0442\u0430\u0434\u0438\u044e {0} -Herbalism.Effect.4=\u0416\u0438\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0435 \u041f\u0440\u0438\u043a\u043e\u0441\u043d\u043e\u0432\u0435\u043d\u0438\u0435 (\u0411\u043b\u043e\u043a\u0438) -Herbalism.SubSkill.GreenThumb.Description.2=\u0412\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0437\u0430\u043c\u0448\u043b\u044f\u0442\u044c \u043a\u0430\u043c\u0435\u043d\u044c \u0438\u043b\u0438 \u0440\u0430\u0441\u0442\u0438\u0442\u044c \u0442\u0440\u0430\u0432\u0443 -Herbalism.SubSkill.FarmersDiet.Name=\u0424\u0435\u0440\u043c\u0435\u0440\u0441\u043a\u0430\u044f \u0414\u0438\u0435\u0442\u0430 -Herbalism.SubSkill.FarmersDiet.Description=\u0423\u0432\u0435\u043b\u0438\u0447\u0438\u0432\u0430\u0435\u0442 \u0443\u0442\u043e\u043b\u0435\u043d\u0438\u0435 \u0433\u043e\u043b\u043e\u0434\u0430 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0444\u0435\u0440\u043c\u0435\u0440\u0441\u043a\u043e\u0439 \u0435\u0434\u044b -Herbalism.SubSkill.FarmersDiet.Stat=\u0424\u0435\u0440\u043c\u0435\u0440\u0441\u043a\u0430\u044f \u0414\u0438\u0435\u0442\u0430: [[GREEN]]\u0420\u0430\u043d\u0433 {0} -Herbalism.SubSkill.DoubleDrops.Name=\u0414\u0432\u043e\u0439\u043d\u043e\u0439 \u0414\u0440\u043e\u043f (\u0412\u0441\u0435\u0445 \u0420\u0430\u0441\u0442\u0435\u043d\u0438\u0439) -Herbalism.SubSkill.DoubleDrops.Description=\u0423\u0434\u0432\u0430\u0438\u0432\u0430\u0435\u0442 \u043d\u043e\u0440\u043c\u0430\u043b\u044c\u043d\u044b\u0439 \u0434\u043e\u0445\u043e\u0434 -Herbalism.SubSkill.DoubleDrops.Stat=\u0414\u0432\u043e\u0439\u043d\u043e\u0439 \u0414\u0440\u043e\u043f \u0428\u0430\u043d\u0441 -Herbalism.SubSkill.HylianLuck.Name=\u0425\u0430\u0439\u043b\u0438\u0430\u043d\u0441\u043a\u0430\u044f \u0423\u0434\u0430\u0447\u0430 -Herbalism.SubSkill.HylianLuck.Description=\u0414\u0430\u0435\u0442 \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u043e\u0439 \u0448\u0430\u043d\u0441 \u043d\u0430\u0439\u0442\u0438 \u0440\u0435\u0434\u043a\u0438\u0435 \u043f\u0440\u0435\u0434\u043c\u0435\u0442\u044b -Herbalism.SubSkill.HylianLuck.Stat=\u0425\u0430\u0439\u043b\u0438\u0430\u043d\u0441\u043a\u0430\u044f \u0423\u0434\u0430\u0447\u0430 \u0428\u0430\u043d\u0441 -Herbalism.SubSkill.ShroomThumb.Name=\u0413\u0440\u0438\u0431\u043d\u043e\u0435 \u041f\u0440\u0438\u043a\u043e\u0441\u043d\u043e\u0432\u0435\u043d\u0438\u0435 -Herbalism.SubSkill.ShroomThumb.Description=\u0420\u0430\u0441\u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0435\u043d\u0438\u0435 \u043c\u0438\u0446\u0435\u043b\u0438\u044f \u043d\u0430 \u0433\u0440\u044f\u0437\u044c \u0438 \u0442\u0440\u0430\u0432\u0443 -Herbalism.SubSkill.ShroomThumb.Stat=\u0413\u0440\u0438\u0431\u043d\u043e\u0435 \u041f\u0440\u0438\u043a\u043e\u0441\u043d\u043e\u0432\u0435\u043d\u0438\u0435 \u0428\u0430\u043d\u0441 -Herbalism.HylianLuck=[[GREEN]]\u0423\u0434\u0430\u0447\u0430 \u0425\u0430\u0439\u0440\u0443\u043b\u0430 \u0441\u0435\u0433\u043e\u0434\u043d\u044f \u0441 \u0442\u043e\u0431\u043e\u0439! -Herbalism.Listener=\u0422\u0440\u0430\u0432\u043d\u0438\u0447\u0435\u0441\u0442\u0432\u043e: -Herbalism.SkillName=\u0422\u0420\u0410\u0412\u041d\u0418\u0427\u0415\u0421\u0422\u0412\u041e -Herbalism.Skills.GTe.Off=**\u0423\u043c\u0435\u043d\u0438\u0435 \u041e\u0437\u0435\u043b\u0435\u043d\u0435\u043d\u0438\u0435 \u043f\u0440\u0435\u043a\u0440\u0430\u0442\u0438\u043b\u043e \u0434\u0435\u0439\u0441\u0442\u0432\u043e\u0432\u0430\u0442\u044c** -Herbalism.Skills.GTe.On=[[GREEN]]**\u0423\u043c\u0435\u043d\u0438\u0435 \"\u041e\u0437\u0435\u043b\u0435\u043d\u0435\u043d\u0438\u0435\" \u0410\u041a\u0422\u0418\u0412\u0418\u0420\u041e\u0412\u0410\u041d\u041e** -Herbalism.Skills.GTe.Refresh=[[GREEN]]\u0412\u0430\u0448\u0435 \u0443\u043c\u0435\u043d\u0438\u0435 [[YELLOW]]\"\u041e\u0437\u0435\u043b\u0435\u043d\u0435\u043d\u0438\u0435\" [[GREEN]]\u0432\u043e\u0441\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u043e! -Herbalism.Skills.GTe.Other.Off=[[GREEN]] \u0423\u043c\u0435\u043d\u0438\u0435 \"[[RED]]\u041e\u0437\u0435\u043b\u0435\u043d\u0435\u043d\u0438\u0435[[GREEN]] \" \u043f\u0440\u0435\u043a\u0440\u0430\u0442\u0438\u043b\u043e \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0435 \u0443 [[YELLOW]]{0} -Herbalism.Skills.GTe.Other.On=[[GREEN]]{0}[[DARK_GREEN]] \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b \u0443\u043c\u0435\u043d\u0438\u0435 [[RED]] \"\u041e\u0437\u0435\u043b\u0435\u043d\u0435\u043d\u0438\u0435\"! -Herbalism.Skillup=\u0423\u0440\u043e\u0432\u0435\u043d\u044c \u043d\u0430\u0432\u044b\u043a\u0430 \"\u0422\u0440\u0430\u0432\u043d\u0438\u0447\u0435\u0441\u0442\u0432\u043e\" \u0443\u0432\u0435\u043b\u0438\u0447\u0435\u043d \u043d\u0430 {0}. \u0412\u0441\u0435\u0433\u043e ({1}) -#MINING -Mining.Ability.Length=\u041f\u0440\u043e\u0434\u043e\u043b\u0436\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u0443\u043c\u0435\u043d\u0438\u044f \"\u0421\u0443\u043f\u0435\u0440 \u0414\u0440\u043e\u0431\u0438\u043b\u043a\u0430\": [[YELLOW]]{0}\u0441. -Mining.Ability.Locked.0=\u0417\u0410\u0411\u041b\u041e\u041a\u0418\u0420\u041e\u0412\u0410\u041d\u041e \u0414\u041e \u0414\u041e\u0421\u0422\u0418\u0416\u0415\u041d\u0418\u042f {0}+ \u0423\u0420\u041e\u0412\u041d\u042f \u041d\u0410\u0412\u042b\u041a\u0410 (\u041f\u041e\u0414\u0420\u042b\u0412\u041d\u0410\u042f \u0414\u041e\u0411\u042b\u0427\u0410) -Mining.Ability.Locked.1=\u0417\u0410\u0411\u041b\u041e\u041a\u0418\u0420\u041e\u0412\u0410\u041d\u041e \u0414\u041e \u0414\u041e\u0421\u0422\u0418\u0416\u0415\u041d\u0418\u042f {0}+ \u0423\u0420\u041e\u0412\u041d\u042f \u041d\u0410\u0412\u042b\u041a\u0410 (\u0411\u041e\u041b\u042c\u0428\u0418\u0415 \u0411\u041e\u041c\u0411\u042b) -Mining.Ability.Locked.2=\u0417\u0410\u0411\u041b\u041e\u041a\u0418\u0420\u041e\u0412\u0410\u041d\u041e \u0414\u041e \u0414\u041e\u0421\u0422\u0418\u0416\u0415\u041d\u0418\u042f {0}+ \u0423\u0420\u041e\u0412\u041d\u042f \u041d\u0410\u0412\u042b\u041a\u0410 (\u042d\u041a\u0421\u041f\u0415\u0420\u0422 \u0412\u0417\u0420\u042b\u0412\u041e\u0412) -Mining.Ability.Lower=[[GREEN]]**\u041a\u0418\u0420\u041a\u0410 \u0412 \u041e\u0411\u042b\u0427\u041d\u041e\u041c \u0421\u041e\u0421\u0422\u041e\u042f\u041d\u0418\u0418** -Mining.Ability.Ready=[[GREEN]]**\u041a\u0418\u0420\u041a\u0410 \u041f\u041e\u0414\u0413\u041e\u0422\u041e\u0412\u041b\u0415\u041d\u0410** -Mining.SubSkill.SuperBreaker.Name=\u0421\u0443\u043f\u0435\u0440 \u0414\u0440\u043e\u0431\u0438\u043b\u043a\u0430 (\u0423\u041c\u0415\u041d\u0418\u0415) -Mining.SubSkill.SuperBreaker.Description=\u0428\u0430\u043d\u0441 \u0422\u0440\u043e\u0439\u043d\u043e\u0433\u043e \u0414\u0440\u043e\u043f\u0430, \u0443\u0432\u0435\u043b\u0438\u0447\u0435\u043d\u043d\u0430\u044f \u0421\u043a\u043e\u0440\u043e\u0441\u0442\u044c -Mining.SubSkill.SuperBreaker.Stat=\u0421\u0443\u043f\u0435\u0440 \u0414\u0440\u043e\u0431\u0438\u043b\u043a\u0430 \u0414\u043b\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c -Mining.SubSkill.DoubleDrops.Name=\u0414\u0432\u043e\u0439\u043d\u043e\u0439 \u0414\u0440\u043e\u043f -Mining.SubSkill.DoubleDrops.Description=\u0423\u0434\u0432\u0430\u0438\u0432\u0430\u0435\u0442 \u043d\u043e\u0440\u043c\u0430\u043b\u044c\u043d\u044b\u0439 \u0434\u043e\u0445\u043e\u0434 -Mining.SubSkill.DoubleDrops.Stat=\u0414\u0432\u043e\u0439\u043d\u043e\u0439 \u0414\u0440\u043e\u043f \u0428\u0430\u043d\u0441 -Mining.SubSkill.BlastMining.Name=\u041f\u043e\u0434\u0440\u044b\u0432\u043d\u0430\u044f \u0414\u043e\u0431\u044b\u0447\u0430 -Mining.SubSkill.BlastMining.Description=\u0423\u0432\u0435\u043b\u0438\u0447\u0438\u0432\u0430\u0435\u0442 \u0434\u043e\u0431\u044b\u0447\u0443 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0414\u0438\u043d\u0430\u043c\u0438\u0442\u0430 -Mining.SubSkill.BlastMining.Stat=\u041f\u043e\u0434\u0440\u044b\u0432\u043d\u0430\u044f \u0414\u043e\u0431\u044b\u0447\u0430:[[GREEN]] \u0420\u0430\u043d\u0433 {0}/{1} [[GRAY]]({2}) -Mining.SubSkill.BlastMining.Stat.Extra=\u0423\u0432\u0435\u043b\u0438\u0447\u0435\u043d\u0438\u0435 \u0420\u0430\u0434\u0438\u0443\u0441\u0430 \u0412\u0437\u0440\u044b\u0432\u0430: [[GREEN]]+{0} -Mining.SubSkill.BiggerBombs.Name=\u0411\u043e\u043b\u044c\u0448\u0438\u0435 \u0411\u043e\u043c\u0431\u044b -Mining.SubSkill.BiggerBombs.Description=\u0423\u0432\u0435\u043b\u0438\u0447\u0438\u0432\u0430\u0435\u0442 \u0440\u0430\u0434\u0438\u0443\u0441 \u0432\u0437\u0440\u044b\u0432\u0430 \u0414\u0438\u043d\u0430\u043c\u0438\u0442\u0430 -Mining.SubSkill.DemolitionsExpertise.Name=\u042d\u043a\u0441\u043f\u0435\u0440\u0442 \u0412\u0437\u0440\u044b\u0432\u043e\u0432 -Mining.SubSkill.DemolitionsExpertise.Description=\u0423\u043c\u0435\u043d\u044c\u0448\u0430\u0435\u0442 \u0443\u0440\u043e\u043d \u043e\u0442 \u0432\u0437\u0440\u044b\u0432\u0430 \u0414\u0438\u043d\u0430\u043c\u0438\u0442\u0430 -Mining.SubSkill.DemolitionsExpertise.Stat=\u042d\u043a\u0441\u043f\u0435\u0440\u0442 \u0412\u0437\u0440\u044b\u0432\u043e\u0432 \u0423\u043c\u0435\u043d\u044c\u0448\u0438\u0435 \u0423\u0440\u043e\u043d\u0430 -Mining.Effect.Decrease=\u0421\u043d\u0438\u0436\u0435\u043d\u0438\u0435 \u043f\u043e\u0432\u0440\u0435\u0436\u0434\u0435\u043d\u0438\u0439 \u0434\u043b\u044f \u042d\u043a\u0441\u043f\u0435\u0440\u0442 \u0412\u0437\u0440\u044b\u0432\u043e\u0432 \u043d\u0430: [[YELLOW]]{0} -Mining.Effect.DropChance=\u0428\u0430\u043d\u0441 \u0414\u0432\u043e\u0439\u043d\u043e\u0433\u043e \u0414\u0440\u043e\u043f\u0430: [[YELLOW]]{0} % -Mining.Listener=\u0428\u0430\u0445\u0442\u0451\u0440\u0441\u0442\u0432\u043e: -Mining.SkillName=\u0428\u0410\u0425\u0422\u0415\u0420\u0421\u0422\u0412\u041e -Mining.Skills.SuperBreaker.Off=**\u0423\u043c\u0435\u043d\u0438\u0435 \"\u0421\u0443\u043f\u0435\u0440 \u0414\u0440\u043e\u0431\u0438\u043b\u043a\u0430\" \u043f\u0440\u0435\u043a\u0440\u0430\u0442\u0438\u043b\u043e \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0435** -Mining.Skills.SuperBreaker.On=[[GREEN]]**\u0423\u043c\u0435\u043d\u0438\u0435 \"\u0421\u0443\u043f\u0435\u0440 \u0414\u0440\u043e\u0431\u0438\u043b\u043a\u0430\" \u0410\u041a\u0422\u0418\u0412\u0418\u0420\u041e\u0412\u0410\u041d\u041e** -Mining.Skills.SuperBreaker.Other.Off=\u0423\u043c\u0435\u043d\u0438\u0435 \"\u0421\u0443\u043f\u0435\u0440 \u0414\u0440\u043e\u0431\u0438\u043b\u043a\u0430\"[[GREEN]] \u043f\u0440\u0435\u043a\u0440\u0430\u0442\u0438\u043b\u043e \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0435 \u0443 [[YELLOW]]{0} -Mining.Skills.SuperBreaker.Other.On=[[GREEN]]{0}[[DARK_GREEN]] \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b \u0443\u043c\u0435\u043d\u0438\u0435 [[RED]]\"\u0421\u0443\u043f\u0435\u0440 \u0414\u0440\u043e\u0431\u0438\u043b\u043a\u0430\"! -Mining.Skills.SuperBreaker.Refresh=[[GREEN]]\u0412\u0430\u0448\u0430 \u0441\u043f\u043e\u0441\u043e\u0431\u043d\u043e\u0441\u0442\u044c [[YELLOW]]\u041a\u043e\u043f\u0430\u0442\u0435\u043b\u044c [[GREEN]]\u0432\u043e\u0441\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u0430! -Mining.Skillup=\u0423\u0440\u043e\u0432\u0435\u043d\u044c \u043d\u0430\u0432\u044b\u043a\u0430 \"\u0428\u0430\u0445\u0442\u0451\u0440\u0441\u0442\u0432\u043e\" \u0443\u0432\u0435\u043b\u0438\u0447\u0435\u043d \u043d\u0430 {0}. \u0412\u0441\u0435\u0433\u043e ({1}) -#Blast Mining -Mining.Blast.Boom=[[GRAY]]**\u0411\u0423\u041c** -Mining.Blast.Cooldown= -Mining.Blast.Effect=+{0} \u0440\u0443\u0434\u044b, {1}x \u0434\u0440\u043e\u043f -Mining.Blast.Radius.Increase=\u0420\u0430\u0434\u0438\u0443\u0441 \u0412\u0437\u0440\u044b\u0432\u0430 \u0423\u0432\u0435\u043b\u0438\u0447\u0435\u043d: [[YELLOW]]+{0} -Mining.Blast.Rank=\u041f\u043e\u0434\u0440\u044b\u0432\u043d\u0430\u044f \u0414\u043e\u0431\u044b\u0447\u0430: [[YELLOW]] \u0420\u0430\u043d\u0433 {0}/8 [[GRAY]]({1}) -Mining.Blast.Other.On=[[GREEN]]{0}[[DARK_GREEN]] \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b \u0443\u043c\u0435\u043d\u0438\u0435 [[RED]]\"\u041f\u043e\u0434\u0440\u044b\u0432\u043d\u0430\u044f \u0414\u043e\u0431\u044b\u0447\u0430\"! -Mining.Blast.Refresh=[[GREEN]]\u0412\u0430\u0448\u0435 \u0443\u043c\u0435\u043d\u0438\u0435 [[YELLOW]]\"\u041f\u043e\u0434\u0440\u044b\u0432\u043d\u0430\u044f \u0414\u043e\u0431\u044b\u0447\u0430\" [[GREEN]]\u0432\u043e\u0441\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u043e! -#REPAIR -Repair.SubSkill.Repair.Name=\u0420\u0435\u043c\u043e\u043d\u0442 -Repair.SubSkill.Repair.Description=\u0420\u0435\u043c\u043e\u043d\u0442 \u0418\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u043e\u0432 \u0438 \u0411\u0440\u043e\u043d\u0438 -Repair.SubSkill.GoldRepair.Name=\u0420\u0435\u043c\u043e\u043d\u0442 \u0417\u043e\u043b\u043e\u0442\u044b\u0445 \u0432\u0435\u0449\u0435\u0439 ({0}+ \u0443\u0440\u043e\u0432\u0435\u043d\u044c) -Repair.SubSkill.GoldRepair.Description=\u0420\u0435\u043c\u043e\u043d\u0442 \u0417\u043e\u043b\u043e\u0442\u044b\u0445 \u0418\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u043e\u0432 \u0438 \u0411\u0440\u043e\u043d\u0438 -Repair.SubSkill.IronRepair.Name=\u0420\u0435\u043c\u043e\u043d\u0442 \u0416\u0435\u043b\u0435\u0437\u043d\u044b\u0445 \u0432\u0435\u0449\u0435\u0439 ({0}+ \u0443\u0440\u043e\u0432\u0435\u043d\u044c) -Repair.SubSkill.IronRepair.Description=\u0420\u0435\u043c\u043e\u043d\u0442 \u0416\u0435\u043b\u0435\u0437\u043d\u044b\u0445 \u0418\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u043e\u0432 \u0438 \u0411\u0440\u043e\u043d\u0438 -Repair.SubSkill.StoneRepair.Name=\u0420\u0435\u043c\u043e\u043d\u0442 \u041a\u0430\u043c\u0435\u043d\u043d\u044b\u0445 \u0432\u0435\u0449\u0435\u0439 ({0}+ \u0443\u0440\u043e\u0432\u0435\u043d\u044c) -Repair.SubSkill.StoneRepair.Description=\u0420\u0435\u043c\u043e\u043d\u0442 \u041a\u0430\u043c\u0435\u043d\u043d\u044b\u0445 \u0418\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u043e\u0432 -Repair.SubSkill.RepairMastery.Name=\u041c\u0430\u0441\u0442\u0435\u0440 \u0420\u0435\u043c\u043e\u043d\u0442\u0430 -Repair.SubSkill.RepairMastery.Description=\u0423\u0432\u0435\u043b\u0438\u0447\u0438\u0432\u0430\u0435\u0442 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u043e \u0440\u0435\u043c\u043e\u043d\u0442\u0430 -Repair.SubSkill.RepairMastery.Stat=\u041c\u0430\u0441\u0442\u0435\u0440 \u0420\u0435\u043c\u043e\u043d\u0442\u0430: [[GREEN]]\u0414\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0432\u043e\u0441\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u0442 {0} \u043f\u0440\u043e\u0447\u043d\u043e\u0441\u0442\u0438 -Repair.SubSkill.SuperRepair.Name=\u0421\u0443\u043f\u0435\u0440 \u0420\u0435\u043c\u043e\u043d\u0442 -Repair.SubSkill.SuperRepair.Description=\u0414\u0432\u043e\u0439\u043d\u0430\u044f \u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u043e\u0441\u0442\u044c -Repair.SubSkill.SuperRepair.Stat=\u0421\u0443\u043f\u0435\u0440 \u0420\u0435\u043c\u043e\u043d\u0442 \u0428\u0430\u043d\u0441 -Repair.SubSkill.DiamondRepair.Name=\u0420\u0435\u043c\u043e\u043d\u0442 \u0410\u043b\u043c\u0430\u0437\u043d\u044b\u0445 \u0432\u0435\u0449\u0435\u0439 ({0}+ \u0443\u0440\u043e\u0432\u0435\u043d\u044c) -Repair.SubSkill.DiamondRepair.Description=\u0420\u0435\u043c\u043e\u043d\u0442 \u0410\u043b\u043c\u0430\u0437\u043d\u044b\u0445 \u0418\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u043e\u0432 \u0438 \u0411\u0440\u043e\u043d\u0438 -Repair.SubSkill.ArcaneForging.Name=\u0412\u043e\u043b\u0448\u0435\u0431\u043d\u0430\u044f \u041a\u043e\u0432\u043a\u0430 -Repair.SubSkill.ArcaneForging.Description=\u0420\u0435\u043c\u043e\u043d\u0442 \u0432\u043e\u043b\u0448\u0435\u0431\u043d\u044b\u0445 \u0432\u0435\u0449\u0435\u0439 -Repair.SubSkill.ArcaneForging.Stat=\u0412\u043e\u043b\u0448\u0435\u0431\u043d\u0430\u044f \u041a\u043e\u0432\u043a\u0430: [[YELLOW]]\u0420\u0430\u043d\u0433 {0}/{1} -Repair.SubSkill.ArcaneForging.Stat.Extra=[[DARK_AQUA]]\u0412\u043e\u043b\u0448\u0435\u0431\u043d\u0430\u044f \u041a\u043e\u0432\u043a\u0430 \u0428\u0430\u043d\u0441\u044b:[[GRAY]] \u0423\u0441\u043f\u0435\u0445 [[GREEN]]{0}[[GRAY]]%, \u041f\u0440\u043e\u0432\u0430\u043b [[RED]]{1}[[GRAY]]% -Repair.Error=[[DARK_RED]]mcMMO \u043e\u0431\u043d\u0430\u0440\u0443\u0436\u0438\u043b \u043e\u0448\u0438\u0431\u043a\u0443 \u043f\u044b\u0442\u0430\u044f\u0441\u044c \u043f\u043e\u0447\u0438\u043d\u0438\u0442\u044c \u044d\u0442\u043e\u0442 \u043f\u0440\u0435\u0434\u043c\u0435\u0442! -Repair.Listener.Anvil=[[DARK_RED]]\u0412\u044b \u0440\u0430\u0437\u043c\u0435\u0441\u0442\u0438\u043b\u0438 \u043d\u0430\u043a\u043e\u0432\u0430\u043b\u044c\u043d\u044e \u043d\u0430 \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u043c\u043e\u0436\u0435\u0442\u0435 \u0447\u0438\u043d\u0438\u0442\u044c \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u044b \u0438 \u0431\u0440\u043e\u043d\u044e. -Repair.Listener=\u0420\u0435\u043c\u043e\u043d\u0442: -Repair.SkillName=\u0420\u0415\u041c\u041e\u041d\u0422 -Repair.Skills.AdeptDiamond=[[DARK_RED]]\u0412\u044b \u043d\u0435\u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u043e\u043f\u044b\u0442\u043d\u044b, \u0447\u0442\u043e\u0431\u044b \u0447\u0438\u043d\u0438\u0442\u044c \u0430\u043b\u043c\u0430\u0437\u043d\u044b\u0435 \u0432\u0435\u0449\u0438. -Repair.Skills.AdeptGold=[[DARK_RED]]\u0412\u044b \u043d\u0435\u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u043e\u043f\u044b\u0442\u043d\u044b, \u0447\u0442\u043e\u0431\u044b \u0447\u0438\u043d\u0438\u0442\u044c \u0437\u043e\u043b\u043e\u0442\u044b\u0435 \u0432\u0435\u0449\u0438. -Repair.Skills.AdeptIron=[[DARK_RED]]\u0412\u044b \u043d\u0435\u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u043e\u043f\u044b\u0442\u043d\u044b, \u0447\u0442\u043e\u0431\u044b \u0447\u0438\u043d\u0438\u0442\u044c \u0436\u0435\u043b\u0435\u0437\u043d\u044b\u0435 \u0432\u0435\u0449\u0438. -Repair.Skills.AdeptStone=[[DARK_RED]]\u0412\u044b \u043d\u0435\u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u043e\u043f\u044b\u0442\u043d\u044b, \u0447\u0442\u043e\u0431\u044b \u0447\u0438\u043d\u0438\u0442\u044c \u043a\u0430\u043c\u0435\u043d\u043d\u044b\u0435 \u0432\u0435\u0449\u0438. -Repair.Skills.Adept=\u0423 \u0412\u0430\u0441 \u0434\u043e\u043b\u0436\u0435\u043d \u0431\u044b\u0442\u044c \u0443\u0440\u043e\u0432\u0435\u043d\u044c [[YELLOW]]{0}[[RED]], \u0447\u0442\u043e\u0431\u044b \u043e\u0442\u0440\u0435\u043c\u043e\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c [[YELLOW]]{1} -Repair.Skills.FeltEasy=[[GRAY]]\u042d\u0442\u043e \u0431\u044b\u043b\u043e \u043b\u0435\u0433\u043a\u043e. -Repair.Skills.FullDurability=[[GRAY]]\u042d\u0442\u043e \u0443\u0436\u0435 \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u0430\u044f \u043f\u0440\u043e\u0447\u043d\u043e\u0441\u0442\u044c. -Repair.Skills.NotFullDurability=[[DARK_RED]]\u0412\u044b \u043d\u0435 \u043c\u043e\u0436\u0435\u0442\u0435 \u0440\u0430\u0437\u043e\u0431\u0440\u0430\u0442\u044c \u043f\u043e\u0432\u0440\u0435\u0436\u0434\u0435\u043d\u043d\u044b\u0435 \u043f\u0440\u0435\u0434\u043c\u0435\u0442\u044b.. -Repair.Skills.Mastery=\u041c\u0430\u0441\u0442\u0435\u0440 \u0420\u0435\u043c\u043e\u043d\u0442\u0430: [[YELLOW]]\u0414\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0432\u043e\u0441\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u043e {0} \u043f\u0440\u043e\u0447\u043d\u043e\u0441\u0442\u0438 -Repair.Skills.StackedItems=[[DARK_RED]]\u0412\u044b \u043d\u0435 \u043c\u043e\u0436\u0435\u0442\u0435 \u0440\u0435\u043c\u043e\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0432\u0435\u0449\u0438 \u0432 \u0441\u0442\u0430\u043a\u0430\u0445. -Repair.Skills.Super.Chance=\u0428\u0430\u043d\u0441 \u0421\u0443\u043f\u0435\u0440 \u0420\u0435\u043c\u043e\u043d\u0442\u0430: [[YELLOW]]{0} % -Repair.Skillup=\u0423\u0440\u043e\u0432\u0435\u043d\u044c \u043d\u0430\u0432\u044b\u043a\u0430 \"\u0420\u0435\u043c\u043e\u043d\u0442\" \u0443\u0432\u0435\u043b\u0438\u0447\u0435\u043d \u043d\u0430 {0}. \u0412\u0441\u0435\u0433\u043e ({1}) -Repair.Pretty.Name=\u0420\u0435\u043c\u043e\u043d\u0442 -#Arcane Forging -Repair.Arcane.Chance.Downgrade=[[GRAY]]\u0428\u0430\u043d\u0441 \u0443\u0445\u0443\u0434\u0448\u0435\u043d\u0438\u044f \u043f\u0440\u0438 \u0412\u043e\u043b\u0448\u0435\u0431\u043d\u043e\u0439 \u041a\u043e\u0432\u043a\u0435: [[YELLOW]]{0}% -Repair.Arcane.Chance.Success=[[GRAY]]\u0428\u0430\u043d\u0441 \u0443\u0434\u0430\u0447\u043d\u043e\u0439 \"\u0412\u043e\u043b\u0448\u0435\u0431\u043d\u043e\u0439 \u041a\u043e\u0432\u043a\u0438\": [[YELLOW]]{0}% -Repair.Arcane.Downgrade=\u0412\u043e\u043b\u0448\u0435\u0431\u043d\u0430\u044f \u0441\u0438\u043b\u0430 \u044d\u0442\u043e\u0433\u043e \u043f\u0440\u0435\u0434\u043c\u0435\u0442\u0430 \u0443\u043c\u0435\u043d\u044c\u0448\u0430\u0435\u0442\u0441\u044f. -Repair.Arcane.Fail=\u0412\u043e\u043b\u0448\u0435\u0431\u043d\u0430\u044f \u0441\u0438\u043b\u0430 \u043d\u0430\u0432\u0441\u0435\u0433\u0434\u0430 \u043f\u043e\u043a\u0438\u043d\u0443\u043b\u0430 \u043f\u0440\u0435\u0434\u043c\u0435\u0442. -Repair.Arcane.Lost=\u0412\u044b \u043d\u0435 \u0440\u0430\u0437\u0432\u0438\u0442\u044b \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e, \u0447\u0442\u043e\u0431\u044b \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u0442\u044c \u0437\u0430\u0447\u0430\u0440\u043e\u0432\u0430\u043d\u0438\u044f. -Repair.Arcane.Perfect=[[GREEN]]\u0412\u044b \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0430\u043b\u0438 \u0432\u043e\u043b\u0448\u0435\u0431\u043d\u0443\u044e \u0441\u0438\u043b\u0443 \u044d\u0442\u043e\u0433\u043e \u043f\u0440\u0435\u0434\u043c\u0435\u0442\u0430. -Repair.Arcane.Rank=\u0412\u043e\u043b\u0448\u0435\u0431\u043d\u0430\u044f \u041a\u043e\u0432\u043a\u0430: [[YELLOW]]\u0420\u0430\u043d\u0433 {0}/4 -#SALVAGE -Salvage.Pretty.Name=\u041f\u0435\u0440\u0435\u0440\u0430\u0431\u043e\u0442\u043a\u0430 -Salvage.SubSkill.UnderstandingTheArt.Name=\u041f\u043e\u043d\u0438\u043c\u0430\u043d\u0438\u0435 \u0418\u0441\u043a\u0443\u0441\u0441\u0442\u0432\u0430 -Salvage.SubSkill.UnderstandingTheArt.Description=\u0422\u044b \u043d\u0435 \u043f\u0440\u043e\u0441\u0442\u043e \u043a\u043e\u043f\u0430\u0435\u0448\u044c\u0441\u044f \u0432 \u0441\u043e\u0441\u0435\u0434\u0441\u043a\u043e\u043c \u043c\u0443\u0441\u043e\u0440\u0435, \u0442\u044b \u0437\u0430\u0431\u043e\u0442\u0438\u0448\u044c\u0441\u044f \u043e\u0431 \u043e\u043a\u0440\u0443\u0436\u0430\u044e\u0449\u0435\u0439 \u0441\u0440\u0435\u0434\u0435.\n\u0423\u043b\u0443\u0447\u0448\u0430\u0435\u0442 \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u0435 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u041f\u0435\u0440\u0435\u0440\u0430\u0431\u043e\u0442\u043a\u0438. -Salvage.SubSkill.ScrapCollector.Name=\u041a\u043e\u043b\u043b\u0435\u043a\u0446\u0438\u043e\u043d\u0435\u0440 \u0425\u043b\u0430\u043c\u0430 -Salvage.SubSkill.ScrapCollector.Description=\u0420\u0430\u0437\u0431\u0438\u0440\u0430\u0439 \u043f\u0440\u0435\u0434\u043c\u0435\u0442\u044b \u043d\u0430 \u043c\u0430\u0442\u0435\u0440\u0438\u0430\u043b\u044b, \u0432\u0435\u043b\u0438\u043a\u043e\u043b\u0435\u043f\u043d\u0430\u044f \u041f\u0435\u0440\u0435\u0440\u0430\u0431\u043e\u0442\u043a\u0430 \u0437\u0430\u0432\u0438\u0441\u0438\u0442 \u043e\u0442 \u043d\u0430\u0432\u044b\u043a\u0430 \u0438 \u0443\u0434\u0430\u0447\u0438. -Salvage.SubSkill.ScrapCollector.Stat=\u041a\u043e\u043b\u043b\u0435\u043a\u0446\u0438\u043e\u043d\u0435\u0440 \u0425\u043b\u0430\u043c\u0430: [[GREEN]]\u0420\u0430\u0437\u0431\u0435\u0440\u0438 \u0434\u043e [[YELLOW]]{0}[[GREEN]] \u043f\u0440\u0435\u0434\u043c\u0435\u0442\u043e\u0432. \u0422\u0443\u0442 \u043d\u0443\u0436\u043d\u043e \u0431\u044b\u0442\u044c \u0432\u0435\u0437\u0443\u0447\u0438\u043c. -Salvage.SubSkill.ArcaneSalvage.Name=\u041c\u0430\u0433\u0438\u0447\u0435\u0441\u043a\u0430\u044f \u041f\u0435\u0440\u0435\u0440\u0430\u0431\u043e\u0442\u043a\u0430 -Salvage.SubSkill.ArcaneSalvage.Description=\u041f\u043e\u043b\u0443\u0447\u0430\u0439 \u0437\u0430\u0447\u0430\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0438\u0437 \u043f\u0440\u0435\u0434\u043c\u0435\u0442\u043e\u0432 -Salvage.SubSkill.ArcaneSalvage.Stat=\u041c\u0430\u0433\u0438\u0447\u0435\u0441\u043a\u0430\u044f \u041f\u0435\u0440\u0435\u0440\u0430\u0431\u043e\u0442\u043a\u0430: [[YELLOW]]\u0420\u0430\u043d\u0433 {0}/{1} -Salvage.Ability.Bonus.0=\u041a\u043e\u043b\u043b\u0435\u043a\u0446\u0438\u043e\u043d\u0435\u0440 \u0425\u043b\u0430\u043c\u0430 -Salvage.Ability.Bonus.1=\u0420\u0430\u0437\u0431\u0435\u0440\u0438 \u0434\u043e [[YELLOW]]{0}[[GREEN]] \u043f\u0440\u0435\u0434\u043c\u0435\u0442\u043e\u0432. \u0422\u0443\u0442 \u043d\u0443\u0436\u043d\u043e \u0431\u044b\u0442\u044c \u0432\u0435\u0437\u0443\u0447\u0438\u043c. -Salvage.Arcane.ExtractFull=[[GRAY]]\u041f\u043e\u043b\u043d\u043e\u0441\u0442\u044c\u044e-\u0428\u0430\u043d\u0441 \u0427\u0430\u0440 -Salvage.Arcane.ExtractPartial=[[GRAY]]\u0427\u0430\u0441\u0442\u0438\u0447\u043d\u043e-\u0428\u0430\u043d\u0441 \u0427\u0430\u0440 -Salvage.Skills.Success=[[GREEN]]\u041f\u0440\u0435\u0434\u043c\u0435\u0442 \u041f\u0435\u0440\u0435\u0440\u0430\u0431\u043e\u0442\u0430\u043d! -Salvage.Skills.Adept.Damaged=[[DARK_RED]]\u0423 \u0432\u0430\u0441 \u043d\u0435\u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u043e\u043f\u044b\u0442\u0430 \u0447\u0442\u043e\u0431\u044b \u0440\u0430\u0437\u043e\u0431\u0440\u0430\u0442\u044c \u043f\u043e\u0432\u0440\u0435\u0436\u0434\u0435\u043d\u043d\u044b\u0439 \u043f\u0440\u0435\u0434\u043c\u0435\u0442. -Salvage.Skills.Adept.Level=\u0412\u044b \u0434\u043e\u043b\u0436\u043d\u044b \u0431\u044b\u0442\u044c \u0445\u043e\u0442\u044f\u0431\u044b \u0443\u0440\u043e\u0432\u043d\u044f [[YELLOW]]{0}[[RED]] \u0447\u0442\u043e\u0431\u044b \u0440\u0430\u0437\u043e\u0431\u0440\u0430\u0442\u044c [[YELLOW]]{1} -Salvage.Skills.TooDamaged=[[DARK_RED]]\u042d\u0442\u043e\u0442 \u043f\u0440\u0435\u0434\u043c\u0435\u0442 \u0441\u043b\u0438\u0448\u043a\u043e\u043c \u043f\u043e\u0432\u0440\u0435\u0436\u0434\u0435\u043d \u0447\u0442\u043e\u0431\u044b \u0435\u0433\u043e \u0440\u0430\u0437\u043e\u0431\u0440\u0430\u0442\u044c. -Salvage.Skills.ArcaneFailed=[[RED]]\u0423 \u0432\u0430\u0441 \u043d\u0435 \u0432\u044b\u0448\u043b\u043e \u0438\u0437\u0432\u043b\u0435\u0447\u044c \u0437\u043d\u0430\u043d\u0438\u044f, \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0449\u0438\u0435\u0441\u044f \u0432 \u0434\u0430\u043d\u043d\u043e\u043c \u043f\u0440\u0435\u0434\u043c\u0435\u0442\u0435. -Salvage.Skills.ArcanePartial=[[RED]]\u0423 \u0432\u0430\u0441 \u0432\u044b\u0448\u043b\u043e \u0442\u043e\u043b\u044c\u043a\u043e \u0447\u0430\u0441\u0442\u0438\u0447\u043d\u043e \u0438\u0437\u0432\u043b\u0435\u0447\u044c \u0437\u043d\u0430\u043d\u0438\u044f, \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0449\u0438\u0435\u0441\u044f \u0432 \u0434\u0430\u043d\u043d\u043e\u043c \u043f\u0440\u0435\u0434\u043c\u0435\u0442\u0435. -Salvage.Skills.ArcaneSuccess=[[GREEN]]\u0423 \u0432\u0430\u0441 \u0432\u044b\u0448\u043b\u043e \u0438\u0437\u0432\u043b\u0435\u0447\u044c \u0432\u0441\u0435 \u0437\u043d\u0430\u043d\u0438\u044f, \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0449\u0438\u0435\u0441\u044f \u0432 \u0434\u0430\u043d\u043d\u043e\u043c \u043f\u0440\u0435\u0434\u043c\u0435\u0442\u0435! -Salvage.Listener.Anvil=[[DARK_RED]]\u0412\u044b \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u043b\u0438 \u0420\u0430\u0437\u0431\u043e\u0440\u043e\u0447\u043d\u0443\u044e \u043d\u0430\u043a\u043e\u0432\u0430\u043b\u044c\u043d\u044e, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0439\u0442\u0435 \u0435\u0435 \u0434\u043b\u044f \u0440\u0430\u0437\u0431\u043e\u0440\u043a\u0438 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u043e\u0432 \u0438 \u0431\u0440\u043e\u043d\u0438. -Salvage.Listener=\u041f\u0435\u0440\u0435\u0440\u0430\u0431\u043e\u0442\u043a\u0430: -Salvage.SkillName=\u041f\u0415\u0420\u0415\u0420\u0410\u0411\u041e\u0422\u041a\u0410 -Salvage.Skills.Lottery.Normal=[[GOLD]]\u0423 \u0432\u0430\u0441 \u0432\u044b\u0448\u043b\u043e \u0438\u0437\u0432\u043b\u0435\u0447\u044c [[DARK_AQUA]]{0}[[GOLD]] \u0438\u0437 [[YELLOW]]{1}[[GOLD]]. -Salvage.Skills.Lottery.Perfect=[[GREEN]][[BOLD]]\u041f\u0440\u0435\u0432\u043e\u0441\u0445\u043e\u0434\u043d\u043e![[RESET]][[GOLD]] \u0412\u044b \u0440\u0430\u0437\u043e\u0431\u0440\u0430\u043b\u0438 [[DARK_AQUA]]{1}[[GOLD]] \u0431\u0435\u0437 \u043e\u0441\u043e\u0431\u044b \u0443\u0441\u0438\u043b\u0438\u0439 \u0438 \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u0438 [[DARK_AQUA]]{0}[[GOLD]]. -Salvage.Skills.Lottery.Untrained=[[GRAY]]\u0423 \u0432\u0430\u0441 \u043d\u0435\u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u043d\u0430\u0432\u044b\u043a\u043e\u0432 \u0423\u0442\u0438\u043b\u0438\u0437\u0430\u0446\u0438\u0438. \u0423 \u0432\u0430\u0441 \u0432\u044b\u0448\u043b\u043e \u0438\u0437\u0432\u043b\u0435\u0447\u044c \u0442\u043e\u043b\u044c\u043a\u043e [[RED]]{0}[[GRAY]] \u0438\u0437 [[GREEN]]{1}[[GRAY]]. -#Anvil (Shared between SALVAGE and REPAIR) -Anvil.Unbreakable=\u042d\u0442\u043e\u0442 \u043f\u0440\u0435\u0434\u043c\u0435\u0442 \u043d\u0435\u043b\u043e\u043c\u0430\u0435\u043c\u044b\u0439! -#SWORDS -Swords.Ability.Lower=[[GRAY]]**\u041c\u0415\u0427 \u0412 \u041e\u0411\u042b\u0427\u041d\u041e\u041c \u0421\u041e\u0421\u0422\u041e\u042f\u041d\u0418\u0418** -Swords.Ability.Ready=[[DARK_AQUA]]**\u041c\u0415\u0427 \u0412 \u0421\u041e\u0421\u0422\u041e\u042f\u041d\u0418\u0418 \u0413\u041e\u0422\u041e\u0412\u041d\u041e\u0421\u0422\u0418** -Swords.Combat.Rupture.Note=[[GRAY]]\u0417\u0410\u041c\u0415\u0422\u041a\u0410: [[YELLOW]]1 \u0442\u0438\u043a \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u043a\u0430\u0436\u0434\u044b\u0435 0.5 \u0441\u0435\u043a\u0443\u043d\u0434! -Swords.Combat.Bleed.Chance=\u0428\u0430\u043d\u0441 \u043d\u0430\u043d\u0435\u0441\u0442\u0438 \u041a\u0440\u043e\u0432\u043e\u0442\u043e\u0447\u0430\u0449\u0438\u0439 \u0423\u0434\u0430\u0440: [[YELLOW]]{0} -Swords.Combat.Bleed.Length=\u041f\u0440\u043e\u0434\u043e\u043b\u0436\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u041a\u0440\u043e\u0432\u043e\u0442\u0435\u0447\u0435\u043d\u0438\u044f: [[YELLOW]]{0} \u0442\u0438\u043a\u043e\u0432 -Swords.Combat.Bleed.Note=[[GRAY]]\u0417\u0410\u041c\u0415\u0422\u041a\u0410: [[YELLOW]]1 \u0422\u0438\u043a \u0441\u043b\u0443\u0447\u0430\u0435\u0442\u0441\u044f \u043a\u0430\u0436\u0434\u044b\u0435 2 \u0441\u0435\u043a\u0443\u043d\u0434\u044b -Swords.Combat.Bleeding.Started=[[DARK_RED]] \u0412\u044b \u0438\u0441\u0442\u0435\u043a\u0430\u0435\u0442\u0435 \u043a\u0440\u043e\u0432\u044c\u044e! -Swords.Combat.Bleeding.Stopped=[[GRAY]]\u041a\u0440\u043e\u0432\u043e\u0442\u0435\u0447\u0435\u043d\u0438\u0435 [[GREEN]]\u043f\u0440\u0435\u043a\u0440\u0430\u0442\u0438\u043b\u043e\u0441\u044c[[GRAY]]! -Swords.Combat.Bleeding=[[GREEN]]**\u0412\u0420\u0410\u0413 \u0418\u0421\u0422\u0415\u041a\u0410\u0415\u0422 \u041a\u0420\u041e\u0412\u042c\u042e** -Swords.Combat.Counter.Chance=\u0428\u0430\u043d\u0441 \u041a\u043e\u043d\u0442\u0440\u0430\u0442\u0430\u043a\u0438: [[YELLOW]]{0} -Swords.Combat.Counter.Hit=[[DARK_RED]]\u041f\u043e\u0440\u0430\u0436\u0435\u043d \u043a\u043e\u043d\u0442\u0440\u0430\u0442\u0430\u043a\u043e\u0439! -Swords.Combat.Countered=[[GREEN]]**\u041a\u041e\u041d\u0422\u0420\u0410\u0422\u0410\u041a\u0410** -Swords.Combat.SS.Struck=[[DARK_RED]]\u041f\u043e\u0440\u0430\u0436\u0435\u043d \u0420\u0415\u0416\u0423\u0429\u0418\u041c \u0423\u0414\u0410\u0420\u041e\u041c! -Swords.SubSkill.CounterAttack.Name=\u041a\u043e\u043d\u0442\u0440\u0430\u0442\u0430\u043a\u0430 -Swords.SubSkill.CounterAttack.Description=\u041e\u0442\u0440\u0430\u0436\u0435\u043d\u0438\u0435 {0} \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u043d\u043e\u0433\u043e \u0443\u0440\u043e\u043d\u0430 \u043f\u0440\u0438 \u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0438 -Swords.SubSkill.CounterAttack.Stat=\u041a\u043e\u043d\u0442\u0440\u0430\u0442\u0430\u043a\u0430 \u0428\u0430\u043d\u0441 -Swords.SubSkill.SerratedStrikes.Name=\u0420\u0435\u0436\u0443\u0449\u0438\u0439 \u0423\u0434\u0430\u0440 (\u0423\u041c\u0415\u041d\u0418\u0415) -Swords.SubSkill.SerratedStrikes.Description={0} \u0423\u0440\u043e\u043d\u0430 \u043e\u0442 \u0421\u043f\u043b\u044d\u0448 \u0423\u0434\u0430\u0440\u0430, \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0435 \u041a\u0440\u043e\u0432\u043e\u0442\u0435\u0447\u0435\u043d\u0438\u0435 -Swords.SubSkill.SerratedStrikes.Stat=\u0420\u0435\u0436\u0443\u0449\u0438\u0439 \u0423\u0434\u0430\u0440 \u0414\u043b\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c -Swords.SubSkill.Rupture.Name=\u041a\u0440\u043e\u0432\u043e\u0442\u0435\u0447\u0435\u043d\u0438\u0435 -#DoT - Damage Over Time == \u0423\u0432\u0421 - \u0423\u0440\u043e\u043d \u0432 \u0421\u0435\u043a\u0443\u043d\u0434\u0443 -Swords.SubSkill.Rupture.Description=\u041d\u0430\u043a\u043b\u0430\u0434\u044b\u0432\u0430\u0435\u0442 \u0441\u0438\u043b\u044c\u043d\u043e\u0435 \u043a\u0440\u043e\u0432\u043e\u0442\u0435\u0447\u0435\u043d\u0438\u0435 \u0423\u0432\u0421 -Swords.SubSkill.Stab.Name=\u0423\u043a\u043e\u043b -Swords.SubSkill.Stab.Description=\u0414\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u0442 \u0431\u043e\u043d\u0443\u0441\u043d\u044b\u0439 \u0443\u0440\u043e\u043d \u0432\u0430\u0448\u0438\u043c \u0430\u0442\u0430\u043a\u0430\u043c. -Swords.SubSkill.Stab.Stat=\u0423\u0440\u043e\u043d \u0423\u043a\u043e\u043b\u043e\u043c -Swords.SubSkill.SwordsLimitBreak.Name=\u041c\u0435\u0447\u0438 \u041f\u0440\u0435\u0432\u043e\u0441\u0445\u043e\u0434\u043d\u043e -Swords.SubSkill.SwordsLimitBreak.Description=\u0412\u044b \u043f\u0440\u0435\u043f\u043e\u0441\u0445\u043e\u0434\u0438\u0442\u0435 \u0441\u0432\u043e\u0438 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438. \u0423\u0432\u0435\u043b\u0438\u0447\u0438\u0432\u0430\u0435\u0442 \u0443\u0440\u043e\u043d \u043f\u0440\u043e\u0442\u0438\u0432 \u0441\u043b\u043e\u0436\u043d\u044b\u0445 \u043f\u0440\u043e\u0442\u0438\u0432\u043d\u0438\u043a\u043e\u0432. \u0420\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0432 \u041f\u0412\u041f \u0432 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 \u043e\u0442 \u043d\u0430\u0441\u0442\u0440\u043e\u0435\u043a \u0441\u0435\u0440\u0432\u0435\u0440\u0430, \u043d\u043e \u0432\u0441\u0435\u0433\u0434\u0430 \u0443\u0432\u0435\u043b\u0438\u0447\u0438\u0432\u0430\u0435\u0442 \u0443\u0440\u043e\u043d \u0432 \u041f\u0412\u0415. -Swords.SubSkill.SwordsLimitBreak.Stat=\u041f\u0440\u0435\u0432\u043e\u0441\u0445\u043e\u0434\u043d\u043e\u0435 \u0412\u043b\u0430\u0434\u0435\u043d\u0438\u0435 \u041c\u0430\u043a\u0441. \u0423\u0440\u043e\u043d -Swords.SubSkill.Rupture.Stat=\u041a\u0440\u043e\u0432\u043e\u0442\u0435\u0447\u0435\u043d\u0438\u0435 \u0428\u0430\u043d\u0441 -Swords.SubSkill.Rupture.Stat.Extra=\u041a\u0440\u043e\u0432\u043e\u0442\u0435\u0447\u0435\u043d\u0438\u0435: [[GREEN]]{0} \u0442\u0438\u043a\u043e\u0432 [{1} \u0423\u0420\u041e\u041d \u0418\u0413\u0420\u041e\u041a\u0410\u041c] [{2} \u0423\u0420\u041e\u041d \u041c\u041e\u0411\u0410\u041c] -Swords.Effect.4=\u0414\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0435 \u041a\u0440\u043e\u0432\u043e\u0442\u0435\u0447\u0435\u043d\u0438\u0435 \u043f\u0440\u0438 \u0420\u0435\u0436\u0443\u0449\u0435\u043c \u0423\u0434\u0430\u0440\u0435 -Swords.Effect.5={0} \u0422\u0438\u043a\u043e\u0432 \u041a\u0440\u043e\u0432\u043e\u0442\u0435\u0447\u0435\u043d\u0438\u0435 -Swords.SubSkill.Bleed.Name=\u041a\u0440\u043e\u0432\u043e\u0442\u0435\u0447\u0435\u043d\u0438\u0435 -Swords.SubSkill.Bleed.Description=\u0417\u0430\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u0432\u0440\u0430\u0433\u0430 \u043a\u0440\u043e\u0432\u043e\u0442\u043e\u0447\u0438\u0442\u044c -Swords.Listener=\u041c\u0435\u0447\u0438: -Swords.SkillName=\u041c\u0435\u0447\u0438 -Swords.Skills.SS.Off=**\u0423\u043c\u0435\u043d\u0438\u0435 \"\u0420\u0435\u0436\u0443\u0449\u0438\u0439 \u0443\u0434\u0430\u0440\" \u043f\u0440\u0435\u043a\u0440\u0430\u0442\u0438\u043b\u043e \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0435** -Swords.Skills.SS.On=[[GREEN]]**\u0423\u043c\u0435\u043d\u0438\u0435 \"\u0420\u0435\u0436\u0443\u0449\u0438\u0439 \u0443\u0434\u0430\u0440\" \u0430\u043a\u0442\u0438\u0432\u0438\u0440\u043e\u0432\u0430\u043d\u043e** -Swords.Skills.SS.Refresh=[[GREEN]]\u0412\u0430\u0448\u0435 \u0443\u043c\u0435\u043d\u0438\u0435 [[YELLOW]]\"\u0420\u0435\u0436\u0443\u0449\u0438\u0439 \u0423\u0434\u0430\u0440\" [[GREEN]]\u0432\u043e\u0441\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u043e! -Swords.Skills.SS.Other.Off=[[GREEN]]\u0423\u043c\u0435\u043d\u0438\u0435 \"[[RED]]\u0420\u0435\u0436\u0443\u0449\u0438\u0439 \u0443\u0434\u0430\u0440[[GREEN]]\" \u043f\u0440\u0435\u043a\u0440\u0430\u0442\u0438\u043b\u043e \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0435 \u0443 [[YELLOW]]{0} -Swords.Skills.SS.Other.On=[[GREEN]]{0}[[DARK_GREEN]] \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b \u0443\u043c\u0435\u043d\u0438\u0435 [[RED]]\"\u0420\u0435\u0436\u0443\u0449\u0438\u0439 \u0423\u0434\u0430\u0440\"! -Swords.Skillup=\u0423\u0440\u043e\u0432\u0435\u043d\u044c \u043d\u0430\u0432\u044b\u043a\u0430 \"\u041c\u0435\u0447\u0438\" \u0443\u0432\u0435\u043b\u0438\u0447\u0435\u043d \u043d\u0430 {0}. \u0412\u0441\u0435\u0433\u043e ({1}) -Swords.SS.Length=\u041f\u0440\u043e\u0434\u043e\u043b\u0436\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u0443\u043c\u0435\u043d\u0438\u044f \"\u0420\u0435\u0436\u0443\u0449\u0438\u0439 \u0423\u0434\u0430\u0440\": [[YELLOW]]{0}\u0441. -#TAMING -Taming.Ability.Bonus.0=\u0417\u043d\u0430\u043d\u0438\u0435 \u041e\u043a\u0440\u0443\u0436\u0430\u044e\u0449\u0435\u0439 \u0421\u0440\u0435\u0434\u044b -Taming.Ability.Bonus.1=\u0412\u043e\u043b\u043a\u0438 \u0438\u0437\u0431\u0435\u0433\u0430\u044e\u0442 \u043e\u043f\u0430\u0441\u043d\u043e\u0441\u0442\u0438 -Taming.Ability.Bonus.2=\u0413\u0443\u0441\u0442\u043e\u0439 \u041c\u0435\u0445 -Taming.Ability.Bonus.3=1/{0} \u0423\u0440\u043e\u043d\u0430, \u041e\u0433\u043d\u0435\u0441\u0442\u043e\u0439\u043a\u043e\u0441\u0442\u044c -Taming.Ability.Bonus.4=\u041d\u0430\u0434\u0435\u0436\u043d\u0430\u044f \u0417\u0430\u0449\u0438\u0442\u0430 -Taming.Ability.Bonus.5=\u0412\u0437\u0440\u044b\u0432\u044b \u043d\u0430\u043d\u043e\u0441\u044f\u0442 1/{0} \u043d\u043e\u0440\u043c\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u0443\u0440\u043e\u043d\u0430 -Taming.Ability.Bonus.6=\u041e\u0441\u0442\u0440\u044b\u0435 \u041a\u043e\u0433\u0442\u0438 -Taming.Ability.Bonus.7=+{0} \u0423\u0440\u043e\u043d\u0430 -Taming.Ability.Bonus.8=\u0411\u044b\u0441\u0442\u0440\u043e\u0435 \u041f\u0438\u0442\u0430\u043d\u0438\u0435 -Taming.Ability.Bonus.9={0} \u0428\u0430\u043d\u0441 \u0432\u044b\u043b\u0435\u0447\u0438\u0442\u044c\u0441\u044f \u043f\u0440\u0438 \u0430\u0442\u0430\u043a\u0435 -Taming.Ability.Bonus.10=\u0421\u0432\u044f\u0442\u043e\u0439 \u041f\u0435\u0441 -Taming.Ability.Bonus.11=\u0412\u043e\u0441\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0435 \u0437\u0434\u043e\u0440\u043e\u0432\u044c\u044f \u043f\u0440\u0438 \u0443\u0440\u043e\u043d\u0435 \u043c\u0430\u0433\u0438\u0435\u0439 \u0438\u043b\u0438 \u0437\u0435\u043b\u044c\u0435\u043c. -Taming.Ability.Locked.0=\u0417\u0410\u0411\u041b\u041e\u041a\u0418\u0420\u041e\u0412\u0410\u041d\u041e \u0414\u041e \u0414\u041e\u0421\u0422\u0418\u0416\u0415\u041d\u0418\u042f {0}+ \u0423\u0420\u041e\u0412\u041d\u042f \u041d\u0410\u0412\u042b\u041a\u0410 (\u0417\u041d\u0410\u041d\u0418\u0415 \u041e\u041a\u0420\u0423\u0416\u0410\u042e\u0429\u0415\u0419 \u0421\u0420\u0415\u0414\u042b) -Taming.Ability.Locked.1=\u0417\u0410\u0411\u041b\u041e\u041a\u0418\u0420\u041e\u0412\u0410\u041d\u041e \u0414\u041e \u0414\u041e\u0421\u0422\u0418\u0416\u0415\u041d\u0418\u042f {0}+ \u0423\u0420\u041e\u0412\u041d\u042f \u041d\u0410\u0412\u042b\u041a\u0410 (\u0413\u0423\u0421\u0422\u041e\u0419 \u041c\u0415\u0425) -Taming.Ability.Locked.2=\u0417\u0410\u0411\u041b\u041e\u041a\u0418\u0420\u041e\u0412\u0410\u041d\u041e \u0414\u041e \u0414\u041e\u0421\u0422\u0418\u0416\u0415\u041d\u0418\u042f {0}+ \u0423\u0420\u041e\u0412\u041d\u042f \u041d\u0410\u0412\u042b\u041a\u0410 (\u041d\u0410\u0414\u0415\u0416\u041d\u0410\u042f \u0417\u0410\u0429\u0418\u0422\u0410) -Taming.Ability.Locked.3=\u0417\u0410\u0411\u041b\u041e\u041a\u0418\u0420\u041e\u0412\u0410\u041d\u041e \u0414\u041e \u0414\u041e\u0421\u0422\u0418\u0416\u0415\u041d\u0418\u042f {0}+ \u0423\u0420\u041e\u0412\u041d\u042f \u041d\u0410\u0412\u042b\u041a\u0410 (\u041e\u0421\u0422\u0420\u042b\u0415 \u041a\u041e\u0413\u0422\u0418) -Taming.Ability.Locked.4=\u0417\u0410\u0411\u041b\u041e\u041a\u0418\u0420\u041e\u0412\u0410\u041d\u041e \u0414\u041e \u0414\u041e\u0421\u0422\u0418\u0416\u0415\u041d\u0418\u042f {0}+ \u0423\u0420\u041e\u0412\u041d\u042f \u041d\u0410\u0412\u042b\u041a\u0410 (\u0411\u042b\u0421\u0422\u0420\u041e\u0415 \u041f\u0418\u0422\u0410\u041d\u0418\u0415) -Taming.Ability.Locked.5=\u0417\u0410\u0411\u041b\u041e\u041a\u0418\u0420\u041e\u0412\u0410\u041d\u041e \u0414\u041e \u0414\u041e\u0421\u0422\u0418\u0416\u0415\u041d\u0418\u042f {0}+ \u0423\u0420\u041e\u0412\u041d\u042f \u041d\u0410\u0412\u042b\u041a\u0410 (\u0421\u0412\u042f\u0422\u041e\u0419 \u041f\u0415\u0421) -Taming.Combat.Chance.Gore=\u0428\u0430\u043d\u0441 \u0423\u043a\u0443\u0441\u0430 -Taming.SubSkill.BeastLore.Name=\u0417\u043d\u0430\u043d\u0438\u0435 \u0417\u0432\u0435\u0440\u0435\u0439 -Taming.SubSkill.BeastLore.Description=\u0423\u0434\u0430\u0440 \u043a\u043e\u0441\u0442\u044c\u044e \u0434\u043b\u044f \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u0432\u043e\u043b\u043a\u043e\u0432 \u0438 \u043e\u0446\u0435\u043b\u043e\u0442\u043e\u0432 -Taming.SubSkill.ShockProof.Name=\u041d\u0430\u0434\u0435\u0436\u043d\u0430\u044f \u0417\u0430\u0449\u0438\u0442\u0430 -Taming.SubSkill.ShockProof.Description=\u0421\u043d\u0438\u0436\u0435\u043d\u0438\u0435 \u0443\u0440\u043e\u043d\u0430 \u043e\u0442 \u0432\u0437\u0440\u044b\u0432\u043e\u0432 -Taming.SubSkill.CallOfTheWild.Name=\u0417\u043e\u0432 \u041f\u0440\u0435\u0434\u043a\u043e\u0432 -Taming.SubSkill.CallOfTheWild.Description=\u041f\u0440\u0438\u0437\u044b\u0432 \u0436\u0438\u0432\u043e\u0442\u043d\u044b\u0445 \u043d\u0430 \u0441\u0432\u043e\u044e \u0441\u0442\u043e\u0440\u043e\u043d\u0443 -Taming.SubSkill.CallOfTheWild.Description.2=[[GRAY]]COTW (\u041e\u0446\u0435\u043b\u043e\u0442): \u041f\u0440\u0438\u0441\u044f\u0434\u044c\u0442\u0435 \u0438 \u043a\u043b\u0438\u043a\u043d\u0438\u0442\u0435 \u043b\u0435\u0432\u043e\u0439 \u043a\u043d\u043e\u043f\u043a\u043e\u0439 \u043c\u044b\u0448\u0438 \u0441 {0} \u0420\u044b\u0431\u043e\u0439 \u0432 \u0440\u0443\u043a\u0435 -Taming.Effect.15=[[GRAY]]COTW (\u0412\u043e\u043b\u043a): \u041f\u0440\u0438\u0441\u044f\u0434\u044c\u0442\u0435 \u0438 \u043a\u043b\u0438\u043a\u043d\u0438\u0442\u0435 \u043b\u0435\u0432\u043e\u0439 \u043a\u043d\u043e\u043f\u043a\u043e\u0439 \u043c\u044b\u0448\u0438 \u0441 {0} \u041a\u043e\u0441\u0442\u044c\u044e \u0432 \u0440\u0443\u043a\u0435 -Taming.SubSkill.Gore.Name0=[[GRAY]]COTW (\u041b\u043e\u0448\u0430\u0434\u044c): \u041f\u0440\u0438\u0441\u044f\u0434\u044c\u0442\u0435 \u0438 \u043a\u043b\u0438\u043a\u043d\u0438\u0442\u0435 \u041b\u041a\u041c \u0441 {0} \u044f\u0431\u043b\u043e\u043a\u0430\u043c\u0438 \u0432 \u0440\u0443\u043a\u0435. -Taming.SubSkill.FastFoodService.Name=\u0411\u044b\u0441\u0442\u0440\u043e\u0435 \u041f\u0438\u0442\u0430\u043d\u0438\u0435 -Taming.SubSkill.FastFoodService.Description=\u0423 \u0432\u043e\u043b\u043a\u043e\u0432 \u0435\u0441\u0442\u044c \u0448\u0430\u043d\u0441 \u0432\u044b\u043b\u0435\u0447\u0438\u0442\u044c\u0441\u044f \u043f\u0440\u0438 \u0430\u0442\u0430\u043a\u0435 -Taming.SubSkill.HolyHound.Name=\u0421\u0432\u044f\u0442\u043e\u0439 \u041f\u0435\u0441 -Taming.SubSkill.HolyHound.Description=\u0418\u0437\u043b\u0435\u0447\u0435\u043d \u0412\u043e\u043b\u0448\u0435\u0431\u0441\u0442\u0432\u043e\u043c \u0438 \u042f\u0434\u043e\u043c -Taming.SubSkill.Gore.Name=\u0423\u043a\u0443\u0441 -Taming.SubSkill.Gore.Description=\u041a\u0440\u0438\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0423\u0434\u0430\u0440, \u0438\u0437-\u0437\u0430 \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u043d\u0430\u0447\u0438\u043d\u0430\u0435\u0442\u0441\u044f \u041a\u0440\u043e\u0432\u043e\u0442\u0435\u0447\u0435\u043d\u0438\u0435 -Taming.SubSkill.SharpenedClaws.Name=\u041e\u0441\u0442\u0440\u044b\u0435 \u041a\u043e\u0433\u0442\u0438 -Taming.SubSkill.SharpenedClaws.Description=\u0414\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u0423\u0440\u043e\u043d -Taming.SubSkill.EnvironmentallyAware.Name=\u0417\u043d\u0430\u043d\u0438\u0435 \u041e\u043a\u0440\u0443\u0436\u0430\u044e\u0449\u0435\u0439 \u0421\u0440\u0435\u0434\u044b -Taming.SubSkill.EnvironmentallyAware.Description=\u0411\u043e\u044f\u0437\u043d\u044c \u041a\u0430\u043a\u0442\u0443\u0441\u043e\u0432 \u0438 \u041b\u0430\u0432\u044b, \u0418\u043c\u0443\u043d\u0438\u0442\u0435\u0442 \u043a \u0423\u0440\u043e\u043d\u0443 \u043e\u0442 \u041f\u0430\u0434\u0435\u043d\u0438\u044f -Taming.SubSkill.ThickFur.Name=\u0413\u0443\u0441\u0442\u043e\u0439 \u041c\u0435\u0445 -Taming.SubSkill.ThickFur.Description=\u0421\u043d\u0438\u0436\u0435\u043d\u0438\u0435 \u0423\u0440\u043e\u043d\u0430, \u041e\u0433\u043d\u0435\u0441\u0442\u043e\u0439\u043a\u043e\u0441\u0442\u044c -Taming.SubSkill.Pummel.Name=\u041e\u0442\u0442\u0430\u043b\u043a\u0438\u0432\u0430\u043d\u0438\u0435 -Taming.SubSkill.Pummel.Description=\u0412\u0430\u0448\u0438 \u0412\u043e\u043b\u043a\u0438 \u0438\u043c\u0435\u044e\u0442 \u0448\u0430\u043d\u0441 \u043e\u0442\u0442\u043e\u043b\u043a\u043d\u0443\u0442\u044c \u0432\u0440\u0430\u0433\u043e\u0432 -Taming.SubSkill.Pummel.TargetMessage=\u0412\u0430\u0441 \u043e\u0442\u0442\u043e\u043b\u043a\u043d\u0443\u043b \u0432\u043e\u043b\u043a! -Taming.Listener.Wolf=[[DARK_GRAY]]\u0412\u0430\u0448 \u0432\u043e\u043b\u043a \u0445\u043e\u0447\u0435\u0442 \u0432\u0435\u0440\u043d\u0443\u0442\u0441\u044f \u043a \u0412\u0430\u043c... -Taming.Listener=\u0423\u043a\u0440\u043e\u0449\u0435\u043d\u0438\u0435: -Taming.SkillName=\u0423\u041a\u0420\u041e\u0429\u0415\u041d\u0418\u0415 -Taming.Skillup=\u0423\u0440\u043e\u0432\u0435\u043d\u044c \u043d\u0430\u0432\u044b\u043a\u0430 \"\u0423\u043a\u0440\u043e\u0449\u0435\u043d\u0438\u0435\" \u0443\u0432\u0435\u043b\u0438\u0447\u0435\u043d \u043d\u0430 {0}. \u0412\u0441\u0435\u0433\u043e ({1}) -Taming.Summon.Complete=[[GREEN]]\u0412\u044b\u0437\u043e\u0432 \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d -Taming.Summon.Fail.Ocelot=\u0412\u043e\u043a\u0440\u0443\u0433 \u0412\u0430\u0441 \u0441\u043b\u0438\u0448\u043a\u043e\u043c \u043c\u043d\u043e\u0433\u043e \u043e\u0446\u0435\u043b\u043e\u0442\u043e\u0432. -Taming.Summon.Fail.Wolf=\u0412\u043e\u043a\u0440\u0443\u0433 \u0412\u0430\u0441 \u0441\u043b\u0438\u0448\u043a\u043e\u043c \u043c\u043d\u043e\u0433\u043e \u0432\u043e\u043b\u043a\u043e\u0432, \u0447\u0442\u043e\u0431\u044b \u043f\u0440\u0438\u0437\u0432\u0430\u0442\u044c \u0435\u0449\u0435. -Taming.Summon.Fail.Horse=\u0412\u043e\u043a\u0440\u0443\u0433 \u0432\u0430\u0441 \u0441\u043b\u0438\u0448\u043a\u043e\u043c \u043c\u043d\u043e\u0433\u043e \u043b\u043e\u0448\u0430\u0434\u0435\u0439 \u0447\u0442\u043e\u0431\u044b \u043f\u0440\u0438\u0437\u0432\u0430\u0442\u044c \u0435\u0449\u0435. -Taming.Summon.Name.Format={0}s {1} -Taming.Summon.COTW.Success.WithoutLifespan=[[GREEN]](\u0417\u043e\u0432 \u041f\u0440\u0435\u0434\u043a\u043e\u0432) [[GRAY]]\u0412\u044b \u043f\u0440\u0438\u0437\u0432\u0430\u043b\u0438 [[GOLD]]{0}[[GRAY]] -Taming.Summon.COTW.Success.WithLifespan=[[GREEN]](\u0417\u043e\u0432 \u041f\u0440\u0435\u0434\u043a\u043e\u0432) [[GRAY]]\u0412\u044b \u043f\u0440\u0438\u0437\u0432\u0430\u043b\u0438 [[GOLD]]{0}[[GRAY]] \u043d\u0430 [[GOLD]]{1}[[GRAY]] \u0441\u0435\u043a. -Taming.Summon.COTW.Limit=[[GREEN]](\u0417\u043e\u0432 \u041f\u0440\u0435\u0434\u043a\u043e\u0432) [[GRAY]]\u0412\u044b \u043c\u043e\u0436\u0435\u0442\u0435 \u0438\u043c\u0435\u0442\u044c \u0442\u043e\u043b\u044c\u043a\u043e [[RED]]{0} [[GRAY]]\u043f\u0440\u0438\u0437\u0432\u0430\u043d\u043d\u044b\u0445 [[GRAY]]{1} \u0436\u0438\u0432\u043e\u0442\u043d\u044b\u0445 \u043e\u0434\u043d\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e. -Taming.Summon.COTW.TimeExpired=[[GREEN]](\u0417\u043e\u0432 \u041f\u0440\u0435\u0434\u043a\u043e\u0432) [[GRAY]]\u0412\u0440\u0435\u043c\u044f \u0432\u044b\u0448\u043b\u043e, \u0432\u0430\u0448\u0438 [[GOLD]]{0}[[GRAY]] \u043e\u0442\u0441\u0442\u0443\u043f\u0430\u044e\u0442. -Taming.Summon.COTW.BreedingDisallowed=[[GREEN]](\u0417\u043e\u0432 \u041f\u0440\u0435\u0434\u043a\u043e\u0432) [[RED]]\u0412\u044b \u043d\u0435 \u043c\u043e\u0436\u0435\u0442\u0435 \u0440\u0430\u0437\u0432\u043e\u0434\u0438\u0442\u044c \u043f\u0440\u0438\u0437\u0432\u0430\u043d\u043d\u044b\u0445 \u0436\u0438\u0432\u043e\u0442\u043d\u044b\u0445. -Taming.Summon.COTW.NeedMoreItems=[[GREEN]](\u0417\u043e\u0432 \u041f\u0440\u0435\u0434\u043a\u043e\u0432) [[GRAY]]\u0412\u043e\u043c \u043d\u0443\u0436\u043d\u043e \u043d\u0430 [[YELLOW]]{0}[[GRAY]] \u0431\u043e\u043b\u044c\u0448\u0435 [[DARK_AQUA]]{1}[[GRAY]] -Taming.Summon.Name.Format=[[GOLD]](\u0417\u043e\u0432 \u041f\u0440\u0435\u0434\u043a\u043e\u0432) [[WHITE]]{0} {1} -#UNARMED -Unarmed.Ability.Berserk.Length=\u041f\u0440\u043e\u0434\u043e\u043b\u0436\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u0443\u043c\u0435\u043d\u0438\u044f \"\u0411\u0435\u0440\u0441\u0435\u0440\u043a\": [[YELLOW]]{0}\u0441. -Unarmed.Ability.Bonus.0=\u0421\u0442\u0438\u043b\u044c \"\u0416\u0435\u043b\u0435\u0437\u043d\u044b\u0439 \u041a\u0443\u043b\u0430\u043a\" -Unarmed.Ability.Bonus.1=\u0423\u0432\u0435\u043b\u0438\u0447\u0435\u043d\u0438\u0435 \u0423\u0440\u043e\u043d\u0430 \u043d\u0430 {0} -Unarmed.Ability.Chance.ArrowDeflect=\u0428\u0430\u043d\u0441 \u041e\u0442\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u0421\u0442\u0440\u0435\u043b: [[YELLOW]]{0} -Unarmed.Ability.Chance.Disarm=\u0428\u0430\u043d\u0441 \u0420\u0430\u0437\u043e\u0440\u0443\u0436\u0438\u0442\u044c: [[YELLOW]]{0} -Unarmed.Ability.Chance.IronGrip=\u0428\u0430\u043d\u0441 \u0416\u0435\u043b\u0435\u0437\u043d\u043e\u0439 \u0425\u0432\u0430\u0442\u043a\u0438: [[YELLOW]{0} -Unarmed.Ability.IronGrip.Attacker=\u0423 \u0432\u0430\u0448\u0435\u0433\u043e \u043e\u043f\u043f\u043e\u043d\u0435\u043d\u0442\u0430 \u0436\u0435\u043b\u0435\u0437\u043d\u0430\u044f \u0445\u0432\u0430\u0442\u043a\u0430! -Unarmed.Ability.IronGrip.Defender=[[GREEN]]\u0412\u0430\u0448\u0430 \u0436\u0435\u043b\u0435\u0437\u043d\u0430\u044f \u0445\u0432\u0430\u0442\u043a\u0430 \u043f\u0440\u0435\u0434\u043e\u0442\u0432\u0440\u0430\u0442\u0438\u043b\u0430 \u0440\u0430\u0437\u043e\u0440\u0443\u0436\u0435\u043d\u0438\u0435! -Unarmed.Ability.Lower=[[GRAY]]**\u041a\u0423\u041b\u0410\u041a\u0418 \u0412 \u041e\u0411\u042b\u0427\u041d\u041e\u041c \u0421\u041e\u0421\u0422\u041e\u042f\u041d\u0418\u0418** -Unarmed.Ability.Ready=[[DARK_AQUA]]**\u041a\u0423\u041b\u0410\u041a\u0418 \u0412 \u0421\u041e\u0421\u0422\u041e\u042f\u041d\u0418\u0418 \u0413\u041e\u0422\u041e\u0412\u041d\u041e\u0421\u0422\u0418** -Unarmed.SubSkill.Berserk.Name=\u0411\u0435\u0440\u0441\u0435\u0440\u043a (\u0423\u041c\u0415\u041d\u0418\u0415) -Unarmed.SubSkill.Berserk.Description=+50% \u043a \u0423\u0440\u043e\u043d\u0443, \u0420\u0430\u0437\u0440\u0443\u0448\u0435\u043d\u0438\u0435 \u043c\u044f\u0433\u043a\u0438\u0445 \u043c\u0430\u0442\u0435\u0440\u0438\u0430\u043b\u043e\u0432 -Unarmed.SubSkill.Berserk.Stat=\u0411\u0435\u0440\u0441\u0435\u0440\u043a \u0414\u043b\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c -Unarmed.SubSkill.Disarm.Name=\u0420\u0430\u0437\u043e\u0440\u0443\u0436\u0435\u043d\u0438\u0435 (\u0418\u0433\u0440\u043e\u043a\u043e\u0432) -Unarmed.SubSkill.Disarm.Description=\u0412\u044b\u0431\u0438\u0432\u0430\u0435\u0442 \u043f\u0440\u0435\u0434\u043c\u0435\u0442 \u0438\u0437 \u0440\u0443\u043a \u0432\u0440\u0430\u0433\u0430 -Unarmed.SubSkill.Disarm.Stat=\u0420\u0430\u0437\u043e\u0440\u0443\u0436\u0435\u043d\u0438\u0435 \u0428\u0430\u043d\u0441 -Unarmed.SubSkill.UnarmedLimitBreak.Name=\u041f\u0440\u0435\u0432\u043e\u0441\u0445\u043e\u0434\u043d\u0430\u044f \u0441\u0430\u043c\u043e\u0437\u0430\u0449\u0438\u0442\u0430 -Unarmed.SubSkill.UnarmedLimitBreak.Description=\u0412\u044b \u043f\u0440\u0435\u043f\u043e\u0441\u0445\u043e\u0434\u0438\u0442\u0435 \u0441\u0432\u043e\u0438 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438. \u0423\u0432\u0435\u043b\u0438\u0447\u0438\u0432\u0430\u0435\u0442 \u0443\u0440\u043e\u043d \u043f\u0440\u043e\u0442\u0438\u0432 \u0441\u043b\u043e\u0436\u043d\u044b\u0445 \u043f\u0440\u043e\u0442\u0438\u0432\u043d\u0438\u043a\u043e\u0432. \u0420\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0432 \u041f\u0412\u041f \u0432 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 \u043e\u0442 \u043d\u0430\u0441\u0442\u0440\u043e\u0435\u043a \u0441\u0435\u0440\u0432\u0435\u0440\u0430, \u043d\u043e \u0432\u0441\u0435\u0433\u0434\u0430 \u0443\u0432\u0435\u043b\u0438\u0447\u0438\u0432\u0430\u0435\u0442 \u0443\u0440\u043e\u043d \u0432 \u041f\u0412\u0415. -Unarmed.SubSkill.UnarmedLimitBreak.Stat=\u041f\u0440\u0435\u0432\u043e\u0441\u043e\u0434\u043d\u043e\u0435 \u0432\u043b\u0430\u0434\u043d\u0438\u0435 \u041c\u0430\u043a\u0441. \u0423\u0440\u043e\u043d -Unarmed.SubSkill.IronArmStyle.Name=\u0421\u0442\u0438\u043b\u044c \"\u0416\u0435\u043b\u0435\u0437\u043d\u044b\u0439 \u041a\u0443\u043b\u0430\u043a\" -Unarmed.SubSkill.IronArmStyle.Description=\u0421\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u0435\u043c \u0443\u043a\u0440\u0435\u043f\u043b\u044f\u0435\u0442 \u0412\u0430\u0448\u0438 \u0440\u0443\u043a\u0438 -Unarmed.SubSkill.ArrowDeflect.Name=\u041e\u0442\u0440\u0430\u0436\u0435\u043d\u0438\u0435 \u0421\u0442\u0440\u0435\u043b -Unarmed.SubSkill.ArrowDeflect.Description=\u041e\u0442\u0440\u0430\u0436\u0435\u043d\u0438\u0435 \u0441\u0442\u0440\u0435\u043b -Unarmed.SubSkill.ArrowDeflect.Stat=\u041e\u0442\u0440\u0430\u0436\u0435\u043d\u0438\u0435 \u0421\u0442\u0440\u0435\u043b \u0428\u0430\u043d\u0441 -Unarmed.SubSkill.IronGrip.Name=\u0416\u0435\u043b\u0435\u0437\u043d\u0430\u044f \u0425\u0432\u0430\u0442\u043a\u0430 -Unarmed.SubSkill.IronGrip.Description=\u041f\u0440\u0435\u043f\u044f\u0442\u0441\u0442\u0432\u0443\u0435\u0442 \u0440\u0430\u0437\u043e\u0440\u0443\u0436\u0435\u043d\u0438\u044e \u0432\u0430\u0441 \u043f\u0440\u043e\u0442\u0438\u0432\u043d\u0438\u043a\u043e\u043c -Unarmed.SubSkill.IronGrip.Stat=\u0416\u0435\u043b\u0435\u0437\u043d\u0430\u044f \u0425\u0432\u0430\u0442\u043a\u0430 \u0428\u0430\u043d\u0441 -Unarmed.Listener=\u0411\u0435\u0437\u043e\u0440\u0443\u0436\u043d\u044b\u0439: -Unarmed.SkillName=\u0411\u0415\u0417\u041e\u0420\u0423\u0416\u041d\u042b\u0419 -Unarmed.Skills.Berserk.Off=**\u0423\u043c\u0435\u043d\u0438\u0435 \"\u0411\u0435\u0440\u0441\u0435\u0440\u043a\" \u043f\u0440\u0435\u043a\u0440\u0430\u0442\u0438\u043b\u043e \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0435** -Unarmed.Skills.Berserk.On=[[GREEN]]**\u0423\u043c\u0435\u043d\u0438\u0435 \"\u0411\u0435\u0440\u0441\u0435\u0440\u043a\" \u0410\u041a\u0422\u0418\u0412\u0418\u0420\u041e\u0412\u0410\u041d\u041e** -Unarmed.Skills.Berserk.Other.Off=[[GREEN]]\u0423\u043c\u0435\u043d\u0438\u0435 \"[[RED]]\u0411\u0435\u0440\u0441\u0435\u0440\u043a[[GREEN]]\" \u043f\u0440\u0435\u043a\u0440\u0430\u0442\u0438\u043b\u043e \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0435 \u0443 [[YELLOW]]{0} -Unarmed.Skills.Berserk.Other.On=[[GREEN]]{0}[[DARK_GREEN]] \u0432\u043a\u043b\u044e\u0447\u0438\u043b [[RED]]\u0443\u043c\u0435\u043d\u0438\u0435 \"\u0411\u0435\u0440\u0441\u0435\u0440\u043a\"! -Unarmed.Skills.Berserk.Refresh=[[GREEN]]\u0412\u0430\u0448\u0435 \u0443\u043c\u0435\u043d\u0438\u0435 [[YELLOW]]\"\u0411\u0435\u0440\u0441\u0435\u0440\u043a\" [[GREEN]]\u0432\u043e\u0441\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u043e! -Unarmed.Skillup=\u0423\u0440\u043e\u0432\u0435\u043d\u044c \u043d\u0430\u0432\u044b\u043a\u0430 \"\u0411\u0435\u0437\u043e\u0440\u0443\u0436\u043d\u044b\u0439\" \u0443\u0432\u0435\u043b\u0438\u0447\u0435\u043d \u043d\u0430 {0}. \u0412\u0441\u0435\u0433\u043e ({1}) -#WOODCUTTING -Woodcutting.Ability.0=\u0421\u0434\u0443\u0432\u0430\u0442\u0435\u043b\u044c \u041b\u0438\u0441\u0442\u044c\u0435\u0432 -Woodcutting.Ability.1=\u0421\u0434\u0443\u0432\u0430\u0439\u0442\u0435 \u043b\u0438\u0441\u0442\u044c\u044f \u043f\u0440\u043e\u0447\u044c! -Woodcutting.Ability.Chance.DDrop=\u0428\u0430\u043d\u0441 \u0414\u0432\u043e\u0439\u043d\u043e\u0433\u043e \u0414\u0440\u043e\u043f\u0430: [[YELLOW]]{0} -Woodcutting.Ability.Length=\u041f\u0440\u043e\u0434\u043e\u043b\u0436\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u0443\u043c\u0435\u043d\u0438\u044f \"\u041b\u0435\u0441\u043e\u0440\u0443\u0431\": [[YELLOW]]{0}\u0441. -Woodcutting.Ability.Locked.0=\u0417\u0410\u0411\u041b\u041e\u041a\u0418\u0420\u041e\u0412\u0410\u041d\u041e \u0414\u041e \u0414\u041e\u0421\u0422\u0418\u0416\u0415\u041d\u0418\u042f {0}+ \u0423\u0420\u041e\u0412\u041d\u042f \u041d\u0410\u0412\u042b\u041a\u0410 (\u0421\u0414\u0423\u0412\u0410\u0422\u0415\u041b\u042c \u041b\u0418\u0421\u0422\u042c\u0415\u0412) -Woodcutting.SubSkill.TreeFeller.Name=\u041b\u0435\u0441\u043e\u0440\u0443\u0431 (\u0423\u041c\u0415\u041d\u0418\u0415) -Woodcutting.SubSkill.TreeFeller.Description=\u0412\u0437\u0440\u044b\u0432\u0430\u0435\u0442 \u0434\u0435\u0440\u0435\u0432\u044c\u044f -Woodcutting.SubSkill.TreeFeller.Stat=\u041b\u0435\u0441\u043e\u0440\u0443\u0431 \u0414\u043b\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c -Woodcutting.SubSkill.LeafBlower.Name=\u0421\u0434\u0443\u0432\u0430\u0442\u0435\u043b\u044c \u041b\u0438\u0441\u0442\u044c\u0435\u0432 -Woodcutting.SubSkill.LeafBlower.Description=\u0421\u0434\u0443\u0432\u0430\u0442\u044c \u043b\u0438\u0441\u0442\u044c\u044f -Woodcutting.SubSkill.HarvestLumber.Name=\u0414\u0432\u043e\u0439\u043d\u043e\u0439 \u0414\u0440\u043e\u043f -Woodcutting.SubSkill.HarvestLumber.Description=\u0423\u0434\u0432\u0430\u0438\u0432\u0430\u0435\u0442 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0432\u044b\u043f\u0430\u0434\u0430\u044e\u0449\u0438\u0445 \u043f\u0440\u0435\u0434\u043c\u0435\u0442\u043e\u0432. -Woodcutting.SubSkill.HarvestLumber.Stat=\u0414\u0432\u043e\u0439\u043d\u043e\u0439 \u0414\u0440\u043e\u043f \u0428\u0430\u043d\u0441 -Woodcutting.SubSkill.Splinter.Name=\u0412 \u0449\u0435\u043f\u043a\u0438 -Woodcutting.SubSkill.Splinter.Description=\u0421\u0440\u0443\u0431\u0430\u0435\u0442 \u0434\u0435\u0440\u0435\u0432\u044c\u044f \u0431\u043e\u043b\u0435\u0435 \u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u043e. -Woodcutting.SubSkill.BarkSurgeon.Name=\u041e\u043f\u0435\u0440\u0430\u0446\u0438\u044f \u043d\u0430 \u041a\u043e\u0440\u0435 -Woodcutting.SubSkill.BarkSurgeon.Description=\u041f\u043e\u043b\u0443\u0447\u0430\u0439 \u043f\u043e\u043b\u0435\u0437\u043d\u044b\u0435 \u043c\u0430\u0442\u0435\u0440\u0438\u0430\u043b\u044b \u043f\u0440\u0438 \u043e\u0431\u0442\u0451\u0441\u044b\u0432\u0430\u043d\u0438\u0438 \u0434\u0440\u0435\u0432\u0435\u0441\u0438\u043d\u044b. -Woodcutting.SubSkill.NaturesBounty.Name=\u0429\u0435\u0434\u0440\u043e\u0441\u0442\u044c \u041f\u0440\u0438\u0440\u043e\u0434\u044b -Woodcutting.SubSkill.NaturesBounty.Description=\u041f\u043e\u043b\u0443\u0447\u0430\u0439 \u043e\u043f\u044b\u0442 \u043e\u0442 \u043f\u0440\u0438\u0440\u043e\u0434\u044b. -Woodcutting.Listener=\u041b\u0435\u0441\u043e\u0440\u0443\u0431\u0441\u0442\u0432\u043e: -Woodcutting.SkillName=\u041b\u0415\u0421\u041e\u0420\u0423\u0411\u0421\u0422\u0412\u041e -Woodcutting.Skills.TreeFeller.Off=[RED]]**\u0423\u043c\u0435\u043d\u0438\u0435 \"\u041b\u0435\u0441\u043e\u0440\u0443\u0431\" \u043f\u0440\u0435\u043a\u0440\u0430\u0442\u0438\u043b\u043e \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0435** -Woodcutting.Skills.TreeFeller.On=[[GREEN]]**\u0423\u043c\u0435\u043d\u0438\u0435 \"\u041b\u0435\u0441\u043e\u0440\u0443\u0431\" \u0410\u041a\u0422\u0418\u0412\u0418\u0420\u041e\u0412\u0410\u041d\u041e** -Woodcutting.Skills.TreeFeller.Refresh=[[GREEN]]\u0412\u0430\u0448\u0435 \u0443\u043c\u0435\u043d\u0438\u0435 [[YELLOW]]\"\u041b\u0435\u0441\u043e\u0440\u0443\u0431\" [[GREEN]]\u0432\u043e\u0441\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u043e! -Woodcutting.Skills.TreeFeller.Other.Off=[[GREEN]]\u0423\u043c\u0435\u043d\u0438\u0435 \"[[RED]]\u041b\u0435\u0441\u043e\u0440\u0443\u0431[[GREEN]]\" \u043f\u0440\u0435\u043a\u0440\u0430\u0442\u0438\u043b\u043e \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0435 \u0443 [[YELLOW]]{0} -Woodcutting.Skills.TreeFeller.Other.On=[[GREEN]]{0}[[DARK_GREEN]] \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b \u0443\u043c\u0435\u043d\u0438\u0435 [[RED]]\"\u041b\u0435\u0441\u043e\u0440\u0443\u0431\"! -Woodcutting.Skills.TreeFeller.Splinter=\u0412\u0410\u0428 \u0422\u041e\u041f\u041e\u0420 \u0420\u0410\u0421\u041a\u041e\u041b\u041e\u041b\u0421\u042f \u041d\u0410 \u0414\u0415\u0421\u042f\u0422\u041a\u0418 \u041a\u0423\u0421\u041a\u041e\u0412! -Woodcutting.Skills.TreeFeller.Threshold=\u042d\u0442\u043e \u0434\u0435\u0440\u0435\u0432\u043e \u0441\u043b\u0438\u0448\u043a\u043e\u043c \u0434\u043b\u0438\u043d\u043d\u043e\u0435! -Woodcutting.Skillup=\u0423\u0440\u043e\u0432\u0435\u043d\u044c \u043d\u0430\u0432\u044b\u043a\u0430 \"\u041b\u0435\u0441\u043e\u0440\u0443\u0431\u0441\u0442\u0432\u043e\" \u0443\u0432\u0435\u043b\u0438\u0447\u0435\u043d \u043d\u0430 {0}. \u0412\u0441\u0435\u0433\u043e ({1}) -#ABILITIY -Ability.Generic.Refresh=[[GREEN]]**\u0423\u041c\u0415\u041d\u0418\u042f \u0412\u041e\u0421\u0421\u0422\u0410\u041d\u041e\u0412\u041b\u0415\u041d\u042b!** -Ability.Generic.Template.Lock=[[GRAY]]{0} -Ability.Generic.Template=[[GOLD]]{0}: [[DARK_AQUA]]{1} -#COMBAT -Combat.ArrowDeflect=[[WHITE]]**\u0421\u0422\u0420\u0415\u041b\u0410 \u041e\u0422\u0421\u041a\u041e\u0427\u0418\u041b\u0410** -Combat.BeastLore=[[GREEN]]**\u0423\u043c\u0435\u043d\u0438\u0435 \"\u0417\u043d\u0430\u043d\u0438\u0435 \u0417\u0432\u0435\u0440\u0435\u0439\" \u0410\u041a\u0422\u0418\u0412\u0418\u0420\u041e\u0412\u0410\u041d\u041e** -Combat.BeastLoreHealth=[[DARK_AQUA]]\u0417\u0434\u043e\u0440\u043e\u0432\u044c\u0435 ([[GREEN]]{0}[[DARK_AQUA]]/{1}) -Combat.BeastLoreOwner=[[DARK_AQUA]]\u0412\u043b\u0430\u0434\u0435\u043b\u0435\u0446 ([[RED]]{0}[[DARK_AQUA]]) -Combat.Gore=[[GREEN]]**\u0423\u041a\u0423\u0428\u0415\u041d** -Combat.StruckByGore=**\u0412\u042b \u0411\u042b\u041b\u0418 \u0423\u041a\u0423\u0428\u0415\u041d\u042b** -Combat.TargetDazed=\u0412\u0430\u0448\u0430 \u0446\u0435\u043b\u044c [[DARK_RED]]\u0428\u043e\u043a\u0438\u0440\u043e\u0432\u0430\u043d\u0430 -Combat.TouchedFuzzy=[[DARK_RED]]\u0412\u044b \u0438\u0441\u0442\u0435\u043a\u0430\u0435\u0442\u0435 \u043a\u0440\u043e\u0432\u044c\u044e. \u041a\u0440\u0443\u0436\u0438\u0442\u0441\u044f \u0433\u043e\u043b\u043e\u0432\u0430. -##generic -mcMMO.Description=[[DARK_AQUA]]\u041e \u043f\u0440\u043e\u044d\u043a\u0442\u0435 [[YELLOW]]mcMMO[[DARK_AQUA]]:,[[GOLD]]mcMMO \u044d\u0442\u043e [[RED]]\u043e\u0442\u043a\u0440\u044b\u0442\u044b\u0439[[GOLD]] RPG \u043c\u043e\u0434, [[GOLD]]\u0441\u043e\u0437\u0434\u0430\u043d\u043d\u044b\u0439 \u0432 \u0444\u0435\u0432\u0440\u0430\u043b\u0435 2011,[[GOLD]]\u043a\u043e\u043c\u043c\u0430\u043d\u0434\u043e\u0439 [[BLUE]]nossr50[[GOLD]]. \u0415\u0433\u043e \u0446\u0435\u043b\u044c\u044e \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0435\u043d\u0438\u0435 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0433\u043e RPG \u043e\u043f\u044b\u0442\u0430 \u0432 \u0438\u0433\u0440\u0435.,[[DARK_AQUA]]\u041f\u043e\u0434\u0441\u043a\u0430\u0437\u043a\u0438:,[[GOLD]] - [[GREEN]]\u0418\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0439\u0442\u0435 [[RED]]/mcmmo help[[GREEN]] \u0447\u0442\u043e\u0431\u044b \u0443\u0432\u0438\u0434\u0435\u0442\u044c \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b\u0435 \u043a\u043e\u043c\u043c\u0430\u043d\u0434\u044b,[[GOLD]] - [[GREEN]]\u041d\u0430\u043f\u0435\u0447\u0430\u0442\u0430\u0439\u0442\u0435 [[RED]]/\u041d\u0410\u0417\u0412\u0410\u041d\u0418\u0415\u0423\u041c\u0415\u041d\u0418\u042f[[GREEN]] \u0447\u0442\u043e\u0431\u044b \u0443\u0432\u0438\u0434\u0435\u0442\u044c \u0434\u0435\u0442\u0430\u043b\u044c\u043d\u0443\u044e \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e \u043e \u043d\u0430\u0432\u044b\u043a\u0435,[[DARK_AQUA]]\u0420\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0438:,[[GOLD]] - [[GREEN]]nossr50 [[BLUE]](Creator & Project Lead),[[GOLD]] - [[GREEN]]electronicboy [[BLUE]](Dev),[[GOLD]] - [[GREEN]]kashike [[BLUE]](Dev),[[GOLD]] - [[GREEN]]t00thpick1 [[BLUE]](Classic Maintainer) -mcMMO.Description.FormerDevs=[[DARK_AQUA]]\u0411\u044b\u0432\u0448\u0438\u0435 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0438: [[GREEN]]GJ, NuclearW, bm01, TfT_02, Glitchfinder -Commands.addlevels.AwardAll.1=[[GREEN]]\u0412\u044b \u0431\u044b\u043b\u0438 \u043d\u0430\u0433\u0440\u0430\u0436\u0434\u0435\u043d\u044b {0} \u043e\u0447\u043a\u0430\u043c\u0438 \u043e\u043f\u044b\u0442\u0430 \u0432\u043e \u0432\u0441\u0435\u0445 \u043d\u0430\u0432\u044b\u043a\u0430\u0445! -Commands.addlevels.AwardAll.2=\u0412\u0441\u0435 \u043d\u0430\u0432\u044b\u043a\u0438 \u0431\u044b\u043b\u0438 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u044b \u043d\u0430 {0}. -Commands.addlevels.AwardSkill.1=[[GREEN]]\u0412\u044b \u0431\u044b\u043b\u0438 \u043d\u0430\u0433\u0440\u0430\u0436\u0434\u0435\u043d\u044b {0} \u0443\u0440\u043e\u0432\u043d\u044f\u043c\u0438 \u0432 {1}! -Commands.addlevels.AwardSkill.2={0} \u0431\u044b\u043b\u043e \u043c\u043e\u0434\u0438\u0444\u0438\u0446\u0438\u0440\u043e\u0432\u0430\u043d\u043e \u0434\u043b\u044f {1}. -Commands.addxp.AwardAll=[[GREEN]]\u0412\u044b \u0431\u044b\u043b\u0438 \u043d\u0430\u0433\u0440\u0430\u0436\u0434\u0435\u043d\u044b {0} \u043e\u0447\u043a\u0430\u043c\u0438 \u043e\u043f\u044b\u0442\u0430 \u0432\u043e \u0432\u0441\u0435\u0445 \u043d\u0430\u0432\u044b\u043a\u0430\u0445! -Commands.addxp.AwardSkill=[[GREEN]]\u0412\u044b \u0431\u044b\u043b\u0438 \u043d\u0430\u0433\u0440\u0430\u0436\u0434\u0435\u043d\u044b {0} \u043e\u0447\u043a\u0430\u043c\u0438 \u043e\u043f\u044b\u0442\u0430 \u0432 {1}! -Commands.Ability.Off=\u0412\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0443\u043c\u0435\u043d\u0438\u044f [[RED]]\u043e\u0442\u043a\u043b\u044e\u0447\u0435\u043d\u0430 -Commands.Ability.On=\u0412\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0443\u043c\u0435\u043d\u0438\u044f [[GREEN]]\u0432\u043a\u043b\u044e\u0447\u0435\u043d\u0430 -Commands.Ability.Toggle=\u0412\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0443\u043c\u0435\u043d\u0438\u044f \u0432\u043a\u043b./\u043e\u0442\u043a\u043b. \u0434\u043b\u044f [[YELLOW]]{0} -Commands.AdminChat.Off=\u0420\u0435\u0436\u0438\u043c \u0447\u0430\u0442\u0430 \u0442\u043e\u043b\u044c\u043a\u043e \u043c\u0435\u0436\u0434\u0443 \u0430\u0434\u043c\u0438\u043d\u0430\u043c\u0438 [[RED]]\u043e\u0442\u043a\u043b\u044e\u0447\u0435\u043d -Commands.AdminChat.On=\u0420\u0435\u0436\u0438\u043c \u0447\u0430\u0442\u0430 \u0442\u043e\u043b\u044c\u043a\u043e \u043c\u0435\u0436\u0434\u0443 \u0430\u0434\u043c\u0438\u043d\u0430\u043c\u0438 [[RED]]\u0432\u043a\u043b\u044e\u0447\u0435\u043d -Commands.AdminToggle=[[GREEN]]- \u0412\u043a\u043b./\u043e\u0442\u043a\u043b. \u0440\u0435\u0436\u0438\u043c \u0447\u0430\u0442\u0430 \u0442\u043e\u043b\u044c\u043a\u043e \u043c\u0435\u0436\u0434\u0443 \u0430\u0434\u043c\u0438\u043d\u0430\u043c\u0438 -Commands.Chat.Console=*\u041a\u043e\u043d\u0441\u043e\u043b\u044c* -Commands.Cooldowns.Header=[[GOLD]]--= [[GREEN]]\u041a\u0443\u043b\u0434\u0430\u0443\u043d\u044b \u0423\u043c\u0435\u043d\u0438\u0439 mcMMO[[GOLD]] =-- -Commands.Cooldowns.Row.N=\\ [[RED]]{0}[[WHITE]] - [[GOLD]]{1} \u0441\u0435\u043a\u0443\u043d\u0434 \u043e\u0441\u0442\u0430\u043b\u043e\u0441\u044c -Commands.Cooldowns.Row.Y=\\ [[AQUA]]{0}[[WHITE]] - [[DARK_GREEN]]\u0413\u043e\u0442\u043e\u0432! -Commands.Database.Cooldown=\u0412\u044b \u0434\u043e\u043b\u0436\u043d\u044b \u043f\u043e\u0434\u043e\u0436\u0434\u0430\u0442\u044c 1 \u0441\u0435\u043a\u0443\u043d\u0434\u0443 \u043f\u0440\u0435\u0436\u0434\u0435 \u0447\u0435\u043c \u043e\u043f\u044f\u0442\u044c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u044d\u0442\u0443 \u043a\u043e\u043c\u0430\u043d\u0434\u0443. -Commands.Database.Processing=\u0412\u0430\u0448\u0430 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0430\u044f \u043a\u043e\u043c\u0430\u043d\u0434\u0430 \u0432\u0441\u0435 \u0435\u0449\u0435 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f. \u041f\u043e\u0436\u0430\u043b\u0443\u0439\u0441\u0442\u0430 \u0436\u0434\u0438\u0442\u0435. -Commands.Disabled=\u042d\u0442\u0430 \u043a\u043e\u043c\u0430\u043d\u0434\u0430 \u043e\u0442\u043a\u043b\u044e\u0447\u0435\u043d\u0430. -Commands.DoesNotExist= [[RED]]\u0418\u0433\u0440\u043e\u043a\u0430 \u043d\u0435 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442 \u0432 \u0431\u0430\u0437\u0435 \u0434\u0430\u043d\u043d\u044b\u0445! -Commands.GodMode.Disabled=\u0420\u0435\u0436\u0438\u043c-\u0431\u043e\u0433\u0430 mcMMO \u041e\u0442\u043a\u043b\u044e\u0447\u0435\u043d -Commands.GodMode.Enabled=\u0420\u0435\u0436\u0438\u043c-\u0431\u043e\u0433\u0430 mcMMO \u0412\u043a\u043b\u044e\u0447\u0435\u043d -Commands.AdminChatSpy.Enabled=mcMMO \u041f\u043e\u0434\u0441\u043b\u0443\u0448\u0438\u0432\u0430\u043d\u0438\u0435 \u0447\u0430\u0442\u0430 \u043f\u0430\u0440\u0442\u0438\u0438 \u0432\u043a\u043b\u044e\u0447\u0435\u043d\u043e -Commands.AdminChatSpy.Disabled=mcMMO \u041f\u043e\u0434\u0441\u043b\u0443\u0448\u0438\u0432\u0430\u043d\u0438\u0435 \u0447\u0430\u0442\u0430 \u043f\u0430\u0440\u0442\u0438\u0438 \u0432\u044b\u043a\u043b\u044e\u0447\u0435\u043d\u043e -Commands.AdminChatSpy.Toggle=mcMMO \u041f\u0430\u0440\u0442\u0438\u0439\u043d\u044b \u0447\u0430\u0442 \u0431\u044b\u043b \u043f\u0435\u0440\u0435\u043a\u043b\u044e\u0447\u0435\u043d \u0432 [[YELLOW]]{0} -Commands.AdminChatSpy.Chat=[[GOLD]][\u041f\u041e\u0414\u0421\u041b\u0423\u0428\u0418\u0412\u0410\u041d\u0418\u0415: [[GREEN]]{0}[[GOLD]]] [[WHITE]]{1} -Commands.GodMode.Forbidden=[mcMMO] \u0420\u0435\u0436\u0438\u043c \u0411\u043e\u0433\u0430 \u043d\u0435 \u0440\u0430\u0437\u0440\u0435\u0448\u0435\u043d \u0432 \u044d\u0442\u043e\u043c \u043c\u0438\u0440\u0435 (\u0421\u043c\u043e\u0442\u0440\u0438 Permissions) -Commands.GodMode.Toggle=\u0420\u0435\u0436\u0438\u043c \u0411\u043e\u0433\u0430 \u0432\u043a\u043b./\u043e\u0442\u043a\u043b. \u0434\u043b\u044f [[YELLOW]]{0} -Commands.Healthbars.Changed.HEARTS=[mcMMO] \u0422\u0438\u043f \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u0448\u043a\u0430\u043b\u044b \u0437\u0434\u043e\u0440\u043e\u0432\u044c\u044f \u0431\u044b\u043b \u0438\u0437\u043c\u0435\u043d\u0435\u043d \u043d\u0430 [[YELLOW]]\u0421\u0435\u0440\u0434\u0446\u0430[[WHITE]]. -Commands.Healthbars.Changed.BAR=[mcMMO] \u0422\u0438\u043f \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u0448\u043a\u0430\u043b\u044b \u0437\u0434\u043e\u0440\u043e\u0432\u044c\u044f \u0431\u044b\u043b \u0438\u0437\u043c\u0435\u043d\u0435\u043d \u043d\u0430 [[YELLOW]]\u041a\u0432\u0430\u0434\u0440\u0430\u0442\u044b[[WHITE]]. -Commands.Healthbars.Changed.DISABLED=[mcMMO] \u041e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435 \u0448\u043a\u0430\u043b\u044b \u0437\u0434\u043e\u0440\u043e\u0432\u044c\u044f \u043c\u043e\u0431\u043e\u0432 [[GRAY]]\u043e\u0442\u043a\u043b\u044e\u0447\u0435\u043d\u043e[[WHITE]]. -Commands.Healthbars.Invalid=\u041d\u0435\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u0442\u0438\u043f \u0448\u043a\u0430\u043b\u044b \u0437\u0434\u043e\u0440\u043e\u0432\u044c\u044f! -Commands.Inspect=<\u0438\u0433\u0440\u043e\u043a> [[GREEN]]- \u041f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u0434\u0435\u0442\u0430\u043b\u044c\u043d\u0443\u044e \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e \u043e \u0438\u0433\u0440\u043e\u043a\u0435 -Commands.Invite.Success=[[GREEN]]\u041f\u0440\u0438\u0433\u043b\u0430\u0448\u0435\u043d\u0438\u0435 \u0443\u0441\u043f\u0435\u0448\u043d\u043e \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u043e. -Commands.Leaderboards=<\u0441\u043f\u043e\u0441\u043e\u0431\u043d\u043e\u0441\u0442\u044c> <\u043d\u043e\u043c\u0435\u0440\u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b> [[GREEN]]- \u0421\u043f\u0438\u0441\u043a\u0438 \u041b\u0438\u0434\u0435\u0440\u043e\u0432 -Commands.mcc.Header=---[][[YELLOW]]\u041a\u043e\u043c\u0430\u043d\u0434\u044b mcMMO[[RED]][]--- -Commands.mcgod=- \u0412\u043a\u043b./\u043e\u0442\u043a\u043b. \u0440\u0435\u0436\u0438\u043c-\u0431\u043e\u0433\u0430 mcMMO -Commands.mchud.Invalid=\u042d\u0442\u043e \u043d\u0435\u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u044b\u0439 \u0442\u0438\u043f \u041f\u0430\u043d\u0435\u043b\u0438 \u0412\u0430\u0436\u043d\u043e\u0439 \u0418\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0438. -Commands.mcpurge.Success=[[GREEN]]\u0411\u0430\u0437\u0430 \u0434\u0430\u043d\u043d\u044b\u0445 \u0431\u044b\u043b\u0430 \u0443\u0441\u043f\u0435\u0448\u043d\u043e \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0430! -Commands.mcrank.Heading=[[GOLD]]-=\u041f\u0415\u0420\u0421\u041e\u041d\u0410\u041b\u042c\u041d\u042b\u0415 \u0420\u0410\u041d\u0413\u0418=- -Commands.mcrank.Overall=\u041e\u0431\u0449\u0438\u0439[[GREEN]] - [[GOLD]]\u0420\u0430\u043d\u0433 [[WHITE]]#[[GREEN]]{0} -Commands.mcrank.Player=\u0426\u0415\u041b\u042c: [[WHITE]]{0} -Commands.mcrank.Skill=[[YELLOW]]{0}[[GREEN]] - [[GOLD]]\u0420\u0430\u043d\u0433 [[WHITE]]#[[GREEN]]{1} -Commands.mcrank.Unranked=[[WHITE]]\u0420\u044f\u0434\u043e\u0432\u043e\u0439 -Commands.mcrefresh.Success={0} \u043e\u0447\u043a\u043e\u0432 \u0443\u043c\u0435\u043d\u0438\u0439 \u0432\u043e\u0441\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u043e -Commands.mcremove.Success=[[GREEN]]{0} \u0431\u044b\u043b \u0443\u0441\u043f\u0435\u0448\u043d\u043e \u0443\u0434\u0430\u043b\u0435\u043d \u0438\u0437 \u0431\u0430\u0437\u044b \u0434\u0430\u043d\u043d\u044b\u0445! -Commands.mctop.Tip=[[GOLD]]\u041f\u043e\u0434\u0441\u043a\u0430\u0437\u043a\u0430: \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0439\u0442\u0435 [[RED]]/mcrank[[GOLD]] \u0447\u0442\u043e\u0431\u044b \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u0432\u0441\u0435 \u0432\u0430\u0448\u0438 \u043f\u0435\u0440\u0441\u043e\u043d\u0430\u043b\u044c\u043d\u044b\u0435 \u0440\u0430\u043d\u0433\u0438! -Commands.mmoedit=[\u0438\u0433\u0440\u043e\u043a] <\u0441\u043f\u043e\u0441\u043e\u0431\u043d\u043e\u0441\u0442\u044c> <\u043d\u043e\u0432\u043e\u0435\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435> [[RED]] - \u041c\u043e\u0434\u0438\u0444\u0438\u0446\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0445\u0430\u0440\u0430\u043a\u0442\u0435\u0440\u0438\u0441\u0442\u0438\u043a\u0438 \u0446\u0435\u043b\u0438 -Commands.mmoedit.AllSkills.1=[[GREEN]]\u0412\u0430\u0448 \u0443\u0440\u043e\u0432\u0435\u043d\u044c \u0432\u043e \u0432\u0441\u0435\u0445 \u043d\u0430\u0432\u044b\u043a\u0430\u0445 \u0431\u044b\u043b \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d \u043d\u0430 {0}! -Commands.mmoedit.Modified.1=[[GREEN]]\u0412\u0430\u0448 \u0443\u0440\u043e\u0432\u0435\u043d\u044c \u0432 {0} \u0431\u044b\u043b \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d \u043d\u0430 {1}! -Commands.mmoedit.Modified.2={0} \u0431\u044b\u043b\u043e \u043c\u043e\u0434\u0438\u0444\u0438\u0446\u0438\u0440\u043e\u0432\u0430\u043d\u043e \u0434\u043b\u044f {1}. -Commands.mcconvert.Database.Same=\u0412\u044b \u0443\u0436\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0435 \u0431\u0430\u0437\u0443 \u0434\u0430\u043d\u043d\u044b\u0445 {0}! -Commands.mcconvert.Database.InvalidType={0} \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043d\u0435\u0434\u043e\u043f\u0443\u0441\u0442\u0438\u043c\u044b\u043c \u0442\u0438\u043f\u043e\u043c \u0431\u0430\u0437\u044b \u0434\u0430\u043d\u043d\u044b\u0445. -Commands.mcconvert.Database.Start=[[GRAY]]\u041d\u0430\u0447\u0430\u043b\u043e \u043a\u043e\u043d\u0432\u0435\u0440\u0442\u0430\u0446\u0438\u0438 \u0438\u0437 {0} \u0432 {1}... -Commands.mcconvert.Database.Finish=[[GRAY]]\u041c\u0438\u0433\u0440\u0430\u0446\u0438\u044f \u0431\u0430\u0437\u044b \u0434\u0430\u043d\u043d\u044b\u0445 \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u0430; \u0431\u0430\u0437\u0430 \u0434\u0430\u043d\u043d\u044b\u0445 {1} \u0442\u0435\u043f\u0435\u0440\u044c \u0432\u043a\u043b\u044e\u0447\u0430\u0435\u0442 \u0432\u0441\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 \u0438\u0437 {0}. -Commands.mmoshowdb=\u0422\u0435\u043a\u0443\u0449\u0430\u044f \u0431\u0430\u0437\u0430 \u0434\u0430\u043d\u043d\u044b\u0445 [[GREEN]]{0} -Commands.mcconvert.Experience.Invalid=\u041d\u0435\u0438\u0437\u0432\u0435\u0441\u0442\u043d\u044b\u0439 \u0442\u0438\u043f \u0444\u043e\u0440\u043c\u0443\u043b\u044b! \u0414\u043e\u0441\u0442\u0443\u043f\u043d\u044b\u0435 \u0442\u0438\u043f\u044b: [[GREEN]]\u041b\u0418\u041d\u0415\u0419\u041d\u0418\u0419 [[RED]]\u0438 [[GREEN]]\u042d\u041a\u0421\u041f\u041e\u041d\u0415\u041d\u0426\u0418\u0410\u041b\u042c\u041d\u042b\u0419. -Commands.mcconvert.Experience.Same=\u0423\u0436\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0442\u0438\u043f \u0444\u043e\u0440\u043c\u0443\u043b\u044b {0} -Commands.mcconvert.Experience.Start=[[GRAY]]\u041d\u0430\u0447\u0430\u043b\u043e \u043a\u043e\u043d\u0432\u0435\u0440\u0442\u0430\u0446\u0438\u0438 \u0438\u0437 {0} \u0432 \u043a\u0440\u0438\u0432\u0443\u044e {1} -Commands.mcconvert.Experience.Finish=[[GRAY]]\u041a\u043e\u043d\u0432\u0435\u0440\u0442\u0430\u0446\u0438\u044f \u0444\u043e\u0440\u043c\u0443\u043b\u044b \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u0430; \u0442\u0435\u043f\u0435\u0440\u044c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u043a\u0440\u0438\u0432\u0430\u044f \u043e\u043f\u044b\u0442\u0430 {0}. -Commands.ModDescription=[[GREEN]]- \u041f\u0440\u043e\u0447\u0438\u0442\u0430\u0442\u044c \u043a\u0440\u0430\u0442\u043a\u043e\u0435 \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u043c\u043e\u0434\u0430 -Commands.NoConsole=\u042d\u0442\u0430 \u043a\u043e\u043c\u0430\u043d\u0434\u0430 \u043d\u0435 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u0441 \u043a\u043e\u043d\u0441\u043e\u043b\u0438 -Commands.Notifications.Off=\u0423\u0432\u0435\u0434\u043e\u043c\u043b\u0435\u043d\u0438\u044f \u043e\u0431 \u0443\u043c\u0435\u043d\u0438\u044f\u0445 [[RED]]\u043e\u0442\u043a\u043b\u044e\u0447\u0435\u043d\u044b -Commands.Notifications.On=\u0412\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0443\u0432\u0435\u0434\u043e\u043c\u043b\u0435\u043d\u0438\u044f \u043f\u0435\u0440\u0435\u043a\u043b\u044e\u0447\u0435\u043d\u043e [[GREEN]] \u043d\u0430 -Commands.Offline=[RED]] \u042d\u0442\u0430 \u043a\u043e\u043c\u0430\u043d\u0434\u0430 \u043d\u0435 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0432 \u0430\u0432\u0442\u043e\u043d\u043e\u043c\u043d\u043e\u043c \u0440\u0435\u0436\u0438\u043c\u0435 \u0438\u0433\u0440\u043e\u043a\u043e\u0432. -Commands.NotLoaded=\u041f\u0440\u043e\u0444\u0438\u043b\u044c \u0438\u0433\u0440\u043e\u043a\u0430 \u0435\u0449\u0435 \u043d\u0435 \u0437\u0430\u0433\u0440\u0443\u0437\u0438\u043b\u0441\u044f. -Commands.Other=[[GREEN]]--\u0414\u0420\u0423\u0413\u0418\u0415 \u041a\u041e\u041c\u0410\u041d\u0414\u042b-- -Commands.Party.Header=-----[][[GREEN]]\u0413\u0420\u0423\u041f\u041f\u0410[[RED]][]----- -Commands.Party.Status=[[DARK_GRAY]]\u041d\u0410\u0417\u0412\u0410\u041d\u0418\u0415: [[WHITE]]{0} {1} -Commands.Party.Status.Alliance=[[DARK_GRAY]]\u0421\u041e\u042e\u0417: [[WHITE]]{0} -Commands.Party.UnlockedFeatures=[[DARK_GRAY]]\u0420\u0410\u0417\u0411\u041b\u041e\u041a\u0418\u0420\u041e\u0412\u0410\u041d\u041d\u042b\u0415 \u0424\u0423\u041d\u041a\u0426\u0418\u0418: [[GRAY]][[ITALIC]]{0} -Commands.Party.ShareMode=[[DARK_GRAY]]\u0420\u0415\u0416\u0418\u041c \u0421\u041e\u0412\u041c\u0415\u0421\u0422\u041d\u041e\u0413\u041e \u041f\u041e\u041b\u042c\u0417\u041e\u0412\u0410\u041d\u0418\u042f: -Commands.Party.ItemShare=[[GRAY]]\u041f\u0420\u0415\u0414\u041c\u0415\u0422 [[DARK_AQUA]]({0}) -Commands.Party.ExpShare=[[GRAY]]\u041e\u041f\u042b\u0422 [[DARK_AQUA]]({0}) -Commands.Party.ItemShareCategories=[[DARK_GRAY]]\u0414\u0435\u043b\u0435\u0436 \u041f\u0440\u0435\u0434\u043c\u0435\u0442\u043e\u0432: [[GRAY]][[ITALIC]]{0} -Commands.Party.MembersNear=[[DARK_GRAY]]\u0412\u041e\u0417\u041b\u0415 \u0412\u0410\u0421 [[DARK_AQUA]]{0}[[DARK_GRAY]]/[[DARK_AQUA]]{1} -Commands.Party.Accept=[[GREEN]]- \u041f\u0440\u0438\u043d\u044f\u0442\u044c \u043f\u0440\u0438\u0433\u043b\u0430\u0448\u0435\u043d\u0438\u0435 \u0432 \u0433\u0440\u0443\u043f\u043f\u0443 -Commands.Party.Chat.Off=\u0413\u0440\u0443\u043f\u043f\u043e\u0432\u043e\u0439 \u0427\u0430\u0442 [[RED]]\u043e\u0442\u043a\u043b\u044e\u0447\u0435\u043d -Commands.Party.Chat.On=\u0413\u0440\u0443\u043f\u043f\u043e\u0432\u043e\u0439 \u0427\u0430\u0442 [[RED]]\u0432\u043a\u043b\u044e\u0447\u0435\u043d -Commands.Party.Commands=[[GREEN]]--\u0413\u0420\u0423\u041f\u041f\u041e\u0412\u042b\u0415 \u041a\u041e\u041c\u0410\u041d\u0414\u042b-- -Commands.Party.Invite.0=[[RED]]\u0412\u041d\u0418\u041c\u0410\u041d\u0418\u0415: [[GREEN]]\u0412\u044b \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u0438 \u043f\u0440\u0438\u0433\u043b\u0430\u0448\u0435\u043d\u0438\u0435 \u0432 \u0433\u0440\u0443\u043f\u043f\u0443 {0} \u043e\u0442 {1} -Commands.Party.Invite.1=[[YELLOW]]\u041d\u0430\u043f\u0435\u0447\u0430\u0442\u0430\u0439\u0442\u0435 [[GREEN]]/party accept[[YELLOW]], \u0447\u0442\u043e\u0431\u044b \u043f\u0440\u0438\u043d\u044f\u0442\u044c \u043f\u0440\u0438\u0433\u043b\u0430\u0448\u0435\u043d\u0438\u0435 \u0432 \u0433\u0440\u0443\u043f\u043f\u0443 -Commands.Party.Invite=[[GREEN]]- \u041e\u0442\u043f\u0440\u0430\u0432\u0438\u0442\u044c \u043f\u0440\u0438\u0433\u043b\u0430\u0448\u0435\u043d\u0438\u0435 \u0432 \u0433\u0440\u0443\u043f\u043f\u0443 -Commands.Party.Invite.Accepted=[[GREEN]]\u041f\u0440\u0438\u0433\u043b\u0430\u0448\u0435\u043d\u0438\u0435 \u043f\u0440\u0438\u043d\u044f\u0442\u043e. \u0412\u044b \u043f\u0440\u0438\u0441\u043e\u0435\u0434\u0435\u043d\u0438\u043b\u0438\u0441\u044c \u043a \u0433\u0440\u0443\u043f\u0435 {0} -Commands.Party.Join=[[GRAY]]\u0423\u0447\u0430\u0441\u0442\u043d\u0438\u043a \u0413\u0440\u0443\u043f\u043f\u044b: {0} -Commands.Party.PartyFull=[[GOLD]]{0}[[RED]] \u0437\u0430\u043f\u043e\u043b\u043d\u0435\u043d\u0430! -Commands.Party.PartyFull.Invite=\u0412\u044b \u043d\u0435 \u043c\u043e\u0436\u0435\u0442\u0435 \u043f\u0440\u0438\u0433\u043b\u0430\u0441\u0438\u0442\u044c [[YELLOW]]{0}[[RED]] \u0432 [[GREEN]]{1}[[RED]] \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u0432 \u043d\u0435\u0439 \u0443\u0436\u0435 [[DARK_AQUA]]{2}[[RED]] \u0438\u0433\u0440\u043e\u043a\u043e\u0432! -Commands.Party.PartyFull.InviteAccept=\u0412\u044b \u043d\u0435 \u043c\u043e\u0436\u0435\u0442\u0435 \u043f\u0440\u0438\u0441\u043e\u0435\u0434\u0435\u043d\u0438\u0442\u044c\u0441\u044f \u043a [[GREEN]]{0}[[RED]] \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u0432 \u043d\u0435\u0439 \u0443\u0436\u0435 [[DARK_AQUA]]{1}[[RED]] \u0438\u0433\u0440\u043e\u043a\u043e\u0432! -Commands.Party.Create=[[GRAY]]\u0421\u043e\u0437\u0434\u0430\u043d\u0430 \u0413\u0440\u0443\u043f\u043f\u0430: {0} -Commands.Party.Rename=[[GRAY]]\u041d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 \u0433\u0440\u0443\u043f\u043f\u044b \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u043e \u043d\u0430: [[WHITE]]{0} -Commands.Party.SetSharing=[[GRAY]]\u0423 \u0433\u0440\u0443\u043f\u043f\u044b {0} \u0432 \u0441\u043e\u0432\u043c\u0435\u0441\u0442\u043d\u043e\u043c \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0438: [[DARK_AQUA]]{1} -Commands.Party.ToggleShareCategory=[[GRAY]]\u0414\u0435\u043b\u0435\u0436 \u043f\u0440\u0435\u0434\u043c\u0435\u0442\u0430\u043c\u0438 \u0432 \u0433\u0440\u0443\u043f\u0435 \u0434\u043b\u044f [[GOLD]]{0} [[GRAY]] [[DARK_AQUA]]{1} -Commands.Party.AlreadyExists=[[DARK_RED]]\u0413\u0440\u0443\u043f\u043f\u0430 {0} \u0443\u0436\u0435 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442! -Commands.Party.Kick=\u0412\u044b \u0432\u044b\u0433\u043d\u0430\u043d\u044b \u0438\u0437 \u0433\u0440\u0443\u043f\u043f\u044b {0}! -Commands.Party.Leave=\u0412\u044b \u043f\u043e\u043a\u0438\u043d\u0443\u043b\u0438 \u0433\u0440\u0443\u043f\u043f\u0443 -Commands.Party.Members.Header=-----[][[GREEN]]\u0423\u0427\u0410\u0421\u0422\u041d\u0418\u041a\u0418[[RED]][]----- -Commands.Party.None=\u0412\u044b \u043d\u0435 \u0432 \u0433\u0440\u0443\u043f\u043f\u0435. -Commands.Party.Quit=[[GREEN]]- \u041f\u043e\u043a\u0438\u043d\u0443\u0442\u044c \u0442\u0435\u043a\u0443\u0449\u0443\u044e \u0433\u0440\u0443\u043f\u043f\u0443 -Commands.Party.Teleport= [[RED]]- \u0422\u0435\u043b\u0435\u043f\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u043a \u0447\u043b\u0435\u043d\u0443 \u0433\u0440\u0443\u043f\u043f\u044b -Commands.Party.Toggle=[[GREEN]]- \u0412\u043a\u043b./\u043e\u0442\u043a\u043b. \u0433\u0440\u0443\u043f\u043f\u043e\u0432\u043e\u0439 \u0447\u0430\u0442 -Commands.Party1=[[GREEN]]- \u0421\u043e\u0437\u0434\u0430\u0442\u044c \u043d\u043e\u0432\u0443\u044e \u0433\u0440\u0443\u043f\u043f\u0443 -Commands.Party2=[[GREEN]]- \u041f\u0440\u0438\u0441\u043e\u0435\u0434\u0435\u043d\u0438\u0442\u044c\u0441\u044f \u043a \u0433\u0440\u0443\u043f\u043f\u0435 \u0438\u0433\u0440\u043e\u043a\u043e\u0432 -Commands.Party.Alliance.Header=[[RED]]-----[][[GREEN]]\u0421\u041e\u042e\u0417 \u0413\u0420\u0423\u041f\u041f\u042b[[RED]][]----- -Commands.Party.Alliance.Ally=[[WHITE]]{0} [[DARK_GRAY]]\u0412 \u0421\u041e\u042e\u0417\u0415 \u0421: [[WHITE]]{1} -Commands.Party.Alliance.Members.Header=[[RED]]-----[][[GREEN]]\u0423\u0427\u0410\u0421\u0422\u041d\u0418\u041a\u0418 \u0421\u041e\u042e\u0417\u0410[[RED]][]----- -Commands.Party.Alliance.Invite.0=\u0412\u041d\u0418\u041c\u0410\u041d\u0418\u0415: [[GREEN]]\u0412\u044b \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u0438 \u0437\u0430\u043f\u0440\u043e\u0441 \u043d\u0430 \u0441\u043e\u044e\u0437 \u0441 {0} \u043e\u0442 {1} -Commands.Party.Alliance.Invite.1=\u041d\u0430\u043f\u0438\u0448\u0438\u0442\u0435 [[GREEN]]/party alliance accept[[YELLOW]] \u0447\u0442\u043e\u0431\u044b \u043f\u0440\u0438\u043d\u044f\u0442\u044c \u043f\u0440\u0438\u0433\u043b\u0430\u0448\u0435\u043d\u0438\u0435 -Commands.Party.Alliance.Invite.Accepted=[[GREEN]]\u041f\u0440\u0435\u0434\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u043e \u0441\u043e\u044e\u0437\u0435 \u043f\u0440\u0438\u043d\u044f\u0442\u043e. -Commands.Party.Alliance.None=[[RED]]\u0412\u0430\u0448\u0430 \u0433\u0440\u0443\u043f\u043f\u0430 \u043d\u0435 \u0438\u043c\u0435\u0435\u0442 \u0441\u043e\u044e\u0437\u043d\u0438\u043a\u043e\u0432. -Commands.Party.Alliance.AlreadyAllies=[[RED]]\u0412\u0430\u0448\u0430 \u0433\u0440\u0443\u043f\u043f\u0430 \u0443\u0436\u0435 \u0432 \u0441\u043e\u044e\u0437\u0435. \u041e\u0442\u043c\u0435\u043d\u0438\u0442\u0435 \u0435\u0433\u043e \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e [[DARK_AQUA]]/party alliance disband -Commands.Party.Alliance.Help.0=[[RED]]\u042d\u0442\u0430 \u0433\u0440\u0443\u043f\u043f\u0430 \u0435\u0449\u0435 \u043d\u0435 \u0437\u0430\u043a\u043b\u044e\u0447\u0438\u043b\u0430 \u0441\u043e\u044e\u0437\u0430. \u041f\u0440\u0438\u0433\u043b\u0430\u0441\u0438\u0442\u0435 \u043b\u0438\u0434\u0435\u0440\u0430 \u0433\u0440\u0443\u043f\u043f\u044b -Commands.Party.Alliance.Help.1=[[RED]] \u0434\u043b\u044f \u0437\u0430\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f \u0441\u043e\u044e\u0437\u0430 [[DARK_AQUA]]/party alliance invite <\u0438\u0433\u0440\u043e\u043a>[[RED]]. -Commands.ptp.Enabled=\u0422\u0435\u043b\u0435\u043f\u043e\u0440\u0442\u0430\u0446\u0438\u044f \u043a \u0443\u0447\u0430\u0441\u0442\u043d\u0438\u043a\u0430\u043c \u0433\u0440\u0443\u043f\u043f\u044b [[GREEN]]\u0432\u043a\u043b\u044e\u0447\u0435\u043d\u0430 -Commands.ptp.Disabled=\u0422\u0435\u043b\u0435\u043f\u043e\u0440\u0442\u0430\u0446\u0438\u044f \u043a \u0443\u0447\u0430\u0441\u0442\u043d\u0438\u043a\u0430\u043c \u0433\u0440\u0443\u043f\u043f\u044b [[RED]]\u043e\u0442\u043a\u043b\u044e\u0447\u0435\u043d\u0430 -Commands.ptp.NoRequests=\u041d\u0430 \u0434\u0430\u043d\u043d\u044b\u0439 \u043c\u043e\u043c\u0435\u043d\u0442 \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432 \u043d\u0430 \u0442\u0435\u043b\u0435\u043f\u043e\u0440\u0442\u0430\u0446\u0438\u044e \u043a \u0432\u0430\u043c \u043d\u0435\u0442 -Commands.ptp.NoWorldPermissions=[mcMMO] \u0423 \u0432\u0430\u0441 \u043d\u0435\u0442 \u043f\u0440\u0430\u0432 \u0434\u043b\u044f \u0442\u0435\u043b\u0435\u043f\u043e\u0440\u0442\u0430\u0446\u0438\u0438 \u0432 \u044d\u0442\u043e\u0442 \u043c\u0438\u0440 {0}. -Commands.ptp.Request1={0} [[GREEN]]\u0437\u0430\u043f\u0440\u0430\u0448\u0438\u0432\u0430\u0435\u0442 \u0440\u0430\u0437\u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u043d\u0430 \u0442\u0435\u043b\u0435\u043f\u043e\u0440\u0442\u0430\u0446\u0438\u044e \u043a \u0432\u0430\u043c. -Commands.ptp.Request2=[[GREEN]]\u0414\u043b\u044f \u043f\u0440\u0438\u043d\u044f\u0442\u0438\u044f \u0437\u0430\u043f\u0440\u043e\u0441\u0430 \u043d\u0430 \u0442\u0435\u043b\u0435\u043f\u043e\u0440\u0442\u0430\u0446\u0438\u044e \u043d\u0430\u043f\u0438\u0448\u0438\u0442\u0435 [[YELLOW]]/ptp accept. [[GREEN]]\u0417\u0430\u043f\u0440\u043e\u0441 \u0431\u0443\u0434\u0435\u0442 \u043f\u0440\u043e\u0441\u0440\u043e\u0447\u0435\u043d \u0447\u0435\u0440\u0435\u0437 [[RED]]{0} [[GREEN]]\u0441\u0435\u043a\u0443\u043d\u0434. -Commands.ptp.AcceptAny.Enabled=\u041f\u043e\u0434\u0442\u0432\u0435\u0440\u0436\u0434\u0435\u043d\u0438\u0435 \u0437\u0430\u043f\u0440\u043e\u0441\u0430 \u043d\u0430 \u0442\u0435\u043b\u0435\u043f\u043e\u0440\u0442\u0430\u0446\u0438\u044e [[GREEN]]\u0432\u043a\u043b\u044e\u0447\u0435\u043d\u043e -Commands.ptp.AcceptAny.Disabled=\u041f\u043e\u0434\u0442\u0432\u0435\u0440\u0436\u0434\u0435\u043d\u0438\u0435 \u0437\u0430\u043f\u0440\u043e\u0441\u0430 \u043d\u0430 \u0442\u0435\u043b\u0435\u043f\u043e\u0440\u0442\u0430\u0446\u0438\u044e [[RED]]\u043e\u0442\u043a\u043b\u044e\u0447\u0435\u043d\u043e -Commands.ptp.RequestExpired=\u0417\u0430\u043f\u0440\u043e\u0441 \u043d\u0430 \u0442\u0435\u043b\u0435\u043f\u043e\u0440\u0442\u0430\u0446\u0438\u044e \u043f\u0440\u043e\u0441\u0440\u043e\u0447\u0435\u043d! -Commands.PowerLevel.Leaderboard=--\u0421\u043f\u0438\u0441\u043e\u043a \u041b\u0438\u0434\u0435\u0440\u043e\u0432 mcMMO \u043f\u043e[[BLUE]] \u041e\u0431\u0449\u0435\u043c\u0443 \u0423\u0440\u043e\u0432\u043d\u044e [[YELLOW]]-- -Commands.PowerLevel.Capped=[[DARK_RED]]\u041e\u0411\u0429\u0418\u0419 \u0423\u0420\u041e\u0412\u0415\u041d\u042c: [[GREEN]]{0} [[DARK_RED]]\u041c\u0410\u041a\u0421\u0418\u041c\u0410\u041b\u042c\u041d\u042b\u0419 \u0423\u0420\u041e\u0412\u0415\u041d\u042c: [[YELLOW]]{1} -Commands.PowerLevel=[[DARK_RED]]\u041e\u0411\u0429\u0418\u0419 \u0423\u0420\u041e\u0412\u0415\u041d\u042c: [[GREEN]]{0} -Commands.Reset.All=[[GREEN]]\u0412\u0441\u0435 \u0432\u0430\u0448\u0438 \u0443\u0440\u043e\u0432\u043d\u0438 \u043d\u0430\u0432\u044b\u043a\u043e\u0432 \u0431\u044b\u043b\u0438 \u0441\u0431\u0440\u043e\u0448\u0435\u043d\u044b \u0443\u0441\u043f\u0435\u0448\u043d\u043e. -Commands.Reset.Single=[[GREEN]]\u0412\u0430\u0448 {0} \u0443\u0440\u043e\u0432\u0435\u043d\u044c \u043d\u0430\u0432\u044b\u043a\u0430 \u0431\u044b\u043b \u0441\u0431\u0440\u043e\u0448\u0435\u043d \u0443\u0441\u043f\u0435\u0448\u043d\u043e. -Commands.Reset=[[GREEN]]-\u0421\u0431\u0440\u043e\u0441 \u0443\u0440\u043e\u0432\u043d\u044f \u043d\u0430\u0432\u044b\u043a\u0430 \u0434\u043e 0 -Commands.Scoreboard.Clear=[[DARK_AQUA]]\u0422\u0430\u0431\u043b\u0438\u0446\u0430 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u043e\u0432 mcMMO \u0443\u0431\u0440\u0430\u043d\u0430. -Commands.Scoreboard.NoBoard=\u0422\u0430\u0431\u043b\u0438\u0446\u0430 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u043e\u0432 mcMMO \u043d\u0435 \u0430\u043a\u0442\u0438\u0432\u043d\u0430. -Commands.Scoreboard.Keep=[[DARK_AQUA]]\u0422\u0430\u0431\u043b\u0438\u0446\u0430 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u043e\u0432 mcMMO \u0431\u0443\u0434\u0435\u0442 \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0430\u0442\u044c\u0441\u044f \u0434\u043e \u0442\u0435\u0445 \u043f\u043e\u0440 \u043f\u043e\u043a\u0430 \u0432\u044b \u043d\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0435 [[GREEN]]/mcscoreboard clear[[DARK_AQUA]]. -Commands.Scoreboard.Timer=[[DARK_AQUA]]\u0422\u0430\u0431\u043b\u0438\u0446\u0430 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u043e\u0432 mcMMO \u0438\u0441\u0447\u0435\u0437\u043d\u0435\u0442 \u0447\u0435\u0440\u0435\u0437 [[GOLD]]{0}[[DARK_AQUA]] \u0441\u0435\u043a\u0443\u043d\u0434. -Commands.Scoreboard.Help.0=[[GOLD]] == [[GREEN]]\u041f\u043e\u043c\u043e\u0449\u044c \u043f\u043e [[RED]]/mcscoreboard[[GOLD]] == -Commands.Scoreboard.Help.1=[[DARK_AQUA]]/mcscoreboard[[AQUA]] clear [[WHITE]] - \u0443\u0431\u0440\u0430\u0442\u044c \u0442\u0430\u0431\u043b\u0438\u0446\u0443 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u043e\u0432 McMMO -Commands.Scoreboard.Help.2=[[DARK_AQUA]]/mcscoreboard[[AQUA]] keep [[WHITE]] - \u043f\u043e\u0441\u0442\u043e\u044f\u043d\u043d\u043e \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0430\u0442\u044c \u0442\u0430\u0431\u043b\u0438\u0446\u0443 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u043e\u0432 mcMMO -Commands.Scoreboard.Help.3=[[DARK_AQUA]]/mcscoreboard[[AQUA]] time [n] [[WHITE]] - \u0443\u0431\u0440\u0430\u0442\u044c \u0442\u0430\u0431\u043b\u0438\u0446\u0443 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u043e\u0432 McMMO \u0447\u0435\u0440\u0435\u0437 [[LIGHT_PURPLE]]n[[WHITE]] \u0441\u0435\u043a\u0443\u043d\u0434 -Commands.Scoreboard.Tip.Keep=[[GOLD]]\u041f\u043e\u0434\u0441\u043a\u0430\u0437\u043a\u0430: \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0439\u0442\u0435 [[RED]]/mcscoreboard keep[[GOLD]] \u0432\u043e \u0432\u0440\u0435\u043c\u044f \u043f\u0440\u043e\u0441\u043c\u043e\u0442\u0440\u0430 \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u043e\u0432, \u0447\u0442\u043e\u0431\u044b \u043e\u043d\u0430 \u043d\u0435 \u0438\u0441\u0447\u0435\u0437\u0430\u043b\u0430. -Commands.Scoreboard.Tip.Clear=[[GOLD]]\u041f\u043e\u0434\u0441\u043a\u0430\u0437\u043a\u0430: \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0439\u0442\u0435 [[RED]]/mcscoreboard clear[[GOLD]] \u0447\u0442\u043e\u0431\u044b \u0443\u0431\u0440\u0430\u0442\u044c \u0442\u0430\u0431\u043b\u0438\u0446\u0443 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u043e\u0432. -Commands.Skill.Invalid=\u042d\u0442\u043e \u043d\u0435\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0435 \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 \u043d\u0430\u0432\u044b\u043a\u0430! -Commands.Skill.Leaderboard=--mcMMO [[BLUE]]{0}[[YELLOW]] \u0421\u043f\u0438\u0441\u043e\u043a \u041b\u0438\u0434\u0435\u0440\u043e\u0432-- -Commands.SkillInfo=- \u041f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u0434\u0435\u0442\u0430\u043b\u044c\u043d\u0443\u044e \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e \u043e \u043d\u0430\u0432\u044b\u043a\u0435 -Commands.Stats.Self=\u0412\u0410\u0428\u0410 \u0421\u0422\u0410\u0422\u0418\u0421\u0422\u0418\u041a\u0410 -Commands.Stats=[[GREEN]]- \u041f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u0412\u0430\u0448\u0443 mcMMO \u0441\u0442\u0430\u0442\u0438\u0441\u0442\u0438\u043a\u0443 -Commands.ToggleAbility=[[GREEN]]- \u0412\u043a\u043b./\u043e\u0442\u043a\u043b. \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0430\u043a\u0442\u0438\u0432\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0443\u043c\u0435\u043d\u0438\u0435 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043f\u0440\u0430\u0432\u043e\u0439 \u043a\u043d\u043e\u043f\u043a\u0438 \u043c\u044b\u0448\u0438 -Commands.Usage.0=\u041f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u043e\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 /{0} -Commands.Usage.1=\u041f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u043e\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 /{0} {1} -Commands.Usage.2=\u041f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u043e\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 /{0} {1} {2} -Commands.Usage.3=\u041f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u043e\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 /{0} {1} {2} {3} -Commands.Usage.FullClassName=classname -Commands.Usage.Level=level -Commands.Usage.Message=message -Commands.Usage.Page=page -Commands.Usage.PartyName=\u0438\u043c\u044f -Commands.Usage.Password=password -Commands.Usage.Player=player -Commands.Usage.Rate=rate -Commands.Usage.Skill=skill -Commands.Usage.XP=xp -Commands.Description.mmoinfo=\u041f\u0440\u043e\u0447\u0438\u0442\u0430\u0439\u0442\u0435 \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u0435\u0435 \u043e \u0441\u043f\u043e\u0441\u043e\u0431\u043d\u043e\u0441\u0442\u0438 \u0438\u043b\u0438 \u043c\u0435\u0445\u0430\u043d\u0438\u043a\u0435. -Commands.MmoInfo.Mystery=[[GRAY]]\u0412\u044b \u0435\u0449\u0435 \u043d\u0435 \u0440\u0430\u0437\u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u0430\u043b\u0438 \u044d\u0442\u0443 \u0441\u043f\u043e\u0441\u043e\u0431\u043d\u043e\u0441\u0442\u044c, \u043d\u043e \u043a\u043e\u0433\u0434\u0430 \u0440\u0430\u0437\u0431\u043b\u043e\u043a\u0438\u0440\u0443\u0435\u0442\u0435, \u0442\u043e \u0441\u043c\u043e\u0436\u0435\u0442\u0435 \u043f\u0440\u043e\u0447\u0438\u0442\u0430\u0442\u044c \u043e \u043d\u0435\u0439 \u0442\u0443\u0442! -Commands.MmoInfo.NoMatch=\u042d\u0442\u0430 \u0441\u043f\u043e\u0441\u043e\u0431\u043d\u043e\u0441\u0442\u044c \u043d\u0435 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442! -Commands.MmoInfo.Header=[[DARK_AQUA]]-=[]=====[][[GOLD]] MMO \u0418\u043d\u0444\u043e [[DARK_AQUA]][]=====[]=- -Commands.MmoInfo.SubSkillHeader=[[GOLD]]\u041d\u0430\u0437\u0432\u0430\u043d\u0438\u0435:[[YELLOW]] {0} -Commands.MmoInfo.DetailsHeader=[[DARK_AQUA]]-=[]=====[][[GREEN]] \u041f\u043e\u0434\u0440\u043e\u0431\u043d\u0435\u0435 [[DARK_AQUA]][]=====[]=- -Commands.MmoInfo.OldSkill=[[GRAY]]mcMMO \u0441\u043f\u043e\u0441\u043e\u0431\u043d\u043e\u0441\u0442\u0438 \u0441\u0435\u0439\u0447\u0430\u0441 \u043f\u0435\u0440\u0435\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u044e\u0442\u0441\u044f \u0432 \u0443\u043b\u0443\u0447\u0448\u0435\u043d\u043d\u0443\u044e \u043c\u043e\u0434\u0443\u043b\u044c\u043d\u0443\u044e \u0441\u0438\u0441\u0442\u0435\u043c\u0443 \u0441\u043f\u043e\u0441\u043e\u0431\u043d\u043e\u0441\u0442\u0435\u0439, \u043a \u0441\u043e\u0436\u0430\u043b\u0435\u043d\u0438\u044e \u0434\u0430\u043d\u043d\u0430\u044f \u0441\u043f\u043e\u0441\u043e\u0431\u043d\u043e\u0441\u0442\u044c \u043f\u043e\u043a\u0430 \u043d\u0435 \u0431\u044b\u043b\u0430 \u043f\u0435\u0440\u0435\u0440\u0430\u0431\u043e\u0442\u0430\u043d\u0430 \u0438 \u0441\u0442\u0440\u0430\u0434\u0430\u0435\u0442 \u043d\u0435\u0434\u043e\u0441\u0442\u0430\u0442\u043a\u043e\u043c \u0445\u0430\u0440\u0430\u043a\u0442\u0435\u0440\u0438\u0441\u0442\u0438\u043a. \u041d\u043e\u0432\u0430\u044f \u0441\u0438\u0441\u0442\u0435\u043c\u0430 \u043f\u043e\u0437\u0432\u043e\u043b\u0438\u0442 \u0432\u044b\u043f\u0443\u0441\u043a\u0430\u0442\u044c \u0434\u043e\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0441\u043f\u043e\u0441\u043e\u0431\u043d\u043e\u0441\u0442\u0435\u0439 \u0431\u044b\u0441\u0442\u0440\u0435\u0435 \u0438 \u0434\u0430\u0441\u0442 \u0431\u043e\u043b\u044c\u0448\u0435 \u0433\u0438\u0431\u043a\u043e\u0441\u0442\u0438 \u0443\u0436\u0435 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u043c \u0441\u043f\u043e\u0441\u043e\u0431\u043d\u043e\u0441\u0442\u044f\u043c. -Commands.MmoInfo.Mechanics=[[DARK_AQUA]]-=[]=====[][[GOLD]] \u041c\u0435\u0445\u0430\u043d\u0438\u043a\u0438 [[DARK_AQUA]][]=====[]=- -Commands.MmoInfo.Stats=\u0421\u0422\u0410\u0422\u042b: {0} -Commands.Mmodebug.Toggle=mcMMO \u0420\u0415\u0416\u0418\u041c \u0414\u0415\u0411\u0410\u0413\u0410 [[GOLD]]{0}[[GRAY]], \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0439\u0442\u0435 \u044d\u0442\u0443 \u043a\u043e\u043c\u0430\u043d\u0434\u0443 \u0447\u0442\u043e\u0431\u044b \u043f\u0435\u0440\u0435\u043a\u043b\u044e\u0447\u0438\u0442\u044c. \u0412 \u0440\u0435\u0436\u0438\u043c\u0435 \u0434\u0435\u0431\u0430\u0433\u0430, \u0432\u044b \u043c\u043e\u0436\u0435\u0442\u0435 \u0431\u0438\u0442\u044c \u0431\u043b\u043e\u043a\u0438 \u0447\u0442\u043e\u0431\u044b \u043e\u0442\u043e\u0431\u0440\u0430\u0437\u0438\u0442\u044c \u043f\u043e\u043b\u0435\u0437\u043d\u0443\u044e \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e \u043d\u0443\u0436\u043d\u0443\u044e \u0434\u043b\u044f \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0438. -mcMMO.NoInvites=\u0421\u0435\u0439\u0447\u0430\u0441 \u0443 \u0412\u0430\u0441 \u043d\u0435\u0442 \u043f\u0440\u0438\u0433\u043b\u0430\u0448\u0435\u043d\u0438\u0439 -mcMMO.NoPermission=[[DARK_RED]]\u041d\u0435\u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u043f\u0440\u0430\u0432. -mcMMO.NoSkillNote=[[DARK_GRAY]]\u0415\u0441\u043b\u0438 \u0443 \u0432\u0430\u0441 \u043d\u0435\u0442 \u0434\u043e\u0441\u0442\u0443\u043f\u0430 \u043a \u043d\u0430\u0432\u044b\u043a\u0443, \u0442\u043e \u043e\u043d \u043d\u0435 \u0431\u0443\u0434\u0435\u0442 \u0437\u0434\u0435\u0441\u044c \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0451\u043d. -##party -Party.Forbidden=[mcMMO] \u0413\u0440\u0443\u043f\u043f\u044b \u043d\u0435 \u0440\u0430\u0437\u0440\u0435\u0448\u0435\u043d\u044b \u0432 \u044d\u0442\u043e\u043c \u043c\u0438\u0440\u0435 (\u0421\u043c\u043e\u0442\u0440\u0438 Permissions) -Party.Help.0=\u041f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u043e\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 [[DARK_AQUA]]{0} [password]. -Party.Help.1=\u0427\u0442\u043e\u0431\u044b \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u0433\u0440\u0443\u043f\u043f\u0443 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0439\u0442\u0435 [[DARK_AQUA]]{0} [password]. -Party.Help.2=\u0418\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0439\u0442\u0435 [[DARK_AQUA]]{0} [[RED]]\u0434\u043b\u044f \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u043e\u0439 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0438. -Party.Help.3=\u0418\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0439\u0442\u0435 [[DARK_AQUA]]{0} [password] [[RED]]\u0447\u0442\u043e\u0431\u044b \u043f\u0440\u0438\u0441\u043e\u0435\u0434\u0435\u043d\u0438\u0442\u044c\u0441\u044f \u0438\u043b\u0438 [[DARK_AQUA]]{1} [[RED]]\u0447\u0442\u043e\u0431\u044b \u0432\u044b\u0439\u0442\u0438 -Party.Help.4=\u0427\u0442\u043e\u0431\u044b \u0437\u0430\u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0438\u043b\u0438 \u0440\u0430\u0437\u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0432\u0430\u0448\u0443 \u0433\u0440\u0443\u043f\u043f\u0443 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0439\u0442\u0435 [[DARK_AQUA]]{0} -Party.Help.5=\u0427\u0442\u043e\u0431\u044b \u0437\u0430\u0449\u0438\u0442\u0438\u0442\u044c \u043f\u0430\u0440\u043e\u043b\u0435\u043c \u0432\u0430\u0448\u0443 \u0433\u0440\u0443\u043f\u043f\u0443 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0439\u0442\u0435 [[DARK_AQUA]]{0} -Party.Help.6= \u0427\u0442\u043e\u0431\u044b \u0432\u044b\u0433\u043d\u0430\u0442\u044c \u0438\u0433\u0440\u043e\u043a\u0430 \u0438\u0437 \u0432\u0430\u0448\u0435\u0439 \u043f\u0430\u0442\u0438, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0439\u0442\u0435 [[DARK_AQUA]] {0} -Party.Help.7=\u0427\u0442\u043e\u0431\u044b \u043f\u0435\u0440\u0435\u0434\u0430\u0442\u044c \u043f\u0440\u0430\u0432\u043e \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0432\u0430\u0448\u0435\u0439 \u0433\u0440\u0443\u043f\u043f\u043e\u0439 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0439\u0442\u0435 [[DARK_AQUA]]{0} -Party.Help.8=\u0427\u0442\u043e\u0431\u044b \u0440\u0430\u0441\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u0432\u0430\u0448\u0443 \u0433\u0440\u0443\u043f\u043f\u0443 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0439\u0442\u0435 [[DARK_AQUA]]{0} -Party.Help.9=\u0418\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0439\u0442\u0435 [[DARK_AQUA]]{0} [[RED]]\u0434\u043b\u044f \u0434\u0435\u043b\u0435\u0436\u0430 \u043f\u0440\u0435\u0434\u043c\u0435\u0442\u0430\u043c\u0438 \u043c\u0435\u0436\u0434\u0443 \u0443\u0447\u0430\u0441\u0442\u043d\u0438\u043a\u0430\u043c\u0438 \u0433\u0440\u0443\u043f\u043f\u044b -Party.Help.10=\u0418\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0439\u0442\u0435 [[DARK_AQUA]]{0} [[RED]]\u0447\u0442\u043e\u0431\u044b \u0432\u043a\u043b\u044e\u0447\u0438\u0442\u044c \u0434\u0435\u043b\u0435\u0436 \u043e\u043f\u044b\u0442\u0430 \u043c\u0435\u0436\u0434\u0443 \u0443\u0447\u0430\u0441\u0442\u043d\u0438\u043a\u0430\u043c\u0438 \u0433\u0440\u0443\u043f\u043f\u044b -Party.InformedOnJoin={0} [[GREEN]]\u043f\u0440\u0438\u0441\u043e\u0435\u0434\u0435\u043d\u0438\u043b\u0441\u044f \u043a \u0432\u0430\u0448\u0435\u0439 \u0433\u0440\u0443\u043f\u043f\u0435 -Party.InformedOnQuit={0} [[GREEN]]\u043f\u043e\u043a\u0438\u043d\u0443\u043b \u0432\u0430\u0448\u0443 \u0433\u0440\u0443\u043f\u043f\u0443 -Party.InformedOnNameChange=[[GOLD]]{0} [[GREEN]]\u0443\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u043b \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 \u0433\u0440\u0443\u043f\u043f\u044b \u043d\u0430 [[WHITE]]{1} -Party.InvalidName=[[DARK_RED]]\u041d\u0435\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0435 \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 \u0433\u0440\u0443\u043f\u043f\u044b. -Party.Invite.Self=[[RED]]\u0412\u044b \u043d\u0435 \u043c\u043e\u0436\u0435\u0442\u0435 \u043f\u0440\u0438\u0433\u043b\u0430\u0441\u0438\u0442\u044c \u0441\u0430\u043c\u0438 \u0441\u0435\u0431\u044f! -Party.IsLocked=[[RED]]\u042d\u0442\u0430 \u0433\u0440\u0443\u043f\u043f\u0430 \u0443\u0436\u0435 \u0437\u0430\u043a\u0440\u044b\u0442\u0430! -Party.IsntLocked=[[RED]]\u042d\u0442\u0430 \u0433\u0440\u0443\u043f\u043f\u0430 \u043d\u0435 \u0437\u0430\u043a\u0440\u044b\u0442\u0430! -Party.Locked=[[RED]]\u0413\u0440\u0443\u043f\u043f\u0430 \u0437\u0430\u043f\u0430\u0440\u043e\u043b\u0435\u043d\u0430, \u0442\u043e\u043b\u044c\u043a\u043e \u043b\u0438\u0434\u0435\u0440 \u0433\u0440\u0443\u043f\u043f\u044b \u043c\u043e\u0436\u0435\u0442 \u043f\u0440\u0438\u0433\u043b\u0430\u0448\u0430\u0442\u044c. -Party.NotInYourParty=[[DARK_RED]]{0} \u043d\u0435 \u0432 \u0433\u0440\u0443\u043f\u043f\u0435 -Party.NotOwner=[[DARK_RED]]\u0412\u044b \u043d\u0435 \u043b\u0438\u0434\u0435\u0440 \u0433\u0440\u0443\u043f\u043f\u044b. -Party.Owner.New=[[GREEN]]{0} \u0442\u0435\u043f\u0435\u0440\u044c \u043d\u043e\u0432\u044b\u0439 \u043b\u0438\u0434\u0435\u0440 \u0433\u0440\u0443\u043f\u043f\u044b. -Party.Owner.NotLeader=[[DARK_RED]]\u0412\u044b \u0431\u043e\u043b\u044c\u0448\u0435 \u043d\u0435 \u043b\u0438\u0434\u0435\u0440 \u0433\u0440\u0443\u043f\u043f\u044b. -Party.Owner.Player=[[GREEN]]\u0422\u0435\u043f\u0435\u0440\u044c \u0432\u044b \u043b\u0438\u0434\u0435\u0440 \u0433\u0440\u0443\u043f\u043f\u044b. -Party.Password.None=[[RED]]\u042d\u0442\u0430 \u0433\u0440\u0443\u043f\u043f\u0430 \u0437\u0430\u0449\u0438\u0449\u0435\u043d\u0430 \u043f\u0430\u0440\u043e\u043b\u0435\u043c. \u041f\u043e\u0436\u0430\u043b\u0443\u0439\u0441\u0442\u0430 \u0432\u0432\u0435\u0434\u0438\u0442\u0435 \u043f\u0430\u0440\u043e\u043b\u044c \u0447\u0442\u043e\u0431\u044b \u043f\u0440\u0438\u0441\u043e\u0435\u0434\u0435\u043d\u0438\u0442\u044c\u0441\u044f. -Party.Password.Incorrect=[[RED]]\u041f\u0430\u0440\u043e\u043b\u044c \u0433\u0440\u0443\u043f\u043f\u044b \u043d\u0435\u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u044b\u0439. -Party.Password.Set=[[GREEN]]\u041f\u0430\u0440\u043e\u043b\u044c \u0433\u0440\u0443\u043f\u043f\u044b \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d {0} -Party.Password.Removed=[[GREEN]]\u041f\u0430\u0440\u043e\u043b\u044c \u0433\u0440\u0443\u043f\u043f\u044b \u0431\u044b\u043b \u0443\u0434\u0430\u043b\u0435\u043d. -Party.Player.Invalid=[[RED]]\u042d\u0442\u043e \u043d\u0435\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u0438\u0433\u0440\u043e\u043a. -Party.NotOnline=[[DARK_RED]]{0} \u043d\u0435 \u0432 \u043e\u043d\u043b\u0430\u0439\u043d\u0435! -Party.Player.InSameParty={0} \u0443\u0436\u0435 \u0432 \u0432\u0430\u0448\u0435\u0439 \u0433\u0440\u0443\u043f\u043f\u0435! -Party.PlayerNotInParty=[[DARK_RED]]{0} \u043d\u0435 \u0441\u043e\u0441\u0442\u043e\u0438\u0442 \u0432 \u0433\u0440\u0443\u043f\u043f\u0435 -Party.Specify=\u0412\u044b \u0434\u043e\u043b\u0436\u043d\u044b \u0443\u043a\u0430\u0437\u0430\u0442\u044c \u0433\u0440\u0443\u043f\u043f\u0443. -Party.Teleport.Dead=\u0412\u044b \u043d\u0435 \u043c\u043e\u0436\u0435\u0442\u0435 \u0442\u0435\u043b\u0435\u043f\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u0441\u044f \u043a \u043c\u0435\u0440\u0442\u0432\u043e\u043c\u0443 \u0438\u0433\u0440\u043e\u043a\u0443. -Party.Teleport.Hurt=\u0412\u0430\u043c \u0431\u044b\u043b \u043d\u0430\u043d\u0435\u0441\u0435\u043d \u0443\u0440\u043e\u043d \u043d\u0430 \u043f\u0440\u043e\u0442\u044f\u0436\u0435\u043d\u0438\u0438 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0445 {0} \u0441\u0435\u043a\u0443\u043d\u0434, \u0442\u0430\u043a \u0447\u0442\u043e \u0432\u044b \u043d\u0435 \u043c\u043e\u0436\u0435\u0442\u0435 \u0442\u0435\u043b\u0435\u043f\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c\u0441\u044f. -Party.Teleport.Player=[[GREEN]]\u0412\u044b \u0442\u0435\u043b\u0435\u043f\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u043b\u0438\u0441\u044c \u043a {0}. -Party.Teleport.Self=\u0412\u044b \u043d\u0435 \u043c\u043e\u0436\u0435\u0442\u0435 \u0442\u0435\u043b\u0435\u043f\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u043a \u0441\u0430\u043c\u043e\u043c\u0443 \u0441\u0435\u0431\u0435! -Party.Teleport.Target=[[GREEN]]{0} \u0442\u0435\u043b\u0435\u043f\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u043b\u0441\u044f \u043a \u0412\u0430\u043c. -Party.Teleport.Disabled=[[RED]]\u0422\u0435\u043b\u0435\u043f\u043e\u0440\u0442\u0430\u0446\u0438\u044f \u043a \u0443\u0447\u0430\u0441\u0442\u043d\u0438\u043a\u0430\u043c \u0433\u0440\u0443\u043f\u043f\u044b {0} \u0437\u0430\u043f\u0440\u0435\u0449\u0435\u043d\u0430 -Party.Rename.Same=[[RED]]\u042d\u0442\u043e \u0443\u0436\u0435 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435\u043c \u0432\u0430\u0448\u0435\u0439 \u0433\u0440\u0443\u043f\u043f\u044b! -Party.Join.Self=[[RED]]\u0412\u044b \u043d\u0435 \u043c\u043e\u0436\u0435\u0442\u0435 \u043f\u0440\u0438\u0441\u043e\u0435\u0434\u0438\u043d\u0438\u0442\u044c\u0441\u044f \u043a \u0441\u0430\u043c\u043e\u043c\u0443 \u0441\u0435\u0431\u0435! -Party.Unlocked=[[GRAY]]\u0413\u0440\u0443\u043f\u043f\u0430 \u0440\u0430\u0437\u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u0430\u043d\u0430 -Party.Disband=[[GRAY]\u0413\u0440\u0443\u043f\u043f\u0430 \u0431\u044b\u043b\u0430 \u0440\u0430\u0441\u043f\u0443\u0449\u0435\u043d\u0430 -Party.Alliance.Formed=[[GRAY]]\u0412\u0430\u0448\u0430 \u0433\u0440\u0443\u043f\u043f\u0430 \u0442\u0435\u043f\u0435\u0440\u044c \u0432 \u0441\u043e\u044e\u0437\u0435 \u0441 [[GREEN]]{0} -Party.Alliance.Disband=[[GRAY]]\u0412\u0430\u0448\u0430 \u0433\u0440\u0443\u043f\u043f\u0430 \u0431\u043e\u043b\u0435\u0435 \u043d\u0435 \u0432 \u0441\u043e\u044e\u0437\u0435 \u0441 [[RED]]{0} -Party.Status.Locked=[[DARK_RED]](\u0422\u041e\u041b\u042c\u041a\u041e \u041f\u041e \u041f\u0420\u0418\u0413\u041b\u0410\u0428\u0415\u041d\u0418\u042e) -Party.LevelUp=[[YELLOW]]\u0423\u0440\u043e\u0432\u0435\u043d\u044c \u0433\u0440\u0443\u043f\u043f\u044b \u0443\u0432\u0435\u043b\u0438\u0447\u0438\u043b\u0441\u044f \u043d\u0430 {0}. \u041e\u0431\u0449\u0438\u0439 ({1}) -Party.Feature.Chat=\u0427\u0430\u0442 \u0433\u0440\u0443\u043f\u043f\u044b -Party.Feature.Teleport=\u0422\u0435\u043b\u0435\u043f\u043e\u0440\u0442 \u0413\u0440\u0443\u043f\u043f\u044b -Party.Feature.Alliance=\u0421\u043e\u044e\u0437\u044b -Party.Feature.ItemShare=\u0420\u0430\u0437\u0434\u0435\u043b\u0435\u043d\u0438\u0435 \u043f\u0440\u0435\u0434\u043c\u0435\u0442\u043e\u0432 -Party.Feature.XpShare=\u0420\u0430\u0437\u0434\u0435\u043b\u0435\u043d\u0438\u0435 \u043e\u043f\u044b\u0442\u0430 -Party.Feature.Locked.Chat=\u0417\u0410\u0411\u041b\u041e\u041a\u0418\u0420\u041e\u0412\u0410\u041d\u041e \u0414\u041e {0}+ (\u0427\u0410\u0422 \u0413\u0420\u0423\u041f\u041f\u042b) -Party.Feature.Locked.Teleport=\u0410\u0411\u041b\u041e\u041a\u0418\u0420\u041e\u0412\u0410\u041d\u041e \u0414\u041e {0}+ (\u0422\u0415\u041b\u0415\u041f\u041e\u0420\u0422 \u0413\u0420\u0423\u041f\u041f\u042b) -Party.Feature.Locked.Alliance=\u0410\u0411\u041b\u041e\u041a\u0418\u0420\u041e\u0412\u0410\u041d\u041e \u0414\u041e {0}+ (\u0421\u041e\u042e\u0417\u042b) -Party.Feature.Locked.ItemShare=\u0410\u0411\u041b\u041e\u041a\u0418\u0420\u041e\u0412\u0410\u041d\u041e \u0414\u041e {0}+ (\u0420\u0410\u0417\u0414\u0415\u041b\u0415\u041d\u0418\u0415 \u041f\u0420\u0415\u0414\u041c\u0415\u0422\u041e\u0412) -Party.Feature.Locked.XpShare=\u0410\u0411\u041b\u041e\u041a\u0418\u0420\u041e\u0412\u0410\u041d\u041e \u0414\u041e {0}+ (\u0420\u0410\u0417\u0414\u0415\u041b\u0415\u041d\u0418\u0415 \u041e\u041f\u042b\u0422\u0410) -Party.Feature.Disabled.1=[[RED]]\u0427\u0430\u0442 \u0433\u0440\u0443\u043f\u043f\u044b \u0435\u0449\u0435 \u043d\u0435 \u0440\u0430\u0437\u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u0430\u043d. -Party.Feature.Disabled.2=[[RED]]\u0422\u0435\u043b\u0435\u043f\u043e\u0440\u0442 \u0433\u0440\u0443\u043f\u043f\u044b \u0435\u0449\u0435 \u043d\u0435 \u0440\u0430\u0437\u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u0430\u043d. -Party.Feature.Disabled.3=[[RED]]\u0421\u043e\u044e\u0437\u044b \u0433\u0440\u0443\u043f\u043f\u044b \u0435\u0449\u0435 \u043d\u0435 \u0440\u0430\u0437\u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u0430\u043d\u044b. -Party.Feature.Disabled.4=[[RED]]\u0420\u0430\u0437\u0434\u0435\u043b\u0435\u043d\u0438\u0435 \u043f\u0440\u0435\u0434\u043c\u0435\u0442\u043e\u0432 \u0432 \u0433\u0440\u0443\u043f\u043f\u0435 \u0435\u0449\u0435 \u043d\u0435 \u0440\u0430\u0437\u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u0430\u043d\u043e. -Party.Feature.Disabled.5=[[RED]]\u0420\u0430\u0437\u0434\u0435\u043b\u0435\u043d\u0438\u0435 \u043e\u043f\u044b\u0442\u0430 \u0432 \u0433\u0440\u0443\u043f\u043f\u0435 \u0435\u0449\u0435 \u043d\u0435 \u0440\u0430\u0437\u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u0430\u043d\u043e. -Party.Status.Unlocked=[[DARK_GREEN]](\u041e\u0422\u041a\u0420\u042b\u0422\u041e) -Party.ShareType.Xp=\u041e\u041f\u042b\u0422 -Party.ShareType.Item=\u041f\u0420\u0415\u0414\u041c\u0415\u0422 -Party.ShareMode.None=\u041d\u0418\u0427\u0415\u0413\u041e -Party.ShareMode.Equal=\u0420\u0410\u0412\u041d\u042b\u0419 -Party.ShareMode.Random=\u0421\u041b\u0423\u0427\u0410\u0419\u041d\u041e -Party.XpShare.Disabled=\u0414\u0435\u043b\u0435\u0436 \u043e\u043f\u044b\u0442\u0430 \u0432 \u0433\u0440\u0443\u043f\u043f\u0435 \u043e\u0442\u043a\u043b\u044e\u0447\u0435\u043d. -Party.ItemShare.Disabled=\u0414\u0435\u043b\u0435\u0436 \u043f\u0440\u0435\u0434\u043c\u0435\u0442\u043e\u0432 \u0432 \u0433\u0440\u0443\u043f\u043f\u0435 \u043e\u0442\u043a\u043b\u044e\u0447\u0435\u043d. -Party.ItemShare.Category.Loot=\u0414\u043e\u0431\u044b\u0447\u0430 -Party.ItemShare.Category.Mining=\u0428\u0430\u0445\u0442\u0451\u0440\u0441\u0442\u0432\u043e -Party.ItemShare.Category.Herbalism=\u0422\u0440\u0430\u0432\u043d\u0438\u0447\u0435\u0441\u0442\u0432\u043e -Party.ItemShare.Category.Woodcutting=\u041b\u0435\u0441\u043e\u0440\u0443\u0431\u0441\u0442\u0432\u043e -Party.ItemShare.Category.Misc=\u0420\u0430\u0437\u043d\u043e\u0435 -##xp -Commands.XPGain.Acrobatics=\u041f\u0440\u044b\u0433\u0430\u0439\u0442\u0435 \u0441 \u0432\u044b\u0441\u043e\u0442\u044b -Commands.XPGain.Alchemy=\u0412\u0430\u0440\u0438\u0442\u0435 \u0417\u0435\u043b\u044c\u044f -Commands.XPGain.Archery=\u0410\u0442\u0430\u043a\u0443\u0439\u0442\u0435 \u041c\u043e\u043d\u0441\u0442\u0440\u043e\u0432 -Commands.XPGain.Axes=\u0410\u0442\u0430\u043a\u0443\u0439\u0442\u0435 \u041c\u043e\u043d\u0441\u0442\u0440\u043e\u0432 -Commands.XPGain.Child=\u041f\u0435\u0440\u0435\u0434\u0430\u0435\u0442 \u0443\u0440\u043e\u0432\u043d\u0438 \u0438\u0437 \u0420\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u0441\u043a\u043e\u0433\u043e \u041d\u0430\u0432\u044b\u043a\u0430 -Commands.XPGain.Excavation=\u0428\u0430\u0445\u0442\u0435\u0440\u0441\u0442\u0432\u043e \u0438 \u043f\u043e\u0438\u0441\u043a \u0441\u043e\u043a\u0440\u043e\u0432\u0438\u0449 -Commands.XPGain.Fishing=\u041d\u0443\u0436\u043d\u043e \u043f\u043e\u0440\u044b\u0431\u0430\u0447\u0438\u0442\u044c -Commands.XPGain.Herbalism=\u0421\u0431\u043e\u0440 \u0440\u0430\u0441\u0442\u0435\u043d\u0438\u0439 -Commands.XPGain.Mining=\u0414\u043e\u0431\u044b\u0432\u0430\u0439\u0442\u0435 \u043a\u0430\u043c\u0435\u043d\u044c \u0438 \u0440\u0443\u0434\u044b -Commands.XPGain.Repair=\u0420\u0435\u043c\u043e\u043d\u0442\u0438\u0440\u0443\u0439\u0442\u0435 \u0432\u0435\u0449\u0438 -Commands.XPGain.Swords=\u0410\u0442\u0430\u043a\u0443\u0439\u0442\u0435 \u041c\u043e\u043d\u0441\u0442\u0440\u043e\u0432 -Commands.XPGain.Taming=\u0423\u043a\u0440\u043e\u0449\u0430\u0439\u0442\u0435 \u0436\u0438\u0432\u043e\u0442\u043d\u044b\u0445 \u0438\u043b\u0438 \u0441\u0440\u0430\u0436\u0430\u0439\u0442\u0435\u0441\u044c \u043f\u0440\u0438 \u043f\u043e\u043c\u043e\u0449\u0438 \u0441\u0432\u043e\u0438\u0445 \u0432\u043e\u043b\u043a\u043e\u0432 -Commands.XPGain.Unarmed=\u0410\u0442\u0430\u043a\u0443\u0439\u0442\u0435 \u041c\u043e\u043d\u0441\u0442\u0440\u043e\u0432 -Commands.XPGain.Woodcutting=\u0420\u0443\u0431\u0438\u0442\u0435 \u0434\u0435\u0440\u0435\u0432\u044c\u044f -Commands.XPGain=[[DARK_GRAY]]\u041f\u041e\u041b\u0423\u0427\u0415\u041d\u041e \u041e\u041f\u042b\u0422\u0410: [[WHITE]]{0} -Commands.xplock.locked=[[GOLD]]\u0412\u0430\u0448\u0430 \u041f\u0430\u043d\u0435\u043b\u044c \u041e\u043f\u044b\u0442\u0430 \u0442\u0435\u043f\u0435\u0440\u044c \u0437\u0430\u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u0430\u043d\u0430 \u043d\u0430 {0}! -Commands.xplock.unlocked=[[GOLD]]\u0412\u0430\u0448\u0430 \u043f\u0430\u043d\u0435\u043b\u044c \u043e\u043f\u044b\u0442\u0430 \u0442\u0435\u043f\u0435\u0440\u044c [[GREEN]]\u0420\u0410\u0417\u0411\u041b\u041e\u041a\u0418\u0420\u041e\u0412\u0410\u041d\u0410[[GOLD]]! -Commands.xprate.modified=\u0412\u0430\u0448 \u0423\u0440\u043e\u0432\u0435\u043d\u044c \u041e\u043f\u044b\u0442\u0430 \u0431\u044b\u043b \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d \u043d\u0430 {0} -Commands.xprate.over=\u041f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435 \u043e\u043f\u044b\u0442\u0430 \u0441\u043d\u043e\u0432\u0430 \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u0432 \u043e\u0431\u044b\u0447\u043d\u043e\u043c \u0440\u0435\u0436\u0438\u043c\u0435! -Commands.xprate.proper.0=\u0427\u0442\u043e\u0431\u044b \u0438\u0437\u043c\u0435\u043d\u0438\u0442\u044c \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u044c \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u043e\u043f\u044b\u0442\u0430 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0439\u0442\u0435 /xprate -Commands.xprate.proper.1=\u0427\u0442\u043e\u0431\u044b \u0432\u043e\u0441\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u0443\u044e \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u044c \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u043e\u043f\u044b\u0442\u0430 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0439\u0442\u0435 /xprate reset -Commands.xprate.proper.2=\u041f\u043e\u0436\u0430\u043b\u0443\u0439\u0441\u0442\u0430, \u0432\u044b\u0431\u0435\u0440\u0438\u0442\u0435 true \u0438\u043b\u0438 false \u0447\u0442\u043e\u0431\u044b \u0443\u043a\u0430\u0437\u0430\u0442\u044c \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043b\u0438 \u044d\u0442\u043e \u0440\u0435\u0436\u0438\u043c\u043e\u043c \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u043d\u043e\u0433\u043e \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u043e\u043f\u044b\u0442\u0430 -Commands.NegativeNumberWarn=\u041d\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0439\u0442\u0435 \u043e\u0442\u0440\u0438\u0446\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0435 \u0447\u0438\u0441\u043b\u0430! -Commands.Event.Start=[[GREEN]]mcMMO[[GOLD]] \u0421\u043e\u0431\u044b\u0442\u0438\u0435! -Commands.Event.Stop=[[GREEN]]mcMMO[[DARK_AQUA]] \u0421\u043e\u0431\u044b\u0442\u0438\u0435 \u0417\u0430\u043a\u043e\u043d\u0447\u0438\u043b\u043e\u0441\u044c! -Commands.Event.Stop.Subtitle=[[GREEN]]\u041d\u0430\u0434\u0435\u044e\u0441\u044c \u0442\u044b \u043f\u043e\u0432\u0435\u0441\u0435\u043b\u0438\u043b\u0441\u044f! -Commands.Event.XP=[[DARK_AQUA]]\u041c\u043e\u0434\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440 \u043e\u043f\u044b\u0442\u0430 \u0441\u0435\u0439\u0447\u0430\u0441 [[GOLD]]{0}[[DARK_AQUA]]x -Commands.xprate.started.0=[[GOLD]]\u0421\u041a\u041e\u0420\u041e\u0421\u0422\u042c \u041f\u041e\u041b\u0423\u0427\u0415\u041d\u0418\u042f \u041e\u041f\u042b\u0422\u0410 \u0423\u0412\u0415\u041b\u0418\u0427\u0415\u041d\u0410! -Commands.xprate.started.1=[[GOLD]]\u0421\u043a\u043e\u0440\u043e\u0441\u0442\u044c \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u043e\u043f\u044b\u0442\u0430 \u0441\u0435\u0439\u0447\u0430\u0441 {0}x! - -# Admin Notifications -Server.ConsoleName=[[YELLOW]][\u0421\u0435\u0440\u0432\u0435\u0440] -Notifications.Admin.XPRate.Start.Self=[[GRAY]]\u0412\u044b \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u043b\u0438 \u0433\u043b\u043e\u0431\u0430\u043b\u044c\u043d\u044b\u0439 \u043c\u043d\u043e\u0436\u0438\u0442\u0435\u043b\u044c \u043e\u043f\u044b\u0442\u0430 \u043d\u0430 [[GOLD]]{0}x -Notifications.Admin.XPRate.End.Self=[[GRAY]]\u0412\u044b \u0437\u0430\u043a\u043e\u043d\u0447\u0438\u043b\u0438 \u0441\u043e\u0431\u044b\u0442\u0438\u0435 \u043c\u043d\u043e\u0436\u0438\u0442\u0435\u043b\u044f \u043e\u043f\u044b\u0442\u0430. -Notifications.Admin.XPRate.End.Others={0} [[GRAY]]\u0437\u0430\u043a\u043e\u043d\u0447\u0438\u043b \u0441\u043e\u0431\u044b\u0442\u0438\u0435 \u043c\u043d\u043e\u0436\u0438\u0442\u0435\u043b\u044f \u043e\u043f\u044b\u0442\u0430 -Notifications.Admin.XPRate.Start.Others={0} [[GRAY]]\u043d\u0430\u0447\u0430\u043b \u0438\u043b\u0438 \u0438\u0437\u043c\u0435\u043d\u0438\u043b \u0441\u043e\u0431\u044b\u0442\u0438\u0435 \u0441 \u043c\u043d\u043e\u0438\u0436\u0438\u0442\u0435\u043b\u0435\u043c \u043e\u043f\u044b\u0442\u0430 {1}x -Notifications.Admin.Format.Others=[[GOLD]]([[GREEN]]mcMMO [[DARK_AQUA]]Admin[[GOLD]]) [[GRAY]]{0} -Notifications.Admin.Format.Self=[[GOLD]]([[GREEN]]mcMMO[[GOLD]]) [[GRAY]]{0} - -# Event -XPRate.Event=[[GOLD]]\u041f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435 \u043e\u043f\u044b\u0442\u0430 \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e \u0443\u0432\u0435\u043b\u0438\u0447\u0435\u043d\u043e! \u041c\u043d\u043e\u0436\u0438\u0442\u0435\u043b\u044c \u043e\u043f\u044b\u0442\u0430 - {0}x! - -#GUIDES -Guides.Available=[[GRAY]]\u0420\u0443\u043a\u043e\u0432\u043e\u0434\u0441\u0442\u0432\u043e \u0434\u043b\u044f {0} \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u043e - \u043d\u0430\u043f\u0438\u0448\u0438\u0442\u0435 /{1} ? [\u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0430] -Guides.Header=[[GOLD]]-=[[GREEN]]{0} \u0420\u0443\u043a\u043e\u0432\u043e\u0434\u0441\u0442\u0432\u043e[[GOLD]]=- -Guides.Page.Invalid=\u041d\u0435\u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u044b\u0439 \u043d\u043e\u043c\u0435\u0440 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b! -Guides.Page.OutOfRange=\u042d\u0442\u0430 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0430 \u043d\u0435 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442, \u0432\u0441\u0435\u0433\u043e \u0435\u0441\u0442\u044c {0} \u0441\u0442\u0440\u0430\u043d\u0438\u0446. -Guides.Usage= \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0439\u0442\u0435 /{0} ? [\u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0430] -##Acrobatics -Guides.Acrobatics.Section.0=[[DARK_AQUA]]\u041e \u043d\u0430\u0432\u044b\u043a\u0435 \u0410\u043a\u0440\u043e\u0431\u0430\u0442\u0438\u043a\u0430:\n[[YELLOW]]\u0410\u043a\u0440\u043e\u0431\u0430\u0442\u0438\u043a\u0430 - \u044d\u0442\u043e \u043d\u0430\u0432\u044b\u043a \u0433\u0440\u0430\u0446\u0438\u043e\u0437\u043d\u043e\u0433\u043e \u043f\u0435\u0440\u0435\u0434\u0432\u0438\u0436\u0435\u043d\u0438\u044f \u0432 mcMMO.\n[[YELLOW]]\u041e\u043d \u0434\u0430\u0435\u0442 \u0431\u043e\u043d\u0443\u0441\u044b \u0432 \u0431\u043e\u044e \u0438 \u0437\u0430\u0449\u0438\u0449\u0430\u0435\u0442 \u043e\u0442 \u043f\u0440\u0438\u0440\u043e\u0434\u043d\u044b\u0445 \u043f\u043e\u0432\u0440\u0435\u0436\u0434\u0435\u043d\u0438\u0439.\n\n[[DARK_AQUA]]\u041f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435 \u043e\u043f\u044b\u0442\u0430:\n[[YELLOW]]\u0427\u0442\u043e\u0431\u044b \u043f\u043e\u043b\u0443\u0447\u0430\u0442\u044c \u043e\u043f\u044b\u0442 \u0432 \u044d\u0442\u043e\u043c \u043d\u0430\u0432\u044b\u043a\u0435, \u043d\u0443\u0436\u043d\u043e \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0442\u044c \u0443\u043a\u043b\u043e\u043d\u0435\u043d\u0438\u044f \n[[YELLOW]]\u0432 \u0431\u043e\u044e \u0438\u043b\u0438 \u043f\u0430\u0434\u0430\u0442\u044c \u0441 \u0431\u043e\u043b\u044c\u0448\u043e\u0439 \u0432\u044b\u0441\u043e\u0442\u044b, \u043f\u043e\u043b\u0443\u0447\u0430\u044f \u0443\u0440\u043e\u043d. -Guides.Acrobatics.Section.1=[[DARK_AQUA]]\u041a\u0430\u043a \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0443\u043c\u0435\u043d\u0438\u0435 \u041f\u0440\u044b\u0436\u043e\u043a?\n[[YELLOW]]\u0423 \u0432\u0430\u0441 \u0435\u0441\u0442\u044c \u0448\u0430\u043d\u0441 \u0441\u0432\u0435\u0441\u0442\u0438 \u043d\u0430 \u043d\u0435\u0442 \u0443\u0440\u043e\u043d \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u043d\u044b\u0439 \u043f\u0440\u0438 \u043f\u0430\u0434\u0435\u043d\u0438\u0438.\n[[YELLOW]]\u0415\u0441\u043b\u0438 \u0432\u043e \u0432\u0440\u0435\u043c\u044f \u043f\u0440\u044b\u0436\u043a\u0430 \u0434\u0435\u0440\u0436\u0430\u0442\u044c \u043a\u043d\u043e\u043f\u043a\u0443 \u043a\u0440\u0430\u0441\u0442\u044c\u0441\u044f (Left Shift),\n[[YELLOW]]\u0442\u043e \u043c\u043e\u0436\u043d\u043e \u0443\u0434\u0432\u043e\u0438\u0442\u044c \u044d\u0442\u043e\u0442 \u0448\u0430\u043d\u0441.\n[[YELLOW]]\u042d\u0442\u043e \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0435 \u0432\u044b\u0437\u043e\u0432\u0435\u0442 \u0418\u0437\u044f\u0449\u043d\u044b\u0439 \u041f\u0440\u044b\u0436\u043e\u043a \u0432\u043c\u0435\u0441\u0442\u043e \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u043e\u0433\u043e.\n[[YELLOW]]\u0418\u0437\u044f\u0449\u043d\u044b\u0435 \u041f\u0440\u044b\u0436\u043a\u0438 \u043f\u043e\u0445\u043e\u0436\u0438 \u043d\u0430 \u043e\u0431\u044b\u0447\u043d\u044b\u0435, \u043d\u043e \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u044f\u0442 \u0432 \u0434\u0432\u0430\n[[YELLOW]]\u0440\u0430\u0437\u0430 \u0440\u0435\u0436\u0435 \u0438 \u0434\u0430\u044e\u0442 \u0431\u043e\u043b\u044c\u0448\u0443\u044e \u0437\u0430\u0449\u0438\u0442\u0443 \u043f\u0440\u0438 \u043f\u0430\u0434\u0435\u043d\u0438\u0438.\n[[YELLOW]]\u0428\u0430\u043d\u0441 \u043d\u0430 \u0443\u0434\u0430\u0447\u043d\u044b\u0439 \u043f\u0440\u044b\u0436\u043e\u043a \u0437\u0430\u0432\u0438\u0441\u0438\u0442 \u043e\u0442 \u0432\u0430\u0448\u0435\u0433\u043e \u0443\u0440\u043e\u0432\u043d\u044f \u043d\u0430\u0432\u044b\u043a\u0430. -Guides.Acrobatics.Section.2=[[DARK_AQUA]]\u041a\u0430\u043a \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0443\u043c\u0435\u043d\u0438\u0435 \u0423\u043a\u043b\u043e\u043d\u0435\u043d\u0438\u0435?\n[[YELLOW]]\u0411\u043b\u0430\u0433\u043e\u0434\u0430\u0440\u044f \u044d\u0442\u043e\u043c\u0443 \u0443\u043c\u0435\u043d\u0438\u044e \u0443 \u0432\u0430\u0441 \u0435\u0441\u0442\u044c \u043f\u0430\u0441\u0441\u0438\u0432\u043d\u044b\u0439 \u0448\u0430\u043d\u0441 \u0443\u043a\u043b\u043e\u043d\u0438\u0442\u044c\u0441\u044f\n[[YELLOW]]\u0432\u043e \u0432\u0440\u0435\u043c\u044f \u0431\u044b\u0442\u0432\u044b, \u0447\u0442\u043e \u0432\u0434\u0432\u043e\u0435 \u0443\u043c\u0435\u043d\u044c\u0448\u0438\u0442 \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u043d\u044b\u0439 \u0443\u0440\u043e\u043d.\n[[YELLOW]]\u0428\u0430\u043d\u0441 \u043d\u0430 \u0443\u0434\u0430\u0447\u043d\u043e\u0435 \u0443\u043a\u043b\u043e\u043d\u0435\u043d\u0438\u0435 \u0437\u0430\u0432\u0438\u0441\u0438\u0442 \u043e\u0442 \u0432\u0430\u0448\u0435\u0433\u043e \u0443\u0440\u043e\u0432\u043d\u044f \u043d\u0430\u0432\u044b\u043a\u0430. -##Alchemy -Guides.Alchemy.Section.0=[[DARK_AQUA]]\u041e \u043d\u0430\u0432\u044b\u043a\u0435 \u0410\u043b\u0445\u0438\u043c\u0438\u044f:\n[[YELLOW]]Alchemy is about brewing potions.\n[[YELLOW]]It provides a speed increase in the potion brew time, as well\n[[YELLOW]]as the addition of new (previously) unobtainable potions.\n\n\n[[DARK_AQUA]]XP GAIN:\n[[YELLOW]]To gain XP in this skill you need to brew potions. -Guides.Alchemy.Section.1=[[DARK_AQUA]]\u041a\u0430\u043a \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u041a\u0430\u0442\u0430\u043b\u0438\u0437\u0430\u0442\u043e\u0440?\n[[YELLOW]]\u041a\u0430\u0442\u0430\u043b\u0438\u0437\u0430\u0442\u043e\u0440 \u0443\u0441\u043a\u043e\u0440\u044f\u0435\u0442 \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u0433\u043e\u0442\u043e\u0432\u043a\u0438, \u0441 a\n[[YELLOW]]\u043c\u0430\u043a\u0441. \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u044c\u044e 4x \u043d\u0430 \u0443\u0440\u043e\u0432\u043d\u0435 1000.\n[[YELLOW]]\u042d\u0442\u0430 \u0441\u043f\u043e\u0441\u043e\u0431\u043d\u043e\u0441\u0442\u044c \u0440\u0430\u0437\u0431\u043b\u043e\u043a\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u043d\u0430 \u0443\u0440\u043e\u0432\u043d\u0435 100 \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e. -Guides.Alchemy.Section.2=[[DARK_AQUA]]\u041a\u0430\u043a \u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0442 \u043e\u0442\u0432\u0430\u0440\u044b?\n[[YELLOW]]\u041e\u0442\u0432\u0430\u0440\u044b \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u044e\u0442 \u0432\u0430\u0440\u0438\u0442\u044c \u0431\u043e\u043b\u044c\u0448\u0435 \u0437\u0435\u043b\u0438\u0439 \u0441 \u043d\u043e\u0432\u044b\u043c\u0438 \u0438\u043d\u0433\u0440\u0438\u0434\u0438\u0435\u043d\u0442\u0430\u043c\u0438.\n[[YELLOW]]\u041e\u0442 \u0432\u0430\u0448\u0435\u0433\u043e \u0440\u0430\u043d\u0433\u0430 \u0437\u0430\u0432\u0438\u0441\u0438\u0442 \u043a\u0430\u043a\u0438\u0435 \u0438\u043d\u0433\u0440\u0438\u0434\u0438\u0435\u043d\u0442\u044b\n[[YELLOW]]\u0431\u0443\u0434\u0443\u0442 \u0440\u0430\u0437\u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u0430\u043d\u044b. \u0412\u0441\u0435\u0433\u043e \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u043e 8 \u0440\u0430\u043d\u0433\u043e\u0432. -Guides.Alchemy.Section.3=[[DARK_AQUA]]\u041e\u0442\u0432\u0430\u0440\u044b 1 \u0442\u0438\u0440\u0430 (\u0438\u043d\u0433\u0440\u0438\u0434\u0438\u0435\u043d\u0442\u044b):\n[[YELLOW]]\u041e\u0433\u043d\u0435\u043d\u043d\u044b\u0439 \u043f\u043e\u0440\u043e\u0448\u043e\u043a, \u041f\u0440\u0438\u0433\u043e\u0442\u043e\u0432\u043b\u0435\u043d\u043d\u044b\u0439 \u043f\u0430\u0443\u0447\u0438\u0439 \u0433\u043b\u0430\u0437, \u0421\u043b\u0435\u0437\u0430 \u0433\u0430\u0441\u0442\u0430, \u0420\u0435\u0434\u0441\u0442\u043e\u0443\u043d,\n[[YELLOW]]\u0421\u0432\u0435\u0442\u043e\u043f\u044b\u043b\u044c, \u0421\u0430\u0445\u0430\u0440, \u0421\u0432\u0435\u0440\u043a\u0430\u044e\u0449\u0438\u0439 \u043b\u043e\u043c\u0442\u0438\u043a \u0430\u0440\u0431\u0443\u0437\u0430, \u0417\u043e\u043b\u043e\u0442\u0430\u044f \u041c\u043e\u0440\u043a\u043e\u0432\u044c,\n[[YELLOW]]\u041b\u0430\u0432\u043e\u0432\u044b\u0439 \u043a\u0440\u0435\u043c, \u0410\u0434\u0441\u043a\u0438\u0439 \u043d\u0430\u0440\u043e\u0441\u0442, \u041f\u0430\u0443\u0447\u0438\u0439 \u0433\u043b\u0430\u0437, \u041f\u043e\u0440\u043e\u0445, \u041a\u0443\u0432\u0448\u0438\u043d\u043a\u0430,\n[[YELLOW]]\u0418\u0433\u043b\u043e\u0431\u0440\u044e\u0445\n[[YELLOW]](\u0421\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u044b\u0435 \u0437\u0435\u043b\u044c\u044f) -Guides.Alchemy.Section.4=[[DARK_AQUA]]\u041e\u0442\u0432\u0430\u0440\u044b 2 \u0442\u0438\u0440\u0430 (\u0438\u043d\u0433\u0440\u0438\u0434\u0438\u0435\u043d\u0442\u044b):\n[[YELLOW]]\u041c\u043e\u0440\u043a\u043e\u0432\u044c (\u0417\u0435\u043b\u044c\u0435 \u0421\u043a\u043e\u0440\u043e\u0441\u0442\u0438)\n[[YELLOW]]\u0421\u043b\u0438\u0437\u044c (\u0417\u0435\u043b\u044c\u0435 \u0422\u0443\u043f\u043e\u0441\u0442\u0438)\n\n[[DARK_AQUA]]\u041e\u0442\u0432\u0430\u0440\u044b 3 \u0442\u0438\u0440\u0430 (\u0438\u043d\u0433\u0440\u0438\u0434\u0438\u0435\u043d\u0442\u044b):\n[[YELLOW]]\u041a\u0432\u0430\u0440\u0446 (\u0417\u0435\u043b\u044c\u0435 \u041f\u043e\u0433\u043b\u043e\u0449\u0435\u043d\u0438\u044f)\n[[YELLOW]]\u041a\u0440\u0430\u0441\u043d\u044b\u0439 \u0413\u0440\u0438\u0431 (\u0417\u0435\u043b\u044c\u0435 \u041f\u0440\u044b\u0433\u0443\u0447\u0435\u0441\u0442\u0438) -Guides.Alchemy.Section.5=[[DARK_AQUA]]\u041e\u0442\u0432\u0430\u0440\u044b 4 \u0442\u0438\u0440\u0430 (\u0438\u043d\u0433\u0440\u0438\u0434\u0438\u0435\u043d\u0442\u044b):\n[[YELLOW]]\u042f\u0431\u043b\u043e\u043a\u043e (\u0417\u0435\u043b\u044c\u0435 \u0414\u043e\u043f. \u0417\u0434\u043e\u0440\u043e\u0432\u044c\u044f)\n[[YELLOW]]\u0413\u043d\u0438\u043b\u0430\u044f \u041f\u043b\u043e\u0442\u044c (\u0417\u0435\u043b\u044c\u0435 \u0413\u043e\u043b\u043e\u0434\u0430)\n\n[[DARK_AQUA]]\u041e\u0442\u0432\u0430\u0440\u044b 5 \u0442\u0438\u0440\u0430 (\u0438\u043d\u0433\u0440\u0438\u0434\u0438\u0435\u043d\u0442\u044b):\n[[YELLOW]]\u041a\u043e\u0440\u0438\u0447\u043d\u0435\u0432\u044b\u0439 \u0413\u0440\u0438\u0431 (\u0417\u0435\u043b\u044c\u0435 \u0422\u043e\u0448\u043d\u043e\u0442\u044b)\n[[YELLOW]]\u0427\u0435\u0440\u043d\u0438\u043b\u044c\u043d\u044b\u0439 \u041c\u0435\u0448\u043e\u043a (\u0417\u0435\u043b\u044c\u0435 \u041e\u0441\u043b\u0435\u043f\u043b\u0435\u043d\u0438\u044f) -Guides.Alchemy.Section.6=[[DARK_AQUA]]\u041e\u0442\u0432\u0430\u0440\u044b 6 \u0442\u0438\u0440\u0430 (\u0438\u043d\u0433\u0440\u0438\u0434\u0438\u0435\u043d\u0442\u044b):\n[[YELLOW]]\u0412\u044b\u0441\u043e\u043a\u0430\u044f \u0422\u0440\u0430\u0432\u0430 (\u0417\u0435\u043b\u044c\u0435 \u041d\u0430\u0441\u044b\u0449\u0435\u043d\u0438\u044f)\n\n[[DARK_AQUA]]\u041e\u0442\u0432\u0430\u0440\u044b 7 \u0442\u0438\u0440\u0430 (\u0438\u043d\u0433\u0440\u0438\u0434\u0438\u0435\u043d\u0442\u044b):\n[[YELLOW]]\u042f\u0434\u043e\u0432\u0438\u0442\u044b\u0435 \u041a\u0430\u0440\u0442\u043e\u0444\u0435\u043b\u044c (\u0417\u0435\u043b\u044c\u0435 \u0417\u0430\u0433\u043d\u0438\u0432\u0430\u043d\u0438\u044f)\n\n[[DARK_AQUA]]\u041e\u0442\u0432\u0430\u0440\u044b 8 \u0442\u0438\u0440\u0430 (\u0438\u043d\u0433\u0440\u0438\u0434\u0438\u0435\u043d\u0442\u044b):\n[[YELLOW]]\u041e\u0431\u044b\u0447\u043d\u043e\u0435 \u0417\u043e\u043b\u043e\u0442\u043e\u0435 \u042f\u0431\u043b\u043e\u043a\u043e (\u0417\u0435\u043b\u044c\u0435 \u0417\u0430\u0449\u0438\u0442\u044b) -##Archery -Guides.Archery.Section.0=[[DARK_AQUA]]\u041e \u043d\u0430\u0432\u044b\u043a\u0435 \u041b\u0443\u043a\u0438:\n[[YELLOW]]\u041d\u0430\u0432\u044b\u043a \u0432\u043b\u0430\u0434\u0435\u043d\u0438\u044f \u041b\u0443\u043a\u043e\u043c \u0434\u0430\u0435\u0442 \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u0435 \u0431\u043e\u043d\u0443\u0441\u044b, \u0442\u0430\u043a\u0438\u0435 \u043a\u0430\u043a\n[[YELLOW]]\u0443\u0432\u0435\u043b\u0438\u0447\u0435\u043d\u0438\u0435 \u0443\u0440\u043e\u043d\u0430, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0437\u0430\u0432\u0438\u0441\u0438\u0442 \u043e\u0442 \u0443\u0440\u043e\u0432\u043d\u044f \u043d\u0430\u0432\u044b\u043a\u0430 \u0432\u043b\u0430\u0434\u0435\u043d\u0438\u044f \u041b\u0443\u043a\u043e\u043c,\n[[YELLOW]]\u0438\u043b\u0438 \u0443\u043c\u0435\u043d\u0438\u0435 \u0448\u043e\u043a\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0432\u0430\u0448\u0438\u0445 \u043e\u043f\u043f\u043e\u043d\u0435\u043d\u0442\u043e\u0432 \u0432 \u041f\u0432\u041f.\n[[YELLOW]]\u0422\u0430\u043a\u0436\u0435 \u0432\u044b \u0441\u043c\u043e\u0436\u0435\u0442\u0435 \u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0432\u0430\u0448\u0438 \u0441\u0442\u0440\u0435\u043b\u044b \u0438\u0437 \u043f\u043e\u0432\u0435\u0440\u0436\u0435\u043d\u043d\u044b\u0445 \u0432\u0440\u0430\u0433\u043e\u0432.\n\n[[DARK_AQUA]]\u041f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435 \u043e\u043f\u044b\u0442\u0430:\n[[YELLOW]]\u0427\u0442\u043e\u0431\u044b \u043f\u043e\u043b\u0443\u0447\u0430\u0442\u044c \u043e\u043f\u044b\u0442 \u0437\u0430 \u044d\u0442\u043e\u0442 \u043d\u0430\u0432\u044b\u043a \u0441\u0442\u0440\u0435\u043b\u044f\u0439\u0442\u0435 \u0432 \u043c\u043e\u0431\u043e\u0432 \u0438\u043b\u0438 \u0434\u0440\u0443\u0433\u0438\u0445 \u0438\u0433\u0440\u043e\u043a\u043e\u0432. -Guides.Archery.Section.1=[[DARK_AQUA]]\u041a\u0430\u043a \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0443\u043c\u0435\u043d\u0438\u0435 \u0423\u043c\u0435\u043b\u044b\u0439 \u0412\u044b\u0441\u0442\u0440\u0435\u043b?\n[[YELLOW]]\u0423\u043c\u0435\u043b\u044b\u0439 \u0412\u044b\u0441\u0442\u0440\u0435\u043b \u0434\u0430\u0435\u0442 \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u0443\u0440\u043e\u043d \u043f\u0440\u0438 \u0441\u0442\u0440\u0435\u043b\u044c\u0431\u0435.\n[[YELLOW]]\u0414\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u0443\u0440\u043e\u043d \u043f\u0440\u0438 \u0423\u043c\u0435\u043b\u043e\u043c \u0412\u044b\u0441\u0442\u0440\u0435\u043b\u0435 \u0440\u0430\u0441\u0442\u0435\u0442 \u0443\u0440\u043e\u0432\u043d\u0435\u043c\n[[YELLOW]]\u043d\u0430\u0432\u044b\u043a\u0430 \u0432\u043b\u0430\u0434\u0435\u043d\u0438\u044f \u041b\u0443\u043a\u043e\u043c. \u041f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e, \u0443\u0440\u043e\u043d \u043e\u0442 \u0441\u0442\u0440\u0435\u043b\u044c\u0431\u044b \n[[YELLOW]]\u0443\u0432\u0435\u043b\u0438\u0447\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u043d\u0430 10% \u043a\u0430\u0436\u0434\u044b\u0435 50 \u0443\u0440\u043e\u0432\u043d\u0435\u0439, \u0434\u043e \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0433\u043e\n[[YELLOW]]\u043f\u043e\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044f \u0432 200% \u0431\u043e\u043d\u0443\u0441\u043d\u043e\u0433\u043e \u0443\u0440\u043e\u043d\u0430. -Guides.Archery.Section.2=[[DARK_AQUA]]\u041a\u0430\u043a \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0443\u043c\u0435\u043d\u0438\u0435 \u0428\u043e\u043a\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435?\n[[YELLOW]]\u0412\u044b \u0438\u043c\u0435\u0435\u0442\u0435 \u043f\u0430\u0441\u0441\u0438\u0432\u043d\u044b\u0439 \u0448\u0430\u043d\u0441 \u0448\u043e\u043a\u0438\u0440\u043e\u0432\u0442\u044c \u0434\u0440\u0443\u0433\u0438\u0445 \u0438\u0433\u0440\u043e\u043a\u043e\u0432,\n[[YELLOW]]\u0441\u0442\u0440\u0435\u043b\u044f\u044f \u0432 \u043d\u0438\u0445. \u0428\u043e\u043a\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0432\u044b\u043d\u0443\u0436\u0434\u0430\u0435\u0442 \u0432\u0430\u0448\u0435\u0433\u043e \u043e\u043f\u043f\u043e\u043d\u0435\u043d\u0442\u0430 \n[[YELLOW]]\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u0441\u0442\u0440\u043e\u0433\u043e \u0432\u0432\u0435\u0440\u0445 \u043d\u0430 \u043f\u0440\u043e\u0442\u044f\u0436\u0435\u043d\u0438\u0438 \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u0438.\n[[YELLOW]]\u0428\u043e\u043a\u0438\u0440\u0443\u044e\u0449\u0438\u0439 \u0432\u044b\u0441\u0442\u0440\u0435\u043b \u0442\u0430\u043a\u0436\u0435 \u043d\u0430\u043d\u043e\u0441\u0438\u0442 +4 \u0443\u0440\u043e\u043d\u0430. -Guides.Archery.Section.3=[[DARK_AQUA]]\u041a\u0430\u043a \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0443\u043c\u0435\u043d\u0438\u0435 \u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0435\u043d\u0438\u0435 \u0421\u0442\u0440\u0435\u043b?\n[[YELLOW]]\u0412\u044b \u0438\u043c\u0435\u0435\u0442\u0435 \u043f\u0430\u0441\u0441\u0438\u0432\u043d\u044b\u0439 \u0448\u0430\u043d\u0441 \u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0441\u0432\u043e\u0438 \u0441\u0442\u0440\u0435\u043b\u044b, \u043a\u043e\u0433\u0434\u0430\n[[YELLOW]]\u0443\u0431\u0438\u0432\u0430\u0435\u0442\u0435 \u043c\u043e\u0431\u0430 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0432\u0430\u0448\u0435\u0433\u043e \u043b\u0443\u043a\u0430. \u042d\u0442\u043e\u0442 \u0448\u0430\u043d\u0441 \u0440\u0430\u0441\u0442\u0435\u0442\n[[YELLOW]]\u0441 \u0443\u0440\u043e\u0432\u043d\u0435\u043c \u043d\u0430\u0432\u044b\u043a\u0430 \u0432\u043b\u0430\u0434\u0435\u043d\u0438\u044f \u041b\u0443\u043a\u043e\u043c. \u041f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e, \u044d\u0442\u043e\n[[YELLOW]]\u0443\u043c\u0435\u043d\u0438\u0435 \u0440\u0430\u0441\u0442\u0435\u0442 \u043d\u0430 0.1% \u0441 \u043a\u0430\u0436\u0434\u044b\u043c \u0443\u0440\u043e\u0432\u043d\u0435\u043c, \u0434\u043e \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u044b\u0445\n[[YELLOW]]100% \u043d\u0430 1000 \u0443\u0440\u043e\u0432\u043d\u0435. -##Axes -Guides.Axes.Section.0=[[DARK_AQUA]]\u041e \u043d\u0430\u0432\u044b\u043a\u0435 \u0422\u043e\u043f\u043e\u0440\u044b:\n[[YELLOW]]\u0421 \u044d\u0442\u0438\u043c \u043d\u0430\u0432\u044b\u043a\u043e\u043c \u0432\u044b \u0441\u043c\u043e\u0436\u0435\u0442\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0441\u0432\u043e\u0439 \u0442\u043e\u043f\u043e\u0440 \u043d\u0435 \u0442\u043e\u043b\u044c\u043a\u043e\n[[YELLOW]]\u0434\u043b\u044f \u0440\u0443\u0431\u043a\u0438 \u043b\u0435\u0441\u0430! \u0412\u044b \u0442\u0430\u043a\u0436\u0435 \u043c\u043e\u0436\u0435\u0442\u0435 \u043a\u0440\u043e\u043c\u0441\u0430\u0442\u044c \u043c\u043e\u0431\u043e\u0432\n[[YELLOW]]\u0438 \u0438\u0433\u0440\u043e\u043a\u043e\u0432 \u0434\u043b\u044f \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u043e\u043f\u044b\u0442\u0430, \u043d\u0430\u043d\u043e\u0441\u0438\u0442\u044c \u0438\u043c \u0441\u043c\u0435\u0440\u0442\u0435\u043b\u044c\u043d\u044b\u0435\n[[YELLOW]]\u043a\u0440\u0438\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0435 \u043f\u043e\u0432\u0440\u0435\u0436\u0434\u0435\u043d\u0438\u044f \u0438 \u043e\u0442\u0431\u0440\u0430\u0441\u044b\u0432\u0430\u0442\u044c \u043e\u0442 \u0441\u0435\u0431\u044f.\n[[YELLOW]]\u0422\u0430\u043a\u0436\u0435 \u0432\u0430\u0448 \u0442\u043e\u043f\u043e\u0440 \u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u0441\u044f \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u043e\u043c \u0434\u043b\u044f \u0431\u044b\u0441\u0442\u0440\u043e\u0433\u043e \u0438\n[[YELLOW]]\u043b\u0435\u0433\u043a\u043e\u0433\u043e \u0440\u0430\u0437\u0440\u0443\u0448\u0435\u043d\u0438\u044f \u0431\u0440\u043e\u043d\u0438 \u043f\u0440\u043e\u0442\u0438\u0432\u043d\u0438\u043a\u043e\u0432.\n[[YELLOW]]\u0427\u0435\u043c \u0432\u044b\u0448\u0435 \u0432\u0430\u0448 \u0443\u0440\u043e\u0432\u0435\u043d\u044c \u043d\u0430\u0432\u044b\u043a\u0430, \u0442\u0435\u043c \u0431\u044b\u0441\u0442\u0440\u0435\u0435 \u0440\u0430\u0437\u0440\u0443\u0448\u0430\u0435\u0442\u0441\u044f \u0431\u0440\u043e\u043d\u044f.\n[[DARK_AQUA]]\u041f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435 \u043e\u043f\u044b\u0442\u0430:\n[[YELLOW]]\u0427\u0442\u043e\u0431\u044b \u043f\u043e\u043b\u0443\u0447\u0430\u0442\u044c \u043e\u043f\u044b\u0442 \u0432 \u044d\u0442\u043e\u043c \u043d\u0430\u0432\u044b\u043a\u0435, \u0432\u044b \u0434\u043e\u043b\u0436\u043d\u044b \u0442\u043e\u043f\u043e\u0440\u043e\u043c \n[[YELLOW]]\u043d\u0430\u043d\u043e\u0441\u0438\u0442\u044c \u043f\u043e\u0432\u0440\u0435\u0436\u0434\u0435\u043d\u0438\u044f \u043c\u043e\u0431\u0430\u043c \u0438\u043b\u0438 \u0434\u0440\u0443\u0433\u0438\u043c \u0438\u0433\u0440\u043e\u043a\u0430\u043c. -Guides.Axes.Section.1=[[DARK_AQUA]]\u041a\u0430\u043a \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0443\u043c\u0435\u043d\u0438\u0435 \u0420\u0430\u0441\u043a\u0430\u043b\u044b\u0432\u0430\u0442\u0435\u043b\u044c \u0427\u0435\u0440\u0435\u043f\u043e\u0432?\n[[YELLOW]]\u042d\u0442\u043e \u0443\u043c\u0435\u043d\u0438\u0435 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0432\u0430\u043c \u043d\u0430\u043d\u043e\u0441\u0438\u0442\u044c \u0443\u0434\u0430\u0440 \u043f\u043e \u043e\u0431\u043b\u0430\u0441\u0442\u0438. \u041f\u043e\u0441\u043b\u0435 \u044d\u0442\u043e\u0433\u043e \u0443\u0434\u0430\u0440\u0430\n[[YELLOW]]\u0432\u0441\u0435 \u0432 \u043e\u0431\u043b\u0430\u0441\u0442\u0438 \u043f\u043e\u043b\u0443\u0447\u0430\u0442 \u043f\u043e\u043b\u043e\u0432\u0438\u043d\u0443 \u0443\u0440\u043e\u043d\u0430, \u043d\u0430\u043d\u0435\u0441\u0435\u043d\u043d\u043e\u0433\u043e \u0432\u0430\u043c\u0438 \u0433\u043b\u0430\u0432\u043d\u043e\u0439 \u0446\u0435\u043b\u0438,\n[[YELLOW]]\u0442\u0430\u043a \u0447\u0442\u043e \u044d\u0442\u043e \u0445\u043e\u0440\u043e\u0448\u0438\u0439 \u0441\u043f\u043e\u0441\u043e\u0431 \u0431\u044b\u0441\u0442\u0440\u043e \u0443\u043d\u0438\u0447\u0442\u043e\u0436\u0430\u0442\u044c \u0441\u043a\u043e\u043f\u043b\u0435\u043d\u0438\u044f \u043c\u043e\u0431\u043e\u0432. -Guides.Axes.Section.2=[[DARK_AQUA]]\u041a\u0430\u043a \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0443\u043c\u0435\u043d\u0438\u0435 \u041a\u0440\u0438\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u0423\u0434\u0430\u0440?\n[[YELLOW]]\u041a\u0440\u0438\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u0423\u0434\u0430\u0440 - \u044d\u0442\u043e \u043f\u0430\u0441\u0441\u0438\u0432\u043d\u043e\u0435 \u0443\u043c\u0435\u043d\u0438\u0435, \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u0434\u0430\u0435\u0442 \u0432\u0430\u043c \u0448\u0430\u043d\u0441\n[[YELLOW]]\u043d\u0430\u043d\u0435\u0441\u0442\u0438 \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u0443\u0440\u043e\u043d. \u041f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e, \n[[YELLOW]]\u043a\u0430\u0436\u0434\u044b\u0435 2 \u0443\u0440\u043e\u0432\u043d\u044f \u043d\u0430\u0432\u044b\u043a\u0430 \u0422\u043e\u043f\u043e\u0440\u044b \u0434\u0430\u044e\u0442 \u0432\u0430\u043c +0.1%\n[[YELLOW]]\u0448\u0430\u043d\u0441 \u043d\u0430\u043d\u0435\u0441\u0442\u0438 \u041a\u0440\u0438\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u0423\u0434\u0430\u0440, \u0438\u0437-\u0437\u0430 \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u043c\u043e\u0431\u044b \u043f\u043e\u043b\u0443\u0447\u0430\u0442\n[[YELLOW]]\u0434\u0432\u043e\u0439\u043d\u043e\u0439 \u0443\u0440\u043e\u043d, \u0430 \u0434\u0440\u0443\u0433\u0438\u0435 \u0438\u0433\u0440\u043e\u043a\u0438 \u043f\u043e\u043b\u0443\u0442\u043e\u0440\u043d\u044b\u0439. -Guides.Axes.Section.3=[[DARK_AQUA]]\u041a\u0430\u043a \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0443\u043c\u0435\u043d\u0438\u0435 \u041c\u0430\u0441\u0442\u0435\u0440 \u0422\u043e\u043f\u043e\u0440\u0430?\n[[YELLOW]]\u041c\u0430\u0441\u0442\u0435\u0440 \u0422\u043e\u043f\u043e\u0440\u0430 - \u044d\u0442\u043e \u043f\u0430\u0441\u0441\u0438\u0432\u043d\u043e\u0435 \u0443\u043c\u0435\u043d\u0438\u0435, \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u0442\n[[YELLOW]]\u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u0443\u0440\u043e\u043d \u043a \u0432\u0430\u0448\u0438\u043c \u0430\u0442\u0430\u043a\u0430\u043c \u0442\u043e\u043f\u043e\u0440\u043e\u043c.\n[[YELLOW]]\u041f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e, \u0431\u043e\u043d\u0443\u0441\u043d\u044b\u0439 \u0443\u0440\u043e\u043d \u0432\u043e\u0437\u0440\u0430\u0441\u0442\u0430\u0435\u0442 \u043d\u0430 1 \u043a\u0430\u0436\u0434\u044b\u0435 50 \u0443\u0440\u043e\u0432\u043d\u0435\u0439\n[[YELLOW]]\u043d\u0430\u0432\u044b\u043a\u0430, \u0434\u043e \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043f\u043e\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044f 4 \u043d\u0430 200 \u0443\u0440\u043e\u0432\u043d\u0435. -Guides.Axes.Section.4=[[DARK_AQUA]]\u041a\u0430\u043a \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0443\u043c\u0435\u043d\u0438\u0435 \u0411\u0440\u043e\u043d\u0435\u0431\u043e\u0439\u043d\u044b\u0439 \u0423\u0434\u0430\u0440?\n[[YELLOW]]\u0411\u0435\u0439\u0442\u0435 \u0441 \u0442\u0430\u043a\u043e\u0439 \u0441\u0438\u043b\u043e\u0439, \u0447\u0442\u043e\u0431\u044b \u0441\u043e\u043a\u0440\u0443\u0448\u0430\u0442\u044c \u0431\u0440\u043e\u043d\u044e \u0432\u0440\u0430\u0433\u043e\u0432!\n[[YELLOW]]\u0423\u043c\u0435\u043d\u0438\u0435 \u0411\u0440\u043e\u043d\u0435\u0431\u043e\u0439\u043d\u044b\u0439 \u0423\u0434\u0430\u0440 \u0434\u0430\u0435\u0442 \u0432\u0430\u043c \u043f\u0430\u0441\u0441\u0438\u0432\u043d\u044b\u0439 \u0448\u0430\u043d\u0441 \u043f\u043e\u0432\u0440\u0435\u0434\u0438\u0442\u044c \u0431\u0440\u043e\u043d\u044e\n[[YELLOW]]\u0432\u0430\u0448\u0435\u0433\u043e \u043e\u043f\u043f\u043e\u043d\u0435\u043d\u0442\u0430. \u0421\u0438\u043b\u0430 \u043f\u043e\u0432\u0440\u0435\u0436\u0434\u0435\u043d\u0438\u0439 \u0437\u0430\u0432\u0438\u0441\u0438\u0442 \u043e\u0442 \u0432\u0430\u0448\u0435\u0433\u043e \u0443\u0440\u043e\u0432\u043d\u044f \u043d\u0430\u0432\u044b\u043a\u0430. -Guides.Axes.Section.5=[[DARK_AQUA]]\u041a\u0430\u043a \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0443\u043c\u0435\u043d\u0438\u0435 \u0412\u0435\u043b\u0438\u043a\u0438\u0439 \u0423\u0434\u0430\u0440?\n[[YELLOW]]\u0412\u044b \u0438\u043c\u0435\u0435\u0442\u0435 \u043f\u0430\u0441\u0441\u0438\u0432\u043d\u044b\u0439 \u0448\u0430\u043d\u0441 \u043d\u0430\u043d\u0435\u0441\u0442\u0438 \u0412\u0435\u043b\u0438\u043a\u0438\u0439 \u0423\u0434\u0430\u0440, \u0441\u0440\u0430\u0436\u0430\u044f\u0441\u044c \u0441 \n[[YELLOW]]\u0442\u043e\u043f\u043e\u0440\u043e\u043c \u043f\u0440\u043e\u0442\u0438\u0432 \u043c\u043e\u0431\u043e\u0432 \u0438\u043b\u0438 \u0434\u0440\u0443\u0433\u0438\u0445 \u0438\u0433\u0440\u043e\u043a\u043e\u0432. \u041f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e, \n[[YELLOW]]\u044d\u0442\u043e\u0442 \u0448\u0430\u043d\u0441 \u0440\u0430\u0432\u0435\u043d 25%. \u042d\u0442\u043e \u043f\u0430\u0441\u0441\u0438\u0432\u043d\u043e\u0435 \u0443\u043c\u0435\u043d\u0438\u0435 \u0434\u0430\u0435\u0442 \u0432\u0430\u043c \u044d\u0444\u0444\u0435\u043a\u0442\n[[YELLOW]]\u044d\u043a\u0441\u0442\u0440\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043e\u0442\u0431\u0440\u0430\u0441\u044b\u0432\u0430\u043d\u0438\u044f, \u043a\u0430\u043a \u043f\u0440\u0438 \u0437\u0430\u0447\u0430\u0440\u043e\u0432\u0430\u043d\u0438\u0438 \u041e\u0442\u0431\u0440\u0430\u0441\u044b\u0432\u0430\u043d\u0438\u0435 II\n[[YELLOW]]\u041f\u043b\u044e\u0441 \u043a\u043e \u0432\u0441\u0435\u043c\u0443, \u044d\u0442\u043e\u0442 \u0443\u0434\u0430\u0440 \u043d\u0430\u043d\u043e\u0441\u0438\u0442 \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0435 \u043f\u043e\u0432\u0440\u0435\u0436\u0434\u0435\u043d\u0438\u044f. -##Excavation -Guides.Excavation.Section.0=[[DARK_AQUA]]\u041e \u043d\u0430\u0432\u044b\u043a\u0435 \u0420\u0430\u0441\u043a\u043e\u043f\u043a\u0438:\n[[YELLOW]]\u0420\u0430\u0441\u043a\u043e\u043f\u043a\u0438 \u044f\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u043c \u043a\u043e\u043f\u0430\u043d\u0438\u044f \u0441\u044b\u043f\u0443\u0447\u0438\u0445 \u043c\u0430\u0442\u0435\u0440\u0438\u0430\u043b\u043e\u0432.\n[[YELLOW]]\u0412 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0435 \u0440\u0430\u0441\u043a\u043e\u043f\u043e\u043a \u0432\u044b \u043c\u043e\u0436\u0435\u0442\u0435 \u043d\u0430\u0439\u0442\u0438 \u0441\u043e\u043a\u0440\u043e\u0432\u0438\u0449\u0430.\n[[YELLOW]]\u0427\u0435\u043c \u0431\u043e\u043b\u044c\u0448\u0435 \u0432\u044b \u043a\u043e\u043f\u0430\u0435\u0442\u0435, \u0442\u0435\u043c \u0431\u043e\u043b\u044c\u0448\u0435 \u0441\u043e\u043a\u0440\u043e\u0432\u0438\u0449 \u0432\u044b \u0441\u043c\u043e\u0436\u0435\u0442\u0435 \u043d\u0430\u0439\u0442\u0438.\n\n[[DARK_AQUA]]\u041f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435 \u043e\u043f\u044b\u0442\u0430:\n[[YELLOW]]\u0427\u0442\u043e\u0431\u044b \u043f\u043e\u043b\u0443\u0447\u0430\u0442\u044c \u043e\u043f\u044b\u0442 \u0437\u0430 \u044d\u0442\u043e\u0442 \u043d\u0430\u0432\u044b\u043a, \u0432\u044b \u0434\u043e\u043b\u0436\u043d\u044b \u043a\u043e\u043f\u0430\u0442\u044c \u0441 \u043b\u043e\u043f\u0430\u0442\u043e\u0439 \u0432 \u0440\u0443\u043a\u0435.\n[[YELLOW]]\u0422\u043e\u043b\u044c\u043a\u043e \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043d\u044b\u0435 \u0431\u043b\u043e\u043a\u0438 \u043f\u0440\u0438 \u043a\u043e\u043f\u0430\u043d\u0438\u0438 \u0434\u0430\u044e\u0442 \u043e\u043f\u044b\u0442 \u0438 \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0442 \u0441\u043e\u043a\u0440\u043e\u0432\u0438\u0449\u0430. -Guides.Excavation.Section.1=[[DARK_AQUA]]\u0421\u043e\u0432\u043c\u0435\u0441\u0442\u0438\u043c\u044b\u0435 \u043c\u0430\u0442\u0435\u0440\u0438\u0430\u043b\u044b:\n[[YELLOW]]\u0422\u0440\u0430\u0432\u0430, \u0413\u0440\u044f\u0437\u044c, \u041f\u0435\u0441\u043e\u043a, \u0413\u043b\u0438\u043d\u0430, \u0413\u0440\u0430\u0432\u0438\u0439, \u041c\u0438\u0446\u0435\u043b\u0438\u0439, \u041f\u0435\u0441\u043e\u043a \u0414\u0443\u0448. -Guides.Excavation.Section.2=[[DARK_AQUA]]\u041a\u0430\u043a \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0443\u043c\u0435\u043d\u0438\u0435 \u041c\u0435\u0433\u0430 \u0411\u0443\u0440:\n[[YELLOW]]\u0421 \u043b\u043e\u043f\u0430\u0442\u043e\u0439 \u0432 \u0440\u0443\u043a\u0435 \u043a\u043b\u0438\u043a\u043d\u0438\u0442\u0435 \u041f\u041a\u041c \u0447\u0442\u043e\u0431\u044b \u043f\u0440\u0438\u0433\u043e\u0442\u043e\u0432\u0438\u0442\u044c \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442.\n[[YELLOW]]\u041f\u043e\u0441\u043b\u0435 \u044d\u0442\u043e\u0433\u043e \u0443 \u0432\u0430\u0441 \u0435\u0441\u0442\u044c \u043e\u043a\u043e\u043b\u043e 4 \u0441\u0435\u043a\u0443\u043d\u0434 \u0434\u043b\u044f \u0440\u0430\u0441\u043a\u043e\u043f\u043e\u043a\n[[YELLOW]]\u0441\u043e\u0432\u043c\u0435\u0441\u0442\u0438\u043c\u044b\u0445 \u0431\u043b\u043e\u043a\u043e\u0432 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0443\u043c\u0435\u043d\u0438\u044f \u041c\u0435\u0433\u0430 \u0411\u0443\u0440. -Guides.Excavation.Section.3=[[DARK_AQUA]]\u0427\u0442\u043e \u0442\u0430\u043a\u043e\u0435 \u041c\u0435\u0433\u0430 \u0411\u0443\u0440?\n[[YELLOW]]\u041c\u0435\u0433\u0430 \u0411\u0443\u0440 - \u044d\u0442\u043e \u0443\u043c\u0435\u043d\u0438\u0435, \u0441\u0432\u044f\u0437\u0430\u043d\u043d\u043e\u0435 \u0441 \u043d\u0430\u0432\u044b\u043a\u043e\u043c \u0420\u0430\u0441\u043a\u043e\u043f\u043a\u0438.\n[[YELLOW]]\u041e\u043d\u043e \u0443\u0442\u0440\u0430\u0438\u0432\u0430\u0435\u0442 \u0448\u0430\u043d\u0441 \u043d\u0430\u0439\u0442\u0438 \u0441\u043e\u043a\u0440\u043e\u0432\u0438\u0449\u0430 \u0438 \u0434\u0430\u0435\u0442 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c\n[[YELLOW]]\u0440\u0430\u0437\u0440\u0443\u0448\u0430\u0442\u044c \u0441\u043e\u0432\u043c\u0435\u0441\u0442\u0438\u043c\u044b\u0435 \u0431\u043b\u043e\u043a\u0438 \u0441 \u043e\u0434\u043d\u043e\u0433\u043e \u0443\u0434\u0430\u0440\u0430. -Guides.Excavation.Section.4=[[DARK_AQUA]]\u041a\u0430\u043a \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0443\u043c\u0435\u043d\u0438\u0435 \u041e\u0445\u043e\u0442\u043d\u0438\u043a \u0437\u0430 \u0421\u043e\u043a\u0440\u043e\u0432\u0438\u0449\u0430\u043c\u0438?\n[[YELLOW]]\u0412\u0441\u0435 \u0441\u043e\u043a\u0440\u043e\u0432\u0438\u0449\u0430, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043c\u043e\u0433\u0443\u0442 \u0431\u044b\u0442\u044c \u043d\u0430\u0439\u0434\u0435\u043d\u044b \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e\n[[YELLOW]]\u043d\u0430\u0432\u044b\u043a\u0430 \u0420\u0430\u0441\u043a\u043e\u043f\u043a\u0438, \u0438\u043c\u0435\u044e\u0442 \u0441\u0432\u043e\u0438 \u0442\u0440\u0435\u0431\u043e\u0432\u0430\u043d\u0438\u044f \u0443\u0440\u043e\u0432\u043d\u044f \u043c\u0430\u0441\u0442\u0435\u0440\u0441\u0442\u0432\u0430\n[[YELLOW]]\u0447\u0442\u043e\u0431\u044b \u0438\u0445 \u043d\u0430\u0439\u0442\u0438. \u0421\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e, \u0442\u0440\u0443\u0434\u043d\u043e \u0441\u043a\u0430\u0437\u0430\u0442\u044c, \u043d\u0430\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0432\u0430\u043c\n[[YELLOW]]\u043f\u043e\u043c\u043e\u0436\u0435\u0442 \u044d\u0442\u043e\u0442 \u043d\u0430\u0432\u044b\u043a. \u041f\u0440\u043e\u0441\u0442\u043e \u0437\u043d\u0430\u0439\u0442\u0435, \u0447\u0435\u043c \u0432\u044b\u0448\u0435 \u0432\u0430\u0448 \u0443\u0440\u043e\u0432\u0435\u043d\u044c \u0420\u0430\u0441\u043a\u043e\u043f\u043e\u043a,\n[[YELLOW]]\u0442\u0435\u043c \u0431\u043e\u043b\u044c\u0448\u0435 \u0441\u043e\u043a\u0440\u043e\u0432\u0438\u0449 \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u043d\u0430\u0439\u0434\u0435\u043d\u043e, \u0438 \u0442\u0435\u043c \u0446\u0435\u043d\u043d\u0435\u0435 \u043e\u043d\u0438 \u0431\u0443\u0434\u0443\u0442.\n[[YELLOW]]\u0422\u0430\u043a \u0436\u0435 \u0438\u043c\u0435\u0439\u0442\u0435 \u0432\u0432\u0438\u0434\u0443, \u0447\u0442\u043e \u043a\u0430\u0436\u0434\u044b\u0439 \u0442\u0438\u043f \u043c\u0430\u0442\u0435\u0440\u0438\u0430\u043b\u043e\u0432 \u0420\u0430\u0441\u043a\u043e\u043f\u043e\u043a \u0438\u043c\u0435\u0435\u0442 \u0441\u0432\u043e\u0439\n[[YELLOW]]\u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0439 \u0441\u043f\u0438\u0441\u043e\u043a \u0441\u043e\u043a\u0440\u043e\u0432\u0438\u0449. \u0414\u0440\u0443\u0433\u0438\u043c\u0438 \u0441\u043b\u043e\u0432\u0430\u043c\u0438, \u0441\u043e\u043a\u0440\u043e\u0432\u0438\u0449\u0430, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \n[[YELLOW]]\u043c\u043e\u0433\u0443\u0442 \u0431\u044b\u0442\u044c \u043d\u0430\u0439\u0434\u0435\u043d\u043d\u044b\u0435 \u0432 \u0417\u0435\u043c\u043b\u0435, \u0431\u0443\u0434\u0443\u0442 \u043e\u0442\u043b\u0438\u0447\u0430\u0442\u044c\u0441\u044f \u043e\u0442 \u0442\u0435\u0445, \u0447\u0442\u043e \u0432\u044b\n[[YELLOW]]\u043c\u043e\u0436\u0435\u0442\u0435 \u043d\u0430\u0439\u0442\u0438 \u0432 \u0413\u0440\u0430\u0432\u0438\u0438. -Guides.Excavation.Section.5=[[DARK_AQUA]]\u0417\u0430\u043c\u0435\u0442\u043a\u0438 \u043e \u043d\u0430\u0432\u044b\u043a\u0435 \u0420\u0430\u0441\u043a\u043e\u043f\u043a\u0438:\n[[YELLOW]]\u041d\u0430\u0445\u043e\u0434\u0438\u043c\u044b\u0435 \u0441\u043e\u043a\u0440\u043e\u0432\u0438\u0449\u0430 \u043f\u0440\u0438 \u0420\u0430\u0441\u043a\u043e\u043f\u043a\u0430\u0445 \u043f\u043e\u043b\u043d\u043e\u0441\u0442\u044c\u044e \u043d\u0430\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u0435\u043c\u044b\u0435.\n[[YELLOW]]\u0422\u0430\u043a \u0447\u0442\u043e, \u043d\u0430 \u0440\u0430\u0437\u043d\u044b\u0445 \u0441\u0435\u0440\u0432\u0435\u0440\u0430\u0445 \u043d\u0430\u0445\u043e\u0434\u043a\u0438 \u043c\u043e\u0433\u0443\u0442 \u0441\u0438\u043b\u044c\u043d\u043e \u043e\u0442\u043b\u0438\u0447\u0430\u0442\u044c\u0441\u044f. -##Fishing -Guides.Fishing.Section.0=[[DARK_AQUA]]\u041e \u043d\u0430\u0432\u044b\u043a\u0435 \u0420\u044b\u0431\u043e\u043b\u043e\u0432\u0441\u0442\u0432\u043e:\n[[YELLOW]]\u0421 \u044d\u0442\u0438\u043c \u043d\u0430\u0432\u044b\u043a\u043e\u043c \u0440\u044b\u0431\u0430\u043b\u043a\u0430 \u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u0441\u044f \u0437\u0430\u0445\u0432\u0430\u0442\u044b\u0432\u0430\u044e\u0449\u0435\u0439!\n[[YELLOW]]\u041d\u0430\u0445\u043e\u0434\u0438\u0442\u0435 \u0441\u043e\u043a\u0440\u043e\u0432\u0438\u0449\u0430 \u0438 \u0432\u044b\u0442\u0440\u044f\u0445\u0438\u0432\u0430\u0439\u0442\u0435 \u043f\u0440\u0435\u0434\u043c\u0435\u0442\u044b \u0438\u0437 \u043c\u043e\u0431\u043e\u0432!\n\n[[DARK_AQUA]]\u041f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435 \u043e\u043f\u044b\u0442\u0430:\n[[YELLOW]]\u0412\u0441\u0435 \u043f\u0440\u043e\u0441\u0442\u043e - \u043b\u043e\u0432\u0438\u0442\u0435 \u0440\u044b\u0431\u0443. -Guides.Fishing.Section.1=[[DARK_AQUA]]\u041a\u0430\u043a \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0443\u043c\u0435\u043d\u0438\u0435 \u041e\u0445\u043e\u0442\u043d\u0438\u043a \u0437\u0430 \u0421\u043e\u043a\u0440\u043e\u0432\u0438\u0449\u0430\u043c\u0438?\n[[YELLOW]]\u042d\u0442\u043e \u0443\u043c\u0435\u043d\u0438\u0435 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u044c \u0441\u043e\u043a\u0440\u043e\u0432\u0438\u0449\u0430 \u0432\u043e \u0432\u0440\u0435\u043c\u044f \u0440\u044b\u0431\u0430\u043b\u043a\u0438,\n[[YELLOW]]\u0435\u0441\u0442\u044c \u0448\u0430\u043d\u0441, \u0447\u0442\u043e \u043e\u043d\u0438 \u0431\u0443\u0434\u0443\u0442 \u0437\u0430\u0447\u0430\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u043c\u0438. \u041a\u0430\u0436\u0434\u043e\u0435 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0435\n[[YELLOW]]\u0441\u043e\u043a\u0440\u043e\u0432\u0438\u0449\u0435 \u0438\u043c\u0435\u0435\u0442 \u0441\u0432\u043e\u0435 \u0442\u0440\u0435\u0431\u043e\u0432\u0430\u043d\u0438\u0435 \u043f\u043e \u043d\u0430\u0432\u044b\u043a\u0443 \u0420\u044b\u0431\u043e\u043b\u043e\u0432\u0441\u0442\u0432\u043e,\n[[YELLOW]]\u0447\u0442\u043e\u0431\u044b \u0435\u0433\u043e \u043d\u0430\u0439\u0442\u0438.\n\n[[YELLOW]]\u0427\u0435\u043c \u0431\u043e\u043b\u044c\u0448\u0435 \u0443\u0440\u043e\u0432\u0435\u043d\u044c \u043d\u0430\u0432\u044b\u043a\u0430 \u0420\u044b\u0431\u043e\u043b\u043e\u0432\u0441\u0442\u0432\u043e,\n[[YELLOW]]\u0442\u0435\u043c \u0431\u043e\u043b\u044c\u0448\u0435 \u0441\u043e\u043a\u0440\u043e\u0432\u0438\u0449 \u043c\u043e\u0436\u043d\u043e \u043d\u0430\u0439\u0442\u0438. -Guides.Fishing.Section.2=[[DARK_AQUA]]\u041a\u0430\u043a \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0443\u043c\u0435\u043d\u0438\u0435 \u041f\u043e\u0434\u043b\u0435\u0434\u043d\u0430\u044f \u0420\u044b\u0431\u0430\u043b\u043a\u0430?\n[[YELLOW]]\u042d\u0442\u043e \u043f\u0430\u0441\u0441\u0438\u0432\u043d\u043e\u0435 \u0443\u043c\u0435\u043d\u0438\u0435 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0432\u0430\u043c \u0440\u044b\u0431\u0430\u0447\u0438\u0442\u044c \u0432\n[[YELLOW]]\u043b\u0435\u0434\u044f\u043d\u044b\u0445 \u0432\u043e\u0434\u043e\u0435\u043c\u0430\u0445. \u041f\u0440\u043e\u0441\u0442\u043e \u0437\u0430\u0431\u0440\u043e\u0441\u044c\u0442\u0435 \u0443\u0434\u043e\u0447\u043a\u0443 \u043d\u0430 \u043b\u0435\u0434\n[[YELLOW]]\u0438 \u0442\u0430\u043c \u043e\u0431\u0440\u0430\u0437\u0443\u0435\u0442\u0441\u044f \u043f\u0440\u043e\u0440\u0443\u0431\u044c \u0434\u043b\u044f \u043b\u043e\u0432\u043b\u0438 \u0440\u044b\u0431\u044b. -Guides.Fishing.Section.3=[[DARK_AQUA]]\u041a\u0430\u043a \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0443\u043c\u0435\u043d\u0438\u0435 \u0420\u044b\u0431\u0430\u0446\u043a\u0430\u044f \u0414\u0438\u0435\u0442\u0430?\n[[YELLOW]]\u042d\u0442\u043e \u0443\u043c\u0435\u043d\u0438\u0435 \u0443\u0432\u0435\u043b\u0438\u0447\u0438\u0432\u0430\u0435\u0442 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u043e \u0443\u0442\u043e\u043b\u0435\u043d\u0438\u044f \u0433\u043e\u043b\u043e\u0434\u0430\n[[YELLOW]]\u043f\u0440\u0438 \u043f\u043e\u0435\u0434\u0430\u043d\u0438\u0438 \u0440\u044b\u0431\u044b. -Guides.Fishing.Section.4=[[DARK_AQUA]]\u041a\u0430\u043a \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0443\u043c\u0435\u043d\u0438\u0435 \u0412\u0441\u0442\u0440\u044f\u0441\u043a\u0430?\n[[YELLOW]]\u042d\u0442\u043e \u0443\u043c\u0435\u043d\u0438\u0435 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0432\u044b\u0442\u0440\u044f\u0445\u0438\u0432\u0430\u0442\u044c \u043f\u0440\u0435\u0434\u043c\u0435\u0442\u044b \u0438\u0437 \u043c\u043e\u0431\u043e\u0432,\n[[YELLOW]]\u0437\u0430\u0446\u0435\u043f\u0430\u044f \u0438\u0445 \u0443\u0434\u043e\u0447\u043a\u043e\u0439. \u042d\u0442\u043e \u0431\u0443\u0434\u0443\u0442 \u043f\u0440\u0435\u0434\u043c\u0435\u0442\u044b, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043e\u0431\u044b\u0447\u043d\u043e\n[[YELLOW]]\u0432\u044b\u043f\u0430\u0434\u0430\u044e\u0442 \u0438\u0437 \u043d\u0438\u0445 \u043f\u0440\u0438 \u0441\u043c\u0435\u0440\u0442\u0438. \u0422\u0430\u043a \u0436\u0435 \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \n[[YELLOW]]\u043d\u0435\u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b\u0435 \u043e\u0431\u044b\u0447\u043d\u043e \u0432 \u0440\u0435\u0436\u0438\u043c\u0435 \u0432\u044b\u0436\u0438\u0432\u0430\u043d\u0438\u044f \u0433\u043e\u043b\u043e\u0432\u044b \u043c\u043e\u0431\u043e\u0432. -Guides.Fishing.Section.5=[[DARK_AQUA]]\u041a\u0430\u043a \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0443\u043c\u0435\u043d\u0438\u0435 \u0420\u044b\u0431\u0430\u0446\u043a\u0430\u044f \u0414\u0438\u0435\u0442\u0430?\n[[YELLOW]]\u042d\u0442\u043e \u0443\u043c\u0435\u043d\u0438\u0435 \u0443\u0432\u0435\u043b\u0438\u0447\u0438\u0432\u0430\u0435\u0442 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u043e \u0443\u0442\u043e\u043b\u0435\u043d\u0438\u044f \u0433\u043e\u043b\u043e\u0434\u0430\n[[YELLOW]]\u043f\u0440\u0438 \u043f\u043e\u0435\u0434\u0430\u043d\u0438\u0438 \u0440\u044b\u0431\u044b. -Guides.Fishing.Section.6=[[DARK_AQUA]]\u0417\u0430\u043c\u0435\u0442\u043a\u0438 \u043e \u043d\u0430\u0432\u044b\u043a\u0435 \u0420\u044b\u0431\u043e\u043b\u043e\u0432\u0441\u0442\u0441\u0432\u043e:\n[[YELLOW]]\u0414\u0440\u043e\u043f \u0432\u0435\u0449\u0435\u0439 \u043f\u0440\u0438 \u0440\u044b\u0431\u0430\u043b\u043a\u0435 \u043f\u043e\u043b\u043d\u043e\u0441\u0442\u044c\u044e \u043d\u0430\u0441\u0442\u0440\u0430\u0435\u0432\u0430\u0435\u043c\u044b\u0439,\n[[YELLOW]]\u0442\u0430\u043a \u0447\u0442\u043e \u043d\u0430 \u0440\u0430\u0437\u043d\u044b\u0445 \u0441\u0435\u0440\u0432\u0435\u0440\u0430\u0445 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u044b \u043c\u043e\u0433\u0443\u0442 \u0431\u044b\u0442\u044c \u0440\u0430\u0437\u043d\u044b\u0435. -##Herbalism -Guides.Herbalism.Section.0=[[DARK_AQUA]]\u041e \u043d\u0430\u0432\u044b\u043a\u0435 \u0422\u0440\u0430\u0432\u043d\u0438\u0447\u0435\u0441\u0442\u0432\u043e:\n[[YELLOW]]\u0422\u0440\u0430\u0432\u043d\u0438\u0447\u0435\u0441\u0442\u0432\u043e - \u044d\u0442\u043e \u0432\u0441\u0435 \u0447\u0442\u043e \u043a\u0430\u0441\u0430\u0435\u0442\u0441\u044f \u0441\u0431\u043e\u0440\u0430 \u0442\u0440\u0430\u0432 \u0438 \u0440\u0430\u0441\u0442\u0435\u043d\u0438\u0439.\n\n[[DARK_AQUA]]\u041f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435 \u043e\u043f\u044b\u0442\u0430:\n[[YELLOW]]\u0421\u043e\u0431\u0438\u0440\u0430\u0439\u0442\u0435 \u0442\u0440\u0430\u0432\u044b \u0438 \u0440\u0430\u0441\u0442\u0435\u043d\u0438\u044f. -Guides.Herbalism.Section.1=[[DARK_AQUA]]\u0421\u043e\u0432\u043c\u0435\u0441\u0442\u0438\u043c\u044b\u0435 \u0440\u0430\u0441\u0442\u0435\u043d\u0438\u044f:\n[[YELLOW]]\u041f\u0448\u0435\u043d\u0438\u0446\u0430, \u041a\u0430\u0440\u0442\u043e\u0448\u043a\u0430, \u041c\u043e\u0440\u043a\u043e\u0432\u044c, \u0410\u0440\u0431\u0443\u0437\u044b, \n[[YELLOW]]\u0422\u044b\u043a\u0432\u044b, \u0421\u0430\u0445\u0430\u0440\u043d\u044b\u0435 \u0422\u0440\u043e\u0441\u043d\u0438\u043a\u0438, \u041a\u0430\u043a\u0430\u043e \u0411\u043e\u0431\u044b, \u0426\u0432\u0435\u0442\u044b, \u041a\u0430\u043a\u0442\u0443\u0441\u044b,\n[[YELLOW]]\u0413\u0440\u0438\u0431\u044b, \u0410\u0434\u0441\u043a\u0438\u0435 \u041d\u0430\u0440\u043e\u0441\u0442\u044b, \u041a\u0443\u0432\u0448\u0438\u043d\u043a\u0438, \u041b\u0438\u0430\u043d\u044b. -Guides.Herbalism.Section.2=[[DARK_AQUA]]\u041a\u0430\u043a \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0443\u043c\u0435\u043d\u0438\u0435 \u041e\u0437\u0435\u043b\u0435\u043d\u0435\u043d\u0438\u0435?\n[[YELLOW]]\u041e\u0437\u0435\u043b\u0435\u043d\u0435\u043d\u0438\u0435 - \u044d\u0442\u043e \u0430\u043a\u0442\u0438\u0432\u043d\u043e\u0435 \u0443\u043c\u0435\u043d\u0438\u0435, \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u0430\u043a\u0442\u0438\u0432\u0438\u0440\u0443\u0435\u0442\u0441\u044f\n[[YELLOW]]\u043d\u0430\u0436\u0430\u0442\u0438\u0435\u043c \u041f\u041a\u041c \u0441 \u043c\u043e\u0442\u044b\u0433\u043e\u0439 \u0432 \u0440\u0443\u043a\u0435. \u041e\u0437\u0435\u043b\u0435\u043d\u0435\u043d\u0438\u0435 \u0434\u0430\u0435\u0442 \u0432\u0430\u043c \n[[YELLOW]]\u0448\u0430\u043d\u0441 \u0442\u0440\u043e\u0439\u043d\u043e\u0433\u043e \u0434\u0440\u043e\u043f\u0430 \u0440\u0430\u0441\u0442\u0435\u043d\u0438\u0439, \u0430 \u0442\u0430\u043a\u0436\u0435 \u0434\u0430\u0435\u0442 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \n[[YELLOW]]\u0432\u0441\u0435\u043b\u0438\u0442\u044c \u0436\u0438\u0437\u043d\u044c \u0432 \u043c\u0435\u0440\u0442\u0432\u044b\u0435 \u0431\u043b\u043e\u043a\u0438, \u0442\u0440\u0430\u043d\u0441\u0444\u043e\u0440\u043c\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0438\u0445 \n[[YELLOW]]\u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044f \u0441\u0435\u043c\u0435\u043d\u0430 \u0438\u0437 \u0432\u0430\u0448\u0435\u0433\u043e \u0438\u043d\u0432\u0435\u043d\u0442\u0430\u0440\u044f. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440,\n[[YELLOW]]\u043c\u043e\u0436\u043d\u043e \u043f\u0440\u0435\u0432\u0440\u0430\u0442\u0438\u0442\u044c \u043e\u0431\u044b\u0447\u043d\u044b\u0439 \u0431\u0443\u043b\u044b\u0436\u043d\u0438\u043a \u0432 \u0437\u0430\u043c\u0448\u0435\u043b\u044b\u0439. -Guides.Herbalism.Section.3=[[DARK_AQUA]]\u041a\u0430\u043a \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0443\u043c\u0435\u043d\u0438\u0435 \u0416\u0438\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0435 \u041f\u0440\u0438\u043a\u043e\u0441\u043d\u043e\u0432\u0435\u043d\u0438\u0435 (\u043d\u0430 \u0443\u0440\u043e\u0436\u0430\u0439)?\n[[YELLOW]]\u042d\u0442\u043e \u043f\u0430\u0441\u0441\u0438\u0432\u043d\u043e\u0435 \u0443\u043c\u0435\u043d\u0438\u0435 \u0434\u0430\u0435\u0442 \u0432\u0430\u043c \u0448\u0430\u043d\u0441 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438\n[[YELLOW]]\u043f\u043e\u0441\u0430\u0434\u0438\u0442\u044c \u043d\u043e\u0432\u044b\u0435 \u0440\u0430\u0441\u0442\u0435\u043d\u0438\u044f \u043f\u0440\u0438 \u0441\u0431\u043e\u0440\u0435 \u0443\u0436\u0435 \u0441\u043e\u0437\u0440\u0435\u0432\u0448\u0438\u0445. \n[[YELLOW]]\u042d\u0442\u043e\u0442 \u0448\u0430\u043d\u0441 \u0437\u0430\u0432\u0438\u0441\u0438\u0442 \u043e\u0442 \u0443\u0440\u043e\u0432\u043d\u044f \u043d\u0430\u0432\u044b\u043a\u0430 \u0422\u0440\u0430\u0432\u043d\u0438\u0447\u0435\u0441\u0442\u0432\u043e. -Guides.Herbalism.Section.4=[[DARK_AQUA]]\u041a\u0430\u043a \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0443\u043c\u0435\u043d\u0438\u0435 \u0416\u0438\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0435 \u041f\u0440\u0438\u043a\u043e\u0441\u043d\u043e\u0432\u0435\u043d\u0438\u0435 (\u043d\u0430 \u043a\u0430\u043c\u0435\u043d\u044c/\u0433\u0440\u044f\u0437\u044c)?\n[[YELLOW]]\u042d\u0442\u043e \u0430\u043a\u0442\u0438\u0432\u043d\u043e\u0435 \u0443\u043c\u0435\u043d\u0438\u0435 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0432\u0430\u043c \u043f\u0440\u0435\u0432\u0440\u0430\u0449\u0430\u0442\u044c \u043c\u0435\u0440\u0442\u0432\u044b\u0435 \u0431\u043b\u043e\u043a\u0438 \u0432 \u0438\u0445\n[[YELLOW]]\u0436\u0438\u0432\u044b\u0435 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0438\u044f. \u0412\u044b \u043c\u043e\u0436\u0435\u0442\u0435 \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u044d\u0442\u043e \u043a\u043b\u0438\u043a\u043d\u0443\u0432 \u041f\u041a\u041c\n[[YELLOW]]\u043d\u0430 \u0431\u043b\u043e\u043a \u0441 \u0441\u0435\u043c\u0435\u043d\u0430\u043c\u0438 \u0432 \u0440\u0443\u043a\u0435. \u042d\u0442\u043e \u043f\u043e\u0442\u0440\u0430\u0442\u0438\u0442 1 \u0441\u0435\u043c\u044f\u0447\u043a\u043e. -Guides.Herbalism.Section.5=[[DARK_AQUA]]\u041a\u0430\u043a \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0443\u043c\u0435\u043d\u0438\u0435 \u0424\u0435\u0440\u043c\u0435\u0440\u0441\u043a\u0430\u044f \u0414\u0438\u0435\u0442\u0430?\n[[YELLOW]]\u042d\u0442\u043e \u0443\u043c\u0435\u043d\u0438\u0435 \u0443\u0432\u0435\u043b\u0438\u0447\u0438\u0432\u0430\u0435\u0442 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u043e \u0443\u0442\u043e\u043b\u0435\u043d\u0438\u044f \u0433\u043e\u043b\u043e\u0434\u0430\n[[YELLOW]]\u043f\u0440\u0438 \u043f\u043e\u0435\u0434\u0430\u043d\u0438\u0438 \u0425\u043b\u0435\u0431\u0430, \u041f\u0435\u0447\u0435\u043d\u044c\u044f, \u0410\u0440\u0431\u0443\u0437\u0430, \u0413\u0440\u0438\u0431\u043d\u043e\u0433\u043e \u0421\u0443\u043f\u0430,\n[[YELLOW]]\u041c\u043e\u0440\u043a\u043e\u0432\u0438 \u0438 \u041a\u0430\u0440\u0442\u043e\u0448\u043a\u0438. -Guides.Herbalism.Section.6=[[DARK_AQUA]]\u041a\u0430\u043a \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0443\u043c\u0435\u043d\u0438\u0435 \u0425\u0430\u0439\u043b\u0438\u0430\u043d\u0441\u043a\u0430\u044f \u0423\u0434\u0430\u0447\u0430?\n[[YELLOW]]\u042d\u0442\u043e \u043f\u0430\u0441\u0441\u0438\u0432\u043d\u043e\u0435 \u0443\u043c\u0435\u043d\u0438\u0435 \u0434\u0430\u0435\u0442 \u0432\u0430\u043c \u0448\u0430\u043d\u0441 \u043d\u0430\u0439\u0442\u0438 \u0440\u0435\u0434\u043a\u0438\u0435\n[[YELLOW]]\u043f\u0440\u0435\u0434\u043c\u0435\u0442\u044b, \u043b\u043e\u043c\u0430\u044f \u043c\u0435\u0447\u0435\u043c \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043d\u044b\u0435 \u0431\u043b\u043e\u043a\u0438. -Guides.Herbalism.Section.7=[[DARK_AQUA]]\u041a\u0430\u043a \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0443\u043c\u0435\u043d\u0438\u0435 \u0414\u0432\u043e\u0439\u043d\u043e\u0439 \u0414\u0440\u043e\u043f?\n[[YELLOW]]\u042d\u0442\u043e \u043f\u0430\u0441\u0441\u0438\u0432\u043d\u043e\u0435 \u0443\u043c\u0435\u043d\u0438\u0435 \u0434\u0430\u0435\u0442 \u0431\u043e\u043b\u044c\u0448\u0438\u0439 \u0432\u044b\u0445\u043e\u0434 \u043f\u0440\u0438 \u0441\u0431\u043e\u0440\u0435 \u0443\u0440\u043e\u0436\u0430\u044f. -##Mining -Guides.Mining.Section.0=[[DARK_AQUA]]\u041e \u043d\u0430\u0432\u044b\u043a\u0435 \u0428\u0430\u0445\u0442\u0435\u0440\u0441\u0442\u0432\u043e:\n[[YELLOW]]\u0428\u0430\u0445\u0442\u0435\u0440\u0441\u0442\u0432\u043e \u0432\u043a\u043b\u044e\u0447\u0430\u0435\u0442 \u0432 \u0441\u0435\u0431\u044f \u0434\u043e\u0431\u044b\u0447\u0443 \u043a\u0430\u043c\u043d\u044f \u0438 \u0440\u0443\u0434. \u041e\u043d\u043e \u0434\u0430\u0435\u0442 \u0448\u0430\u043d\u0441,\n[[YELLOW]]\u0447\u0442\u043e \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0440\u0435\u0434\u043a\u0438\u0435 \u043c\u0430\u0442\u0435\u0440\u0438\u0430\u043b\u044b \u0431\u0443\u0434\u0443\u0442 \u043d\u0430\u0439\u0434\u0435\u043d\u044b \u0432\u043e \u0432\u0440\u0435\u043c\u044f \u0434\u043e\u0431\u044b\u0447\u0438.\n\n[[DARK_AQUA]]\u041f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435 \u043e\u043f\u044b\u0442\u0430:\n[[YELLOW]]\u0427\u0442\u043e\u0431\u044b \u043f\u043e\u043b\u0443\u0447\u0430\u0442\u044c \u043e\u043f\u044b\u0442, \u0432\u044b \u0434\u043e\u043b\u0436\u043d\u044b \u0432\u0435\u0441\u0442\u0438 \u0434\u043e\u0431\u044b\u0447\u0443 \u0441 \u043a\u0438\u0440\u043a\u043e\u0439 \u0432 \u0440\u0443\u043a\u0435.\n[[YELLOW]]\u041e\u043f\u044b\u0442 \u0434\u0430\u0435\u0442\u0441\u044f \u0437\u0430 \u0434\u043e\u0431\u044b\u0447\u0443 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043d\u044b\u0445 \u0431\u043b\u043e\u043a\u043e\u0432. -Guides.Mining.Section.1=[[DARK_AQUA]]\u0421\u043e\u0432\u043c\u0435\u0441\u0442\u0438\u043c\u044b\u0435 \u0411\u043b\u043e\u043a\u0438:\n[[YELLOW]]\u041a\u0430\u043c\u0435\u043d\u044c, \u0423\u0433\u043e\u043b\u044c, \u0416\u0435\u043b\u0435\u0437\u043d\u0430\u044f \u0420\u0443\u0434\u0430, \u0417\u043e\u043b\u043e\u0442\u0430\u044f \u0420\u0443\u0434\u0430, \u0410\u043b\u043c\u0430\u0437\u043d\u0430\u044f \u0420\u0443\u0434\u0430, \u0420\u0435\u0434\u0441\u0442\u043e\u0443\u043d,\n[[YELLOW]]\u041b\u0430\u0437\u0443\u0440\u0438\u0442\u043e\u0432\u0430\u044f \u0420\u0443\u0434\u0430, \u041e\u0431\u0441\u0438\u0434\u0438\u0430\u043d, \u0417\u0430\u043c\u0448\u043b\u0435\u043d\u043d\u044b\u0439 \u0431\u0443\u043b\u044b\u0436\u043d\u0438\u043a, \u041a\u0430\u043c\u0435\u043d\u044c \u041a\u0440\u0430\u044f,\n[[YELLOW]]\u0421\u0432\u0435\u0442\u044f\u0449\u0438\u0439\u0441\u044f \u041a\u0430\u043c\u0435\u043d\u044c \u0438 \u0410\u0434\u0441\u043a\u0438\u0439 \u041a\u0430\u043c\u0435\u043d\u044c. -Guides.Mining.Section.2=[[DARK_AQUA]]\u041a\u0430\u043a \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0443\u043c\u0435\u043d\u0438\u0435 \u0421\u0443\u043f\u0435\u0440 \u0414\u0440\u043e\u0431\u0438\u043b\u043a\u0430:\n[[YELLOW]]\u0421 \u043a\u0438\u0440\u043a\u043e\u0439 \u0432 \u0440\u0443\u043a\u0435 \u043a\u043b\u0438\u043a\u043d\u0438\u0442\u0435 \u041f\u041a\u041c \u0447\u0442\u043e\u0431\u044b \u043f\u0440\u0438\u0433\u043e\u0442\u043e\u0432\u0438\u0442\u044c \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442.\n[[YELLOW]]\u041f\u043e\u0441\u043b\u0435 \u044d\u0442\u043e\u0433\u043e \u0443 \u0432\u0430\u0441 \u0435\u0441\u0442\u044c \u043e\u043a\u043e\u043b\u043e 4 \u0441\u0435\u043a\u0443\u043d\u0434 \u0434\u043b\u044f \u0434\u043e\u0431\u044b\u0447\u0438\n[[YELLOW]]\u0441\u043e\u0432\u043c\u0435\u0441\u0442\u0438\u043c\u044b\u0445 \u0431\u043b\u043e\u043a\u043e\u0432 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0443\u043c\u0435\u043d\u0438\u044f \u0421\u0443\u043f\u0435\u0440 \u0414\u0440\u043e\u0431\u0438\u043b\u043a\u0430. -Guides.Mining.Section.3=[[DARK_AQUA]]\u0427\u0442\u043e \u0442\u0430\u043a\u043e\u0435 \u0421\u0443\u043f\u0435\u0440 \u0414\u0440\u043e\u0431\u0438\u043b\u043a\u0430?\n[[YELLOW]]\u0421\u0443\u043f\u0435\u0440 \u0414\u0440\u043e\u0431\u0438\u043b\u043a\u0430 - \u044d\u0442\u043e \u0443\u043c\u0435\u043d\u0438\u0435, \u0441\u0432\u044f\u0437\u0430\u043d\u043d\u043e\u0435 \u0441 \u043d\u0430\u0432\u044b\u043a\u043e\u043c \u0428\u0430\u0445\u0442\u0435\u0440\u0441\u0442\u0432\u043e.\n[[YELLOW]]\u041e\u043d\u043e \u0443\u0442\u0440\u0430\u0438\u0432\u0430\u0435\u0442 \u0448\u0430\u043d\u0441 \u043d\u0430\u0439\u0442\u0438 \u0441\u043e\u043a\u0440\u043e\u0432\u0438\u0449\u0430 \u0438 \u0434\u0430\u0435\u0442 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c\n[[YELLOW]]\u0440\u0430\u0437\u0440\u0443\u0448\u0430\u0442\u044c \u0431\u043b\u043e\u043a\u0438 \u0441 \u043e\u0434\u043d\u043e\u0433\u043e \u0443\u0434\u0430\u0440\u0430. -Guides.Mining.Section.4=[[DARK_AQUA]]\u041a\u0430\u043a \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0443\u043c\u0435\u043d\u0438\u0435 \u041f\u043e\u0434\u0440\u044b\u0432\u043d\u0430\u044f \u0414\u043e\u0431\u044b\u0447\u0430:\n[[YELLOW]]\u0421 \u0434\u0435\u0442\u043e\u043d\u0430\u0442\u043e\u0440\u043e\u043c \u0432 \u0440\u0443\u043a\u0435 (\u0437\u0430\u0436\u0438\u0433\u0430\u043b\u043a\u0430 \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e), \u0441\u043e\u0431\u043b\u044e\u0434\u0430\u044f\n[[YELLOW]]\u0434\u0438\u0441\u0442\u0430\u043d\u0446\u0438\u044e, \u043f\u0440\u0438\u0441\u044f\u0434\u044c\u0442\u0435, \u043d\u0430\u0432\u0435\u0434\u0438\u0442\u0435 \u043f\u0435\u0440\u0435\u043a\u0440\u0435\u0441\u0442\u0438\u0435 \u043d\u0430 TNT \u0438 \n[[YELLOW]]\u043a\u043b\u0438\u043a\u043d\u0438\u0442\u0435 \u041f\u041a\u041c, \u044d\u0442\u043e \u043f\u0440\u0438\u0432\u0435\u0434\u0435\u0442 \u043a \u0435\u0433\u043e \u043c\u0433\u043d\u043e\u0432\u0435\u043d\u043d\u043e\u043c\u0443 \u0432\u0437\u0440\u044b\u0432\u0443. -Guides.Mining.Section.5=[[DARK_AQUA]]\u041a\u0430\u043a \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0443\u043c\u0435\u043d\u0438\u0435 \u041f\u043e\u0434\u0440\u044b\u0432\u043d\u0430\u044f \u0414\u043e\u0431\u044b\u0447\u0430?\n[[YELLOW]]\u041f\u043e\u0434\u0440\u044b\u0432\u043d\u0430\u044f \u0414\u043e\u0431\u044b\u0447\u0430 - \u044d\u0442\u043e \u0443\u043c\u0435\u043d\u0438\u0435, \u0441\u0432\u044f\u0437\u0430\u043d\u043d\u043e\u0435 \u0441 \u043d\u0430\u0432\u044b\u043a\u043e\u043c\n[[YELLOW]]\u0428\u0430\u0445\u0442\u0435\u0440\u0441\u0442\u0432\u043e. \u041e\u043d\u043e \u0434\u0430\u0435\u0442 \u0431\u043e\u043d\u0443\u0441\u044b \u043f\u0440\u0438 \u0432\u0437\u0440\u044b\u0432\u0435 TNT \u0438 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442\n[[YELLOW]]\u0432\u0437\u0440\u044b\u0432\u0430\u0442\u044c \u0435\u0433\u043e \u043d\u0430 \u0440\u0430\u0441\u0441\u0442\u043e\u044f\u043d\u0438\u0438. \u0415\u0441\u0442\u044c \u0442\u0440\u0438 \u043e\u0441\u0431\u0435\u043d\u043d\u043e\u0441\u0442\u0438 \u041f\u043e\u0434\u0440\u044b\u0432\u043d\u043e\u0439 \u0414\u043e\u0431\u044b\u0447\u0438. \n[[YELLOW]]\u041f\u0435\u0440\u0432\u0430\u044f - \u044d\u0442\u043e \u0443\u043c\u0435\u043d\u0438\u0435 \u0411\u043e\u043b\u044c\u0448\u0438\u0435 \u0411\u043e\u043c\u0431\u044b, \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u0443\u0432\u0435\u043b\u0438\u0447\u0438\u0432\u0430\u0435\u0442 \u0440\u0430\u0434\u0438\u0443\u0441\n[[YELLOW]]\u0432\u0437\u0440\u044b\u0432\u0430 TNT. \u0412\u0442\u043e\u0440\u0430\u044f - \u0443\u043c\u0435\u043d\u0438\u0435 \u042d\u043a\u0441\u043f\u0435\u0440\u0442 \u0412\u0437\u0440\u044b\u0432\u043e\u0432, \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u0443\u043c\u0435\u043d\u044c\u0448\u0430\u0435\u0442 \n[[YELLOW]]\u043f\u043e\u043b\u0443\u0447\u0435\u043d\u043d\u044b\u0435 \u0432\u0430\u043c\u0438 \u043f\u043e\u0432\u0440\u0435\u0436\u0434\u0435\u043d\u0438\u044f \u043e\u0442 \u0432\u0437\u0440\u044b\u0432\u0430 TNT. \u0422\u0440\u0435\u0442\u044c\u044f - \u0443\u043c\u0435\u043d\u044c\u0448\u0435\u043d\u0438\u0435\n[[YELLOW]]\u0434\u0440\u043e\u043f\u0430 \u043f\u0440\u043e\u0441\u0442\u044b\u0445 \u043a\u0430\u043c\u043d\u0435\u0439, \u0438 \u0443\u0432\u0435\u043b\u0438\u0447\u0435\u043d\u0438\u0435 \u0434\u0440\u043e\u043f\u0430 \u043f\u043e\u043b\u0435\u0437\u043d\u044b\u0445 \u0440\u0443\u0434. -##Repair -Guides.Repair.Section.0=[[DARK_AQUA]]\u041e \u043d\u0430\u0432\u044b\u043a\u0435 \u0420\u0435\u043c\u043e\u043d\u0442:\n[[YELLOW]]\u0420\u0435\u043c\u043e\u043d\u0442 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0436\u0435\u043b\u0435\u0437\u043d\u044b\u0439 \u0431\u043b\u043e\u043a \u0434\u043b\u044f \u043f\u043e\u0447\u0438\u043d\u043a\u0438 \u0431\u0440\u043e\u043d\u0438\n[[YELLOW]]\u0438 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u043e\u0432. \n\n[[DARK_AQUA]]\u041f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435 \u043e\u043f\u044b\u0442\u0430:\n[[YELLOW]]\u0427\u0438\u043d\u0438\u0442\u0435 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u044b \u0438 \u0431\u0440\u043e\u043d\u044e, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044f mcMMO \u043d\u0430\u043a\u043e\u0432\u0430\u043b\u044c\u043d\u044e. \n[[YELLOW]]\u041f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e, \u044d\u0442\u043e \u0436\u0435\u043b\u0435\u0437\u043d\u044b\u0439 \u0431\u043b\u043e\u043a \u0438 \u044d\u0442\u0443 \n[[YELLOW]]\u043d\u0430\u043a\u043e\u0432\u0430\u043b\u044c\u043d\u044e \u043d\u0435 \u0441\u043b\u0435\u0434\u0443\u0435\u0442 \u043f\u0443\u0442\u0430\u0442\u044c \u0441 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b\u044c\u043d\u043e\u0439. -Guides.Repair.Section.1=[[DARK_AQUA]]\u041a\u0430\u043a \u0440\u0435\u043c\u043e\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0432\u0435\u0449\u0438?\n[[YELLOW]]\u0420\u0430\u0437\u043c\u0435\u0441\u0442\u0438\u0442\u0435 mcMMO \u043d\u0430\u043a\u043e\u0432\u0430\u043b\u044c\u043d\u044e \u0438 \u043a\u043b\u0438\u043a\u043d\u0438\u0442\u0435 \u043f\u043e \u043d\u0435\u0439 \u041f\u041a\u041c \n[[YELLOW]]\u0434\u043b\u044f \u043f\u043e\u0447\u0438\u043d\u043a\u0438 \u043f\u0440\u0435\u0434\u043c\u0435\u0442\u0430 \u0432 \u0440\u0443\u043a\u0435. \u042d\u0442\u043e \u0441\u0442\u043e\u0438\u0442 \u0435\u0434\u0435\u043d\u0438\u0446\u0443 \u0441\u044b\u0440\u044c\u044f. -Guides.Repair.Section.2=[[DARK_AQUA]]\u041a\u0430\u043a \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0443\u043c\u0435\u043d\u0438\u0435 \u041c\u0430\u0441\u0442\u0435\u0440 \u0420\u0435\u043c\u043e\u043d\u0442\u0430?\n[[YELLOW]]\u0423\u043c\u0435\u043d\u0438\u0435 \u041c\u0430\u0441\u0442\u0435\u0440 \u0420\u0435\u043c\u043e\u043d\u0442\u0430 \u043f\u043e\u0432\u044b\u0448\u0430\u0435\u0442 \u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u043e\u0441\u0442\u044c \u043f\u043e\u0447\u0438\u043d\u043a\u0438.\n[[YELLOW]]\u042d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u043e\u0441\u0442\u044c \u0437\u0430\u0432\u0438\u0441\u0438\u0442 \u043e\u0442 \u0443\u0440\u043e\u0432\u043d\u044f \u043d\u0430\u0432\u044b\u043a\u0430 \u0420\u0435\u043c\u043e\u043d\u0442\u0430. -Guides.Repair.Section.3=[[DARK_AQUA]]\u041a\u0430\u043a \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0443\u043c\u0435\u043d\u0438\u0435 \u0421\u0443\u043f\u0435\u0440 \u0420\u0435\u043c\u043e\u043d\u0442?\n[[YELLOW]]\u0421\u0443\u043f\u0435\u0440 \u0420\u0435\u043c\u043e\u043d\u0442 - \u044d\u0442\u043e \u043f\u0430\u0441\u0441\u0438\u0432\u043d\u043e\u0435 \u0443\u043c\u0435\u043d\u0438\u0435. \u041f\u0440\u0438 \u043f\u043e\u0447\u0438\u043d\u043a\u0435\n[[YELLOW]]\u043f\u0440\u0435\u0434\u043c\u0435\u0442\u0430 \u043e\u043d\u043e \u0434\u0430\u0435\u0442 \u0432\u0430\u043c \u0448\u0430\u043d\u0441 \u043e\u0442\u0440\u0435\u043c\u043e\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0435\u0433\u043e\n[[YELLOW]]\u0441 \u0434\u0432\u043e\u0439\u043d\u043e\u0439 \u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u043e\u0441\u0442\u044c\u044e. -Guides.Repair.Section.4=[[DARK_AQUA]]\u041a\u0430\u043a \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0443\u043c\u0435\u043d\u0438\u0435 \u0412\u043e\u043b\u0448\u0435\u0431\u043d\u0430\u044f \u041a\u043e\u0432\u043a\u0430?\n[[YELLOW]]\u042d\u0442\u043e \u043f\u0430\u0441\u0441\u0438\u0432\u043d\u043e\u0435 \u0443\u043c\u0435\u043d\u0438\u0435 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0432\u0430\u043c \u0440\u0435\u043c\u043e\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043f\u0440\u0435\u0434\u043c\u0435\u0442\u044b\n[[YELLOW]]\u0441 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u043b\u0435\u043d\u043d\u044b\u043c\u0448\u0430\u043d\u0441\u043e\u043c \u0441\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c \u0438\u0445 \u0437\u0430\u0447\u0430\u0440\u043e\u0432\u0430\u043d\u0438\u0435. \n[[YELLOW]]\u042d\u0442\u043e \u0437\u0430\u0447\u0430\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u043c\u043e\u0436\u0435\u0442 \u043e\u0441\u0442\u0430\u0442\u044c\u0441\u044f \u043d\u0430 \u043f\u0440\u0435\u0436\u043d\u0435\u043c \u0443\u0440\u043e\u0432\u043d\u0435,\n[[YELLOW]]\u0441\u043d\u0438\u0437\u0438\u0442\u044c\u0441\u044f \u0438\u043b\u0438 \u0438\u0441\u0447\u0435\u0437\u043d\u0443\u0442\u044c. -##Salvage -Guides.Salvage.Section.0=[[DARK_AQUA]]\u041e \u043f\u0435\u0440\u0435\u0440\u0430\u0431\u043e\u0442\u043a\u0435:\n[[YELLOW]]\u041f\u0435\u0440\u0435\u0440\u0430\u0431\u043e\u0442\u043a\u0430 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0432\u0430\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0437\u043e\u043b\u043e\u0442\u043e\u0439 \u0431\u043b\u043e\u043a \u0434\u043b\u044f \u043f\u0435\u0440\u0435\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0431\u0440\u043e\u043d\u0438 \u0438\n[[YELLOW]]\u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u043e\u0432.\n\n[[DARK_AQUA]]\u041f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435 \u043e\u043f\u044b\u0442\u0430:\n[[YELLOW]]\u041f\u0435\u0440\u0435\u0440\u0430\u0431\u043e\u0442\u043a\u0430 \u044d\u0442\u043e \u043f\u043e\u0434\u0441\u043f\u043e\u0441\u043e\u0431\u043d\u043e\u0441\u0442\u044c \u041f\u043e\u0447\u0438\u043d\u043a\u0438 \u0438 \u0420\u044b\u0431\u0430\u043b\u043a\u0438, \u0432\u0430\u0448 \u0443\u0440\u043e\u0432\u0435\u043d\u044c\n[[YELLOW]]\u043f\u0435\u0440\u0435\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0437\u0430\u0432\u0438\u0441\u0438\u0442 \u043e\u0442 \u0432\u0430\u0448\u0438\u0445 \u0443\u0440\u043e\u0432\u043d\u0435\u0439 \u041f\u043e\u0447\u0438\u043d\u043a\u0438 \u0438 \u0420\u044b\u0431\u0430\u043b\u043a\u0438. -Guides.Salvage.Section.1=[[DARK_AQUA]]\u041a\u0430\u043a \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0443\u043c\u0435\u043d\u0438\u0435 \u0420\u0430\u0437\u0431\u043e\u0440\u043a\u0430 \u0412\u0435\u0449\u0435\u0439?\n[[YELLOW]]\u0420\u0430\u0437\u043c\u0435\u0441\u0442\u0438\u0442\u0435 \u0420\u0430\u0437\u0431\u043e\u0440\u043e\u0447\u043d\u0443\u044e \u041d\u0430\u043a\u043e\u0432\u0430\u043b\u044c\u043d\u044e mcMMO \u0438 \u043a\u043b\u0438\u043a\u043d\u0438\u0442\u0435 \u043f\u043e \n[[YELLOW]]\u043d\u0435\u0439 \u041f\u041a\u041c, \u0447\u0442\u043e\u0431\u044b \u0440\u0430\u0437\u043e\u0431\u0440\u0430\u0442\u044c \u043f\u0440\u0435\u0434\u043c\u0435\u0442 \u0432 \u0440\u0443\u043a\u0435 \u043d\u0430 \u0441\u044b\u0440\u044c\u0435. \u042d\u0442\u043e \u0443\u043d\u0438\u0447\u0442\u043e\u0436\u0438\u0442\n[[YELLOW]]\u043f\u0440\u0435\u0434\u043c\u0435\u0442 \u0438 \u0432\u0435\u0440\u043d\u0435\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u043d\u043e\u0435 \u0441\u044b\u0440\u044c\u0435. \u0412\u044b \u043c\u043e\u0436\u0435\u0442\u0435 \u0440\u0430\u0437\u043e\u0431\u0440\u0430\u0442\u044c\n[[YELLOW]]\u0442\u043e\u043b\u044c\u043a\u043e \u043d\u0435\u043f\u043e\u0432\u0440\u0435\u0436\u0434\u0435\u043d\u043d\u044b\u0435 \u0432\u0435\u0449\u0438. -Guides.Salvage.Section.2=[[DARK_AQUA]]\u041a\u0430\u043a \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0443\u043c\u0435\u043d\u0438\u0435 \u0423\u043b\u0443\u0447\u0448\u0435\u043d\u043d\u0430\u044f \u041f\u0435\u0440\u0435\u0440\u0430\u0431\u043e\u0442\u043a\u0430?\n[[YELLOW]]\u041a\u043e\u0433\u0434\u0430 \u0440\u0430\u0437\u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u0430\u043d\u0430, \u0442\u043e \u044d\u0442\u0430 \u0441\u043f\u043e\u0441\u043e\u0431\u043d\u043e\u0441\u0442\u044c \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0432\u0430\u043c \u043f\u0435\u0440\u0435\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0442\u044c \u043f\u043e\u0432\u0440\u0435\u0436\u0434\u0435\u043d\u043d\u044b\u0435 \u0432\u0435\u0449\u0438.\n[[YELLOW]]\u041f\u043e\u043b\u0435\u0437\u043d\u044b\u0439 \u0432\u044b\u0445\u043b\u043e\u043f \u043f\u043e\u0432\u044b\u0448\u0430\u0435\u0442\u0441\u044f \u0432\u043c\u0435\u0441\u0442\u0435 \u0441 \u0443\u0440\u043e\u0432\u043d\u0435\u043c. \u0412\u044b\u0441\u043e\u043a\u0438\u0439\n[[YELLOW]]\u043f\u043e\u043b\u0435\u0437\u043d\u044b\u0439 \u0432\u044b\u0445\u043e\u043b\u043e\u043f \u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442 \u0447\u0442\u043e \u0432\u044b \u0441\u043c\u043e\u0436\u0435\u0442\u0435 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0431\u043e\u043b\u044c\u0448\u0435 \u043c\u0430\u0442\u0435\u0440\u0438\u0430\u043b\u043e\u0432 \u043e\u0431\u0440\u0430\u0442\u043d\u043e.\n[[YELLOW]]\u0421 \u0423\u043b\u0443\u0447\u0448\u0435\u043d\u043d\u043e\u0439 \u041f\u0435\u0440\u0435\u0440\u0430\u0431\u043e\u0442\u043a\u043e\u0439 \u0432\u044b \u0431\u0443\u0434\u0435\u0442\u0435 \u0432\u0441\u0435\u0433\u0434\u0430 \u043f\u043e\u043b\u0443\u0447\u0430\u0442\u044c 1 \u043c\u0430\u0442\u0435\u0440\u0438\u0430\u043b \u043e\u0431\u0440\u0430\u0442\u043d\u043e,\n[[YELLOW]]\u043a\u0440\u043e\u043c\u0435 \u0441\u043b\u0443\u0447\u0430\u0435\u0432 \u043a\u043e\u0433\u0434\u0430 \u043f\u0440\u0435\u0434\u043c\u0435\u0442 \u0441\u043b\u0438\u0448\u043a\u043e\u043c \u0441\u0438\u043b\u044c\u043d\u043e \u043f\u043e\u0432\u0440\u0435\u0436\u0434\u0435\u043d. \u0422\u0430\u043a \u0447\u0442\u043e \u0432\u0430\u043c \u043d\u0435 \u043d\u0443\u0436\u043d\u043e \u0432\u043e\u043b\u043d\u043e\u0432\u0430\u0442\u044c\u0441\u044f\n[[YELLOW]]\u043e \u0443\u043d\u0438\u0447\u0442\u043e\u0436\u0435\u043d\u0438\u0438 \u043f\u0440\u0435\u0434\u043c\u0435\u0442\u043e\u0432 \u0431\u0435\u0437 \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u0447\u0435\u0433\u043e-\u0442\u043e \u043e\u0431\u0440\u0430\u0442\u043d\u043e. -Guides.Salvage.Section.3=[[DARK_AQUA]]\u0427\u0442\u043e\u0431\u044b \u043f\u043e\u043a\u0430\u0437\u0430\u0442\u044c \u043a\u0430\u043a \u044d\u0442\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442, \u0432\u043e\u0442 \u043f\u0440\u0438\u043c\u0435\u0440:\n[[YELLOW]]\u041f\u0440\u0435\u0434\u043f\u043e\u043b\u043e\u0436\u0438\u043c \u043c\u044b \u043f\u0435\u0440\u0435\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0435\u043c \u0437\u043e\u043b\u043e\u0442\u0443\u044e \u043a\u0438\u0440\u043a\u0443, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043f\u043e\u0432\u0440\u0435\u0436\u0434\u0435\u043d\u0430 \u043d\u0430 20%,\n[[YELLOW]]\u044d\u0442\u043e \u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442, \u0447\u0442\u043e \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0435 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0441\u043b\u0438\u0442\u043a\u043e\u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u0432\u044b \u043c\u043e\u0436\u0435\u0442\u0435 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c - \u0432\u0441\u0435\u0433\u043e 2\n[[YELLOW]](\u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u043a\u0438\u0440\u043a\u0430 \u0442\u0440\u0435\u0431\u0443\u0435\u0442 3 \u0441\u043b\u0438\u0442\u043a\u0430 - \u043a\u0430\u0436\u0434\u044b\u0439 \u0441\u0442\u043e\u0438\u0442\n[[YELLOW]]33,33% \u043f\u0440\u043e\u0447\u043d\u043e\u0441\u0442\u0438) \u0447\u0442\u043e \u044d\u043a\u0432\u0438\u0432\u0430\u043b\u0435\u043d\u0442\u043d\u043e 66%. \u0415\u0441\u043b\u0438 \u0432\u0430\u0448 \u043f\u0440\u043e\u0446\u0435\u043d\u0442\n[[YELLOW]]\u043f\u043e\u043b\u0435\u0437\u043d\u043e\u0433\u043e \u0432\u044b\u0445\u043b\u043e\u043f\u0430 \u043d\u0438\u0436\u0435 66%, \u0442\u043e \u0432\u044b \u043d\u0435 \u0441\u043c\u043e\u0436\u0435\u0442\u0435 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c 2 \u0441\u043b\u0438\u0442\u043a\u0430.\n[[YELLOW]]\u0415\u0441\u043b\u0438 \u043e\u043d \u0432\u044b\u0448\u0435 \u044d\u0442\u043e\u0433\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f, \u0442\u043e \u0432\u044b \u0441\u043c\u043e\u0436\u0435\u0442\u0435 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c "\u041f\u043e\u043b\u043d\u0443\u044e \u0441\u0442\u043e\u0438\u043c\u043e\u0441\u0442\u044c",\n[[YELLOW]]\u0447\u0442\u043e \u0437\u043d\u0430\u0447\u0438\u0442 - \u0432\u044b \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u0435 2 \u0441\u043b\u0438\u0442\u043a\u0430. -Guides.Salvage.Section.4=[[DARK_AQUA]]\u041a\u0430\u043a \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u041c\u0430\u0433\u0438\u0447\u0435\u0441\u043a\u0430\u044f \u041f\u0435\u0440\u0435\u0440\u0430\u0431\u043e\u0442\u043a\u0430?\n[[YELLOW]]\u042d\u0442\u0430 \u0441\u043f\u043e\u0441\u043e\u0431\u043d\u043e\u0441\u0442\u044c \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0432\u0430\u043c \u043f\u043e\u043b\u0443\u0447\u0430\u0442\u044c \u043a\u043d\u0438\u0433\u0438 \u0437\u0430\u0447\u0430\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u043a\u043e\u0433\u0434\u0430 \u0432\u044b \u043f\u0435\u0440\u0435\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0435\u0442\u0435\n[[YELLOW]]\u0437\u0430\u0447\u0430\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0435 \u043f\u0440\u0435\u0434\u043c\u0435\u0442\u044b. \u0412 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 \u043e\u0442 \u0448\u0430\u043d\u0441\u0430 \u0443\u0441\u043f\u0435\u0445\u0430\n[[YELLOW]]\u0432\u044b \u043c\u043e\u0436\u0435\u0442\u0435 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u043f\u043e\u043b\u043d\u0443\u044e \u043a\u043d\u0438\u0433\u0443 \u0438\u043b\u0438 \u043b\u0438\u0448\u044c \u0447\u0430\u0441\u0442\u0438\u0447\u043d\u0443\u044e.\n\n[[YELLOW]]\u041a\u043e\u0433\u0434\u0430 \u0432\u044b \u0438\u0437\u0432\u043b\u0435\u043a\u0430\u0435\u0442\u0435 \u0447\u0430\u0441\u0442\u0438\u0447\u043d\u043e\u0435 \u0437\u0430\u0447\u0430\u0440\u043e\u0432\u0430\u043d\u0438\u0435, \u0442\u043e \u0437\u0430\u0447\u0430\u0440\u043e\u0432\u0430\u043d\u0438\u0435\n[[YELLOW]]\u043d\u0430 \u043a\u043d\u0438\u0433\u0435 \u0431\u0443\u0434\u0435\u0442 \u0438\u043c\u0435\u0442\u044c \u043c\u0435\u043d\u044c\u0448\u0438\u0439 \u0443\u0440\u043e\u0432\u0435\u043d\u044c, \u0447\u0435\u043c \u0437\u0430\u0447\u0430\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u043a\u043e\u0442\u043e\u0440\u043e\u0435\n[[YELLOW]]\u0431\u044b\u043b\u043e \u043d\u0430 \u043f\u0440\u0435\u0434\u043c\u0435\u0442\u0435. -##Swords -Guides.Swords.Section.0=[[DARK_AQUA]]\u041e \u043d\u0430\u0432\u044b\u043a\u0435 \u041c\u0435\u0447\u0438:\n[[YELLOW]]\u042d\u0442\u043e\u0442 \u043d\u0430\u0432\u044b\u043a \u0434\u0430\u0435\u0442 \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u0435 \u0431\u043e\u043d\u0443\u0441\u044b \u043f\u0440\u0438 \u0431\u0438\u0442\u0432\u0435 \u043c\u0435\u0447\u0435\u043c.\n\n[[DARK_AQUA]]\u041f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435 \u043e\u043f\u044b\u0442\u0430:\n[[YELLOW]]\u041e\u043f\u044b\u0442 \u043d\u0430\u0447\u0438\u0441\u043b\u044f\u0435\u0442\u0441\u044f \u0432 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 \u043e\u0442 \u0443\u0440\u043e\u043d\u0430, \u043d\u0430\u043d\u0435\u0441\u0435\u043d\u043d\u043e\u0433\u043e \n[[YELLOW]]\u043c\u043e\u0431\u0430\u043c \u0438\u043b\u0438 \u0434\u0440\u0443\u0433\u0438\u043c \u0438\u0433\u0440\u043e\u043a\u0430\u043c \u043f\u0440\u0438 \u043f\u043e\u043c\u043e\u0449\u0438 \u043c\u0435\u0447\u0430. -Guides.Swords.Section.1=[[DARK_AQUA]]\u041a\u0430\u043a \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0443\u043c\u0435\u043d\u0438\u0435 \u0420\u0435\u0436\u0443\u0449\u0438\u0439 \u0423\u0434\u0430\u0440?\n[[YELLOW]]\u0420\u0435\u0436\u0443\u0449\u0438\u0439 \u0423\u0434\u0430\u0440 - \u044d\u0442\u043e \u0430\u043a\u0442\u0438\u0432\u043d\u043e\u0435 \u0443\u043c\u0435\u043d\u0438\u0435, \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u0430\u043a\u0442\u0438\u0432\u0438\u0440\u0443\u0435\u0442\u0441\u044f \n[[YELLOW]]\u043d\u0430\u0436\u0430\u0442\u0438\u0435\u043c \u041f\u041a\u041c \u0441 \u043c\u0435\u0447\u0435\u043c \u0432 \u0440\u0443\u043a\u0435. \u042d\u0442\u043e \u0443\u043c\u0435\u043d\u0438\u0435 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0441\u043e\u0432\u0435\u0440\u0448\u0438\u0442\u044c \n[[YELLOW]]\u0443\u0434\u0430\u0440 \u043f\u043e \u043e\u0431\u043b\u0430\u0441\u0442\u0438, \u0447\u0442\u043e \u043d\u0430\u043d\u0435\u0441\u0435\u0442 \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u043e 25% \u0443\u0440\u043e\u043d\u0430\n[[YELLOW]]\u0438 \u0432\u044b\u0437\u043e\u0432\u0435\u0442 \u044d\u0444\u0444\u0435\u043a\u0442 \u043a\u0440\u043e\u0432\u043e\u0442\u0435\u0447\u0435\u043d\u0438\u044f, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u0440\u043e\u0434\u043b\u0438\u0442\u0441\u044f 5 \u0442\u0438\u043a\u043e\u0432. -Guides.Swords.Section.2=[[DARK_AQUA]]\u041a\u0430\u043a \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0443\u043c\u0435\u043d\u0438\u0435 \u041a\u043e\u043d\u0442\u0440\u0430\u0442\u0430\u043a\u0430?\n[[YELLOW]]\u041a\u043e\u043d\u0442\u0440\u0430\u0442\u0430\u043a\u0430 - \u044d\u0442\u043e \u0430\u043a\u0442\u0438\u0432\u043d\u043e\u0435 \u0443\u043c\u0435\u043d\u0438\u0435, \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u0434\u0430\u0435\u0442 \u0448\u0430\u043d\u0441 \u043f\u0440\u0438\n[[YELLOW]]\u043f\u0440\u0438 \u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0438 \u0443\u0434\u0430\u0440\u043e\u0432 \u043e\u0442\u0440\u0430\u0437\u0438\u0442\u044c 50% \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u043d\u043e\u0433\u043e \u0443\u0440\u043e\u043d\u0430. -Guides.Swords.Section.3=[[DARK_AQUA]]\u041a\u0430\u043a \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0443\u043c\u0435\u043d\u0438\u0435 \u041a\u0440\u043e\u0432\u043e\u0442\u0435\u0447\u0435\u043d\u0438\u0435?\n[[YELLOW]]\u041a\u0440\u043e\u0432\u043e\u0442\u0435\u0447\u0435\u043d\u0438\u0435 \u0437\u0430\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u0432\u0440\u0430\u0433\u043e\u0432 \u043f\u043e\u043b\u0443\u0447\u0430\u0442\u044c \u0443\u0440\u043e\u043d \u043a\u0430\u0436\u0434\u044b\u0435 2 \u0441\u0435\u043a\u0443\u043d\u0434\u044b.\n[[YELLOW]]\u0426\u0435\u043b\u044c \u0431\u0443\u0434\u0435\u0442 \u043a\u0440\u043e\u0432\u043e\u0442\u043e\u0447\u0438\u0442\u044c \u043f\u043e\u043a\u0430 \u043d\u0435 \u043f\u0440\u0435\u043a\u0440\u0430\u0442\u0438\u0442\u0441\u044f \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0435 \u044d\u0444\u0444\u0435\u043a\u0442\u0430\n[[YELLOW]]\u0438\u043b\u0438 \u043d\u0435 \u043d\u0430\u0441\u0442\u0443\u043f\u0438\u0442 \u0441\u043c\u0435\u0440\u0442\u044c. \u041f\u0440\u043e\u0434\u043e\u043b\u0436\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u044d\u0444\u0444\u0435\u043a\u0442\u0430\n[[YELLOW]]\u0437\u0430\u0432\u0438\u0441\u0438\u0442 \u043e\u0442 \u0443\u0440\u043e\u0432\u043d\u044f \u043d\u0430\u0432\u044b\u043a\u0430 \u041c\u0435\u0447\u0438. -##Smelting -Guides.Smelting.Section.0=\u0421\u043a\u043e\u0440\u043e \u0431\u0443\u0434\u0435\u0442... -##Taming -Guides.Taming.Section.0=[[DARK_AQUA]]\u041e \u043d\u0430\u0432\u044b\u043a\u0435 \u0423\u043a\u0440\u043e\u0449\u0435\u043d\u0438\u0435:\n[[YELLOW]]\u041d\u0430\u0432\u044b\u043a \u0423\u043a\u0440\u043e\u0449\u0435\u043d\u0438\u0435 \u0434\u0430\u0435\u0442 \u0438\u0433\u0440\u043e\u043a\u0430\u043c \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u0435 \u0431\u043e\u043d\u0443\u0441\u044b \u0432 \u0431\u0438\u0442\u0432\u0435\n[[YELLOW]]\u0441 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435\u043c \u0437\u0432\u0435\u0440\u0435\u0439.\n\n[[DARK_AQUA]]\u041f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435 \u043e\u043f\u044b\u0442\u0430:\n[[YELLOW]]\u0427\u0442\u043e\u0431\u044b \u043f\u043e\u043b\u0443\u0447\u0430\u0442\u044c \u043e\u043f\u044b\u0442 \u0432 \u044d\u0442\u043e\u043c \u043d\u0430\u0432\u044b\u043a\u0435, \u0432\u0430\u043c \u043d\u0443\u0436\u043d\u043e \u043f\u0440\u0438\u0440\u0443\u0447\u0430\u0442\u044c \u0432\u043e\u043b\u043a\u043e\u0432\n[[YELLOW]]\u0438\u043b\u0438 \u043e\u0446\u0435\u043b\u043e\u0442\u043e\u0432, \u0430 \u0442\u0430\u043a\u0436\u0435 \u0441\u0440\u0430\u0436\u0430\u0442\u044c\u0441\u044f \u043f\u0440\u0438 \u043f\u043e\u043c\u043e\u0449\u0438 \u0432\u043e\u043b\u043a\u043e\u0432. -Guides.Taming.Section.1=[[DARK_AQUA]]\u041a\u0430\u043a \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0443\u043c\u0435\u043d\u0438\u0435 \u0417\u043e\u0432 \u041f\u0440\u0435\u0434\u043a\u043e\u0432?\n[[YELLOW]]\u0417\u043e\u0432 \u041f\u0440\u0435\u0434\u043a\u043e\u0432 - \u044d\u0442\u043e \u0430\u043a\u0442\u0438\u0432\u043d\u043e\u0435 \u0443\u043c\u0435\u043d\u0438\u0435, \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0432\u0430\u043c\n[[YELLOW]]\u043f\u0440\u0438\u0437\u044b\u0432\u0430\u0442\u044c \u043a \u0441\u0435\u0431\u0435 \u043f\u0440\u0438\u0440\u0443\u0447\u0435\u043d\u043d\u044b\u0445 \u0432\u043e\u043b\u043a\u043e\u0432 \u0438\u043b\u0438 \u043e\u0446\u0435\u043b\u043e\u0442\u043e\u0432. \u042d\u0442\u043e \u043c\u043e\u0436\u043d\u043e\n[[YELLOW]]\u0441\u0434\u0435\u043b\u0430\u0442\u044c \u043d\u0430\u0436\u0430\u0432 \u041b\u041a\u041c, \u0434\u0435\u0440\u0436\u0430 \u0432 \u0440\u0443\u043a\u0435 \u043a\u043e\u0441\u0442\u0438 \u0438\u043b\u0438 \u0440\u044b\u0431\u0443. -Guides.Taming.Section.2=[[DARK_AQUA]]\u041a\u0430\u043a \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0443\u043c\u0435\u043d\u0438\u0435 \u0417\u043d\u0430\u043d\u0438\u0435 \u0417\u0432\u0435\u0440\u0435\u0439?\n[[YELLOW]]\u0417\u043d\u0430\u043d\u0438\u0435 \u0417\u0432\u0435\u0440\u0435\u0439 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0438\u0433\u0440\u043e\u043a\u0430\u043c \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0442\u044c \u0437\u0434\u043e\u0440\u043e\u0432\u044c\u0435 \u0438\u0445 \u043f\u0438\u0442\u043e\u043c\u0446\u0435\u0432\n[[YELLOW]]\u0438 \u043f\u043e\u043b\u0443\u0447\u0430\u0442\u044c \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u0443\u044e \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e \u043e \u043d\u0438\u0445. \u041a\u043b\u0438\u043a\u043d\u0438\u0442\u0435 \u041b\u041a\u041c \u043f\u043e \u0432\u043e\u043b\u043a\u0443 \u0438\u043b\u0438 \n[[YELLOW]]\u043e\u0446\u0435\u043b\u043e\u0442\u0443, \u0447\u0442\u043e\u0431\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0443\u043c\u0435\u043d\u0438\u0435 \u0417\u043d\u0430\u043d\u0438\u0435 \u0417\u0432\u0435\u0440\u0435\u0439. -Guides.Taming.Section.3=[[DARK_AQUA]]\u041a\u0430\u043a \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0443\u043c\u0435\u043d\u0438\u0435 \u0423\u043a\u0443\u0441?\n[[YELLOW]]\u0423\u043a\u0443\u0441 - \u044d\u0442\u043e \u043f\u0430\u0441\u0441\u0438\u0432\u043d\u043e\u0435 \u0443\u043c\u0435\u043d\u0438\u0435, \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u0434\u0430\u0435\u0442 \u0448\u0430\u043d\u0441 \u0447\u0442\u043e \u0430\u0442\u0430\u043a\u0430\n[[YELLOW]]\u0432\u0430\u0448\u0438\u0445 \u0432\u043e\u043b\u043a\u043e\u0432 \u043f\u0440\u0438\u0432\u0435\u0434\u0435\u0442 \u043a \u043a\u0440\u043e\u0432\u043e\u0442\u0435\u0447\u0435\u043d\u0438\u044e \u0446\u0435\u043b\u0438. -Guides.Taming.Section.4=[[DARK_AQUA]]\u041a\u0430\u043a \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0443\u043c\u0435\u043d\u0438\u0435 \u041e\u0441\u0442\u0440\u044b\u0435 \u041a\u043e\u0433\u0442\u0438?\n[[YELLOW]]\u0423\u043c\u0435\u043d\u0438\u0435 \u041e\u0441\u0442\u0440\u044b\u0435 \u041a\u043e\u0433\u0442\u0438 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0432\u0430\u0448\u0438\u043c\u0438 \u0432\u043e\u043b\u043a\u0430\u043c \u043d\u0430\u043d\u043e\u0441\u0438\u0442\u044c\n[[YELLOW]]\u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u0443\u0440\u043e\u043d, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0437\u0430\u0432\u0438\u0441\u0438\u0442 \u043e\u0442 \u0443\u0440\u043e\u0432\u043d\u044f \u043d\u0430\u0432\u044b\u043a\u0430 \u0423\u043a\u0440\u043e\u0449\u0435\u043d\u0438\u0435. -Guides.Taming.Section.5=[[DARK_AQUA]]\u041a\u0430\u043a \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0443\u043c\u0435\u043d\u0438\u0435 \u0417\u043d\u0430\u043d\u0438\u0435 \u041e\u043a\u0440\u0443\u0436\u0430\u044e\u0449\u0435\u0439 \u0421\u0440\u0435\u0434\u044b?\n[[YELLOW]]\u042d\u0442\u043e \u043f\u0430\u0441\u0441\u0438\u0432\u043d\u043e\u0435 \u0443\u043c\u0435\u043d\u0438\u0435 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0432\u0430\u0448\u0438\u043c \u0432\u043e\u043b\u043a\u0430\u043c \u0442\u0435\u043b\u0435\u043f\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u0441\u044f\n[[YELLOW]]\u043a \u0432\u0430\u043c,\u0435\u0441\u043b\u0438 \u0438\u043c \u0443\u0433\u0440\u043e\u0436\u0430\u0435\u0442 \u043e\u043f\u0430\u0441\u043d\u043e\u0441\u0442\u044c, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440 \u041a\u0430\u043a\u0442\u0443\u0441/\u041b\u0430\u0432\u0430. \u041e\u043d\u043e \u0442\u0430\u043a\u0436\u0435\n[[YELLOW]]\u0434\u0430\u0435\u0442 \u0432\u0430\u0448\u0438\u043c \u0432\u043e\u043b\u043a\u0430\u043c \u0437\u0430\u0449\u0438\u0442\u0443 \u043e\u0442 \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u0443\u0440\u043e\u043d\u0430 \u043f\u0440\u0438 \u043f\u0430\u0434\u0435\u043d\u0438\u0438. -Guides.Taming.Section.6=[[DARK_AQUA]]\u041a\u0430\u043a \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0443\u043c\u0435\u043d\u0438\u0435 \u0413\u0443\u0441\u0442\u043e\u0439 \u041c\u0435\u0445?\n[[YELLOW]]\u042d\u0442\u043e \u043f\u0430\u0441\u0441\u0438\u0432\u043d\u043e\u0435 \u0443\u043c\u0435\u043d\u0438\u0435 \u0443\u043c\u0435\u043d\u044c\u0448\u0430\u0435\u0442 \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c\u044b\u0439 \u0432\u0430\u0448\u0438\u043c\u0438 \u0432\u043e\u043b\u043a\u0430\u043c\u0438\n[[YELLOW]]\u0443\u0440\u043e\u043d \u0438 \u043d\u0430\u0434\u0435\u043b\u044f\u0435\u0442 \u0438\u0445 \u043e\u0433\u043d\u0435\u0441\u0442\u043e\u0439\u043a\u043e\u0441\u0442\u044c\u044e. -Guides.Taming.Section.7=[[DARK_AQUA]]\u041a\u0430\u043a \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0443\u043c\u0435\u043d\u0438\u0435 \u041d\u0430\u0434\u0435\u0436\u043d\u0430\u044f \u0417\u0430\u0449\u0438\u0442\u0430?\n[[YELLOW]]\u042d\u0442\u043e \u043f\u0430\u0441\u0441\u0438\u0432\u043d\u043e\u0435 \u0443\u043c\u0435\u043d\u0438\u0435 \u0443\u043c\u0435\u043d\u044c\u0448\u0430\u0435\u0442 \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c\u044b\u0439 \u0432\u0430\u0448\u0438\u043c\u0438\n[[YELLOW]]\u0432\u043e\u043b\u043a\u0430\u043c\u0438 \u0443\u0440\u043e\u043d \u043f\u0440\u0438 \u0432\u0437\u0440\u044b\u0432\u0430\u0445. -Guides.Taming.Section.8=[[DARK_AQUA]]\u041a\u0430\u043a \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0443\u043c\u0435\u043d\u0438\u0435 \u0411\u044b\u0441\u0442\u0440\u043e\u0435 \u041f\u0438\u0442\u0430\u043d\u0438\u0435?\n[[YELLOW]]\u042d\u0442\u043e \u043f\u0430\u0441\u0441\u0438\u0432\u043d\u043e\u0435 \u0443\u043c\u0435\u043d\u0438\u0435 \u0434\u0430\u0435\u0442 \u0432\u0430\u0448\u0438\u043c \u0432\u043e\u043b\u043a\u0430\u043c \u0448\u0430\u043d\u0441\n[[YELLOW]]\u0438\u0441\u0446\u0435\u043b\u0438\u0442\u044c\u0441\u044f, \u043a\u043e\u0433\u0434\u0430 \u043e\u043d\u0438 \u0430\u0442\u0430\u043a\u0443\u044e\u0442 \u043a\u043e\u0433\u043e-\u043b\u0438\u0431\u043e. -##Unarmed -Guides.Unarmed.Section.0=[[DARK_AQUA]]\u041e \u043d\u0430\u0432\u044b\u043a\u0435 \u0411\u0435\u0437\u043e\u0440\u0443\u0436\u043d\u044b\u0439:\n[[YELLOW]]\u041d\u0430\u0432\u044b\u043a \u0411\u0435\u0437\u043e\u0440\u0443\u0436\u043d\u044b\u0439 \u0434\u0430\u0435\u0442 \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u0435 \u0431\u043e\u0435\u0432\u044b\u0435 \u0431\u043e\u043d\u0443\u0441\u044b, \u043a\u043e\u0433\u0434\u0430\n[[YELLOW]]\u0432\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0435 \u0432\u0430\u0448\u0438 \u043a\u0443\u043b\u0430\u043a\u0438 \u043a\u0430\u043a \u043e\u0440\u0443\u0436\u0438\u0435.\n\n[[DARK_AQUA]]\u041f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435 \u043e\u043f\u044b\u0442\u0430:\n[[YELLOW]]\u041a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c\u043e\u0433\u043e \u043e\u043f\u044b\u0442\u0430 \u0437\u0430\u0432\u0438\u0441\u0438\u0442 \u043e\u0442 \u0443\u0440\u043e\u043d\u0430, \u043d\u0430\u043d\u0435\u0441\u0435\u043d\u043d\u043e\u0433\u043e\n[[YELLOW]]\u043a\u0443\u043b\u0430\u043a\u0430\u043c\u0438 \u043c\u043e\u0431\u0430\u043c \u0438\u043b\u0438 \u0434\u0440\u0443\u0433\u0438\u043c \u0438\u0433\u0440\u043e\u043a\u0430\u043c. -Guides.Unarmed.Section.1=[[DARK_AQUA]]\u041a\u0430\u043a \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0443\u043c\u0435\u043d\u0438\u0435 \u0411\u0435\u0440\u0441\u0435\u0440\u043a?\n[[YELLOW]]\u0411\u0435\u0440\u0441\u0435\u0440\u043a - \u044d\u0442\u043e \u0430\u043a\u0442\u0438\u0432\u043d\u043e\u0435 \u0443\u043c\u0435\u043d\u0438\u0435, \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u0430\u043a\u0442\u0438\u0432\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u043d\u0430\u0436\u0430\u0442\u0438\u0435\u043c \u041f\u041a\u041c.\n[[YELLOW]]\u041a\u043e\u0433\u0434\u0430 \u043e\u043d\u043e \u0430\u043a\u0442\u0438\u0432\u043d\u043e \u0432\u044b \u0431\u0443\u0434\u0435\u0442\u0435 \u043d\u0430\u043d\u043e\u0441\u0438\u0442\u044c \u043d\u0430 50% \u0431\u043e\u043b\u044c\u0448\u0435 \u0443\u0440\u043e\u043d\u0430 \u0438\n[[YELLOW]]\u0441\u043c\u043e\u0436\u0435\u0442\u0435 \u043c\u0433\u043d\u043e\u0432\u0435\u043d\u043d\u043e \u0440\u0430\u0437\u0440\u0443\u0448\u0430\u0442\u044c \u0445\u0440\u0443\u043f\u043a\u0438\u0435 \u0431\u043b\u043e\u043a\u0438, \u043a\u0430\u043a \u0413\u0440\u044f\u0437\u044c \u0438 \u0422\u0440\u0430\u0432\u0430. -Guides.Unarmed.Section.2=[[DARK_AQUA]]\u041a\u0430\u043a \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0443\u043c\u0435\u043d\u0438\u0435 \u0416\u0435\u043b\u0435\u0437\u043d\u044b\u0439 \u041a\u0443\u043b\u0430\u043a?\n[[YELLOW]]\u0423\u043c\u0435\u043d\u0438\u0435 \u0416\u0435\u043b\u0435\u0437\u043d\u044b\u0439 \u041a\u0443\u043b\u0430\u043a \u0443\u0432\u0435\u043b\u0438\u0447\u0438\u0432\u0430\u0435\u0442 \u0443\u0440\u043e\u043d, \u043d\u0430\u043d\u043e\u0441\u0438\u043c\u044b\u0439\n[[YELLOW]]\u043a\u0443\u043b\u0430\u043a\u0430\u043c\u0438 \u043c\u043e\u0431\u0430\u043c \u0438 \u0434\u0440\u0443\u0433\u0438\u043c \u0438\u0433\u0440\u043e\u043a\u0430\u043c. -Guides.Unarmed.Section.3=[[DARK_AQUA]]\u041a\u0430\u043a \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0443\u043c\u0435\u043d\u0438\u0435 \u041e\u0442\u0440\u0430\u0436\u0435\u043d\u0438\u0435 \u0421\u0442\u0440\u0435\u043b?\n[[YELLOW]]\u041e\u0442\u0440\u0430\u0436\u0435\u043d\u0438\u0435 \u0421\u0442\u0440\u0435\u043b - \u044d\u0442\u043e \u043f\u0430\u0441\u0441\u0438\u0432\u043d\u043e\u0435 \u0443\u043c\u0435\u043d\u0438\u0435, \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u0434\u0430\u0435\u0442 \u0432\u0430\u043c \u0448\u0430\u043d\u0441\n[[YELLOW]]\u043e\u0442\u0440\u0430\u0436\u0430\u0442\u044c \u0441\u0442\u0440\u0435\u043b\u044b, \u0432\u044b\u043f\u0443\u0449\u0435\u043d\u044b\u0435 \u0421\u043a\u0435\u043b\u0435\u0442\u0430\u043c\u0438 \u0438\u043b\u0438 \u0434\u0440\u0443\u0433\u0438\u043c\u0438 \u0438\u0433\u0440\u043e\u043a\u0430\u043c\u0438.\n[[YELLOW]]\u0421\u0442\u0440\u0435\u043b\u0430 \u0443\u043f\u0430\u0434\u0435\u0442 \u043d\u0430 \u0437\u0435\u043c\u043b\u044e \u0431\u0435\u0437 \u043f\u0440\u0438\u0447\u0435\u043d\u0435\u043d\u0438\u044f \u0432\u0430\u043c \u0432\u0440\u0435\u0434\u0430. -Guides.Unarmed.Section.4=[[DARK_AQUA]]\u041a\u0430\u043a \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0443\u043c\u0435\u043d\u0438\u0435 \u0416\u0435\u043b\u0435\u0437\u043d\u0430\u044f \u0425\u0432\u0430\u0442\u043a\u0430?\n[[YELLOW]]\u0416\u0435\u043b\u0435\u0437\u043d\u0430\u044f \u0425\u0432\u0430\u0442\u043a\u0430 - \u044d\u0442\u043e \u043f\u0430\u0441\u0441\u0438\u0432\u043d\u043e\u0435 \u0443\u043c\u0435\u043d\u0438\u0435, \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u043f\u0440\u0435\u043f\u044f\u0442\u0441\u0442\u0432\u0443\u0435\u0442\n[[YELLOW]]\u0440\u0430\u0437\u043e\u0440\u0443\u0436\u0435\u043d\u0438\u044e. \u0428\u0430\u043d\u0441 \u0440\u0430\u0441\u0442\u0435\u0442 \u0432\u043c\u0435\u0441\u0442\u0435 \u0441 \u0443\u0440\u043e\u0432\u043d\u0435\u043c \u043d\u0430\u0432\u044b\u043a\u0430 \u0411\u0435\u0437\u043e\u0440\u0443\u0436\u043d\u044b\u0439. -Guides.Unarmed.Section.5=[[DARK_AQUA]]\u041a\u0430\u043a \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0443\u043c\u0435\u043d\u0438\u0435 \u0420\u0430\u0437\u043e\u0440\u0443\u0436\u0435\u043d\u0438\u0435?\n[[YELLOW]]\u042d\u0442\u043e \u043f\u0430\u0441\u0441\u0438\u0432\u043d\u043e\u0435 \u0443\u043c\u0435\u043d\u0438\u0435 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0440\u0430\u0437\u043e\u0440\u0443\u0436\u0430\u0442\u044c \u0434\u0440\u0443\u0433\u0438\u0445 \u0438\u0433\u0440\u043e\u043a\u043e\u0432,\n[[YELLOW]]\u0442\u043e \u0435\u0441\u0442\u044c \u043f\u0440\u0438\u0432\u043e\u0434\u0438\u0442 \u043a \u0432\u044b\u043f\u0430\u0434\u0435\u043d\u0438\u044e \u043d\u0430 \u0437\u0435\u043c\u043b\u044e \u043e\u0440\u0443\u0436\u0438\u044f \u043f\u0440\u043e\u0442\u0438\u0432\u043d\u0438\u043a\u0430. -##Woodcutting -Guides.Woodcutting.Section.0=[[DARK_AQUA]]\u041e \u043d\u0430\u0432\u044b\u043a\u0435 \u041b\u0435\u0441\u043e\u0440\u0443\u0431\u0441\u0442\u0432\u043e:\n[[YELLOW]]\u041b\u0435\u0441\u043e\u0440\u0443\u0431\u0441\u0442\u0432\u043e - \u044d\u0442\u043e \u0432\u0441\u0435 \u0447\u0442\u043e \u043a\u0430\u0441\u0430\u0435\u0442\u0441\u044f \u0440\u0443\u0431\u043a\u0438 \u0434\u0435\u0440\u0435\u0432\u044c\u0435\u0432.\n\n[[DARK_AQUA]]\u041f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435 \u043e\u043f\u044b\u0442\u0430:\n[[YELLOW]]\u041e\u043f\u044b\u0442 \u0434\u0430\u0435\u0442\u0441\u044f \u043f\u0440\u0438 \u0440\u0430\u0437\u0440\u0443\u0448\u0435\u043d\u0438\u0438 \u0431\u043b\u043e\u043a\u043e\u0432 \u0434\u0440\u0435\u0432\u0435\u0441\u0438\u043d\u044b. -Guides.Woodcutting.Section.1=[[DARK_AQUA]]\u041a\u0430\u043a \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0443\u043c\u0435\u043d\u0438\u0435 \u041b\u0435\u0441\u043e\u0440\u0443\u0431?\n[[YELLOW]]\u041b\u0435\u0441\u043e\u0440\u0443\u0431 - \u044d\u0442\u043e \u0430\u043a\u0442\u0438\u0432\u043d\u043e\u0435 \u0443\u043c\u0435\u043d\u0438\u0435, \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u0430\u043a\u0442\u0438\u0432\u0438\u0440\u0443\u0435\u0442\u0441\u044f\n[[YELLOW]]\u043d\u0430\u0436\u0430\u0442\u0438\u0435\u043c \u041f\u041a\u041c \u0441 \u0442\u043e\u043f\u043e\u0440\u043e\u043c \u0432 \u0440\u0443\u043a\u0435. \u042d\u0442\u043e \u043f\u0440\u0438\u0432\u0435\u0434\u0435\u0442 \u043a \u0442\u043e\u043c\u0443, \n[[YELLOW]]\u0447\u0442\u043e \u0432\u0441\u0435 \u0434\u0435\u0440\u0435\u0432\u043e \u0432\u043c\u0438\u0433 \u0431\u0443\u0434\u0435\u0442 \u0441\u0440\u0443\u0431\u043b\u0435\u043d\u043e, \u0438 \u0432\u0441\u0435 \u0431\u043b\u043e\u043a\u0438 \u0434\u0440\u0435\u0432\u0435\u0441\u0438\u043d\u044b\n[[YELLOW]]\u0432\u044b\u043f\u0430\u0434\u0443\u0442 \u0437\u0430 \u0440\u0430\u0437. -Guides.Woodcutting.Section.2=[[DARK_AQUA]]\u041a\u0430\u043a \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0443\u043c\u0435\u043d\u0438\u0435 \u0421\u0434\u0443\u0432\u0430\u0442\u0435\u043b\u044c \u041b\u0438\u0441\u0442\u044c\u0435\u0432?\n[[YELLOW]]\u0421\u0434\u0443\u0432\u0430\u0442\u0435\u043b\u044c \u041b\u0438\u0441\u0442\u044c\u0435\u0432 - \u044d\u0442\u043e \u043f\u0430\u0441\u0441\u0438\u0432\u043d\u043e\u0435 \u0443\u043c\u0435\u043d\u0438\u0435, \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u043f\u0440\u0438\u0432\u043e\u0434\u0438\u0442\n[[YELLOW]]\u043a \u0442\u043e\u043c\u0443, \u0447\u0442\u043e \u0431\u043b\u043e\u043a\u0438 \u043b\u0438\u0441\u0442\u0432\u044b \u0432\u043c\u0438\u0433 \u0440\u0430\u0437\u0440\u0443\u0448\u0430\u044e\u0442\u0441\u044f \u043f\u0440\u0438 \u0443\u0434\u0430\u0440\u0435 \u0442\u043e\u043f\u043e\u0440\u043e\u043c. \n[[YELLOW]]\u041f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e, \u044d\u0442\u043e \u0443\u043c\u0435\u043d\u0438\u0435 \u0440\u0430\u0437\u0431\u043b\u043e\u043a\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u043d\u0430 \u0443\u0440\u043e\u0432\u043d\u0435 100. -Guides.Woodcutting.Section.3=[[DARK_AQUA]]\u041a\u0430\u043a \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0443\u043c\u0435\u043d\u0438\u0435 \u0414\u0432\u043e\u0439\u043d\u043e\u0439 \u0414\u0440\u043e\u043f?\n[[YELLOW]]\u042d\u0442\u043e \u043f\u0430\u0441\u0441\u0438\u0432\u043d\u043e\u0435 \u0443\u043c\u0435\u043d\u0438\u0435 \u0434\u0430\u0435\u0442 \u0448\u0430\u043d\u0441 \u0432\u044b\u043f\u0430\u0434\u0435\u043d\u0438\u044f\n[[YELLOW]]\u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0433\u043e \u0431\u043b\u043e\u043a\u0430 \u0434\u0440\u0435\u0432\u0435\u0441\u0438\u043d\u044b \u043f\u0440\u0438 \u0440\u0443\u0431\u043a\u0435. - -Effects.Effects=\u042d\u0424\u0424\u0415\u041a\u0422\u042b -Effects.SubSkills.Overhaul=\u0421\u043f\u043e\u0441\u043e\u0431\u043d\u043e\u0441\u0442\u0438 -Effects.Child=[[DARK_GRAY]]\u0423\u0420\u041e\u0412\u0415\u041d\u042c: [[GREEN]]{0} -Effects.Child.Overhaul=[[DARK_AQUA]]\u041d\u0410\u0421\u041b\u0415\u0414\u0421\u0422\u0412\u0415\u041d\u041d\u042b\u0419 \u0423\u0420.[[YELLOW]] {0}[[DARK_AQUA]]: {1} -Effects.Child.ParentList=[[GREEN]]{0}[[GOLD]]([[DARK_AQUA]]\u0423\u0420.[[YELLOW]]{1}[[GOLD]]) -Effects.Level=[[DARK_GRAY]]\u0423\u0420\u041e\u0412\u0415\u041d\u042c: [[GREEN]]{0} [[DARK_AQUA]]\u041e\u041f\u042b\u0422[[YELLOW]]([[GOLD]]{1}[[YELLOW]]/[[GOLD]]{2}[[YELLOW]]) -Effects.Level.Overhaul=[[GOLD]]\u0423\u0420\u041e\u0412\u0415\u041d\u042c: [[YELLOW]]{0} [[DARK_AQUA]]\u041e\u041f\u042b\u0422\u0410[[YELLOW]]([[GOLD]]{1}[[YELLOW]]/[[GOLD]]{2}[[YELLOW]]) -Effects.Parent=[[GOLD]]{0} - -Effects.Template=[[DARK_AQUA]]{0}: [[GREEN]]{1} -Commands.Stats.Self.Overhaul=\u0421\u0442\u0430\u0442\u0438\u0441\u0442\u0438\u043a\u0430 -Commands.XPGain.Overhaul=[[GOLD]]\u041e\u043f\u044b\u0442\u0430 \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u043e: [[DARK_AQUA]]{0} -MOTD.Version.Overhaul=[[GOLD]][mcMMO] [[DARK_AQUA]]Overhaul Era[[GOLD]] - [[DARK_AQUA]]{0} -Overhaul.mcMMO.Header=[[RED]][]=====[][[GREEN]] mcMMO - Overhaul Era [[RED]][]=====[] -Overhaul.mcMMO.Url.Wrap.Prefix=[[RED]][| -Overhaul.mcMMO.Url.Wrap.Suffix=[[RED]]|] -Overhaul.mcMMO.MmoInfo.Wiki=[[YELLOW]][[[WHITE]]\u041f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u0434\u0430\u043d\u043d\u044b\u0439 \u0441\u043a\u0438\u043b\u043b \u043d\u0430 Wiki![[YELLOW]]] +mcMMO.Template.Prefix=&6(&amcMMO&6) &7{0} +# BEGIN STYLING +Ability.Generic.Refresh=&a**УМЕНИЯ ВОССТАНОВЛЕНЫ!** +Ability.Generic.Template.Lock=&7{0} +# Skill Command Styling +Ability.Generic.Template=&6{0}: &3{1} +Ability.Generic.Template.Custom=&3{0} +Skills.Overhaul.Header=&c[]=====[]&a {0} &c[]=====[] +Effects.Effects=ЭФФЕКТЫ +Effects.SubSkills.Overhaul=Поднавыки +Effects.Child.Overhaul=&3Дочерний ур.&e {0}&3: {1} +Effects.Child.ParentList=&a{0}&6(&3Ур.&e{1}&6) +Effects.Level.Overhaul=&6УРОВЕНЬ: &e{0} &3ОПЫТА&e(&6{1}&e/&6{2}&e) +Effects.Parent=&6{0} - +Effects.Template=&3{0}: &a{1} +Commands.Stats.Self.Overhaul=Статистика +Commands.XPGain.Overhaul=&6ПОЛУЧЕНО ОПЫТА: &3{0} +MOTD.Version.Overhaul=&6[mcMMO] &3Эра перемен&6 - &3{0} +Overhaul.mcMMO.Header=&c[]=====[]&a mcMMO - Эра перемен &c[]=====[] +Overhaul.mcMMO.Url.Wrap.Prefix=&c[| +Overhaul.mcMMO.Url.Wrap.Suffix=&c|] +Overhaul.mcMMO.MmoInfo.Wiki=&e[&fПросмотреть этот навык в вики!&e] # Overhaul.Levelup can take {0} - Skill Name defined in Overhaul.Name {1} - Amount of levels gained {2} - Level in skill -Overhaul.Levelup=[[BOLD]]{0} \u0443\u0432\u0435\u043b\u0438\u0447\u0435\u043d \u0434\u043e [[RESET]][[GREEN]][[BOLD]]{2}[[RESET]][[WHITE]]. -Overhaul.Name.Acrobatics=\u0410\u043a\u0440\u043e\u0431\u0430\u0442\u0438\u043a\u0430 -Overhaul.Name.Alchemy=\u0410\u043b\u0445\u0438\u043c\u0438\u044f -Overhaul.Name.Archery=\u041b\u0443\u043a\u0438 -Overhaul.Name.Axes=\u0422\u043e\u043f\u043e\u0440\u044b -Overhaul.Name.Excavation=\u0420\u0430\u0441\u043a\u043e\u043f\u043a\u0438 -Overhaul.Name.Fishing=\u0420\u044b\u0431\u043e\u043b\u043e\u0432\u0441\u0442\u0432\u043e -Overhaul.Name.Herbalism=\u0422\u0440\u0430\u0432\u043d\u0438\u0447\u0435\u0441\u0442\u0432\u043e -Overhaul.Name.Mining=\u0428\u0430\u0445\u0442\u0451\u0440\u0441\u0442\u0432\u043e -Overhaul.Name.Repair=\u041f\u043e\u0447\u0438\u043d\u043a\u0430 -Overhaul.Name.Salvage=\u041f\u0435\u0440\u0435\u0440\u0430\u0431\u043e\u0442\u043a\u0430 -Overhaul.Name.Smelting=\u0412\u044b\u043f\u043b\u0430\u0432\u043a\u0430 -Overhaul.Name.Swords=\u041c\u0435\u0447\u0438 -Overhaul.Name.Taming=\u0423\u043a\u0440\u043e\u0449\u0435\u043d\u0438\u0435 -Overhaul.Name.Unarmed=\u0411\u0435\u0437\u043e\u0440\u0443\u0436\u043d\u044b\u0439 -Overhaul.Name.Woodcutting=\u041b\u0435\u0441\u043e\u0440\u0443\u0431\u0441\u0442\u0432\u043e +Overhaul.Levelup=&l{0} увеличен до &r&a&l{2}&r&f. +Overhaul.Name.Acrobatics=Акробатика +Overhaul.Name.Alchemy=Алхимия +Overhaul.Name.Archery=Стрельба +Overhaul.Name.Axes=Топоры +Overhaul.Name.Excavation=Раскопки +Overhaul.Name.Fishing=Рыболовство +Overhaul.Name.Herbalism=Травничество +Overhaul.Name.Mining=Шахтерство +Overhaul.Name.Repair=Починка +Overhaul.Name.Salvage=Разборка +Overhaul.Name.Smelting=Переплавка +Overhaul.Name.Swords=Мечи +Overhaul.Name.Taming=Укрощение +Overhaul.Name.Unarmed=Безоружный +Overhaul.Name.Woodcutting=Лесорубство +# /mcMMO Command Style Stuff +Commands.mcc.Header=&c---[]&aКоманды mcMMO&c[]--- +Commands.Other=&c---[]&aОСОБЫЕ КОМАНДЫ&c[]--- +Commands.Party.Header=&c-----[]&aГРУППА&c[]----- +Commands.Party.Features.Header=&c-----[]&aФУНКЦИИ&c[]----- # XP BAR Allows for the following variables -- {0} = Skill Level, {1} Current XP, {2} XP Needed for next level, {3} Power Level, {4} Percentage of Level # Make sure you turn on Experience_Bars.ThisMayCauseLag.AlwaysUpdateTitlesWhenXPIsGained if you want the XP bar title to update every time a player gains XP! XPBar.Template={0} -XPBar.Template.EarlyGameBoost=[[GOLD]]\u0418\u0437\u0443\u0447\u0435\u043d\u0438\u0435 \u043d\u043e\u0432\u043e\u0439 \u0441\u043f\u043e\u0441\u043e\u0431\u043d\u043e\u0441\u0442\u0438... -XPBar.Acrobatics=\u0410\u043a\u0440\u043e\u0431\u0430\u0442\u0438\u043a\u0430 \u0443\u0440.[[GOLD]]{0} -XPBar.Alchemy=\u0410\u043b\u0445\u0438\u043c\u0438\u044f \u0443\u0440..[[GOLD]]{0} -XPBar.Archery=\u041b\u0443\u043a\u0438 \u0443\u0440.[[GOLD]]{0} -XPBar.Axes=\u0422\u043e\u043f\u043e\u0440\u044b \u0443\u0440.[[GOLD]]{0} -XPBar.Excavation=\u0420\u0430\u0441\u043a\u043e\u043f\u043a\u0438 \u0443\u0440.[[GOLD]]{0} -XPBar.Fishing=\u0420\u044b\u0431\u043e\u043b\u043e\u0432\u0441\u0442\u0432\u043e \u0443\u0440.[[GOLD]]{0} -XPBar.Herbalism=\u0422\u0440\u0430\u0432\u043d\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0443\u0440.[[GOLD]]{0} -XPBar.Mining=\u0428\u0430\u0445\u0442\u0435\u0440\u0441\u0442\u0432\u043e \u0443\u0440.[[GOLD]]{0} -XPBar.Repair=\u041f\u043e\u0447\u0438\u043d\u043a\u0430 \u0443\u0440.[[GOLD]]{0} -XPBar.Salvage=\u041f\u0435\u0440\u0435\u0440\u0430\u0431\u043e\u0442\u043a\u0430 \u0443\u0440.[[GOLD]]{0} -XPBar.Smelting=\u0412\u044b\u043f\u043b\u0430\u0432\u043a\u0430 \u0443\u0440.[[GOLD]]{0} -XPBar.Swords=\u041c\u0435\u0447\u0438 \u0443\u0440.[[GOLD]]{0} -XPBar.Taming=\u0423\u043a\u0440\u043e\u0449\u0435\u043d\u0438\u0435 \u0443\u0440.[[GOLD]]{0} -XPBar.Unarmed=\u0411\u0435\u0437\u043e\u0440\u0443\u0436\u043d\u044b\u0439 \u0443\u0440.[[GOLD]]{0} -XPBar.Woodcutting=\u041b\u0435\u0441\u043e\u0440\u0443\u0431\u0441\u0442\u0432\u043e \u0443\u0440.[[GOLD]]{0} +XPBar.Template.EarlyGameBoost=&6Обучение новому навыку... +XPBar.Acrobatics=Акробатика ур.&6{0} +XPBar.Alchemy=Алхимия ур.&6{0} +XPBar.Archery=Стрельба ур.&6{0} +XPBar.Axes=Топоры ур.&6{0} +XPBar.Excavation=Раскопки ур.&6{0} +XPBar.Fishing=Рыболовство ур.&6{0} +XPBar.Herbalism=Травничество ур.&6{0} +XPBar.Mining=Шахтерство ур.&6{0} +XPBar.Repair=Починка ур.&6{0} +XPBar.Salvage=Разборка ур.&6{0} +XPBar.Smelting=Переплавка ур.&6{0} +XPBar.Swords=Мечи ур.&6{0} +XPBar.Taming=Укрощение ур.&6{0} +XPBar.Unarmed=Безоружный ур.&6{0} +XPBar.Woodcutting=Лесорубство ур.&6{0} #This is just a preset template that gets used if the 'ExtraDetails' setting is turned on in experience.yml (off by default), you can ignore this template and just edit the strings above -XPBar.Complex.Template={0} [[DARK_AQUA]] {4}[[WHITE]]% [[DARK_AQUA]]([[WHITE]]{1}[[DARK_AQUA]]/[[WHITE]]{2}[[DARK_AQUA]]) +XPBar.Complex.Template={0} &3 {4}&f% &3(&f{1}&3/&f{2}&3) # XP BAR Allows for the following variables -- {0} = Skill Level, {1} Current XP, {2} XP Needed for next level, {3} Power Level, {4} Percentage of Level # Make sure you turn on Experience_Bars.ThisMayCauseLag.AlwaysUpdateTitlesWhenXPIsGained if you want the XP bar title to update every time a player gains XP! -# END +# END STYLING + +#ACROBATICS +Acrobatics.Ability.Proc=&a**Грациозное приземление** +Acrobatics.Combat.Proc=&a**Уклонение** +Acrobatics.SubSkill.Roll.Stats=&6Шанс Кувырка &e{0}%&6 Шанс Грациозного кувырка&e {1}% +Acrobatics.SubSkill.Roll.Stat=Шанс Кувырка +Acrobatics.SubSkill.Roll.Stat.Extra=Шанс Грациозного кувырка +Acrobatics.SubSkill.Roll.Name=Кувырок +Acrobatics.SubSkill.Roll.Description=Приземляйтесь по-умному для нивелирования урона. +Acrobatics.SubSkill.Roll.Chance=Шанс Кувырка: &e{0} % +Acrobatics.SubSkill.Roll.GraceChance=Шанс Грациозного кувырка: &e{0} +Acrobatics.SubSkill.Roll.Mechanics=&7Кувырок - активный поднавык с пассивным компонентом.!nasdКогда вы получаете урон от падения, то у вас есть шанс полностью нивелировать урон в зависимости от уровня навыка. На уровне &e{6}&7 у вас есть &e{0}%&7 шанс избежать урон, и &e{1}%&7 если активирован Изящный кувырок.!nasdШанс увеличивается линейно на основе вашего уровня вплоть до уровня &e{2}&7, на котором навык достигает максимума. Каждый уровень Акробатики дает вам &e{3}%&7 шанса успеха.!nasdЗажав кнопку приседа, вы можете удвоить свои шансы на избежание урона от падения! Зажатие кнопки приседа переведет вашу способность Кувырок в состояние Грациозного кувырка.!nasdКувырок может нивелировать до &c{4}&7 урона, Изящный кувырок до &a{5}&7 урона. +Acrobatics.SubSkill.GracefulRoll.Name=Грациозный кувырок +Acrobatics.SubSkill.GracefulRoll.Description=Вдвое эффективнее обычного Кувырка +Acrobatics.SubSkill.Dodge.Name=Уклонение +Acrobatics.SubSkill.Dodge.Description=Уменьшение урона от атаки на половину +Acrobatics.SubSkill.Dodge.Stat=Шанс Уклонения +Acrobatics.Listener=Акробатика: +Acrobatics.Roll.Text=[[ITALIC]]**Кувырок** +Acrobatics.SkillName=АКРОБАТИКА +#ALCHEMY +Alchemy.SubSkill.Catalysis.Name=Катализатор +Alchemy.SubSkill.Catalysis.Description=Увеличивает скорость приготовления зелий +Alchemy.SubSkill.Catalysis.Stat=Скорость готовки зелий +Alchemy.SubSkill.Concoctions.Name=Отвары +Alchemy.SubSkill.Concoctions.Description=Готовка зелий из большего количества ингредиентов +Alchemy.SubSkill.Concoctions.Stat=Ранг Отваров: &a{0}&3/&a{1} +Alchemy.SubSkill.Concoctions.Stat.Extra=Ингредиенты [&a{0}&3]: &a{1} +Alchemy.Listener=Алхимия: +Alchemy.Ability.Locked.0=ЗАБЛОКИРОВАНО ДО {0}+ НАВЫКА (КАТАЛИЗАТОР) +Alchemy.SkillName=АЛХИМИЯ +#ARCHERY + + +Archery.SubSkill.SkillShot.Name=Умелый выстрел +Archery.SubSkill.SkillShot.Description=Увеличивает урон, наносимый луками +Archery.SubSkill.SkillShot.Stat=Бонусный урон от Умелого выстрела +Archery.SubSkill.Daze.Name=Ошеломление +Archery.SubSkill.Daze.Description=Дезориентирует и наносит дополнительный урон +Archery.SubSkill.Daze.Stat=Шанс Ошеломления +Archery.SubSkill.ArrowRetrieval.Name=Возврат стрел +Archery.SubSkill.ArrowRetrieval.Description=Шанс извлечь стрелы из трупов +Archery.SubSkill.ArrowRetrieval.Stat=Шанс Возврата стрел +Archery.SubSkill.ArcheryLimitBreak.Name=Запредельная стрельба +Archery.SubSkill.ArcheryLimitBreak.Description=Вы превосходите свои возможности. Увеличивает урон против сложных противников. Работает в ПВП в зависимости от настроек сервера, но всегда увеличивает урон в ПВЕ. +Archery.SubSkill.ArcheryLimitBreak.Stat=Макс. урон Запредельной стрельбы +Archery.Listener=Стрельба: +Archery.SkillName=СТРЕЛЬБА +#AXES +Axes.Ability.Bonus.0=Владение топором +Axes.Ability.Bonus.1=Бонус {0} урона +Axes.Ability.Bonus.2=Бронебойный удар +Axes.Ability.Bonus.3=Наносит {0} бонусного урона броне +Axes.Ability.Bonus.4=Мощный удар +Axes.Ability.Bonus.5=Наносит {0} бонусного урона небронированным врагам +Axes.Ability.Lower=&7Вы опустили свой топор. +Axes.Ability.Ready=&3Вы &6подготовили&3 свой топор. +Axes.Ability.Ready.Extra=&3Вы &6подготовили&3 свой топор. &7({0} на откате {1}с) +Axes.Combat.CritStruck=&4Вам нанесен КРИТИЧЕСКИЙ удар! +Axes.Combat.CriticalHit=КРИТИЧЕСКИЙ УДАР! +Axes.Combat.GI.Proc=&a**УДАР С ОГРОМНОЙ СИЛОЙ** +Axes.Combat.GI.Struck=**ПОРАЖЕН МОЩНЫМ УДАРОМ** +Axes.Combat.SS.Struck=&4Поражен РАСКАЛЫВАТЕЛЕМ ЧЕРЕПОВ! +Axes.SubSkill.SkullSplitter.Name=Раскалыватель черепов +Axes.SubSkill.SkullSplitter.Description=Наносит удар по области +Axes.SubSkill.SkullSplitter.Stat=Продолжительность Раскалывателя черепов +Axes.SubSkill.CriticalStrikes.Name=Критический удар +Axes.SubSkill.CriticalStrikes.Description=Двойной урон +Axes.SubSkill.CriticalStrikes.Stat=Шанс Критического удара +Axes.SubSkill.AxeMastery.Name=Владение топором +Axes.SubSkill.AxeMastery.Description=Наносит бонусный урон +Axes.SubSkill.AxesLimitBreak.Name=Запредельные топоры +Axes.SubSkill.AxesLimitBreak.Description=Вы превосходите свои возможности. Увеличивает урон против сложных противников. Работает в ПВП в зависимости от настроек сервера, но всегда увеличивает урон в ПВЕ. +Axes.SubSkill.AxesLimitBreak.Stat=Макс. урон Запредельных топоров +Axes.SubSkill.ArmorImpact.Name=Бронебойный удар +Axes.SubSkill.ArmorImpact.Description=Удар с такой силой, что разрушает броню +Axes.SubSkill.GreaterImpact.Name=Мощный удар +Axes.SubSkill.GreaterImpact.Description=Наносит бонусный урона небронированным врагам +Axes.Listener=Топоры: +Axes.SkillName=ТОПОРЫ +Axes.Skills.SS.Off=**Раскалыватель черепов прекратил действие** +Axes.Skills.SS.On=&a**Раскалыватель Черепов АКТИВИРОВАН** +Axes.Skills.SS.Refresh=&aВаше умение &eРаскалыватель черепов &aвосстановлено! +Axes.Skills.SS.Other.Off=Раскалыватель черепов&a прекратил действие у &e{0} +Axes.Skills.SS.Other.On=&a{0}&2 использовал &cРаскалыватель черепов! +#EXCAVATION +Excavation.Ability.Lower=&7Вы опустили свою лопату. +Excavation.Ability.Ready=&3Вы &6подготовили&e свою лопату. +Excavation.SubSkill.GigaDrillBreaker.Name=Гига-бур +Excavation.SubSkill.GigaDrillBreaker.Description=3x добыча, 3x опыт, +скорость +Excavation.SubSkill.GigaDrillBreaker.Stat=Продолжительность Гига-бура +Excavation.SubSkill.Archaeology.Name=Археология +Excavation.SubSkill.Archaeology.Description=Раскройте тайны земли! Повышение уровня увеличивает шансы получения опыта при нахождении сокровищ! +Excavation.SubSkill.Archaeology.Stat=Шанс получения опыта Археологии +Excavation.SubSkill.Archaeology.Stat.Extra=Количество опыта Археологии +Excavation.Listener=Раскопки: +Excavation.SkillName=РАСКОПКИ +Excavation.Skills.GigaDrillBreaker.Off=**Гига-бур прекратил действие** +Excavation.Skills.GigaDrillBreaker.On=&a**ГИГА-БУР АКТИВИРОВАН** +Excavation.Skills.GigaDrillBreaker.Refresh=&aВаше умение &eГига-бур &aвосстановлено! +Excavation.Skills.GigaDrillBreaker.Other.Off=Гига-бур&a прекратил действие у &e{0} +Excavation.Skills.GigaDrillBreaker.Other.On=&a{0}&2 использовал &cГига-бур! +#FISHING +Fishing.ScarcityTip=&e&oВ этой зоне не практически не осталось рыбы - используй удочку в другом месте, хотя бы на {0} блоков дальше отсюда. +Fishing.Scared=&7&oХаотичные движения испугают рыбу! +Fishing.Exhausting=&c&oНеправильное использование удочки вызывет усталость и износ удочки! +Fishing.LowResourcesTip=&7Вы понимаете, что в этом районе осталось мало рыбы. Попробуйте рыбачить на {0} блоков дальше отсюда. +Fishing.Ability.Info=Охотник за чудесами: &7 **Совершенствуется с рангом Охотника за сокровищами** +Fishing.Ability.Locked.0=ЗАБЛОКИРОВАНО ДО {0}+ НАВЫКА (ВСТРЯСКА) +Fishing.Ability.Locked.1=ЗАБЛОКИРОВАНО ДО {0}+ НАВЫКА (ПОДЛЕДНАЯ РЫБАЛКА) +Fishing.Ability.Locked.2=ЗАБЛОКИРОВАНО ДО {0}+ НАВЫКА (МАСТЕР-РЫБОЛОВ) +Fishing.SubSkill.TreasureHunter.Name=Охотник за сокровищами +Fishing.SubSkill.TreasureHunter.Description=Ловля разных предметов +Fishing.SubSkill.TreasureHunter.Stat=Ранг Охотника за сокровищами: &a{0}&3/&a{1} +Fishing.SubSkill.TreasureHunter.Stat.Extra=Шанс добычи: &7Обычное: &e{0} &aНеобычное: &e{1}!nasd&9Редкое: &e{2} &dЭпическое: &e{3} &6Легендарное: &e{4} &bМифическое: &e{5} +Fishing.SubSkill.MagicHunter.Name=Охотник за чудесами +Fishing.SubSkill.MagicHunter.Description=Находка зачарованных предметов +Fishing.SubSkill.MagicHunter.Stat=Шанс Охотника за чудесами +Fishing.SubSkill.Shake.Name=Встряска +Fishing.SubSkill.Shake.Description=Вытряхивайте вещи из мобов и игроков с помощью удочки +Fishing.SubSkill.Shake.Stat=Шанс Встряски +Fishing.SubSkill.FishermansDiet.Name=Рыбацкая диета +Fishing.SubSkill.FishermansDiet.Description=Увеличивает утоление голода с помощью рыбацкой еды +Fishing.SubSkill.FishermansDiet.Stat=Рыбацкая диета:&a Ранг {0} +Fishing.SubSkill.MasterAngler.Name=Мастер-рыболов +Fishing.SubSkill.MasterAngler.Description=Рыба ловится чаще, работает лучше при рыбалке с лодки. +Fishing.SubSkill.MasterAngler.Stat=Уменьшение минимального ожидания клёва: &a-{0} секунд +Fishing.SubSkill.MasterAngler.Stat.Extra=Уменьшение максимального ожидания клёва: &a-{0} секунд +Fishing.SubSkill.IceFishing.Name=Подледная рыбалка +Fishing.SubSkill.IceFishing.Description=Позволяет вам рыбачить в снежных биомах +Fishing.SubSkill.IceFishing.Stat=Подледная рыбалка +Fishing.Chance.Raining=&9 Бонус дождя +Fishing.Listener=Рыболовство: +Fishing.Ability.TH.MagicFound=&7Ты чувствуешь нечто чудотворное от этого улова... +Fishing.Ability.TH.Boom=&7ВРЕМЯ ВЗРЫВАТЬ!!! +Fishing.Ability.TH.Poison=&7Пахнет чем-то сомнительным... +Fishing.SkillName=РЫБОЛОВСТВО +#HERBALISM +Herbalism.Ability.GTe.NeedMore=Вам нужно больше семян для распространения Озеленения. +Herbalism.Ability.GTh.Fail=**ЖИВИТЕЛЬНОЕ ПРИКОСНОВЕНИЕ НЕ УДАЛОСЬ** +Herbalism.Ability.GTh=&a**ЖИВИТЕЛЬНОЕ ПРИКОСНОВЕНИЕ** +Herbalism.Ability.Lower=&7Вы опустили свою мотыгу. +Herbalism.Ability.Ready=&3Вы &6подготовили&3 свою мотыгу. +Herbalism.Ability.ShroomThumb.Fail=**ГРИБНОЕ ПРИКОСНОВЕНИЕ НЕ УДАЛОСЬ** +Herbalism.SubSkill.GreenTerra.Name=Озеленение +Herbalism.SubSkill.GreenTerra.Description=Распространение зелени, 3x добыча, улучшает Живительное прикосновение +Herbalism.SubSkill.GreenTerra.Stat=Длительность Озеленения +Herbalism.SubSkill.GreenThumb.Name=Живительное прикосновение +Herbalism.SubSkill.GreenThumb.Description=Автопосадка растений при сборе урожая мотыгой +Herbalism.SubSkill.GreenThumb.Stat=Шанс Живительного прикосновения +Herbalism.SubSkill.GreenThumb.Stat.Extra=Стадия Живительного прикосновения: &a Урожай вырастает на стадию {0} +Herbalism.Effect.4=Живительное прикосновение (блоки) +Herbalism.SubSkill.GreenThumb.Description.2=Покрывает кирпичи мхом или растит траву +Herbalism.SubSkill.FarmersDiet.Name=Фермерская диета +Herbalism.SubSkill.FarmersDiet.Description=Увеличивает утоление голода с помощью фермерской еды +Herbalism.SubSkill.FarmersDiet.Stat=Фермерская диета: &aРанг {0} +Herbalism.SubSkill.DoubleDrops.Name=Двойная добыча +Herbalism.SubSkill.DoubleDrops.Description=Удваивает обычную добычу +Herbalism.SubSkill.DoubleDrops.Stat=Шанс Двойной добычи +Herbalism.SubSkill.HylianLuck.Name=Хайлийская удача +Herbalism.SubSkill.HylianLuck.Description=Дает небольшой шанс найти редкие предметы +Herbalism.SubSkill.HylianLuck.Stat=Шанс Хайлийской удачи +Herbalism.SubSkill.ShroomThumb.Name=Грибное прикосновение +Herbalism.SubSkill.ShroomThumb.Description=Распространение мицелия на грязь и дёрн +Herbalism.SubSkill.ShroomThumb.Stat=Шанс Грибного прикосновения +Herbalism.HylianLuck=&aУдача Хайрула сегодня с тобой! +Herbalism.Listener=Травничество: +Herbalism.SkillName=ТРАВНИЧЕСТВО +Herbalism.Skills.GTe.Off=**Озеленение прекратило действие** +Herbalism.Skills.GTe.On=&a**ОЗЕЛЕНЕНИЕ АКТИВИРОВАНО** +Herbalism.Skills.GTe.Refresh=&aВаше умение &eОзеленение &aвосстановлено! +Herbalism.Skills.GTe.Other.Off=Озеленение&a прекратило действие у &e{0} +Herbalism.Skills.GTe.Other.On=&a{0}&2 использовал &cОзеленение! +#MINING +Mining.Ability.Locked.0=ЗАБЛОКИРОВАНО ДО {0}+ НАВЫКА (ПОДРЫВНАЯ ДОБЫЧА) +Mining.Ability.Locked.1=ЗАБЛОКИРОВАНО ДО {0}+ НАВЫКА (БОЛЬШИЕ БОМБЫ) +Mining.Ability.Locked.2=ЗАБЛОКИРОВАНО ДО {0}+ НАВЫКА (ЭКСПЕРТ ВЗРЫВОВ) +Mining.Ability.Lower=&7Вы опустили свою кирку. +Mining.Ability.Ready=&3Вы &6подготовили&3 свою кирку. +Mining.SubSkill.SuperBreaker.Name=Суперкрушитель +Mining.SubSkill.SuperBreaker.Description=Скорость+, шанс тройной добычи +Mining.SubSkill.SuperBreaker.Stat=Длительность Суперкрушителя +Mining.SubSkill.DoubleDrops.Name=Двойная добыча +Mining.SubSkill.DoubleDrops.Description=Удваивает обычную добычу +Mining.SubSkill.DoubleDrops.Stat=Шанс Двойной добычи +Mining.SubSkill.BlastMining.Name=Подрывная добыча +Mining.SubSkill.BlastMining.Description=Увеличивает добычу с помощью динамита +Mining.SubSkill.BlastMining.Stat=Подрывная добыча:&a Ранг {0}/{1} &7({2}) +Mining.SubSkill.BlastMining.Stat.Extra=Увеличение радиуса взрыва: &a+{0} +Mining.SubSkill.BiggerBombs.Name=Большие бомбы +Mining.SubSkill.BiggerBombs.Description=Увеличивает радиус взрыва динамита +Mining.SubSkill.DemolitionsExpertise.Name=Экспертиза подрывов +Mining.SubSkill.DemolitionsExpertise.Description=Уменьшает урон от взрыва динамита +Mining.SubSkill.DemolitionsExpertise.Stat=Уменьшение урона Экспертизы подрывов + +Mining.Listener=Шахтерство: +Mining.SkillName=ШАХТЕРСТВО +Mining.Skills.SuperBreaker.Off=**Суперкрушитель прекратил действие** +Mining.Skills.SuperBreaker.On=&a**СУПЕРКРУШИТЕЛЬ АКТИВИРОВАН** +Mining.Skills.SuperBreaker.Other.Off=Суперкрушитель&a прекратил действие у &e{0} +Mining.Skills.SuperBreaker.Other.On=&a{0}&2 использовал &cСуперкрушитель! +Mining.Skills.SuperBreaker.Refresh=&aВаше умение &eСуперкрушитель &aвосстановлено! +#Blast Mining +Mining.Blast.Boom=&7**БУМ** +Mining.Blast.Cooldown= +Mining.Blast.Effect=+{0} руды, {1}x добыча +Mining.Blast.Other.On=&a{0}&2 использовал &cПодрывную добычу! +Mining.Blast.Refresh=&aВаше умение &eПодрывная добыча &aвосстановлено! +#REPAIR +Repair.SubSkill.Repair.Name=Ремонт +Repair.SubSkill.Repair.Description=Ремонт инструментов и брони +Repair.SubSkill.GoldRepair.Name=Золотой ремонт ({0}+ НАВЫК) +Repair.SubSkill.GoldRepair.Description=Ремонт золотых инструментов и брони +Repair.SubSkill.IronRepair.Name=Железный ремонт ({0}+ НАВЫК) +Repair.SubSkill.IronRepair.Description=Ремонт железных инструментов и брони +Repair.SubSkill.StoneRepair.Name=Каменный ремонт ({0}+ НАВЫК) +Repair.SubSkill.StoneRepair.Description=Ремонт каменных инструментов +Repair.SubSkill.RepairMastery.Name=Мастерство ремонта +Repair.SubSkill.RepairMastery.Description=Увеличивает качество ремонта +Repair.SubSkill.RepairMastery.Stat=Мастерство ремонта: &aДополнительно восстанавливает {0} прочности +Repair.SubSkill.SuperRepair.Name=Суперремонт +Repair.SubSkill.SuperRepair.Description=Двойная эффективность +Repair.SubSkill.SuperRepair.Stat=Шанс Суперремонта +Repair.SubSkill.DiamondRepair.Name=Алмазный ремонт ({0}+ НАВЫК) +Repair.SubSkill.DiamondRepair.Description=Ремонт алмазных инструментов и брони +Repair.SubSkill.ArcaneForging.Name=Волшебная ковка +Repair.SubSkill.ArcaneForging.Description=Ремонт волшебных предметов +Repair.SubSkill.ArcaneForging.Stat=Волшебная ковка: &eРанг {0}/{1} +Repair.SubSkill.ArcaneForging.Stat.Extra=&3Шансы Волшебной ковки:&7 успех &a{0}&7%, провал &c{1}&7% +Repair.Error=&4В mcMMO произошла ошибка при попытке починить этот предмет! +Repair.Listener.Anvil=&4Вы разместили наковальню, на которой можете чинить инструменты и броню. +Repair.Listener=Ремонт: +Repair.SkillName=РЕМОНТ +Repair.Skills.AdeptDiamond=&4Вы недостаточно умелы, чтобы чинить алмазные вещи. +Repair.Skills.AdeptGold=&4Вы недостаточно умелы, чтобы чинить золотые вещи. +Repair.Skills.AdeptIron=&4Вы недостаточно умелы, чтобы чинить железные вещи. +Repair.Skills.AdeptStone=&4Вы недостаточно умелы, чтобы чинить каменные вещи. +Repair.Skills.Adept=&cУ вас должен быть уровень &e{0}&c, чтобы отремонтировать &e{1} +Repair.Skills.FeltEasy=&7Это было легко. +Repair.Skills.FullDurability=&7Это уже максимальная прочность. +Repair.Skills.StackedItems=&4Вы не можете ремонтировать вещи в стаках. +Repair.Pretty.Name=Ремонт +#Arcane Forging +Repair.Arcane.Downgrade=Волшебная сила этого предмета уменьшается. +Repair.Arcane.Fail=Волшебная сила навсегда покинула предмет. +Repair.Arcane.Lost=Вы недостаточно умелы, чтобы сохранять зачарования. +Repair.Arcane.Perfect=&aВы сохранили волшебную силу этого предмета. +#SALVAGE +Salvage.Pretty.Name=Разборка +Salvage.SubSkill.UnderstandingTheArt.Name=Понимание искусства +Salvage.SubSkill.UnderstandingTheArt.Description=Вы не просто копаетесь в соседском мусоре - вы заботитесь об окружающей среде.!nasdУлучшает различные параметры Переработки. +Salvage.SubSkill.ScrapCollector.Name=Коллекционер хлама +Salvage.SubSkill.ScrapCollector.Description=Разбирайте предметы на материалы, качество разборки зависит от навыка и удачи. +Salvage.SubSkill.ScrapCollector.Stat=Коллекционер хлама: &aРазбирайте до &e{0}&a предметов. Удача пригодится. +Salvage.SubSkill.ArcaneSalvage.Name=Магическая переработка +Salvage.SubSkill.ArcaneSalvage.Description=Извлечение зачарований из предметов +Salvage.SubSkill.ArcaneSalvage.Stat=Магическая переработка: &eРанг {0}/{1} +Salvage.Ability.Bonus.0=Коллекционер хлама +Salvage.Ability.Bonus.1=Разбирайте до &e{0}&a предметов. Удача пригодится. +Salvage.Arcane.ExtractFull=&7Шанс МП всех зачарований +Salvage.Arcane.ExtractPartial=&7Шанс МП части зачарований +Salvage.Skills.Success=&aПредмет разобран! +Salvage.Skills.Adept.Damaged=&4Вы недостаточно умелы, чтобы разобрать поврежденный предмет. +Salvage.Skills.Adept.Level=У вас должен быть уровень &e{0}&c, чтобы разобрать &e{1} +Salvage.Skills.TooDamaged=&4Этот предмет слишком поврежден, чтобы разбирать его. +Salvage.Skills.ArcaneFailed=&cУ вас не вышло извлечь знания, содержащиеся в данном предмете. +Salvage.Skills.ArcanePartial=&cУ вас вышло только частично извлечь знания, содержащиеся в данном предмете. +Salvage.Skills.ArcaneSuccess=&aУ вас вышло извлечь все знания, содержащиеся в данном предмете! +Salvage.Listener.Anvil=&4Вы установили Разборочную наковальню - используйте её для разборки инструментов и брони. +Salvage.Listener=Разборка: +Salvage.SkillName=РАЗБОРКА +Salvage.Skills.Lottery.Normal=&6У вас вышло извлечь &3{0}&6 материалов из &e{1}&6. +Salvage.Skills.Lottery.Perfect=&a&lПревосходно!&r&6 Вы разобрали &3{1}&6 без особы усилий и получили &3{0}&6 материалов. +Salvage.Skills.Lottery.Untrained=&7Вы недостаточны умелы в Разборке. У вас вышло извлечь лишь &c{0}&7 материалов из &a{1}&7. +#Anvil (Shared between SALVAGE and REPAIR) +Anvil.Unbreakable=Этот предмет неразрушим! +#SWORDS +Swords.Ability.Lower=&7Вы опустили свой меч. +Swords.Ability.Ready=&4Вы &6подготовили&e свой меч. +Swords.Combat.Rupture.Note=&7ПРИМЕЧАНИЕ: &e1 тик происходит каждые 0.5 секунд! +Swords.Combat.Bleeding.Started=&4 Вы истекаете кровью! +Swords.Combat.Bleeding.Stopped=&7Кровотечение &aпрекратилось&7! +Swords.Combat.Bleeding=&a**ВРАГ ИСТЕКАЕТ КРОВЬЮ** +Swords.Combat.Counter.Hit=&4Поражен контратакой! +Swords.Combat.Countered=&a**КОНТРАТАКА** +Swords.Combat.SS.Struck=&4Поражен РУБЯЩИМ УДАРОМ! +Swords.SubSkill.CounterAttack.Name=Контратака +Swords.SubSkill.CounterAttack.Description=Отражает часть урона при нападении! +Swords.SubSkill.CounterAttack.Stat=Шанс Контратаки +Swords.SubSkill.SerratedStrikes.Name=Рубящий удар +Swords.SubSkill.SerratedStrikes.Description=Наносит часть урона по площади с шансом применить Разрыв! +Swords.SubSkill.SerratedStrikes.Stat=Длительность Рубящего удара +Swords.SubSkill.Rupture.Name=Разрыв +Swords.SubSkill.Rupture.Description=Накладывает сильное кровотечение +Swords.SubSkill.Stab.Name=Пронзание +Swords.SubSkill.Stab.Description=Добавляет бонусный урон вашим атакам. +Swords.SubSkill.Stab.Stat=Урон Пронзания +Swords.SubSkill.SwordsLimitBreak.Name=Запредельные мечи +Swords.SubSkill.SwordsLimitBreak.Description=Вы превосходите свои возможности. Увеличивает урон против сложных противников. Работает в ПВП в зависимости от настроек сервера, но всегда увеличивает урон в ПВЕ. +Swords.SubSkill.SwordsLimitBreak.Stat=Макс. урон Запредельных мечей +Swords.SubSkill.Rupture.Stat=Шанс Разрыва +Swords.SubSkill.Rupture.Stat.Extra=Разрыв: &a{0} тиков [{1} урон игрокам] [{2} урон мобам] +Swords.Effect.4=Рубящий удар Разрыв+ + + +Swords.Effect.5={0} тиков Разрыва +Swords.Listener=Мечи: +Swords.SkillName=Мечи +Swords.Skills.SS.Off=**Рубящий удар прекратил действие** +Swords.Skills.SS.On=&a**РУБЯЩИЙ УДАР АКТИВИРОВАН** +Swords.Skills.SS.Refresh=&aВаше умение &eРубящий удар &aвосстановлено! +Swords.Skills.SS.Other.Off=Рубящий удар&a прекратил действие у &e{0} +Swords.Skills.SS.Other.On=&a{0}&2 использовал &cРубящий удар! +#TAMING +Taming.Ability.Bonus.0=Знание среды +Taming.Ability.Bonus.1=Волки избегают опасности +Taming.Ability.Bonus.2=Густой мех +Taming.Ability.Bonus.3=1/{0} урона, огнестойкость +Taming.Ability.Bonus.4=Ударопрочность +Taming.Ability.Bonus.5=Взрывы наносят 1/{0} обычного урона +Taming.Ability.Bonus.6=Острые когти +Taming.Ability.Bonus.7=+{0} урона +Taming.Ability.Bonus.8=Быстрое питание +Taming.Ability.Bonus.9={0} шанс вылечиться при атаке +Taming.Ability.Bonus.10=Святая гончая +Taming.Ability.Bonus.11=Восстановление здоровья при уроне магией или зельем +Taming.Ability.Locked.0=ЗАБЛОКИРОВАНО ДО {0}+ НАВЫКА (ЗНАНИЕ СРЕДЫ) +Taming.Ability.Locked.1=ЗАБЛОКИРОВАНО ДО {0}+ НАВЫКА (ГУСТОЙ МЕХ) +Taming.Ability.Locked.2=ЗАБЛОКИРОВАНО ДО {0}+ НАВЫКА (УДАРОПРОЧНОСТЬ) +Taming.Ability.Locked.3=ЗАБЛОКИРОВАНО ДО {0}+ НАВЫКА (ОСТРЫЕ КОГТИ) +Taming.Ability.Locked.4=ЗАБЛОКИРОВАНО ДО {0}+ НАВЫКА (БЫСТРОЕ ПИТАНИЕ) +Taming.Ability.Locked.5=ЗАБЛОКИРОВАНО ДО {0}+ НАВЫКА (СВЯТАЯ ГОНЧАЯ) +Taming.Combat.Chance.Gore=Шанс Укуса +Taming.SubSkill.BeastLore.Name=Познание зверей +Taming.SubSkill.BeastLore.Description=Ударьте костью для проверки волков и оцелотов +Taming.SubSkill.ShockProof.Name=Ударопрочность +Taming.SubSkill.ShockProof.Description=Снижение урона от взрывов +Taming.SubSkill.CallOfTheWild.Name=Зов природы +Taming.SubSkill.CallOfTheWild.Description=Призыв животных на свою сторону +Taming.SubSkill.CallOfTheWild.Description.2=&7ЗП: Присядьте и нажмите ЛКМ с!nasd {0} {1} (Оцелот), {2} {3} (Волк), {4} {5} (Лошадь) +Taming.SubSkill.FastFoodService.Name=Быстрое Питание +Taming.SubSkill.FastFoodService.Description=У волков есть шанс вылечиться при атаке +Taming.SubSkill.HolyHound.Name=Святая гончая +Taming.SubSkill.HolyHound.Description=Лечение волшебством и ядами +Taming.SubSkill.Gore.Name=Укус +Taming.SubSkill.Gore.Description=Критический удар, применяющий Разрыв +Taming.SubSkill.SharpenedClaws.Name=Острые когти +Taming.SubSkill.SharpenedClaws.Description=Бонусный урон +Taming.SubSkill.EnvironmentallyAware.Name=Знание среды +Taming.SubSkill.EnvironmentallyAware.Description=Боязнь кактусов и лавы, иммунитет к урону от падения +Taming.SubSkill.ThickFur.Name=Густой мех +Taming.SubSkill.ThickFur.Description=Снижение урона, огнестойкость +Taming.SubSkill.Pummel.Name=Избиение +Taming.SubSkill.Pummel.Description=Ваши волки имеют шанс отбросить врагов +Taming.SubSkill.Pummel.TargetMessage=Вы были отброшены волком! +Taming.Listener.Wolf=&8Ваш волк хочет вернутся к вам... +Taming.Listener=Укрощение: +Taming.SkillName=УКРОЩЕНИЕ +Taming.Summon.COTW.Success.WithoutLifespan=&a(Зов природы) &7Вы призвали &6{0}&7 +Taming.Summon.COTW.Success.WithLifespan=&a(Зов природы) &7Вы призвали &6{0}&7 на &6{1}&7 секунд. +Taming.Summon.COTW.Limit=&a(Зов природы) &7Одновременно можно вызвать только{0} &7питомцев &7{1}. +Taming.Summon.COTW.TimeExpired=&a(Зов природы) &7Время вышло, ваш &6{0}&7 уходит. +Taming.Summon.COTW.Removed=&a(Зов природы) &7Призванный &6{0}&7 исчез из этого мира. +Taming.Summon.COTW.BreedingDisallowed=&a(Зов природы) &cВы не можете разводить призванных животных. +Taming.Summon.COTW.NeedMoreItems=&a(Зов природы) &7Вам нужно на &e{0}&7 больше &3{1} +Taming.Summon.Name.Format=&6(Зов Предков) &f{0} {1} +#UNARMED +Unarmed.Ability.Bonus.0=Стиль Стального кулака +Unarmed.Ability.Bonus.1=+{0} улучшение урона +Unarmed.Ability.IronGrip.Attacker=У вашего оппонента Железная хватка! +Unarmed.Ability.IronGrip.Defender=&aВаша Железная хватка предотвратила разоружение! +Unarmed.Ability.Lower=&7Вы опустили свои кулаки. +Unarmed.Ability.Ready=&3Вы &6подготовили&e свои кулаки. +Unarmed.SubSkill.Berserk.Name=Берсерк +Unarmed.SubSkill.Berserk.Description=+50% к урону, разрушение нетвердых блоков +Unarmed.SubSkill.Berserk.Stat=Длительность Берсерка +Unarmed.SubSkill.Disarm.Name=Разоружение +Unarmed.SubSkill.Disarm.Description=Выбивает предмет из рук противника +Unarmed.SubSkill.Disarm.Stat=Шанс Разоружения +Unarmed.SubSkill.UnarmedLimitBreak.Name=Запредельная безоружность +Unarmed.SubSkill.UnarmedLimitBreak.Description=Вы превосходите свои возможности. Увеличивает урон против сложных противников. Работает в ПВП в зависимости от настроек сервера, но всегда увеличивает урон в ПВЕ. +Unarmed.SubSkill.UnarmedLimitBreak.Stat=Макс. урон Запредельной безоружности +Unarmed.SubSkill.SteelArmStyle.Name=Стиль Стального кулака +Unarmed.SubSkill.SteelArmStyle.Description=Укрепляет ваш удар с течением времени +Unarmed.SubSkill.ArrowDeflect.Name=Отражение стрел +Unarmed.SubSkill.ArrowDeflect.Description=Отражает стрелы +Unarmed.SubSkill.ArrowDeflect.Stat=Шанс Отражения стрел +Unarmed.SubSkill.IronGrip.Name=Железная хватка +Unarmed.SubSkill.IronGrip.Description=Препятствует разоружению вас противником +Unarmed.SubSkill.IronGrip.Stat=Шанс Железной хватки +Unarmed.SubSkill.BlockCracker.Name=Крушитель блоков +Unarmed.SubSkill.BlockCracker.Description=Разрушайте скалы своими кулаками +Unarmed.Listener=Безоружный: +Unarmed.SkillName=БЕЗОРУЖНЫЙ +Unarmed.Skills.Berserk.Off=**Берсерк прекратил действие** +Unarmed.Skills.Berserk.On=&a**БЕРСЕРК АКТИВИРОВАН** +Unarmed.Skills.Berserk.Other.Off=Берсерк&a прекратил действие у &e{0} +Unarmed.Skills.Berserk.Other.On=&a{0}&2 использовал &cБерсерка! +Unarmed.Skills.Berserk.Refresh=&aВаше умение &eБерсерк &aвосстановлено! +#WOODCUTTING +Woodcutting.Ability.0=Сдуватель листьев +Woodcutting.Ability.1=Сдувайте листья прочь +Woodcutting.Ability.Locked.0=ЗАБЛОКИРОВАНО ДО {0}+ НАВЫКА (СДУВАТЕЛЬ ЛИСТЬЕВ) +Woodcutting.SubSkill.TreeFeller.Name=Дровосек +Woodcutting.SubSkill.TreeFeller.Description=Взрывает деревья +Woodcutting.SubSkill.TreeFeller.Stat=Длительность Дровосека +Woodcutting.SubSkill.LeafBlower.Name=Сдуватель листьев +Woodcutting.SubSkill.LeafBlower.Description=Сдувайте листья прочь +Woodcutting.SubSkill.KnockOnWood.Name=Стук по дереву +Woodcutting.SubSkill.KnockOnWood.Description=Больше добычи при использовании Дровосека +Woodcutting.SubSkill.KnockOnWood.Stat=Стук по дереву +Woodcutting.SubSkill.KnockOnWood.Loot.Normal=Обычная добыча с деревьев +Woodcutting.SubSkill.KnockOnWood.Loot.Rank2=Обычная добыча и опыт с деревьев +Woodcutting.SubSkill.HarvestLumber.Name=Сбор древесины +Woodcutting.SubSkill.HarvestLumber.Description=Умело получайте больше древесины +Woodcutting.SubSkill.HarvestLumber.Stat=Шанс Двойной добычи +Woodcutting.SubSkill.Splinter.Name=В щепки +Woodcutting.SubSkill.Splinter.Description=Срубайте деревья более эффективно. +Woodcutting.SubSkill.BarkSurgeon.Name=Коровая хирургия +Woodcutting.SubSkill.BarkSurgeon.Description=Получай полезные материалы при обтёсывании древесины. +Woodcutting.SubSkill.NaturesBounty.Name=Щедрость природы +Woodcutting.SubSkill.NaturesBounty.Description=Получайте опыт от природы. +Woodcutting.Listener=Лесорубство: +Woodcutting.SkillName=ЛЕСОРУБСТВО +Woodcutting.Skills.TreeFeller.Off=**Дровосек прекратил действие** +Woodcutting.Skills.TreeFeller.On=&a**ДРОВОСЕК АКТИВИРОВАН** +Woodcutting.Skills.TreeFeller.Refresh=&aВаше умение &eДровосек &aвосстановлено! +Woodcutting.Skills.TreeFeller.Other.Off=Дровосек&a прекратило действие у &e{0} +Woodcutting.Skills.TreeFeller.Other.On=&a{0}&2 использовал &cДровосека! +Woodcutting.Skills.TreeFeller.Splinter=ВАШ ТОПОР РАСКОЛОЛСЯ НА ДЕСЯТКИ КУСКОВ! +Woodcutting.Skills.TreeFeller.Threshold=Это дерево слишком большое! +#ABILITIY + +#COMBAT +Combat.ArrowDeflect=&f**СТРЕЛА ОТСКОЧИЛА** +Combat.BeastLore=&a**ПОЗНАНИЕ ЗВЕРЕЙ** +Combat.BeastLoreHealth=&3Здоровье (&a{0}&3/{1}) +Combat.BeastLoreOwner=&3Хозяин (&c{0}&3) +Combat.BeastLoreHorseSpeed=&3Скорость движения лошади (&a{0} блоков/с&3) +Combat.BeastLoreHorseJumpStrength=&3Сила прыжка лошади (&aМакс. {0} блоков&3) +Combat.Gore=&a**УКУШЕН** +Combat.StruckByGore=**ВЫ БЫЛИ УКУШЕНЫ** +Combat.TargetDazed=Ваша цель &4Ошеломлена +Combat.TouchedFuzzy=&4Вы истекаете кровью. Кружится голова. +#COMMANDS +##generic +mcMMO.Description=&3О проекте &emcMMO&3:,&6mcMMO это RPG мод &cс открытым кодом&6, &6созданный в феврале 2011,&6за авторством &9nossr50&6. Его целью является обеспечение качественного RPG опыта в игре.,&3Подсказки:,&6 - &aИспользуйте &c/mcmmo help&a чтобы увидеть доступные комманды,&6 - &aНапечатайте &c/НАЗВАНИЕНАВЫКА&a чтобы увидеть детальную информацию о навыке,&3Разработчики:,&6 - &anossr50 &9(Создатель и Руководитель),&6 - &aelectronicboy &9(Разработчик),&6 - &akashike &9(Разработчик),&6 - &at00thpick1 &9(Поддержатель Классики) +mcMMO.Description.FormerDevs=&3Бывшие разработчики: &aGJ, NuclearW, bm01, TfT_02, Glitchfinder +Commands.addlevels.AwardAll.1=&aВы были награждены {0} очками опыта во всех навыках! +Commands.addlevels.AwardAll.2=Все навыки были установлены на {0}. +Commands.addlevels.AwardSkill.1=&aВы были награждены {0} уровнями в {1}! +Commands.addlevels.AwardSkill.2={0} был изменен на {1}. +Commands.addxp.AwardAll=&aВы были награждены {0} очками опыта во всех навыках! +Commands.addxp.AwardSkill=&aВы были награждены {0} очками опыта в {1}! +Commands.Ability.Off=Возможность использовать умения &cотключена +Commands.Ability.On=Возможность использовать умения &aвключена +Commands.Ability.Toggle=Возможность использовать умения переключена для &e{0} +Commands.AdminChat.Off=Режим админ-чата &cвыключен +Commands.AdminChat.On=Режим админ-чата &aвключен +Commands.AdminToggle=&a- Переключение админ-чата +Commands.Chat.Console=*Консоль* +Commands.Cooldowns.Header=&6--= &aОткаты умений mcMMO&6 =-- +Commands.Cooldowns.Row.N= &c{0}&f - &6{1} секунд осталось +Commands.Cooldowns.Row.Y= &b{0}&f - &2Готово! +Commands.Database.CooldownMS=Вы должны подождать {0} миллисекунд, прежде чем вновь использовать эту команду. +Commands.Database.Cooldown=Вы должны подождать {0} секунд, прежде чем вновь использовать эту команду. +Commands.Database.Processing=Ваша предыдущая команда все ещё выполняется. Пожалуйста, подождите. +Commands.Disabled=Эта команда отключена. +Commands.DoesNotExist= &cИгрока не существует в базе данных! +Commands.GodMode.Disabled=Режим бога mcMMO отключен +Commands.GodMode.Enabled=Режим бога mcMMO включен +Commands.AdminChatSpy.Enabled=Слежка за чатами групп mcMMO включена +Commands.AdminChatSpy.Disabled=Слежка за чатами групп mcMMO отключена +Commands.AdminChatSpy.Toggle=Чат групп mcMMO переключен для &e{0} +Commands.AdminChatSpy.Chat=&6[ШПИК: &a{0}&6] &f{1} +Commands.GodMode.Forbidden=[mcMMO] Режим бога не разрешен в этом мире (проверьте права) +Commands.GodMode.Toggle=Режим бога переключен для &e{0} +Commands.Healthbars.Changed.HEARTS=[mcMMO] Тип отображения шкалы здоровья был изменен на &eСердца&f. +Commands.Healthbars.Changed.BAR=[mcMMO] Тип отображения шкалы здоровья был изменен на &eКвадраты&f. +Commands.Healthbars.Changed.DISABLED=[mcMMO] Отображение шкалы здоровья мобов &7отключено&f. +Commands.Healthbars.Invalid=Недействительный тип шкалы здоровья! +Commands.Inspect=<игрок> &a- Посмотреть детальную информацию об игроке +Commands.Invite.Success=&aПриглашение успешно отправлено. +Commands.Leaderboards=<навык> <страница> &a- Таблица лидеров +Commands.mcgod=&a- Переключить режим бога +Commands.mchud.Invalid=Это неправильный тип HUD'а. +Commands.mcpurge.Success=&aБаза данных успешно очищена! +Commands.mcrank.Heading=&6-=ПЕРСОНАЛЬНЫЙ РЕЙТИНГ=- +Commands.mcrank.Overall=Общий&a - &6Ранг &f#&a{0} +Commands.mcrank.Player=&eРейтинг для &f{0} +Commands.mcrank.Skill=&e{0}&a - &6Ранг &f#&a{1} +Commands.mcrank.Unranked=&fРядовой +Commands.mcrefresh.Success=Откаты {0} были восстановлены. +Commands.mcremove.Success=&a{0} успешно удален из базы данных! +Commands.mctop.Tip=&6Подсказка: Используйте &c/mcrank&6, чтобы посмотреть свой рейтинг! +Commands.mmoedit=[игрок] <навык> <значение> &c - Модифицировать цель +Commands.mmoedit.AllSkills.1=&aВаш уровень во всех навыках был установлен на {0}! +Commands.mmoedit.Modified.1=&aВаш уровень в {0} был установлен на {1}! +Commands.mmoedit.Modified.2={0} было изменен на {1}. +Commands.mcconvert.Database.Same=Вы уже используете базу данных {0}! +Commands.mcconvert.Database.InvalidType={0} не является допустимым типом базы данных. +Commands.mcconvert.Database.Start=&7Начало конвертации из {0} в {1}... +Commands.mcconvert.Database.Finish=&7Миграция базы данных завершена; база данных {1} теперь включает все данные из {0}. +Commands.mmoshowdb=Текущая база данных &a{0} +Commands.mcconvert.Experience.Invalid=Неизвестный тип формулы! Доступные типы: &aLINEAR &cи &aEXPONENTIAL. +Commands.mcconvert.Experience.Same=Тип формулы {0} уже используется +Commands.mcconvert.Experience.Start=&7Начало конвертации из {0} в кривую {1} +Commands.mcconvert.Experience.Finish=&7Конвертация формулы завершена; теперь используется кривая опыта {0}. +Commands.ModDescription=&a- Прочитать краткое описание мода +Commands.NoConsole=Эта команда не поддерживает использования с консоли. +Commands.Notifications.Off=Уведомления об умениях &cотключены +Commands.Notifications.On=Уведомления об умениях &cвключены +Commands.Offline=Эта команда не работает для игроков не в сети. +Commands.NotLoaded=Профиль игрока еще не загрузился. +Commands.Party.Status=&8ИМЯ: &f{0} {1} &8УРОВЕНЬ: &e{2} +Commands.Party.Status.Alliance=&8СОЮЗ: &f{0} +Commands.Party.UnlockedFeatures=&8Разблокированные функции: &7[[ITALIC]]{0} +Commands.Party.ShareMode=&8РЕЖИМ РАСПРЕДЕЛЕНИЯ: +Commands.Party.ItemShare=&7ПРЕДМЕТ &3({0}) +Commands.Party.ExpShare=&7ОПЫТ &3({0}) +Commands.Party.ItemShareCategories=&8Распределение предметов: &7[[ITALIC]]{0} +Commands.Party.MembersNear=&8ВОЗЛЕ ВАС &3{0}&8/&3{1} +Commands.Party.Accept=&a- Принять приглашение в группу +Commands.Party.Chat.Off=Режим чата группы &cотключен +Commands.Party.Chat.On=Режим чата группы &cвключен +Commands.Party.Commands=&c---[]&aКОМАНДЫ ГРУППЫ&c[]--- +Commands.Party.Invite.0=&cВНИМАНИЕ: &aВы получили приглашение в группу {0} от {1} +Commands.Party.Invite.1=&eВведите &a/party accept&e, чтобы принять приглашение в группу +Commands.Party.Invite=&a- Отправить приглашение в группу +Commands.Party.Invite.Accepted=&aПриглашение принято. Вы присоединились к группе {0} +Commands.Party.Join=&7Присоединился к группе: {0} +Commands.Party.PartyFull=&6{0}&c заполнена! +Commands.Party.PartyFull.Invite=Вы не можете пригласить &e{0}&c в &a{1}&c, потому что в ней уже &3{2}&c игроков! +Commands.Party.PartyFull.InviteAccept=Вы не можете присоединиться к &a{0}&c, потому что в ней уже &3{1}&c игроков! +Commands.Party.Create=&7Создана группа: {0} +Commands.Party.Rename=&7Название группы изменено на: &f{0} +Commands.Party.SetSharing=&7Распределение группы {0} установлено на: &3{1} +Commands.Party.ToggleShareCategory=&7Распределение предметов для &6{0} &7было &3{1} +Commands.Party.AlreadyExists=&4Группа {0} уже существует! +Commands.Party.Kick=&cВы были выгнаны из группы &a{0}&c! +Commands.Party.Leave=&eВы покинули эту группу +Commands.Party.Members.Header=&c-----[]&aУЧАСТНИКИ&c[]----- +Commands.Party.None=&cВы не состоите в группе. +Commands.Party.Quit=&a- Покинуть текущую группу +Commands.Party.Teleport=&a- Телепортироваться к участнику группы +Commands.Party.Toggle=&a- Переключить чат группы +Commands.Party1=&a- Создать новую группу +Commands.Party2=&a- Присоединиться к группе +Commands.Party.Alliance.Header=&c-----[]&aСОЮЗ ГРУППЫ&c[]----- +Commands.Party.Alliance.Ally=&f{0} &8В СОЮЗЕ С: &f{1} +Commands.Party.Alliance.Members.Header=&c-----[]&aУЧАСТНИКИ СОЮЗА&c[]----- +Commands.Party.Alliance.Invite.0=ВНИМАНИЕ: &aВы получили запрос на союз с {0} от {1} +Commands.Party.Alliance.Invite.1=Введите &a/party alliance accept&e, чтобы принять приглашение +Commands.Party.Alliance.Invite.Accepted=&aПредложение о союзе принято. +Commands.Party.Alliance.None=&cВаша группа не имеет союзников. +Commands.Party.Alliance.AlreadyAllies=&cВаша группа уже в союзе. Расформируйте его с помощью &3/party alliance disband +Commands.Party.Alliance.Help.0=&cЭта группа еще не заключила союза. Пригласите лидера группы +Commands.Party.Alliance.Help.1=&c для заключения союза &3/party alliance invite <игрок>&c. +Commands.ptp.Enabled=Телепортация к участникам группы &aвключена +Commands.ptp.Disabled=Телепортация к участникам группы &cотключена +Commands.ptp.NoRequests=&cНа данный момент запросов на телепортацию к вам нет +Commands.ptp.NoWorldPermissions=&c[mcMMO] У вас нет прав на телепортацию в мир {0}. +Commands.ptp.Request1=&e{0} &aзапрашивает телепортироваться к вам. +Commands.ptp.Request2=&aДля телепортации введите &e/ptp accept&a. Запрос будет отменен через &c{0} &aсекунд. +Commands.ptp.AcceptAny.Enabled=Подтверждение запроса на телепортацию &aвключено +Commands.ptp.AcceptAny.Disabled=Подтверждение запроса на телепортацию &cотключено +Commands.ptp.RequestExpired=&cГрупповой запрос на телепортацию истек! +Commands.PowerLevel.Leaderboard=&e--Tаблица лидеров&9 по уровню силы &emcMMO-- +Commands.PowerLevel.Capped=&4УРОВЕНЬ СИЛЫ: &a{0} &4МАКС. УРОВЕНЬ: &e{1} +Commands.PowerLevel=&4УРОВЕНЬ СИЛЫ: &a{0} +Commands.Reset.All=&aВсе ваши уровни навыков были успешно сброшены. +Commands.Reset.Single=&aВаш уровень навыка {0} был успешно сброшен. +Commands.Reset=&a- Сброс уровня навыка до 0 +Commands.Scoreboard.Clear=&3Таблица mcMMO убрана. +Commands.Scoreboard.NoBoard=&cТаблица mcMMO не активна. +Commands.Scoreboard.Keep=&3Таблица mcMMO будет отображаться пока вы не используете &a/mcscoreboard clear&3. +Commands.Scoreboard.Timer=&3Таблица mcMMO исчезнет через &6{0}&3 секунд. +Commands.Scoreboard.Help.0=&6 == &aПомощь по &c/mcscoreboard&6 == +Commands.Scoreboard.Help.1=&3/mcscoreboard&b clear &f - убрать таблицу mcMMO +Commands.Scoreboard.Help.2=&3/mcscoreboard&b keep &f - постоянно отображать таблицу mcMMO +Commands.Scoreboard.Help.3=&3/mcscoreboard&b time [n] &f - убрать таблицу результатов mcMMO через &dn&f секунд +Commands.Scoreboard.Tip.Keep=&6Подсказка: Используйте &c/mcscoreboard keep&6 во время просмотра таблицы, чтобы она не исчезала. +Commands.Scoreboard.Tip.Clear=&6Подсказка: Используйте &c/mcscoreboard clear&6 чтобы убрать таблицу. +Commands.XPBar.Reset=&6Настройки шкалы опыта для mcMMO были сброшены. +Commands.XPBar.SettingChanged=&6Настройка шкалы опыта для &a{0}&6 установлена на &a{1} +Commands.Skill.Invalid=Это недействительное название навыка! +Commands.Skill.ChildSkill=Дочерние навыки недействительны для этой команды! +Commands.Skill.Leaderboard=--mcMMO &9{0}&e таблица лидеров-- +Commands.SkillInfo=&a- Посмотреть детальную информацию о навыке +Commands.Stats=&a- Посмотреть свои статы mcMMO +Commands.ToggleAbility=&a- Переключить активацию умений через ПКМ +Commands.Usage.0=&cПравильное использование /{0} +Commands.Usage.1=&cПравильное использование /{0} {1} +Commands.Usage.2=&cПравильное использование /{0} {1} {2} +Commands.Usage.3=&cПравильное использование /{0} {1} {2} {3} +Commands.Usage.3.XP=&cПравильное использование - /{0} {1} {2} {3}&7 (Вы можете добавить -s в конце для выполнения команды без информирования об этом игрока) +Commands.Usage.FullClassName=класс +Commands.Usage.Level=уровень +Commands.Usage.Message=сообщение +Commands.Usage.Page=страница +Commands.Usage.PartyName=имя +Commands.Usage.Password=пароль +Commands.Usage.Player=игрок +Commands.Usage.Rate=частота +Commands.Usage.Skill=навык +Commands.Usage.SubSkill=поднавык +Commands.Usage.XP=опыт +Commands.Description.mmoinfo=Прочитайте подробнее о навыке или механике. +Commands.MmoInfo.Mystery=&7Вы еще не разблокировали этот навык, но когда разблокируете, сможете прочитать о нем тут! +Commands.MmoInfo.NoMatch=Этого поднавыка не существует! +Commands.MmoInfo.Header=&3-=[]=====[]&6 MMO инфо. &3[]=====[]=- +Commands.MmoInfo.SubSkillHeader=&6Название:&e {0} +Commands.MmoInfo.DetailsHeader=&3-=[]=====[]&a Подробнее &3[]=====[]=- +Commands.MmoInfo.OldSkill=&7Навыки mcMMO сейчас перерабатываются в улучшенную модульную систему, и к сожалению данный навык пока не был переработан и недостает описания. Новая система позволит создавать навыки быстрее и даст больше гибкости уже существующим. +Commands.MmoInfo.Mechanics=&3-=[]=====[]&6 Механики &3[]=====[]=- +Commands.MmoInfo.Stats=СТАТЫ: {0} +Commands.Mmodebug.Toggle=Режим отладки mcMMO &6{0}&7, используйте команду снова для переключения. В режиме отладки вы можете бить блоки, чтобы просматривать полезную информацию, требуемую для поддержки. +mcMMO.NoInvites=&cСейчас у вас нет приглашений +mcMMO.NoPermission=&4Недостаточно прав. +mcMMO.NoSkillNote=&8Если у вас нет доступа к навыку, то он не будет отображен здесь. +##party +Party.Forbidden=[mcMMO] Группы не разрешены в этом мире (проверьте права) +Party.Help.0=&cПравильное использование &3{0} <игрок> [пароль]. +Party.Help.1=&cЧтобы создать группу, используйте &3{0} <название> [пароль]. +Party.Help.2=&cИспользуйте &3{0} &cдля дополнительной информации +Party.Help.3=&cИспользуйте &3{0} <игрок> [пароль]&c, чтобы присоединиться или &3{1}&c, чтобы выйти +Party.Help.4=&cЧтобы заблокировать или разблокировать свою группу, используйте &3{0} +Party.Help.5=&cЧтобы защитить свою группу паролем, используйте &3{0} <пароль> +Party.Help.6=Чтобы выгнать игрока из своей группы, используйте &3{0} <игрок> +Party.Help.7=Чтобы передать права управления своей группой, используйте &3{0} <игрок> +Party.Help.8=&cЧтобы расформировать свою группу, используйте &3{0} +Party.Help.9=&cИспользуйте &3{0} &cдля распределения предметов между участниками группы +Party.Help.10=&cИспользуйте &3{0} &cдля включения распределения опыта между участниками группы +Party.InformedOnJoin={0} &aприсоединился к вашей группе +Party.InformedOnQuit={0} &aпокинул вашу группу +Party.InformedOnNameChange=&6{0} &aустановил название группы на &f{1} +Party.InvalidName=&4Это недопустимое название группы. +Party.Invite.Self=&cВы не можете пригласить сами себя! +Party.IsLocked=&cЭта группа уже закрыта! +Party.IsntLocked=&cЭта группа не закрыта! +Party.Locked=&cГруппа закрыта, только лидер группы может приглашать. +Party.NotInYourParty=&4{0} нет в вашей группе +Party.NotOwner=&4Вы не лидер группы. +Party.Target.NotOwner=&4{0} не лидер группы. +Party.Owner.New=&a{0} теперь новый лидер группы. +Party.Owner.NotLeader=&4Вы больше не лидер группы. +Party.Owner.Player =&aТеперь вы лидер группы. +Party.Password.None=&cЭта группа защищена паролем. Пожалуйста, введите пароль чтобы присоединиться. +Party.Password.Incorrect=&cНеправильный пароль группы. +Party.Password.Set=&aПароль группы установлен на {0} +Party.Password.Removed=&aПароль группы был удален. +Party.Player.Invalid=&cЭто недействительный игрок. +Party.NotOnline=&4{0} не в сети! +Party.Player.InSameParty=&c{0} уже находится в вашей группе! +Party.PlayerNotInParty=&4{0} не состоит в группе +Party.Specify=&cВы должны указать группу. +Party.Teleport.Dead=&cВы не можете телепортироватся к мертвому игроку. +Party.Teleport.Hurt=&cЗа последние {0} секунд вы получили урон, телепортация отменена. +Party.Teleport.Player=&aВы телепортировались к {0}. +Party.Teleport.Self=&cВы не можете телепортироваться к себе! +Party.Teleport.Target=&a{0} телепортировался к вам. +Party.Teleport.Disabled=&cТелепортация к участникам группы {0} запрещена +Party.Rename.Same=&cЭто уже является названием вашей группы! +Party.Join.Self=&cВы не можете присоединиться к самому себе! +Party.Unlocked=&7Группа открыта +Party.Disband=&7Группа расформирована +Party.Alliance.Formed=&7Ваша группа теперь в союзе с &a{0} +Party.Alliance.Disband=&7Ваш союз с &c{0} &7распался +Party.Status.Locked=&4(ТОЛЬКО ПО ПРИГЛАШЕНИЮ) +Party.Status.Unlocked=&2(ОТКРЫТА) +Party.LevelUp=&eУровень группы увеличился на {0}. Всего ({1}) +Party.Feature.Chat=Чат группы +Party.Feature.Teleport=Телепортация группы +Party.Feature.Alliance=Союзы +Party.Feature.ItemShare=Распределение предметов +Party.Feature.XpShare=Распределение опыта +Party.Feature.Locked.Chat=ЗАБЛОКИРОВАНО ДО {0}+ (ЧАТ ГРУППЫ) +Party.Feature.Locked.Teleport=ЗАБЛОКИРОВАНО ДО {0}+ (ТЕЛЕПОРТАЦИЯ ГРУППЫ) +Party.Feature.Locked.Alliance=ЗАБЛОКИРОВАНО ДО {0}+ (СОЮЗЫ) +Party.Feature.Locked.ItemShare=ЗАБЛОКИРОВАНО ДО {0}+ (РАЗДЕЛЕНИЕ ПРЕДМЕТОВ) +Party.Feature.Locked.XpShare=ЗАБЛОКИРОВАНО ДО {0}+ (РАЗДЕЛЕНИЕ ОПЫТА) +Party.Feature.Disabled.1=&cЧат группы еще не разблокирован. +Party.Feature.Disabled.2=&cТелепортация группы еще не разблокирована. +Party.Feature.Disabled.3=&cСоюзы группы еще не разблокированы. +Party.Feature.Disabled.4=&cРаспределение предметов в группе еще не разблокировано. +Party.Feature.Disabled.5=&cРаспределение опыта в группе еще не разблокировано. +Party.ShareType.Xp=ОПЫТ +Party.ShareType.Item=ПРЕДМЕТ +Party.ShareMode.None=НИЧЕГО +Party.ShareMode.Equal=РАВНЫЙ +Party.ShareMode.Random=СЛУЧАЙНО +Party.ItemShare.Category.Loot=Добыча +Party.ItemShare.Category.Mining=Шахтерство +Party.ItemShare.Category.Herbalism=Травничество +Party.ItemShare.Category.Woodcutting=Лесорубство +Party.ItemShare.Category.Misc=Разное +##xp +Commands.XPGain.Acrobatics=Падение +Commands.XPGain.Alchemy=Варка зелий +Commands.XPGain.Archery=Убийство монстров +Commands.XPGain.Axes=Убийство монстров +Commands.XPGain.Child=Получает уровни от родительского навыка +Commands.XPGain.Excavation=Раскопки и поиск сокровищ +Commands.XPGain.Fishing=Рыбалка (очевидно) +Commands.XPGain.Herbalism=Сбор трав +Commands.XPGain.Mining=Добыча камней и руд +Commands.XPGain.Repair=Ремонт вещей +Commands.XPGain.Swords=Убийство монстров +Commands.XPGain.Taming=Приручение животных или сражение вместе с волками +Commands.XPGain.Unarmed=Убийство монстров +Commands.XPGain.Woodcutting=Рубка деревьев +Commands.XPGain=&8ПОЛУЧЕНО ОПЫТА: &f{0} +Commands.xplock.locked=&6Ваша панель опыта теперь зафиксирована на {0}! +Commands.xplock.unlocked=&6Ваша панель опыта теперь &aРАЗБЛОКИРОВАНА&6! +Commands.xprate.modified=&cМНОЖИTЕЛЬ ОПЫTА установлен на {0} +Commands.xprate.over=&cСобытие множителя опыта mcMMO ЗАВЕРШЕНО!! +Commands.xprate.proper.0=&cПравильное использования для изменения множителя опыта /xprate <число> +Commands.xprate.proper.1=&cПравильное использование для сброса множителя опыта /xprate reset +Commands.xprate.proper.2=&cПожалуйста, выберите true(да) или false(нет), чтобы указать, является ли это событием множителя опыта +Commands.NegativeNumberWarn=Не используйте отрицательные числа! +Commands.Event.Start=&amcMMO&6 событие! +Commands.Event.Stop=&amcMMO&3 событие завершено! +Commands.Event.Stop.Subtitle=&aНадеюсь, вы повеселились! +Commands.Event.XP=&3Множитель опыта сейчас &6{0}&3x +Commands.xprate.started.0=&6СОБЫИTЕ МНОЖИTЕЛЯ ОПЫTА mcMMO НАЧАЛОСЬ! +Commands.xprate.started.1=&6МНОЖИTЕЛЬ ОПЫTА mcMMO СЕЙЧАС {0}x! + +# Admin Notifications +Server.ConsoleName=&e[Сервер] +Notifications.Admin.XPRate.Start.Self=&7Вы установили глобальный множитель опыта на &6{0}x +Notifications.Admin.XPRate.End.Self=&7Вы завершили событие множителя опыта. +Notifications.Admin.XPRate.End.Others={0} &7завершил событие множителя опыта +Notifications.Admin.XPRate.Start.Others={0} &7начал или изменил событие множителя опыта {1}x +Notifications.Admin.Format.Others=&6(&amcMMO &3админ&6) &7{0} +Notifications.Admin.Format.Self=&6(&amcMMO&6) &7{0} + +# Event +XPRate.Event=&6В mcMMO событие множителя опыта! Множитель опыта - {0}x! + +#GUIDES +Guides.Available=&7Доступно руководство для {0} - введите /{1} ? [страница] +Guides.Header=&6-=&aРуководство {0} &6=- +Guides.Page.Invalid=Неправильный номер страницы! +Guides.Page.OutOfRange=Этой страницы не существует - есть лишь {0} страниц. +Guides.Usage= Используйте /{0} ? [страница] +##Acrobatics +Guides.Acrobatics.Section.0=&3О навыке Акробатика:!nasd&eАкробатика - это навык грациозного передвижения в mcMMO.!nasd&eОн дает бонусы в бою и защищает от природных повреждений.!nasd!nasd&3Получение опыта:!nasd&eЧтобы получать опыт в этом навыке, нужно выполнять уклонения !nasd&eв бою или падать с большой высоты, получая урон. +Guides.Acrobatics.Section.1=&3Как работает умение Кувырок?!nasd&eУ вас есть шанс свести на нет урон, получаемый при падении.!nasd&eЕсли во время падения держать кнопку приседа,!nasd&eто этот шанс можно удвоить.!nasd&eЭто вызовет Грациозный кувырок, вместо стандартного.!nasd&eГрациозные кувырки похожи на обычные, но происходят в два!nasd&eраза реже и дают большую защиту при падении.!nasd&eШанс на удачный Кувырок зависит от уровня навыка. +Guides.Acrobatics.Section.2=&3Как работает умение Уклонение?!nasd&eБлагодаря этому умению у вас есть шанс уклониться!nasd&eво время бытвы, что вдвое уменьшит полученный урон.!nasd&eШанс на удачное Уклонение зависит от уровня навыка. +##Alchemy +Guides.Alchemy.Section.0=&3О навыке Алхимия:!nasd&eАлхимия - это производство зелий.!nasd&eОна обеспечивает ускорение варки зелий, а также!nasd&eдобавляет новые, ранее недоступные зелий.!nasd!nasd!nasd&3ПОЛУЧЕНИ ОПЫTА:!nasd&eЧтобы получить опыт в этом навыке, необходимо варить зелья. +Guides.Alchemy.Section.1=&3Как работает умение Катализатор?!nasd&eКатализатор ускоряет процесс варки до!nasd&eскорости 4x на уровне 1000.!nasd&eЭто умение разблокируется на уровне 100. +Guides.Alchemy.Section.2=&3Как работает умение Отвары?!nasd&eОтвары позволяют варить больше зелий с новыми ингредиентами.!nasd&eОт вашего ранга зависит какие ингредиенты!nasd&eбудут разблокированы. Всего доступно 8 рангов. +Guides.Alchemy.Section.3=&3Ингредиенты 1 ранга Отваров:!nasd&eОгненный порошок, Маринованный паучий глаз, Слеза гаста, Редстоун,!nasd&eСветокаменная пыль, Сахар, Сверкающий ломтик арбуза, Золотая морковь,!nasd&eСгусток магмы, Незерский нарост, Паучий глаз, Порох, Кувшинка,!nasd&eИглобрюх!nasd&e(Ванильные зелья) +Guides.Alchemy.Section.4=&3Ингредиенты 2 ранга Отваров:!nasd&eМорковь (Зелье скорости)!nasd&eСлизь (Зелье тупости)!nasd!nasd&3Ингредиенты 3 ранга Отваров:!nasd&eКварц (Зелье поглощения)!nasd&eМухомор (Зелье прыгучести) +Guides.Alchemy.Section.5=&3Ингредиенты 4 ранга Отваров:!nasd&eЯблоко (Зелье доп. здоровья)!nasd&eГнилая Плоть (Зелье голода)!nasd!nasd&3Ингредиенты 5 ранга Отваров:!nasd&eКоричневый гриб (Зелье тошноты)!nasd&eЧернильный мешок (Зелье слепоты) +Guides.Alchemy.Section.6=&3Ингредиенты 6 ранга Отваров:!nasd&eПапоротник (Зелье насыщения)!nasd!nasd&3Ингредиенты 7 ранга Отваров:!nasd&eЯдовитый картофель (Зелье загнивания)!nasd!nasd&3Ингредиенты 8 ранга Отваров:!nasd&eОбычное золотое яблоко (Зелье защиты) + +##Archery +Guides.Archery.Section.0=&3О навыке Стрельба:!nasd&eНавык Стрельбы направлен на ваши лук и стрелы.!nasd&eОн дает различные бонусы, вроде увеличение урона,!nasd&eвозрастающего с уровнем, а также умение ошеломить!nasd&eпротивника в ПвП. Также вы получаете возможность!nasd&eвернуть часть стрел с поверженных врагов.!nasd!nasd&3ПОЛУЧЕНИЕ ОПЫТА:!nasd&eЧтобы получать опыт в этом навые, необходимо стрелять!nasd&eв мобов или других игроков. +Guides.Archery.Section.1=&3Как работает умение Умелый выстрел?!nasd&eУмелый выстрел наносит дополнительный урон при стрельбе.!nasd&eДополнительный урон при Умелом выстреле растет с!nasd&e вашим уровнем навыка Стрельбы. !nasd&eПо умолчанию, урон от стрельбы увеличивается на 10% !nasd&eкаждые 50 уровней, вплоть до 200% бонусного урона. +Guides.Archery.Section.2=&3Как работает умение Ошеломление?!nasd&eВы имеете пассивный шанс Ошеломить других игроков,!nasd&eстреляя в них. Ошеломление вынуждает вашего оппонента !nasd&eсмотреть строго вверх на протяжении небольшого времени.!nasd&eОшеломление дополнительно наносит 4 урона (2 сердца). +Guides.Archery.Section.3=&3Как работает умение Возвращение стрел?!nasd&eУ вас есть пассивный шанс вернуть часть своих!nasd&eстрел после убийства моба с помощью лука.!nasd&eЭтот шанс растет с уровнем навыка Стрельбы.!nasd&eУмение растет на 0,1% с каждым уровнем, вплоть!nasd&eдо 100% на 1000 уровне. +##Axes +Guides.Axes.Section.0=&3О навыке Топоры:!nasd&eС навыком Топоры вы сможете использовать свой топор не!nasd&eтолько для рубки леса! Вы сможете кромсать мобов!nasd&eи игроков для получения опыта, наносить им смертельные!nasd&eкритические повреждения и отбрасывать от себя.!nasd&eТакже ваш топор становится инструментом для быстрого и!nasd&eлегкого разрушения брони противников.!nasd&eЧем выше ваш уровень навыка, тем быстрее разрушается броня.!nasd&3ПОЛУЧЕНИЕ ОПЫТА:!nasd&eЧтобы получать опыт в этом навыке, вы должны топором !nasd&eнаносить повреждения мобам или другим игрокам. +Guides.Axes.Section.1=&3Как работает умение Раскалыватель черепов?!nasd&eЭто умение позволяет вам наносить удар по области. После этого удара!nasd&eвсе в области получат половину урона, нанесенного вами главной цели,!nasd&eтак что это хороший способ быстро уничтожать скопления мобов. +Guides.Axes.Section.2=&3Как работает умение Критический удар?!nasd&eКритический удар - пассивное умение, которое дает вам шанс!nasd&eнанести дополнительный урон.!nasd&eКаждые 2 уровня навыка Топоров дают вам +0,1%!nasd&eшанс нанести Критический удар, из-за которого мобы получат!nasd&eурон x2, а другие игроки x1,5. +Guides.Axes.Section.3=&3Как работает умение Мастерство топора?!nasd&eМастерство топора - пассивное умение, которое наносит!nasd&eдополнительный урон при ваших атаках топором.!nasd&eБонусный урон возрастает на 1 каждые 50 уровней!nasd&eнавыка, вплоть до 4 дополнительного урона на 200 уровне. +Guides.Axes.Section.4=&3Как работает умение Бронебойный удар?!nasd&eБейте с такой силой, чтобы сокрушать броню врагов!!nasd&eБронебойный удар дает вам пассивный шанс повредить броню!nasd&eвашего оппонента. Сила повреждений зависит от уровня навыка. +Guides.Axes.Section.5=&3Как работает умение Мощный удар?!nasd&eВы имеете пассивный шанс нанести Мощный удар, сражаясь с !nasd&eтопором против мобов или других игроков. По умолчанию, !nasd&eэтот шанс равен 25%. Это пассивное умение дает эффект!nasd&eсильного откидывания, как при зачаровании Откидывание II!nasd&eК тому же этот удар наносит дополнительные повреждения. +##Excavation +Guides.Excavation.Section.0=&3О навыке Раскопки:!nasd&eРаскопки - процесс копания земли в поисках сокровищ.!nasd&eВ процессе раскопок вы можете найти сокровища.!nasd&eЧем больше вы копаете, тем больше сокровищ вы можете найти.!nasd!nasd&3ПОЛУЧЕНИЕ ОПЫТА:!nasd&eЧтобы получать опыт за этот навык, вы должны копать с лопатой в руке.!nasd&eТолько определенные блоки при копании дают опыт и содержат сокровища. +Guides.Excavation.Section.1=&3Подходящие блоки:!nasd&eДерн, Земля, Песок, Глина, Гравий, Мицелий, Песок Душ, Снег +Guides.Excavation.Section.2=&3Как использовать умение Гига-бур:!nasd&eС лопатой в руке кликните ПКМ, чтобы подготовить инструмент.!nasd&eПосле этого у вас есть около 4 секунд для начала добычи!nasd&eподходящих блоков, что активирует умение Гига-бур. +Guides.Excavation.Section.3=&3Что такое Гига-бур?!nasd&eГига-бур - это умение с откатом, связанное!nasd&eс навыком Раскопок. Оно утраивает шанс!nasd&eнайти сокровища и дает возможность!nasd&eразрушать подходящие блоки с одного удара. +Guides.Excavation.Section.4=&3Как работает умение Археология?!nasd&eВсе сокровища навыка Раскопок имеют свой!nasd&eтребуемый уровень навыка, так что сложно сказать,!nasd&eнасколько сильно вам поможет этот навык.!nasd&eПросто помните, что чем выше ваш навык Раскопок,!nasd&eтем больше сокровищ вы сможете найти.!nasd&eТакже не забывайте, что для каждого совместимого!nasd&eс Раскопками блока имеются свои уникальные сокровища.!nasd&eДругими словами, в земле вы найдете другие сокровища,!nasd&eнежели, например, в гравии. +Guides.Excavation.Section.5=&3Примечания о Раскопках:!nasd&eНаходимые сокровища при Раскопках полностью настраиваемые.!nasd&eТак что, на разных серверах находки могут сильно отличаться. +##Fishing +Guides.Fishing.Section.0=&3О навыке Рыболовство:!nasd&eС этим навыком рыбалка становится захватывающей!!nasd&eНаходите сокровища и вытряхивайте предметы из мобов!!nasd!nasd&3ПОЛУЧЕНИЕ ОПЫТА:!nasd&eЛовите рыбу. +Guides.Fishing.Section.1=&3Как работает умение Охотник за сокровищами?!nasd&eЭто умение позволяет находить сокровища во!nasd&eвремя рыбалки, есть шанс, что они будут зачарованными.!nasd&eВсе сокровища Рыболовства имеют шанс!nasd&eпойматься на любом уровне. Шанс выпадения!nasd&eзависит от редкости сокровища.!nasd&eЧем больше уровень навыка Рыболовство,!nasd&eтем больше шанс найти хорошие сокровища. +Guides.Fishing.Section.2=&3Как работает умение Подледная рыбалка?!nasd&eЭто пассивное умение позволяет вам рыбачить в!nasd&eледяных водоемах. Просто забросьте удочку на лед!nasd&eи там образуется прорубь для ловли рыбы. +Guides.Fishing.Section.3=&3Как работает умение Мастер-рыболов?!nasd&&eЭтот пассивный навык увеличивает шанс улова во время рыбалки.!nasd&eКогда вы разблокируете это умение, рыбалка в лодке!nasd&eувеличивает шансы поймать рыбу. +Guides.Fishing.Section.4=&3Как работает умение Встряска?!nasd&eЭто активное умение позволяет вытряхивать предметы!nasd&eиз мобов, цепляя их удочкой.!nasd&eЭто будут предметы, которые выпадают из них при смерти.!nasd&eТакже есть шанс получить черепа мобов, которые обычно!nasd&eнедоступны в режиме выживания. +Guides.Fishing.Section.5=&3Как работает умение Рыбацкая диета?!nasd&eЭто умение увеличивает качество утоления голода!nasd&eпри поедании рыбы. +Guides.Fishing.Section.6=&3Примечания о Рыболовстве:!nasd&eПредметы при рыбалке полностью настраиваемы,!nasd&eтак что на разных серверах и добыча может быть разная. +##Herbalism +Guides.Herbalism.Section.0=&3О навыке Травничество:!nasd&eТравничество - это все что, касается сбора трав и растений.!nasd!nasd&3ПОЛУЧЕНИЕ ОПЫТА:!nasd&eСобирайте травы и растения. +Guides.Herbalism.Section.1=&3Подходящие растения:!nasd&eПшеница, Картошка, Морковь, Арбузы, !nasd&eТыквы, Сахарный тростник, Какао-бобы, Цветы, Кактусы,!nasd&eГрибы, Незерский нарост, Кувшинки, Лианы. +Guides.Herbalism.Section.2=&3Как работает умение Озеленение?!nasd&eОзеленение - активное умение, которое!nasd&eактивируется нажатием ПКМ с мотыгой в руке.!nasd&eОзеленение дает шанс 3x добычи при сборе!nasd&eрастений. Также оно дает возможность !nasd&eвселить жизнь в мертвые блоки, трансформировать их !nasd&eиспользуя семена из вашего инвентаря. +Guides.Herbalism.Section.3=&3Как работает умение Живительное прикосновение (на урожай)?!nasd&eЭто пассивное умение дает вам шанс автоматически!nasd&eпосадить новые растения при сборе уже созревших. !nasd&eЭтот шанс зависит от уровня навыка Травничество. +Guides.Herbalism.Section.4=&3Как работает умение Живительное прикосновение (на камень/грязь)?!nasd&eЭто активное умение позволяет вам превращать мертвые блоки в их!nasd&e"живые" варианты. Вы можете сделать это, кликнув ПКМ!nasd&eна блок с семенами в руке. Это потратит 1 семечко. +Guides.Herbalism.Section.5=&3Как работает умение Фермерская диета?!nasd&eЭто умение увеличивает качество утоления голода!nasd&eпри поедании хлеба, печенья, арбуза, грибного супа,!nasd&eморкови и картошки. +Guides.Herbalism.Section.6=&3Как работает умение Хайлийская удача?!nasd&eЭто пассивное умение дает вам шанс найти редкие!nasd&eпредметы, ломая мечем определенные блоки. +Guides.Herbalism.Section.7=&3Как работает умение Двойная добыча?!nasd&eЭто пассивное умение дает больше урожая при!nasd&eво время его сбора. +##Mining +Guides.Mining.Section.0=&3О навыке Шахтерство:!nasd&eШахтерство включает в себя добычу камня и руд. Оно дает шанс,!nasd&eчто некоторые редкие материалы будут найдены во время добычи.!nasd!nasd&3ПОЛУЧЕНИЕ ОПЫТА:!nasd&eЧтобы получать опыт, вы должны вести добычу с киркой в руке.!nasd&eОпыт дается за добычу определенных блоков. +Guides.Mining.Section.1=&3Подходящие блоки:!nasd&eКамень, Каменный уголь, Железная руда, Золотая руда, Алмазная руда,!nasd&eРедстоуновая руда, Лазуритовая руда, Обсидиан, Замшелый булыжник,!nasd&eЭндерняк, Светящийся камень, Незерак. +Guides.Mining.Section.2=&3Как использовать умение Суперкрушитель:!nasd&eС киркой в руке кликните ПКМ, чтобы подготовить инструмент.!nasd&eПосле этого у вас есть около 4 секунд для начала добычи!nasd&eподходящих блоков, что активирует умение Суперкрушитель. +Guides.Mining.Section.3=&3Что такое Суперкрушитель?!nasd&eСуперкрушитель - это умение, связанное с навыком Шахтерство.!nasd&eОно утраивает шанс получить дополнительные предметы и!nasd&eразрушает подходящие блоки с одного удара. +Guides.Mining.Section.4=&3Как использовать умение Подрывная добыча:!nasd&eС киркой в руке,!nasd&eприсядьте и нажмите ПКМ по динамиту с расстояния. Это !nasd&eмгновенно приведет к подрыву динамита. +Guides.Mining.Section.5=&3Как работает умение Подрывная добыча?!nasd&eПодрывная добыча - умение с откатом, связанное с навыком!nasd&eШахтерство. Оно дает бонусы при добыче с динамитом и позволяет!nasd&eвзрывать его на расстоянии. Есть три особенности Подрывной добычи. !nasd&eПервая - умение Большие бомбы, которое увеличивает радиус!nasd&eвзрыва динамита. Вторая - умение Экспертиза подрывов, которое уменьшает !nasd&eполученные вами повреждения от взрыва TNT. Третья - уменьшение!nasd&eдобычи простых камней и увеличение добычи полезных руд. +##Repair +Guides.Repair.Section.0=&3О навыке Ремонт:!nasd&eРемонт позволяет использовать железный блок для починки!nasd&eброни и инструментов.!nasd!nasd&3Получение опыта:!nasd&eЧините инструменты и броню, используя наковальню mcMMO. !nasd&eНаковальней является поставленный железный блок, и её!nasd&eне следует путать с обычной наковальней. +Guides.Repair.Section.1=&3Как использовать навык Ремонт?!nasd&eРазместите наковальню mcMMO и кликните по ней ПКМ для!nasd&eпочинки предмета в руке. Расходует 1 сырье за использование. +Guides.Repair.Section.2=&3Как работает умение Мастерство ремонта?!nasd&eУмение Мастерство ремонта повышает эффективность починки.!nasd&eЭффективность зависит от уровня навыка Ремонта. +Guides.Repair.Section.3=&3Как работает умение Суперремонт?!nasd&eСуперремонт - это пассивное умение. При починке!nasd&eпредмета оно дает вам шанс отремонтировать его!nasd&eс двойной эффективностью. +Guides.Repair.Section.4=&3Как работает умение Волшебная ковка?!nasd&eЭто пассивное умение позволяет вам ремонтировать предметы!nasd&eс определенным шансом сохранить их зачарование. !nasd&eЭто зачарование может остаться на прежнем уровне,!nasd&eснизиться, или вовсе исчезнуть. +##Salvage +Guides.Salvage.Section.0=&3О Разборке:!nasd&eРазборка позволяет вам использовать золотой блок для переработки брони и!nasd&eинструментов.!nasd!nasd&3ПОЛУЧЕНИЕ ОПЫТА:!nasd&eРазборка это дочерний навык Починки и Рыбалки. Ваш уровень!nasd&eразборки зависит от ваших уровней Починки и Рыбалки. +Guides.Salvage.Section.1=&3Как работает Разборка?!nasd&eРазместите Разборочную наковальню mcMMO и кликните по !nasd&eней ПКМ, чтобы разобрать предмет в руке. Это уничтожит!nasd&eпредмет и вернет использованные на него материалы.!nasd!nasd&eНапример, разборка железной кирки вернет вам железные слитки. +Guides.Salvage.Section.2=&3Как работает умение Улучшенная разборка?!nasd&eЭто умение позволяет перерабатывать поврежденные вещи.!nasd&eКачество разборки повышается вместе с уровнем. Чем оно больше,!nasd&eтем больше материалов вы сможете получить обратно.!nasd&eС Улучшенной разборкой вы будете всегда получать 1 материал обратно,!nasd&eкроме случаев, когда предмет слишком поврежден. Вам не нужно волноваться!nasd&eоб уничтожении предметов без получения чего-то обратно. +Guides.Salvage.Section.3=&3Чтобы показать, как это работает, вот пример:!nasd&eПредположим мы разбираем золотую кирку, которая повреждена на 20%.!nasd&eЭто значит, что максимальное количество слитков, которое вы можете!nasd&eполучить - всего 2 (потому что кирка требует 3 слитка - каждый стоит!nasd&e33,33% прочности), что эквивалентно 66%. Если ваше качество!nasd&eразборки ниже 66%, то вы не сможете получить 2 слитка.!nasd&eЕсли он выше этого значения, то вы сможете получить "полную стоимость",!nasd&eчто значит - вы получите 2 слитка. +Guides.Salvage.Section.4=&3Как работает Магическая разборка?!nasd&eЭта способность позволяет вам получать книги зачарования, когда вы!nasd&eразбираете зачарованные предметы. В зависимости от шанса успеха!nasd&eвы можете получить полную все или лишь часть зачарований.!nasd!nasd&eКогда вы извлекаете часть зачарований, то зачарования!nasd&eна книге будет иметь меньший уровень, чем зачарования,!nasd&eкоторые были на предмете. +##Smelting +Guides.Smelting.Section.0=Скоро... +##Swords +Guides.Swords.Section.0=&3О навыке Мечи:!nasd&eЭтот навык дает различные бонусы при битве мечем.!nasd!nasd&3ПОЛУЧЕНИЕ ОПЫТА:!nasd&eОпыт начисляется в зависимости от урона, нанесенного!nasd&eмобам или другим игрокам при помощи меча. +Guides.Swords.Section.1=&3Как работает умение Рубящий удар?!nasd&eРубящий удар - активное умение, которое активируется!nasd&eнажатием ПКМ с мечем в руке. Это умение позволяет совершить!nasd&eудар по области, что наносящий дополнительно 25% урона!nasd&eи вызовет эффект кровотечения, который продлится 5 тиков. +Guides.Swords.Section.2=&3Как работает умение Контратака?!nasd&eКонтратака - это активное умение, которое дает шанс при!nasd&eпри блокировании ударов отразить 50% полученного урона. +Guides.Swords.Section.3=&3Как работает умение Разрыв?!nasd&eРызрыв наносит противникам урон каждые 2 секунды.!nasd&eЦель будет кровоточить, пока не прекратится действие эффекта!nasd&eили не наступит смерть.!nasd&eПродолжительность эффекта зависит от уровня навыка Мечей. +##Taming +Guides.Taming.Section.0=&3О навыке Укрощение:!nasd&eУкрощение дает различные бонусы в битвах вместе!nasd&eс прирученными волками.!nasd!nasd&3ПОЛУЧЕНИЕ ОПЫТА:!nasd&eЧтобы получать опыт в этом навыке, вам нужно приручать волков!nasd&eили оцелотов, а также сражаться при помощи волков. +Guides.Taming.Section.1=&3Как работает умение Зов природы?!nasd&eЗов природы - это активное умение, которое позволяет вам!nasd&eпризывать к себе прирученных волков или оцелотов. Это можно!nasd&eсделать присев и нажав ЛКМ, держа в руке кости или рыбу. +Guides.Taming.Section.2=&3Как работает умение Познание зверей?!nasd&eПознание зверей позволяет проверять питомцев!nasd&eи получать статы о них. Кликните ЛКМ костью по волку или !nasd&eоцелоту, чтобы использовать умение Познание зверей. +Guides.Taming.Section.3=&3Как работает умение Укус?!nasd&eУкус - пассивное умение, дающее шанс того, что!nasd&eатака ваших волков приведет к кровотечению цели. +Guides.Taming.Section.4=&3Как работает умение Острые когти?!nasd&eОстрые когти позволяет вашими волкам наносить бонусный!nasd&eурон, который зависит от уровня навыка Укрощение. +Guides.Taming.Section.5=&3Как работает умение Знание среды?!nasd&eЭто пассивное умение, позволяющее вашим волкам телепортироватся!nasd&eк вам, если им угрожает опасность, например кактус или лава. Оно также!nasd&eдает вашим волкам иммунитет к получению урона при падении. +Guides.Taming.Section.6=&3Как работает умение Густой мех?!nasd&eЭто пассивное умение, уменьшающее получаемый вашими!nasd&eволками урон и наделяющее их огнестойкостью. +Guides.Taming.Section.7=&3Как работает умение Ударопрочность?!nasd&eЭто пассивное умение, уменьшающее получаемый!nasd&eвашими волками урон при взрывах. +Guides.Taming.Section.8=&3Как работает умение Быстрое питание?!nasd&eЭто пассивное умение, дающее вашим волкам шанс!nasd&eисцелиться, когда они атакуют кого-либо. +##Unarmed +Guides.Unarmed.Section.0=&3О навыке Безоружный:!nasd&eНавык Безоружный дает различные боевые бонусы, когда!nasd&eвы используете ваши кулаки как оружие.!nasd!nasd&3ПОЛУЧЕНИЕ ОПЫТА:!nasd&eКоличество получаемого опыта зависит от урона, нанесенного!nasd&eкулаками мобам или другим игрокам. +Guides.Unarmed.Section.1=&3Как работает умение Берсерк?!nasd&eБерсерк - это активное умение, которое активируется нажатием ПКМ.!nasd&eВ режиме берсерка вы будете наносить на 50% больше урона и!nasd&eсможете мгновенно разрушать нетверды блоки, вроде земли и дерна. +Guides.Unarmed.Section.2=&3Как работает умение Стиль Стального кулака?!nasd&eСтиль Стального кулака увеличивает урон, наносимый!nasd&eкулаками мобам и другим игрокам. +Guides.Unarmed.Section.3=&3Как работает умение Отражение стрел?!nasd&eОтражение стрел - пассивное умение, которое дает вам шанс!nasd&eотражать стрелы, выпущенные скелетами или другими игроками.!nasd&eСтрела упадет на землю без причинения вам вреда. +Guides.Unarmed.Section.4=&3Как работает умение Железная хватка?!nasd&eЖелезная хватка - пассивное умение, которое препятствует!nasd&eразоружению. Шанс растет вместе с уровнем навыка Безоружный. +Guides.Unarmed.Section.5=&3Как работает умение Разоружение?!nasd&eЭто пассивное умение, позволяющее разоружать других игроков,!nasd&eто есть приводит к выпадению на землю оружия противника. +##Woodcutting +Guides.Woodcutting.Section.0=&3О навыке Лесорубство:!nasd&eЛесорубство - это все, что касается рубки деревьев.!nasd!nasd&3ПОЛУЧЕНИЕ ОПЫТА:!nasd&eОпыт дается при разрушении блоков древесины. +Guides.Woodcutting.Section.1=&3Как работает умение Дровосек?!nasd&eДровосек - это активное умение, которое активируется!nasd&eнажатием ПКМ с топором в руке. Это приведет к тому, !nasd&eчто все дерево вмиг будет срублено, а все блоки древесины!nasd&eвыпадут за раз. +Guides.Woodcutting.Section.2=&3Как работает умение Сдуватель листьев?!nasd&eСдуватель листьев - пассивное умение, которое приводит!nasd&eк тому, что блоки листвы вмиг разрушаются при ударе топором. !nasd&eЭто умение разблокируется на уровне 100. +Guides.Woodcutting.Section.3=&3Как работает умение Двойная добыча?!nasd&eЭто пассивное умение, дающее шанс выпадения!nasd&eдополнительного блока древесины при рубке. #INSPECT -Inspect.Offline=\u0423 \u0412\u0430\u0441 \u043d\u0435\u0442 \u043f\u0440\u0430\u0432, \u0447\u0442\u043e\u0431\u044b \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0442\u044c \u043e\u0444\u0444\u043b\u0430\u0439\u043d \u0438\u0433\u0440\u043e\u043a\u043e\u0432! -Inspect.OfflineStats=mcMMO \u0421\u0442\u0430\u0442\u0438\u0441\u0442\u0438\u043a\u0430 \u0434\u043b\u044f \u041e\u0444\u0444\u043b\u0430\u0439\u043d \u0418\u0433\u0440\u043e\u043a\u043e\u0432 [[YELLOW]]{0} -Inspect.Stats=[[GREEN]]mcMMO \u0421\u0442\u0430\u0442\u0438\u0441\u0442\u0438\u043a\u0430 \u0434\u043b\u044f [[YELLOW]]{0} -Inspect.TooFar=\u0412\u044b \u0441\u043b\u0438\u0448\u043a\u043e\u043c \u0434\u0430\u043b\u0435\u043a\u043e \u0447\u0442\u043e\u0431\u044b \u0438\u043d\u0441\u043f\u0435\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u044d\u0442\u043e\u0433\u043e \u0438\u0433\u0440\u043e\u043a\u0430! +Inspect.Offline= &cУ вас нет прав проверять игроков не в сети! +Inspect.OfflineStats=Статы mcMMO игрока не сети &e{0} +Inspect.Stats=&aСтаты mcMMO &e{0} +Inspect.TooFar=Вы слишком далеко, чтобы проверять этого игрока! #ITEMS -Item.ChimaeraWing.Fail=**\u041a\u0420\u042b\u041b\u042c\u042f \u0425\u0418\u041c\u0415\u0420\u042b \u041d\u0415 \u0421\u041c\u041e\u0413\u041b\u0418 \u0423\u041d\u0415\u0421\u0422\u0418 \u0412\u0410\u0421!** -Item.ChimaeraWing.Pass=**\u041a\u0420\u042b\u041b\u042c\u042f \u0425\u0418\u041c\u0415\u0420\u042b \u0423\u041d\u0415\u0421\u041b\u0418 \u0412\u0410\u0421!** -Item.ChimaeraWing.Name=\u041a\u0440\u044b\u043b\u044c\u044f \u0425\u0438\u043c\u0435\u0440\u044b -Item.ChimaeraWing.Lore=[[GRAY]]\u0422\u0435\u043b\u0435\u043f\u043e\u0440\u0442\u0438\u0440\u0443\u0435\u0442 \u0432\u0430\u0441 \u043a \u0432\u0430\u0448\u0435\u0439 \u043a\u0440\u043e\u0432\u0430\u0442\u0438. -Item.ChimaeraWing.NotEnough=\u0412\u0430\u043c \u043d\u0443\u0436\u043d\u043e [[YELLOW]]{0}[[RED]] \u0431\u043e\u043b\u044c\u0448\u0435 [[GOLD]]{1}[[RED]]! -Item.NotEnough=\u0412\u0430\u043c \u043d\u0443\u0436\u043d\u043e [[YELLOW]]{0}[[RED]] \u0431\u043e\u043b\u044c\u0448\u0435 [[GOLD]]{1}[[RED]]! -Item.Generic.Wait=\u0412\u0430\u043c \u043d\u0443\u0436\u043d\u043e \u043f\u043e\u0434\u043e\u0436\u0434\u0430\u0442\u044c \u043f\u0440\u0435\u0436\u0434\u0435 \u0447\u0435\u043c \u0432\u044b \u0441\u043c\u043e\u0436\u0435\u0442\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u044d\u0442\u043e \u0441\u043d\u043e\u0432\u0430! [[YELLOW]]({0}\u0441) -Item.Injured.Wait=\u0412\u044b \u0431\u044b\u043b\u0438 \u0440\u0430\u043d\u0435\u043d\u044b \u0438 \u0434\u043e\u043b\u0436\u043d\u044b \u043f\u043e\u0434\u043e\u0436\u0434\u0430\u0442\u044c \u043f\u0440\u0435\u0436\u0434\u0435 \u0447\u0435\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u044d\u0442\u043e. [[YELLOW]]({0}s) -Item.FluxPickaxe.Name=\u041f\u043b\u0430\u0432\u0438\u043b\u044c\u043d\u0430\u044f \u041a\u0438\u0440\u043a\u0430 -Item.FluxPickaxe.Lore.1=[[GRAY]]\u0418\u043c\u0435\u0435\u0442 \u0448\u0430\u043d\u0441 \u043c\u0433\u043d\u043e\u0432\u0435\u043d\u043d\u043e \u0432\u044b\u043f\u043b\u0430\u0432\u0438\u0442\u044c \u0431\u043b\u043e\u043a. -Item.FluxPickaxe.Lore.2=[[GRAY]]\u041d\u0443\u0436\u0435\u043d \u0443\u0440\u043e\u0432\u0435\u043d\u044c \u043f\u0435\u0440\u0435\u043f\u043b\u0430\u0432\u043a\u0438 {0}+ +Item.ChimaeraWing.Fail=&c**КРЫЛЬЯ ХИМЕРЫ НЕ СМОГЛИ УНЕСТИ ВАС!** +Item.ChimaeraWing.Pass=**КРЫЛЬЯ ХИМЕРЫ** +Item.ChimaeraWing.Name=Крылья Химеры +Item.ChimaeraWing.Lore=&7Телепортирует вас к вашей кровати. +Item.ChimaeraWing.NotEnough=Вам нужно ещё &e{0}&c штук &6{1}&c! +Item.NotEnough=Вам нужно ещё &e{0}&c штук &6{1}&c! +Item.Generic.Wait=Вам нужно подождать, прежде чем вы сможете использовать это снова! &e({0}с) +Item.Injured.Wait=Вы были ранены и должны подождать, прежде чем использовать это. &e({0}s) +Item.FluxPickaxe.Name=Флюсовая кирка +Item.FluxPickaxe.Lore.1=&7Имеет шанс мгновенно переплавить руду. +Item.FluxPickaxe.Lore.2=&7Нужен уровень Переплавки {0}+ #TELEPORTATION -Teleport.Commencing=[[GRAY]]\u0422\u0435\u043b\u0435\u043f\u043e\u0440\u0442\u0430\u0446\u0438\u044f \u0447\u0435\u0440\u0435\u0437 [[GOLD]]({0}) [[GRAY]]\u0441\u0435\u043a\u0443\u043d\u0434, \u043f\u043e\u0436\u0430\u043b\u0443\u0439\u0441\u0442\u0430 \u043d\u0435 \u0434\u0432\u0438\u0433\u0430\u0439\u0442\u0435\u0441\u044c... -Teleport.Cancelled=[[DARK_RED]]\u0422\u0435\u043b\u0435\u043f\u043e\u0440\u0442\u0430\u0446\u0438\u044f \u043e\u0442\u043c\u0435\u043d\u0435\u043d\u0430! +Teleport.Commencing=&7Телепортация через &6({0}) &7секунд, пожалуйста не двигайтесь... +Teleport.Cancelled=&4Телепортация отменена! #SKILLS -Skills.Child=[[GOLD]](\u041d\u0410\u0421\u041b\u0415\u0414\u0421\u0422\u0412\u0415\u041d\u041d\u042b\u0419 \u041d\u0410\u0412\u042b\u041a) -Skills.Disarmed=[[DARK_RED]]\u0412\u044b \u043e\u0431\u0435\u0437\u043e\u0440\u0443\u0436\u0435\u043d\u044b! -Skills.Header=-----[][[GREEN]]{0}[[RED]][]----- -Skills.NeedMore=[[DARK_RED]]\u0412\u0430\u043c \u043d\u0443\u0436\u043d\u043e \u0431\u043e\u043b\u044c\u0448\u0435 [[GRAY]]{0} -Skills.NeedMore.Extra=[[DARK_RED]]\u0412\u0430\u043c \u043d\u0443\u0436\u043d\u043e \u0431\u043e\u043b\u044c\u0448\u0435 [[GRAY]]{0}{1} -Skills.Parents=\u0420\u041e\u0414\u0418\u0422\u0415\u041b\u042c\u0421\u041a\u0418\u0419 -Skills.Stats={0}[[GREEN]]{1}[[DARK_AQUA]] \u041e\u041f\u042b\u0422([[GRAY]]{2}[[DARK_AQUA]]/[[GRAY]]{3}[[DARK_AQUA]]) -Skills.ChildStats={0}[[GREEN]]{1} -Skills.TooTired=\u0412\u044b \u0441\u043b\u0438\u0448\u043a\u043e\u043c \u0443\u0441\u0442\u0430\u043b\u0438, \u0447\u0442\u043e\u0431\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0443\u043c\u0435\u043d\u0438\u0435 \u0435\u0449\u0451 \u0440\u0430\u0437. -Skills.Cancelled={0} \u043e\u0442\u043c\u0435\u043d\u0435\u043d\u043e! -Skills.ConfirmOrCancel=[[GREEN]]\u041d\u0430\u0436\u043c\u0438\u0442\u0435 \u041f\u041a\u041c \u0435\u0449\u0435 \u0440\u0430\u0437 \u0434\u043b\u044f \u043f\u043e\u0434\u0442\u0432\u0435\u0440\u0436\u0434\u0435\u043d\u0438\u044f [[GOLD]]{0}[[GREEN]]. \u041b\u041a\u041c \u0434\u043b\u044f \u043e\u0442\u043c\u0435\u043d\u044b. -Skills.AbilityGateRequirementFail=[[GRAY]]\u0412\u0430\u043c \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0435\u0449\u0435 [[YELLOW]]{0}[[GRAY]] \u0443\u0440\u043e\u0432\u043d\u0435\u0439 [[DARK_AQUA]]{1}[[GRAY]] \u0447\u0442\u043e\u0431\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0434\u0430\u043d\u043d\u0443\u044e \u0441\u043f\u043e\u0441\u043e\u0431\u043d\u043e\u0441\u0442\u044c. +Skills.Child=&6(ДОЧЕРНИЙ НАВЫК) +Skills.Disarmed=&4Вы обезоружены! +Skills.Header=-----[] &a{0}&c []----- +Skills.NeedMore=&4Вам нужно больше &7{0} +Skills.NeedMore.Extra=&4Вам нужно больше &7{0}{1} +Skills.Parents= РОДИТЕЛЬСКИЙ +Skills.Stats={0}&a{1}&3 ОПЫТ(&7{2}&3/&7{3}&3) +Skills.ChildStats={0}&a{1} +Skills.MaxXP=Макс. +Skills.TooTired=Вы слишком устали, чтобы использовать умение ещё раз. &e({0}с) +Skills.TooTired.Named=&7(&6{0}&e {1}с&7) +Skills.TooTired.Extra=&6{0} &eОткаты суперумений - {1} +Skills.Cancelled=&7{0} &cотменен! +Skills.ConfirmOrCancel=&aНажмите ПКМ ещё раз для подтверждения &6{0}&a. ЛКМ для отмены. +Skills.AbilityGateRequirementFail=&7Вам необходимо ещё &e{0}&7 уровней &3{1}&7, чтобы использовать данное умений. #STATISTICS -Stats.Header.Combat=[[GOLD]]-=\u0411\u041e\u0415\u0412\u042b\u0415 \u041d\u0410\u0412\u042b\u041a\u0418=- -Stats.Header.Gathering=[[GOLD]]-=\u041d\u0410\u0412\u042b\u041a\u0418 \u0421\u0411\u041e\u0420\u0410=- -Stats.Header.Misc=[[GOLD]]-=\u0420\u0410\u0417\u041d\u042b\u0415 \u041d\u0410\u0412\u042b\u041a\u0418=- -Stats.Own.Stats=[[GREEN]][mcMMO] \u0421\u0442\u0430\u0442\u0438\u0441\u0442\u0438\u043a\u0430 +Stats.Header.Combat=&6-=БОЕВЫЕ НАВЫКИ=- +Stats.Header.Gathering=&6-=НАВЫКИ СБОРА=- +Stats.Header.Misc=&6-=РАЗНЫЕ НАВЫКИ=- +Stats.Own.Stats=&a[mcMMO] Статы #PERKS -Perks.XP.Name=\u041e\u043f\u044b\u0442 -Perks.XP.Desc=\u041f\u043e\u043b\u0443\u0447\u0430\u0435\u0442\u0435 \u0431\u0443\u0441\u0442 \u043e\u043f\u044b\u0442\u0430. -Perks.Lucky.Name=\u0423\u0434\u0430\u0447\u0430 -Perks.Lucky.Desc=\u0414\u0430\u0435\u0442 \u043d\u0430 33.3% \u0431\u043e\u043b\u044c\u0448\u0435 \u0448\u0430\u043d\u0441\u043e\u0432 \u0430\u043a\u0442\u0438\u0432\u0430\u0446\u0438\u0438 \u043d\u0430\u0432\u044b\u043a\u043e\u0432 \u0438 \u0443\u043c\u0435\u043d\u0438\u0439 {0}. -Perks.Lucky.Desc.Login=\u0414\u0430\u0435\u0442 \u043d\u0430 33.3% \u0431\u043e\u043b\u044c\u0448\u0435 \u0448\u0430\u043d\u0441\u043e\u0432 \u0430\u043a\u0442\u0438\u0432\u0430\u0446\u0438\u0438 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043d\u044b\u0445 \u043d\u0430\u0432\u044b\u043a\u043e\u0432 \u0438 \u0443\u043c\u0435\u043d\u0438\u0439. -Perks.Lucky.Bonus=[[GOLD]] ({0} \u0441\u043e \u0421\u0447\u0430\u0441\u0442\u043b\u0438\u0432\u044b\u043c \u041f\u0435\u0440\u043a\u043e\u043c) -Perks.Cooldowns.Name=\u0411\u044b\u0441\u0442\u0440\u043e\u0435 \u0412\u043e\u0441\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0435 -Perks.Cooldowns.Desc=\u0423\u043c\u0435\u043d\u044c\u0448\u0430\u0435\u0442 \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u0432\u043e\u0441\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u044f \u0443\u043c\u0435\u043d\u0438\u044f \u043d\u0430 {0}. -Perks.ActivationTime.Name=\u0412\u044b\u043d\u043e\u0441\u043b\u0438\u0432\u043e\u0441\u0442\u044c -Perks.ActivationTime.Desc=\u0423\u0432\u0435\u043b\u0438\u0447\u0438\u0432\u0430\u0435\u0442 \u0432\u0440\u0435\u043c\u044f \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f \u0443\u043c\u0435\u043d\u0438\u044f \u043d\u0430 {0} \u0441\u0435\u043a\u0443\u043d\u0434. -Perks.ActivationTime.Bonus=[[GOLD]] ({0}% \u0441 \u0421\u0447\u0430\u0441\u0442\u043b\u0438\u0432\u044b\u043c \u041f\u0435\u0440\u043a\u043e\u043c) +Perks.XP.Name=Опыт +Perks.XP.Desc=Получайте больше опыта в определенном навыке. +Perks.Lucky.Name=Удача +Perks.Lucky.Desc=Дает {0} навыкам и умениям на 33,3% больше шансов активации. +Perks.Lucky.Desc.Login=Дает определенным навыкам и умениям на 33,3% больше шансов активации. +Perks.Lucky.Bonus=&6 ({0} с Удачей) +Perks.Cooldowns.Name=Быстрое восстановление +Perks.Cooldowns.Desc=Уменьшает время откатов на {0}. +Perks.ActivationTime.Name=Выносливость +Perks.ActivationTime.Desc=Увеличивает время действия умения на {0} секунд. +Perks.ActivationTime.Bonus=&6 ({0}% с Выносливостью) #HARDCORE -Hardcore.Mode.Disabled=[[GOLD]][mcMMO] \u0420\u0435\u0436\u0438\u043c \u0425\u0430\u0440\u0434\u043a\u043e\u0440 {0} \u043e\u0442\u043a\u043b\u044e\u0447\u0435\u043d. {1} -Hardcore.Mode.Enabled=[[GOLD]][mcMMO] \u0420\u0435\u0436\u0438\u043c \u0425\u0430\u0440\u0434\u043a\u043e\u0440 {0} \u0432\u043a\u043b\u044e\u0447\u0435\u043d. {1} -Hardcore.DeathStatLoss.Name=\u0412\u0437\u044b\u0441\u043a\u0430\u043d\u0438\u0435 \u0437\u043d\u0430\u043d\u0438\u0439 \u043f\u0440\u0438 \u0441\u043c\u0435\u0440\u0442\u0438. -Hardcore.DeathStatLoss.PlayerDeath=[[GOLD]][mcMMO] [[DARK_RED]]\u0412\u044b \u043f\u043e\u0442\u0435\u0440\u044f\u043b\u0438 [[BLUE]]{0}[[DARK_RED]] \u043f\u0440\u0438 \u0441\u043c\u0435\u0440\u0442\u0438. -Hardcore.DeathStatLoss.PercentageChanged=[[GOLD]][mcMMO] \u041f\u0440\u043e\u0446\u0435\u043d\u0442 \u043f\u043e\u0442\u0435\u0440\u0438 \u0437\u043d\u0430\u043d\u0438\u0439 \u0431\u044b\u043b \u0438\u0437\u043c\u0435\u043d\u0435\u043d \u043d\u0430 {0}. -Hardcore.Vampirism.Name=\u0412\u0430\u043c\u043f\u0438\u0440\u0438\u0437\u043c -Hardcore.Vampirism.Killer.Failure=[[GOLD]][mcMMO] [[YELLOW]]{0}[[GRAY]] \u0431\u044b\u043b \u0441\u043b\u0438\u0448\u043a\u043e\u043c \u043d\u0435\u043e\u043f\u044b\u0442\u0435\u043d, \u0447\u0442\u043e\u0431\u044b \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u0432\u0430\u043c \u043a\u0430\u043a\u0438\u0435-\u043b\u0438\u0431\u043e \u0437\u043d\u0430\u043d\u0438\u044f. -Hardcore.Vampirism.Killer.Success=[[GOLD]][mcMMO] [[DARK_AQUA]]\u0412\u044b \u0443\u043a\u0440\u0430\u043b\u0438 [[BLUE]]{0}[[DARK_AQUA]] \u0443\u0440\u043e\u0432\u043d\u0435\u0439 \u0443 [[YELLOW]]{1}. -Hardcore.Vampirism.Victim.Failure=[[GOLD]][mcMMO] [[YELLOW]]{0}[[GRAY]] \u0431\u044b\u043b \u043d\u0435\u0441\u043f\u043e\u0441\u043e\u0431\u0435\u043d \u0443\u043a\u0440\u0430\u0441\u0442\u044c \u0432\u0430\u0448\u0438 \u0437\u043d\u0430\u043d\u0438\u044f! -Hardcore.Vampirism.Victim.Success=[[GOLD]][mcMMO] [[YELLOW]]{0}[[DARK_RED]] \u0443\u043a\u0440\u0430\u043b \u0443 \u0432\u0430\u0441 [[BLUE]]{1}[[DARK_RED]] \u0443\u0440\u043e\u0432\u043d\u0435\u0439! -Hardcore.Vampirism.PercentageChanged=[[GOLD]][mcMMO] \u041f\u0440\u043e\u0446\u0435\u043d\u0442 \u043f\u043e\u0433\u043b\u043e\u0449\u0435\u043d\u0438\u044f \u0437\u043d\u0430\u043d\u0438\u0439 \u0431\u044b\u043b \u0438\u0437\u043c\u0435\u043d\u0435\u043d \u043d\u0430 {0}. +Hardcore.Mode.Disabled=&6[mcMMO] Режим хардкора {0} отключен для {1}. +Hardcore.Mode.Enabled=&6[mcMMO] Режим хардкора {0} включен для {1}. +Hardcore.DeathStatLoss.Name=Штраф навыков за смерть +Hardcore.DeathStatLoss.PlayerDeath=&6[mcMMO] &4Вы потеряли &9{0}&4 уровней при смерти. +Hardcore.DeathStatLoss.PercentageChanged=&6[mcMMO] Процент потери статов был изменен на {0}. +Hardcore.Vampirism.Name=Вампиризм +Hardcore.Vampirism.Killer.Failure=&6[mcMMO] &e{0}&7 был слишком неумел, чтобы предоставить вам какие-либо знания. +Hardcore.Vampirism.Killer.Success=&6[mcMMO] &3Вы украли &9{0}&3 уровней у &e{1}. +Hardcore.Vampirism.Victim.Failure=&6[mcMMO] &e{0}&7 был неспособен украсть ваши знания! +Hardcore.Vampirism.Victim.Success=&6[mcMMO] &e{0}&4 украл у вас &9{1}&4 уровней! +Hardcore.Vampirism.PercentageChanged=&6[mcMMO] Процент поглощения статов был изменен на {0}. #MOTD -MOTD.Donate=[[DARK_AQUA]]\u0418\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044f \u043e \u043f\u043e\u0436\u0435\u0440\u0442\u0432\u043e\u0432\u0430\u043d\u0438\u044f\u0445: -MOTD.Hardcore.Enabled=[[GOLD]][mcMMO] [[DARK_AQUA]]\u0420\u0435\u0436\u0438\u043c \u0425\u0430\u0440\u0434\u043a\u043e\u0440 \u0432\u043a\u043b\u044e\u0447\u0435\u043d: [[DARK_RED]]{0} -MOTD.Hardcore.DeathStatLoss.Stats=[[GOLD]][mcMMO] [[DARK_AQUA]]\u041d\u0430\u0432\u044b\u043a \u0421\u043c\u0435\u0440\u0442\u043d\u043e\u0439 \u041a\u0430\u0437\u043d\u0438: [[DARK_RED]]{0}% -MOTD.Hardcore.Vampirism.Stats=[[GOLD]][mcMMO] [[DARK_AQUA]]\u0412\u0430\u043c\u043f\u0438\u0440\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u041f\u043e\u0433\u043b\u043e\u0449\u0435\u043d\u0438\u0435 \u041e\u043f\u044b\u0442\u0430: [[DARK_RED]]{0}% -MOTD.PerksPrefix=[mcMMO Perks] -MOTD.Version=[[GOLD]][mcMMO] \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0432\u0435\u0440\u0441\u0438\u044f [[DARK_AQUA]]{0} -MOTD.Website=[[GOLD]][mcMMO] [[GREEN]]{0}[[YELLOW]] - \u0421\u0430\u0439\u0442 mcMMO +MOTD.Donate=&3Пожертвования: +MOTD.Hardcore.Enabled=&6[mcMMO] &3Режим хардкор включен: &4{0} +MOTD.Hardcore.DeathStatLoss.Stats=&6[mcMMO] &3Штраф навыков за смерть: &4{0}% +MOTD.Hardcore.Vampirism.Stats=&6[mcMMO] &3Поглощение статов от Вампиризма: &4{0}% +MOTD.PerksPrefix=&6[mcMMO особенности] +MOTD.Version=&6[mcMMO] Используется версия &3{0} +MOTD.Website=&6[mcMMO] &a{0}&e - сайт mcMMO #SMELTING -Smelting.SubSkill.UnderstandingTheArt.Name=\u041f\u043e\u043d\u0438\u043c\u0430\u043d\u0438\u0435 \u0418\u0441\u043a\u0443\u0441\u0441\u0442\u0432\u0430 -Smelting.SubSkill.UnderstandingTheArt.Description=\u0412\u043e\u0437\u043c\u043e\u0436\u043d\u043e \u0432\u044b \u0442\u0440\u0430\u0442\u0438\u0442\u0435 \u043c\u043d\u043e\u0433\u043e\u0432\u0430\u0442\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u043f\u0435\u0440\u0435\u043f\u043b\u0430\u0432\u043b\u044f\u044f \u0440\u0443\u0434\u044b \u0432 \u043f\u0435\u0449\u0435\u0440\u0430\u0445.\n\u0423\u043b\u0443\u0447\u0448\u0430\u0435\u0442 \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u0435 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u041f\u0435\u0440\u0435\u043f\u043b\u0430\u0432\u043a\u0438. -Smelting.SubSkill.UnderstandingTheArt.Stat=\u0421\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u044b\u0439 \u043c\u043d\u043e\u0436\u0438\u0442\u0435\u043b\u044c \u043e\u043f\u044b\u0442\u0430: [[YELLOW]]{0}x -Smelting.Ability.FluxMining=\u0428\u0430\u043d\u0441 \u041f\u043e\u0442\u043e\u043a\u043e\u0432\u043e\u0439 \u0414\u043e\u0431\u044b\u0447\u0438: [[YELLOW]]{0} -Smelting.SubSkill.FluxMining.Name=\u041f\u043e\u0442\u043e\u043a\u043e\u0432\u0430\u044f \u0414\u043e\u0431\u044b\u0447\u0430 -Smelting.SubSkill.FluxMining.Description=\u0428\u0430\u043d\u0441 \u0447\u0442\u043e \u0440\u0443\u0434\u0430 \u043f\u0435\u0440\u0435\u043f\u043b\u0430\u0432\u0438\u0442\u0441\u044f \u043f\u0440\u0438 \u0434\u043e\u0431\u044b\u0447\u0435 -Smelting.SubSkill.FluxMining.Stat=\u041f\u043e\u0442\u043e\u043a\u043e\u0432\u0430\u044f \u0414\u043e\u0431\u044b\u0447\u0430 \u0428\u0430\u043d\u0441 -Smelting.Ability.FuelEfficiency=\u041c\u043d\u043e\u0436\u0438\u0442\u0435\u043b\u044c \u042d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u043e\u0441\u0442\u0438 \u0422\u043e\u043f\u043b\u0438\u0432\u0430: [[YELLOW]]{0}x -Smelting.Ability.Locked.0=\u0417\u0410\u0411\u041b\u041e\u041a\u0418\u0420\u041e\u0412\u0410\u041d\u041e \u0414\u041e \u0414\u041e\u0421\u0422\u0418\u0416\u0415\u041d\u0418\u042f {0}+ \u0423\u0420\u041e\u0412\u041d\u042f \u041d\u0410\u0412\u042b\u041a\u0410 (\u0423\u0412\u0415\u041b\u0418\u0427\u0415\u041d\u0418\u0415 \u041e\u041f\u042b\u0422\u0410) -Smelting.Ability.Locked.1=\u0417\u0410\u0411\u041b\u041e\u041a\u0418\u0420\u041e\u0412\u0410\u041d\u041e \u0414\u041e \u0414\u041e\u0421\u0422\u0418\u0416\u0415\u041d\u0418\u042f {0}+ \u0423\u0420\u041e\u0412\u041d\u042f \u041d\u0410\u0412\u042b\u041a\u0410 (\u041f\u041e\u0422\u041e\u041a\u041e\u0412\u0410\u042f \u0414\u041e\u0411\u042b\u0427\u0410) -Smelting.Ability.SecondSmelt=\u0428\u0430\u043d\u0441 \u0412\u0442\u043e\u0440\u043e\u0439 \u0412\u044b\u043f\u043b\u0430\u0432\u043a\u0438: [[YELLOW]]{0} -Smelting.Ability.VanillaXPBoost=\u041c\u043d\u043e\u0436\u0438\u0442\u0435\u043b\u044c \u041e\u043f\u044b\u0442\u0430: [[YELLOW]]{0}x -Smelting.SubSkill.FuelEfficiency.Name=\u042d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u043e\u0441\u0442\u044c \u0422\u043e\u043f\u043b\u0438\u0432\u0430 -Smelting.SubSkill.FuelEfficiency.Description=\u0423\u0432\u0435\u043b\u0438\u0447\u0435\u043d\u0438\u0435 \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u0433\u043e\u0440\u0435\u043d\u0438\u044f \u0442\u043e\u043f\u043b\u0438\u0432\u0430, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u043e\u0433\u043e \u043f\u0440\u0438 \u0432\u044b\u043f\u043b\u0430\u0432\u043a\u0435 \u0432 \u043f\u0435\u0447\u043a\u0435 -Smelting.SubSkill.FuelEfficiency.Stat=\u042d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u043e\u0441\u0442\u044c \u0422\u043e\u043f\u043b\u0438\u0432\u0430 \u041c\u043d\u043e\u0436\u0438\u0442\u0435\u043b\u044c: [[YELLOW]]{0}x -Smelting.SubSkill.SecondSmelt.Name=\u0412\u0442\u043e\u0440\u0430\u044f \u0412\u044b\u043f\u043b\u0430\u0432\u043a\u0430 -Smelting.SubSkill.SecondSmelt.Description=\u0423\u0434\u0432\u043e\u0435\u043d\u0438\u0435 \u0440\u0435\u0441\u0443\u0440\u0441\u043e\u0432, \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c\u044b\u0445 \u043f\u0440\u0438 \u0432\u044b\u043f\u043b\u0430\u0432\u043a\u0435 -Smelting.SubSkill.SecondSmelt.Stat=\u0412\u0442\u043e\u0440\u0430\u044f \u0412\u044b\u043f\u043b\u0430\u0432\u043a\u0430 \u0428\u0430\u043d\u0441 -Smelting.Effect.4=\u0423\u0432\u0435\u043b\u0438\u0447\u0435\u043d\u0438\u0435 \u043e\u043f\u044b\u0442\u0430 -Smelting.Effect.5=\u0423\u0432\u0435\u043b\u0438\u0447\u0435\u043d\u0438\u0435 \u043e\u043f\u044b\u0442\u0430 \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c\u043e\u0433\u043e \u043f\u0440\u0438 \u0432\u044b\u043f\u043b\u0430\u0432\u043a\u0435 -Smelting.FluxMining.Success=[[GREEN]]\u042d\u0442\u0430 \u0440\u0443\u0434\u0430 \u043f\u0435\u0440\u0435\u043f\u043b\u0430\u0432\u0438\u043b\u0430\u0441\u044c \u0441\u0430\u043c\u0430 \u0441\u043e\u0431\u043e\u0439! -Smelting.Listener=\u0412\u044b\u043f\u043b\u0430\u0432\u043a\u0430: -Smelting.SkillName=\u0412\u042b\u041f\u041b\u0410\u0412\u041a\u0410 +Smelting.SubSkill.UnderstandingTheArt.Name=Понимание искусства +Smelting.SubSkill.UnderstandingTheArt.Description=Возможно, вы тратите слишком много времени переплавляя руды в пещерах.!nasdУлучшает различные параметры Переплавки. +Smelting.SubSkill.UnderstandingTheArt.Stat=Множитель обычного опыта: &e{0}x +Smelting.Ability.Locked.0=ЗАБЛОКИРОВАНО ДО {0}+ НАВЫКА (УВЕЛИЧЕНИЕ ОБЫЧНОГО ОПЫТА) +Smelting.Ability.Locked.1=ЗАБЛОКИРОВАНО ДО {0}+ НАВЫКА (ФЛЮСОВАЯ ДОБЫЧА) +Smelting.SubSkill.FuelEfficiency.Name=Эффективность топлива +Smelting.SubSkill.FuelEfficiency.Description=Увеличение времени горения топлива при переплаки в печи +Smelting.SubSkill.FuelEfficiency.Stat=Множитель эффективности топлива: &e{0}x +Smelting.SubSkill.SecondSmelt.Name=Вторая плавка +Smelting.SubSkill.SecondSmelt.Description=Удвоение ресурсов, получаемых при переплавке +Smelting.SubSkill.SecondSmelt.Stat=Шанс Второй плавки +Smelting.Effect.4=Увеличение обычного опыта +Smelting.Effect.5=Увеличение обычного опыта, получаемого при переплавке +Smelting.SubSkill.FluxMining.Name=Флюсовая добыча +Smelting.SubSkill.FluxMining.Description=Шанс мгновенной переплавки руд во время добычи +Smelting.SubSkill.FluxMining.Stat=Шанс Флюсовой добычи +Smelting.Listener=Переплавка: +Smelting.SkillName=ПЕРЕПЛАВКА #COMMAND DESCRIPTIONS -Commands.Description.addlevels=\u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c mcMMO \u0443\u0440\u043e\u0432\u043d\u0435\u0439 \u0434\u043b\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439 -Commands.Description.adminchat=\u0412\u043a\u043b./\u043e\u0442\u043a\u043b. \u0440\u0435\u0436\u0438\u043c \u0447\u0430\u0442\u0430 \u0442\u043e\u043b\u044c\u043a\u043e \u043c\u0435\u0436\u0434\u0443 \u0430\u0434\u043c\u0438\u043d\u0430\u043c\u0438 \u0438\u043b\u0438 \u043f\u043e\u0441\u043b\u0430\u0442\u044c \u0430\u0434\u043c\u0438\u043d\u0441\u043a\u043e\u0435 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435 -Commands.Description.addxp=\u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044e \u043e\u043f\u044b\u0442 mcMMO -Commands.Description.hardcore=\u0418\u0437\u043c\u0435\u043d\u0438\u0442\u044c \u043f\u0440\u043e\u0446\u0435\u043d\u0442 \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u0438 \u0432 mcMMO \u0438\u043b\u0438 \u0432\u043a\u043b./\u043e\u0442\u043a\u043b. \u0440\u0435\u0436\u0438\u043c \u0445\u0430\u0440\u0434\u043a\u043e\u0440 -Commands.Description.inspect=\u041f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u0434\u0435\u0442\u0430\u043b\u044c\u043d\u0443\u044e mcMMO \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e \u043e \u0434\u0440\u0443\u0433\u043e\u043c \u0438\u0433\u0440\u043e\u043a\u0435 -Commands.Description.mcability=\u0412\u043a\u043b./\u043e\u0442\u043a\u043b. \u0430\u043a\u0442\u0438\u0432\u0430\u0446\u0438\u044e \u0443\u043c\u0435\u043d\u0438\u0439 mcMMO \u043a\u043b\u0438\u043a\u043e\u043c \u041f\u041a\u041c -Commands.Description.mccooldown=\u041f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u0432\u0441\u0435 \u043a\u0443\u043b\u0434\u0430\u0443\u043d\u044b \u0443\u043c\u0435\u043d\u0438\u0439 mcMMO -Commands.Description.mcchatspy=\u041f\u0435\u0440\u0435\u043a\u043b\u044e\u0447\u0438\u0442\u044c mcMMO \u043f\u043e\u0434\u0441\u043b\u0443\u0448\u0438\u0432\u0430\u043d\u0438\u0435 \u0433\u0440\u0443\u043f\u043f\u043e\u0432\u043e\u0433\u043e \u0447\u0430\u0442\u0430 -Commands.Description.mcgod=\u0412\u043a\u043b./\u043e\u0442\u043a\u043b. \u0440\u0435\u0436\u0438\u043c-\u0431\u043e\u0433\u0430 mcMMO -Commands.Description.mchud=\u0418\u0437\u043c\u0435\u043d\u0438\u0442\u044c \u0441\u0442\u0438\u043b\u044c \u041f\u0430\u043d\u0435\u043b\u0438 \u0412\u0430\u0436\u043d\u043e\u0439 \u0418\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0438 mcMMO! -Commands.Description.mcmmo=\u041f\u043e\u043a\u0430\u0437\u0430\u0442\u044c \u043a\u0440\u0430\u0442\u043a\u043e\u0435 \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0435 mcMMO -Commands.Description.mcnotify=\u0412\u043a\u043b./\u043e\u0442\u043a\u043b. \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435 \u0432 \u0447\u0430\u0442\u0435 \u0443\u0432\u0435\u0434\u043e\u043c\u043b\u0435\u043d\u0438\u0439 \u043e\u0431 \u0443\u043c\u0435\u043d\u0438\u044f\u0445 mcMMO -Commands.Description.mcpurge=\u0423\u0434\u0430\u043b\u0438\u0442\u044c \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439 \u0431\u0435\u0437 \u0443\u0440\u043e\u0432\u043d\u0435\u0439 mcMMO \u0438 \u0442\u0435\u0445, \u043a\u0442\u043e \u043d\u0435 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0430\u043b\u0438\u0441\u044c \u0431\u043e\u043b\u044c\u0448\u0435 {0} \u043c\u0435\u0441\u044f\u0446\u0435\u0432 \u0438\u0437 \u0431\u0430\u0437\u044b \u0434\u0430\u043d\u043d\u044b\u0445 mcMMO. -Commands.Description.mcrank=\u041f\u043e\u043a\u0430\u0437\u0430\u0442\u044c mcMMO \u0440\u0435\u0439\u0442\u0438\u043d\u0433 \u0438\u0433\u0440\u043e\u043a\u0430 -Commands.Description.mcrefresh=\u041e\u0431\u043d\u043e\u0432\u0438\u0442\u044c \u0432\u0441\u0435 \u043a\u0443\u043b\u0434\u0430\u0443\u043d\u044b \u0434\u043b\u044f mcMMO -Commands.Description.mcremove=\u0423\u0434\u0430\u043b\u0438\u0442\u044c \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u0438\u0437 \u0431\u0430\u0437\u044b \u0434\u0430\u043d\u043d\u044b\u0445 mcMMO -Commands.Description.mcscoreboard=\u0423\u043f\u0440\u0430\u0432\u043b\u044f\u0439\u0442\u0435 \u0432\u0430\u0448\u0435\u0439 \u0442\u0430\u0431\u043b\u0438\u0446\u0435\u0439 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u043e\u0432 mcMMO -Commands.Description.mcstats=\u041f\u043e\u043a\u0430\u0437\u0430\u0442\u044c \u0432\u0430\u0448\u0438 mcMMO \u0443\u0440\u043e\u0432\u043d\u0438 \u0438 \u043e\u043f\u044b\u0442 -Commands.Description.mctop=\u041f\u043e\u043a\u0430\u0437\u0430\u0442\u044c \u0441\u043f\u0438\u0441\u043e\u043a \u043b\u0438\u0434\u0435\u0440\u043e\u0432 mcMMO -Commands.Description.mmoedit=\u0418\u0437\u043c\u0435\u043d\u0438\u0442\u044c mcMMO \u0443\u0440\u043e\u0432\u043d\u044f \u0434\u043b\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439 -Commands.Description.mmoupdate=\u041c\u0438\u0433\u0440\u0430\u0446\u0438\u044f \u0431\u0430\u0437\u044b \u0434\u0430\u043d\u043d\u044b\u0445 mcMMO \u0438\u0437 \u0441\u0442\u0430\u0440\u043e\u0439 \u0432 \u0442\u0435\u043a\u0443\u0449\u0443\u044e -Commands.Description.mcconvert=\u041a\u043e\u043d\u0432\u0435\u0440\u0442\u0438\u0440\u0443\u0435\u0442 \u0442\u0438\u043f \u0431\u0430\u0437\u044b \u0434\u0430\u043d\u043d\u044b\u0445 \u0438\u043b\u0438 \u0442\u0438\u043f \u0444\u043e\u0440\u043c\u0443\u043b\u044b \u043e\u043f\u044b\u0442\u0430 -Commands.Description.mmoshowdb=\u041f\u043e\u043a\u0430\u0437\u0430\u0442\u044c \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 \u0442\u0435\u043a\u0443\u0449\u0435\u0433\u043e \u0442\u0438\u043f\u0430 \u0431\u0430\u0437\u044b \u0434\u0430\u043d\u043d\u044b\u0445 (\u0434\u043b\u044f \u0434\u0430\u043b\u044c\u043d\u0435\u0439\u0448\u0435\u0433\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e /mmoupdate) -Commands.Description.party=\u0423\u043f\u0440\u0430\u0432\u043b\u044f\u0442\u044c \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u043c\u0438 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430\u043c\u0438 \u043f\u0430\u0442\u0438 mcMMO -Commands.Description.partychat=\u0412\u043a\u043b./\u043e\u0442\u043a\u043b. \u0433\u0440\u0443\u043f\u043f\u043e\u0432\u043e\u0439 \u0447\u0430\u0442 \u0438\u043b\u0438 \u043e\u0442\u043e\u0441\u043b\u0430\u0442\u044c \u0433\u0440\u0443\u043f\u043f\u043e\u0432\u043e\u0435 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435. -Commands.Description.ptp=\u0422\u0435\u043b\u0435\u043f\u043e\u0440\u0442 \u043a mcMMO \u0447\u043b\u0435\u043d\u0430\u043c \u0433\u0440\u0443\u043f\u043f\u044b -Commands.Description.Skill=\u041f\u043e\u043a\u0430\u0437\u0430\u0442\u044c \u0434\u0435\u0442\u0430\u043b\u044c\u043d\u0443\u044e \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e \u043e \u043d\u0430\u0432\u044b\u043a\u0430\u0445 mcMMO \u0434\u043b\u044f {0} -Commands.Description.skillreset=\u0421\u0431\u0440\u043e\u0441\u0438\u0442\u044c \u0443\u0440\u043e\u0432\u043d\u0438 mcMMO \u0434\u043b\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f -Commands.Description.vampirism=\u0418\u0437\u043c\u0435\u043d\u0438\u0442\u044c \u043f\u0440\u043e\u0446\u0435\u043d\u0442 \u0432\u0430\u043c\u043f\u0438\u0440\u0438\u0437\u043c\u0430 \u0432 mcMMO \u0438\u043b\u0438 \u0432\u043a\u043b./\u043e\u0442\u043a\u043b. \u0440\u0435\u0436\u0438\u043c \u0432\u0430\u043c\u043f\u0438\u0440\u0438\u0437\u043c\u0430 -Commands.Description.xplock=\u0417\u0430\u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u041f\u0430\u043d\u0435\u043b\u044c \u041e\u043f\u044b\u0442\u0430 mcMMO \u0434\u043b\u044f \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043d\u043e\u0433\u043e \u043d\u0430\u0432\u044b\u043a\u0430. -Commands.Description.xprate=\u0418\u0437\u043c\u0435\u043d\u0438\u0442\u044c \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u044c \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u043e\u043f\u044b\u0442\u0430 mcMMO +Commands.Description.addlevels=Добавить пользователю уровней mcMMO +Commands.Description.adminchat=Переключить админ-чат mcMMO или отослать туда сообщение +Commands.Description.addxp=Добавить пользователю опыт mcMMO +Commands.Description.hardcore=Изменить штраф хардкора mcMMO или переключить режим хардкор +Commands.Description.inspect=Посмотреть детальную mcMMO информацию о другом игроке +Commands.Description.mcability=Переключить активацию умений mcMMO кликом ПКМ +Commands.Description.mccooldown=Посмотреть все откаты умений mcMMO +Commands.Description.mcchatspy=Переключить слежку за чатами групп mcMMO +Commands.Description.mcgod=Переключить режим бога mcMMO +Commands.Description.mchud=Изменить стиль HUD mcMMO +Commands.Description.mcmmo=Показать краткое описание mcMMO +Commands.Description.mcnotify=Переключить отображение в чате уведомлений об умениях mcMMO +Commands.Description.mcpurge=Удалить пользователей без уровней mcMMO и тех, кто не подключался больше {0} месяцев из базы данных mcMMO. +Commands.Description.mcrank=Показать mcMMO рейтинг игрока +Commands.Description.mcrefresh=Сбросить все откаты для mcMMO +Commands.Description.mcremove=Удалить пользователя из базы данных mcMMO +Commands.Description.mcscoreboard=Управлять своей таблицей mcMMO +Commands.Description.mcstats=Показать ваши уровни и опыт mcMMO +Commands.Description.mctop=Показать таблицу лидеров mcMMO +Commands.Description.mmoedit=Изменить уровень mcMMO для пользователей +Commands.Description.mmodebug=Переключить режим отладки, который выводит полезную информацию при ударах по блокам +Commands.Description.mmoupdate=Миграция базы данных mcMMO из старой в текущую +Commands.Description.mcconvert=Конвертирует тип базы данных или тип формулы опыта +Commands.Description.mmoshowdb=Показать название текущего типа базы данных (для дальнейшего использования с /mmoupdate) +Commands.Description.party=Управлять различными настройками группы mcMMO +Commands.Description.partychat=Переключить чат группы mcMMO или отослать туда сообщение +Commands.Description.ptp=Телепортация к членам группы mcMMO +Commands.Description.Skill=Показать детальную информацию о навыках mcMMO для {0} +Commands.Description.skillreset=Сбросить уровни mcMMO для пользователя +Commands.Description.vampirism=Изменить процент Вампиризма в mcMMO или переключить режим Вампиризма +Commands.Description.xplock=Зафиксировать шкалу опыта mcMMO на определенном навыке +Commands.Description.xprate=Изменить множитель опыта mcMMO или начать событие множителя опыта mcMMO #UPDATE CHECKER -UpdateChecker.Outdated=\u0412\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0435 \u0443\u0441\u0442\u0430\u0440\u0435\u0432\u0448\u0443\u044e \u0432\u0435\u0440\u0441\u0438\u044e mcMMO! -UpdateChecker.NewAvailable=\u0415\u0441\u0442\u044c \u043d\u043e\u0432\u0430\u044f \u0432\u0435\u0440\u0441\u0438\u044f, \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u0430\u044f \u043d\u0430 Spigot. +UpdateChecker.Outdated=Вы используете устаревшую версию mcMMO! +UpdateChecker.NewAvailable=Есть новая версия, доступная на Spigot. #SCOREBOARD HEADERS -Scoreboard.Header.PlayerStats=[[YELLOW]]\u0421\u0442\u0430\u0442\u0438\u0441\u0442\u0438\u043a\u0430 mcMMO -Scoreboard.Header.PlayerCooldowns=[[YELLOW]]\u041a\u0443\u043b\u0434\u0430\u0443\u043d\u044b mcMMO -Scoreboard.Header.PlayerRank=[[YELLOW]]\u0420\u0430\u043d\u0436\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 mcMMO -Scoreboard.Header.PlayerInspect=[[YELLOW]]\u0421\u0442\u0430\u0442\u0438\u0441\u0442\u0438\u043a\u0430 mcMMO: -Scoreboard.Header.PowerLevel=[[RED]]\u0423\u0440\u043e\u0432\u0435\u043d\u044c \u0421\u0438\u043b\u044b -Scoreboard.Misc.PowerLevel=[[GOLD]]\u0423\u0440\u043e\u0432\u0435\u043d\u044c \u0421\u0438\u043b\u044b -Scoreboard.Misc.Level=[[DARK_AQUA]]\u0423\u0440\u043e\u0432\u0435\u043d\u044c -Scoreboard.Misc.CurrentXP=[[GREEN]]\u0422\u0435\u043a\u0443\u0449\u0438\u0439 \u043e\u043f\u044b\u0442 -Scoreboard.Misc.RemainingXP=[[YELLOW]]\u041e\u0441\u0442\u0430\u043b\u044c\u043d\u043e\u0439 \u043e\u043f\u044b\u0442 -Scoreboard.Misc.Cooldown=[[LIGHT_PURPLE]]\u041a\u0443\u043b\u0434\u0430\u0443\u043d -Scoreboard.Misc.Overall=[[GOLD]]\u041e\u0431\u0449\u0438\u0439 -Recovery.Notice=\u0423\u0432\u0435\u0434\u043e\u043c\u043b\u0435\u043d\u0438\u0435: mcMMO [[DARK_RED]]\u043d\u0435 \u0443\u0434\u0430\u043b\u043e\u0441\u044c \u0437\u0430\u0433\u0440\u0443\u0437\u0438\u0442\u044c \u0434\u0430\u043d\u043d\u044b\u0435.[[RED]] \u041f\u043e\u0432\u0442\u043e\u0440 5 \u0440\u0430\u0437... -Recovery.Success=[[GREEN]]\u0423\u0441\u043f\u0435\u0445! \u0414\u0430\u043d\u043d\u044b\u0435 mcMMO \u0437\u0430\u0433\u0440\u0443\u0436\u0435\u043d\u044b. -Recovery.Failure=mcMMO \u0432\u0441\u0435 \u0435\u0449\u0435 \u043d\u0435 \u0443\u0434\u0430\u0435\u0442\u0441\u044f \u0437\u0430\u0433\u0440\u0443\u0437\u0438\u0442\u044c \u0434\u0430\u043d\u043d\u044b\u0435. \u0412\u044b \u043c\u043e\u0436\u0435\u0442\u0435 [[AQUA]]\u043e\u0431\u0440\u0430\u0442\u0438\u0442\u044c\u0441\u044f \u043a \u0432\u043b\u0430\u0434\u0435\u043b\u044c\u0446\u0443 \u0441\u0435\u0440\u0432\u0435\u0440\u0430.\n[[YELLOW]]\u0412\u044b \u043c\u043e\u0436\u0435\u0442\u0435 \u0434\u0430\u043b\u044c\u0448\u0435 \u0438\u0433\u0440\u0430\u0442\u044c \u043d\u0430 \u0441\u0435\u0440\u0432\u0435\u0440\u0435, \u043d\u043e \u0432\u044b[[BOLD]]\u043d\u0435 \u0431\u0443\u0434\u0435\u0442\u0435 \u043f\u043e\u043b\u0443\u0447\u0430\u0442\u044c \u0443\u0440\u043e\u0432\u043d\u0438 mcMMO[[YELLOW]] \u0438 \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c\u044b\u0439 \u0432\u0430\u043c\u0438 \u043e\u043f\u044b\u0442 [[BOLD]]\u043d\u0435 \u0431\u0443\u0434\u0435\u0442 \u0441\u043e\u0445\u0440\u0430\u043d\u0435\u043d[[YELLOW]]. -Recovery.AdminFailureNotice=[[DARK_RED]][A][[RED]] mcMMO \u043d\u0435 \u0443\u0434\u0430\u043b\u043e\u0441\u044c \u0437\u0430\u0433\u0440\u0443\u0437\u0438\u0442\u044c \u0434\u0430\u043d\u043d\u044b\u0435 \u0438\u0433\u0440\u043e\u043a\u0430 \u043e [[YELLOW]]{0}[[RED]]. [[LIGHT_PURPLE]]\u041f\u043e\u0436\u0430\u043b\u0443\u0439\u0441\u0442\u0430 \u043f\u0440\u043e\u0432\u0435\u0440\u0442\u0435 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 \u0431\u0430\u0437\u044b \u0434\u0430\u043d\u043d\u044b\u0445. +Scoreboard.Header.PlayerStats=&eСтаты mcMMO +Scoreboard.Header.PlayerCooldowns=&eОткаты mcMMO +Scoreboard.Header.PlayerRank=&eРейтинг mcMMO +Scoreboard.Header.PlayerInspect=&eСтаты mcMMO: {0} +Scoreboard.Header.PowerLevel=&cУровень силы +Scoreboard.Misc.PowerLevel=&6Уровень силы +Scoreboard.Misc.Level=&3Уровень +Scoreboard.Misc.CurrentXP=&aТекущий опыт +Scoreboard.Misc.RemainingXP=&eОсталось опыта +Scoreboard.Misc.Cooldown=&dОткат +Scoreboard.Misc.Overall=&6Всего +Scoreboard.Misc.Ability=Умение #DATABASE RECOVERY -Profile.PendingLoad=[[RED]]\u0412\u0430\u0448\u0438 \u0434\u0430\u043d\u043d\u044b\u0435 \u043e \u0438\u0433\u0440\u043e\u043a\u0430\u0445 mcMMO \u043d\u0435 \u0431\u044b\u043b\u0438 \u0437\u0430\u0433\u0440\u0443\u0436\u0435\u043d\u044b. -Profile.Loading.Success=[[GREEN]]\u0412\u0430\u0448 \u043f\u0440\u043e\u0444\u0438\u043b\u044c mcMMO \u043d\u0435 \u0431\u044b\u043b \u0437\u0430\u0433\u0440\u0443\u0436\u0435\u043d. -Profile.Loading.FailurePlayer=[[RED]]mcMMO \u043d\u0435 \u043c\u043e\u0436\u0435\u0442 \u0437\u0430\u0433\u0440\u0443\u0437\u0438\u0442\u044c \u0432\u0430\u0448\u0438 \u0434\u0430\u043d\u043d\u044b\u0435, \u043c\u044b \u043f\u0440\u043e\u0431\u043e\u0432\u0430\u043b\u0438 \u0437\u0430\u0433\u0440\u0443\u0437\u0438\u0442\u044c \u0438\u0445 [[GREEN]]{0}[[RED]] \u0440\u0430\u0437.[[RED]] \u0412\u043e\u0437\u043c\u043e\u0436\u043d\u043e \u0432\u0430\u043c \u0441\u0442\u043e\u0438\u0442 \u0441\u043e\u043e\u0431\u0449\u0438\u0442\u044c \u043e \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0435 \u0430\u0434\u043c\u0438\u043d\u0438\u0441\u0442\u0440\u0430\u0442\u043e\u0440\u0430\u043c \u0441\u0435\u0440\u0432\u0435\u0440\u0430. mcMMO \u0431\u0443\u0434\u0435\u0442 \u043f\u044b\u0442\u0430\u0442\u044c\u0441\u044f \u0437\u0430\u0433\u0440\u0443\u0437\u0438\u0442\u044c \u0432\u0430\u0448\u0438 \u0434\u0430\u043d\u043d\u044b\u0435 \u0434\u043e \u0442\u0435\u0445 \u043f\u043e\u0440 \u043f\u043e\u043a\u0430 \u0432\u044b \u043d\u0435 \u043f\u043e\u043a\u0438\u043d\u0438\u0442\u0435 \u0438\u0433\u0440\u0443, \u0432\u044b \u043d\u0435 \u0431\u0443\u0434\u0435\u0442\u0435 \u043f\u043e\u043b\u0443\u0447\u0430\u0442\u044c \u043e\u043f\u044b\u0442 \u0438 \u0443 \u0432\u0430\u0441 \u043d\u0435 \u0431\u0443\u0434\u0435\u0442 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0441\u043f\u043e\u0441\u043e\u0431\u043d\u043e\u0441\u0442\u0438, \u043f\u043e\u043a\u0430 \u0434\u0430\u043d\u043d\u044b\u0435 \u043d\u0435 \u0431\u0443\u0434\u0443\u0442 \u0437\u0430\u0433\u0440\u0443\u0436\u0435\u043d\u044b. -Profile.Loading.FailureNotice=[[DARK_RED]][A][[RED]] mcMMO \u043d\u0435 \u0441\u043c\u043e\u0433\u043b\u0430 \u0437\u0430\u0433\u0440\u0443\u0437\u0438\u0442\u044c \u0434\u0430\u043d\u043d\u044b\u0435 \u0438\u0433\u0440\u043e\u043a\u0430 [[YELLOW]]{0}[[RED]]. [[LIGHT_PURPLE]]\u041f\u043e\u0436\u0430\u043b\u0443\u0439\u0441\u0442\u0430 \u043f\u0440\u043e\u0432\u0435\u0440\u044c\u0442\u0435 \u0432\u0430\u0448\u0438 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u0431\u0430\u0437\u044b \u0434\u0430\u043d\u043d\u044b\u0445. \u0423\u0436\u0435 \u043f\u0440\u0435\u0434\u043f\u0440\u0438\u043d\u044f\u0442\u043e \u043f\u043e\u043f\u044b\u0442\u043e\u043a \u0437\u0430\u0433\u0440\u0443\u0437\u0438\u0442\u044c \u0434\u0430\u043d\u043d\u044b\u0435 {1}. +Profile.PendingLoad=&cВаш профиль mcMMO ещё не был загружен. +Profile.Loading.Success=&aВаш профиль mcMMO загрузился. +Profile.Loading.FailurePlayer=&cmcMMO не может загрузить ваши данные - мы пробовали загрузить их уже &a{0}&c раз. Вам стоит сообщить о проблеме администрации сервера. mcMMO будет пытаться загрузить ваши данные пока вы не покинете игру. Пока данные не будут загружены, вы не будете получать опыт и у вас не будет возможности использовать навыки. +Profile.Loading.FailureNotice=&4[А]&c mcMMO не смогл загрузить данные игрока &e{0}&c. &dПожалуйста, проверьте ваши параметры базы данных. Попыток загрузки данных {1}. #Holiday -Holiday.AprilFools.Levelup=[[GOLD]]{0} \u0442\u0435\u043f\u0435\u0440\u044c \u0443\u0440\u043e\u0432\u043d\u044f [[GREEN]]{1}[[GOLD]]! -Holiday.Anniversary=[[BLUE]]\u0421 {0} \u0413\u043e\u0434\u043e\u0432\u0449\u0438\u043d\u043e\u0439!\n[[BLUE]]\u0412 \u0447\u0435\u0441\u0442\u044c \u0432\u0441\u0435\u0439 \u043f\u0440\u043e\u0434\u0435\u043b\u0430\u043d\u043d\u043e\u0439 nossr50 \u0440\u0430\u0431\u043e\u0442\u044b, \u0430 \u0442\u0430\u043a\u0436\u0435 \u0434\u0440\u0443\u0433\u0438\u0445 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u043e\u0432 \u0444\u0435\u0439\u0440\u0432\u0435\u0440\u043a\u0438! +Holiday.AprilFools.Levelup=&6{0} теперь уровня &a{1}&6! +Holiday.Anniversary=&9С {0} Годовщиной!!nasd&9В честь всей проделанной nossr50 работы, а также других разработчиков, да будут фейерверки! +#Reminder Messages +Reminder.Squelched=&7Напоминание: В настоящее время вы не получаете уведомления от mcMMO; чтобы включить уведомления, пожалуйста, введите команду /mc!nasdotify снова. Это автоматическое почасовое напоминание. #Locale -Locale.Reloaded=[[GREEN]]\u041b\u043e\u043a\u0430\u043b\u044c \u043f\u0435\u0440\u0435\u0437\u0430\u0433\u0440\u0443\u0436\u0435\u043d\u0430! +Locale.Reloaded=&aЛокализация перезагружена! #Player Leveling Stuff -LevelCap.PowerLevel=[[GOLD]]([[GREEN]]mcMMO[[GOLD]]) [[YELLOW]]\u0412\u044b \u0434\u043e\u0441\u0442\u0438\u0433\u043b\u0438 \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u0443\u0440\u043e\u0432\u043d\u044f [[RED]]{0}[[YELLOW]]. \u0412\u0430\u0448\u0438 \u0441\u043f\u043e\u0441\u043e\u0431\u043d\u043e\u0441\u0442\u0438 \u0431\u043e\u043b\u044c\u0448\u0435 \u043d\u0435 \u0431\u0443\u0434\u0443\u0442 \u0443\u043b\u0443\u0447\u0448\u0430\u0442\u044c\u0441\u044f. -LevelCap.Skill=[[GOLD]]([[GREEN]]mcMMO[[GOLD]]) [[YELLOW]]\u0412\u044b \u0434\u043e\u0441\u0442\u0438\u0433\u043b\u0438 \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u0443\u0440\u043e\u0432\u043d\u044f [[RED]]{0}[[YELLOW]] \u0434\u043b\u044f [[GOLD]]{1}[[YELLOW]]. \u0412\u0430\u0448\u0438 \u0441\u043f\u043e\u0441\u043e\u0431\u043d\u043e\u0441\u0442\u0438 \u0431\u043e\u043b\u044c\u0448\u0435 \u043d\u0435 \u0431\u0443\u0434\u0443\u0442 \u0443\u043b\u0443\u0447\u0448\u0430\u0442\u044c\u0441\u044f. +LevelCap.PowerLevel=&6(&amcMMO&6) &eВы достигли максимального уровня &c{0}&e. Ваши навыки больше не будут улучшаться. +LevelCap.Skill=&6(&amcMMO&6) &eВы достигли максимального уровня &c{0}&e для &6{1}&e. Ваши навыки больше не будут улучшаться. +Commands.XPBar.Usage=Правильное использование - /mmoxpbar <навык | reset> +Commands.Description.mmoxpbar=Настройки игрока для шкалы опыта mcMMO +Commands.Description.mmocompat=Информация о mcMMO и о том, работает ли режим совместимости или нет. +Compatibility.Layer.Unsupported=&6Совместимость для &{0}&6 не поддерживается этой версией Minecraft. +Compatibility.Layer.PartialSupport=&6Совместимость для &{0}&6 не полностью поддерживается этой версией Minecraft, но mcMMO использует вторичную систему для эмулирования некоторых недостающих функций. +Commands.XPBar.DisableAll=&6 Все шкалы опыта mcMMO отключены, используйте /mmoxpbar для сброса настроек. +#Modern Chat Settings +Chat.Style.Admin=&b(А) &r{0} &b→ &r{1} +Chat.Style.Party=&a(Г) &r{0} &a→ &r{1} +Chat.Style.Party.Leader=&a(Г) &r{0} &6→ &r{1} +Chat.Identity.Console=&6* Консоль * +Chat.Channel.On=&6(&amcMMO-чат&6) &eВаши сообщения будут автоматически доставлены в канал чата &a{0}. +Chat.Channel.Off=&6(&amcMMO-чат&6) &eВаши сообщения больше не будут автоматически доставлены в канал чата. +Chat.Spy.Party=&6[&eШПИК&6-&a{2}&6] &r{0} &b→ &r{1} +Broadcasts.LevelUpMilestone=&6(&amcMMO&6) {0}&7 достиг уровня &a{1}&7 в &e{2}&7! +Broadcasts.PowerLevelUpMilestone=&6(&amcMMO&6) {0}&7 достиг уровня силы &a{1}&7! +Scoreboard.Recovery=Попытка восстановить работу таблицы mcMMO... diff --git a/src/main/resources/locale/locale_sv.properties b/src/main/resources/locale/locale_sv.properties index 8e4ed3028..6c4ae3717 100644 --- a/src/main/resources/locale/locale_sv.properties +++ b/src/main/resources/locale/locale_sv.properties @@ -1,51 +1,51 @@ -Acrobatics.Combat.Proc=[[GREEN]]**Duckade** +Acrobatics.Combat.Proc=&a**Duckade** Acrobatics.Listener=Akrobatik: Acrobatics.SkillName=AKROBATIK -Acrobatics.Skillup=Akrobatikf\u00e4rdigheten \u00f6kade med {0}. Totalt ({1}) -Archery.SubSkill.SkillShot.Name=D\u00f6dsskott -Archery.SubSkill.SkillShot.Description=\u00d6kad skada med b\u00e5gar -Archery.SubSkill.Daze.Name=F\u00f6rvirra (Players) -Archery.SubSkill.ArrowRetrieval.Description=Chans f\u00f6r att \u00e5terta pilar fr\u00e5n kroppar -Archery.Listener=B\u00e5gskytte: -Archery.Skillup=Pilskyttef\u00e4rdigheten \u00f6kade med {0}. Totalt ({1}) -Axes.Ability.Bonus.0=Yxm\u00e4stare -Axes.Ability.Lower=[[GRAY]]**DU S\u00c4NKER FIN YXA** -Axes.Combat.CritStruck=[[DARK_RED]]Du var KRITISKT skadad -Axes.Combat.GI.Struck=**SLAGEN AV ST\u00d6RRE EFFEKT** -Axes.Combat.SS.Length=Skallsplittrare l\u00e4ngd [[YELLOW]]{0}s +Acrobatics.Skillup=Akrobatikfärdigheten ökade med {0}. Totalt ({1}) +Archery.SubSkill.SkillShot.Name=Dödsskott +Archery.SubSkill.SkillShot.Description=Ökad skada med bågar +Archery.SubSkill.Daze.Name=Förvirra (Players) +Archery.SubSkill.ArrowRetrieval.Description=Chans för att återta pilar från kroppar +Archery.Listener=Bågskytte: +Archery.Skillup=Pilskyttefärdigheten ökade med {0}. Totalt ({1}) +Axes.Ability.Bonus.0=Yxmästare +Axes.Ability.Lower=&7**DU SÄNKER FIN YXA** +Axes.Combat.CritStruck=&4Du var KRITISKT skadad +Axes.Combat.GI.Struck=**SLAGEN AV STÖRRE EFFEKT** +Axes.Combat.SS.Length=Skallsplittrare längd &e{0}s Axes.SubSkill.CriticalStrikes.Description=Dubbel Skada -Axes.SubSkill.AxeMastery.Description=L\u00e4gger till bonus skada +Axes.SubSkill.AxeMastery.Description=Lägger till bonus skada Axes.SkillName=YXOR -Axes.Skills.SS.On=[[GREEN]]**Skallsplittrare AKTIVERAD** -Axes.Skills.SS.Refresh=[[GREEN]]Your [[YELLOW]Skallsplittrar [[GREEN]]f\u00f6rm\u00e5gan \u00e4r vederkvickad! -Axes.Skills.SS.Other.On=[[GREEN]]{0}[[DARK_GREEN]] har anv\u00e4nt [[RED]]Skallsplittrare! -Axes.Skillup=Yxf\u00e4rdigheten har \u00f6kat med {0}. Totalt ({1}) -Excavation.Ability.Ready=[[GREEN]]**DU H\u00d6JER DIN SPADE** -Excavation.Listener=Gr\u00e4vning: -Excavation.SkillName=Gr\u00e4vning -Excavation.Skills.GigaDrillBreaker.On=[[GREEN]]**GIGA BORR KROSSAREN AKTIVERAD** -Excavation.Skillup=Gr\u00e4vningsf\u00e4rdigheten har \u00f6kat med {0}. Totalt ({1}) -Fishing.Ability.TH.MagicFound=[[GRAY]] Du f\u00e5r en k\u00e4nsla av magi med denna f\u00e5ngst.... -Herbalism.Ability.GTh=[[GREEN]]**GR\u00d6NA FINGRAR** -Herbalism.Ability.Ready=[[GREEN]]**DU H\u00d6JER DIN SKYFFEL** -Herbalism.Listener=V\u00e4xtk\u00e4nnedom: -Herbalism.Skills.GTe.Refresh=[[GREEN]]Dina[[YELLOW]]Gr\u00f6na fingrar [[GREEN]]f\u00f6rm\u00e5ga \u00e4r vederkvickad! -Herbalism.Skills.GTe.Other.Off=[[RED]Gr\u00f6na fingrar[GREEN]] har avklingat f\u00f6r [[YELLOW]]{0} -Herbalism.Skills.GTe.Other.On=[[GREEN]]{0}[[DARK_GREEN]] har anv\u00e4nt [[RED]]Gr\u00f6n Jord! -Mining.Ability.Length=Superbrytarl\u00e4ngd: [[YELLOW]]{0}s -Mining.Ability.Lower=[[GRAY]]**DU S\u00c4NKER DIN HACKA** -Mining.Ability.Ready=[[GREEN]]**DU F\u00d6RBEREDER DIN HACKA** +Axes.Skills.SS.On=&a**Skallsplittrare AKTIVERAD** +Axes.Skills.SS.Refresh=&aYour &eSkallsplittrar &aförmågan är vederkvickad! +Axes.Skills.SS.Other.On=&a{0}&2 har använt &cSkallsplittrare! +Axes.Skillup=Yxfärdigheten har ökat med {0}. Totalt ({1}) +Excavation.Ability.Ready=&a**DU HÖJER DIN SPADE** +Excavation.Listener=Grävning: +Excavation.SkillName=Grävning +Excavation.Skills.GigaDrillBreaker.On=&a**GIGA BORR KROSSAREN AKTIVERAD** +Excavation.Skillup=Grävningsfärdigheten har ökat med {0}. Totalt ({1}) +Fishing.Ability.TH.MagicFound=&7 Du får en känsla av magi med denna fångst.... +Herbalism.Ability.GTh=&a**GRÖNA FINGRAR** +Herbalism.Ability.Ready=&a**DU HÖJER DIN SKYFFEL** +Herbalism.Listener=Växtkännedom: +Herbalism.Skills.GTe.Refresh=&aDina&eGröna fingrar &aförmåga är vederkvickad! +Herbalism.Skills.GTe.Other.Off=&cGröna fingrar&a har avklingat för &e{0} +Herbalism.Skills.GTe.Other.On=&a{0}&2 har använt &cGrön Jord! +Mining.Ability.Length=Superbrytarlängd: &e{0}s +Mining.Ability.Lower=&7**DU SÄNKER DIN HACKA** +Mining.Ability.Ready=&a**DU FÖRBEREDER DIN HACKA** Mining.Listener=Gruvdrift: -Mining.Skills.SuperBreaker.Other.Off=Supebrytning[[GREEN]] har avklingat f\u00f6r [[YELLOW]]{0} -Mining.Skills.SuperBreaker.Refresh=[[GREEN]]Din [[YELLOW]]Superbrytar [[GREEN]]f\u00f6rm\u00e5ga har uppdaterats! -Mining.Skillup=Hackf\u00e4rdigheten \u00f6kade med {0}. Totalt ({1}) -Mining.Blast.Radius.Increase=\u00d6KNING AV SPR\u00c4NGNINGSRADIEN: [[YELLOW]]+{0} -Mining.Blast.Rank=Explosions Gruvdrift: [[YELLOW]] Grad {0}/8 [[GRAY]]({1}) -Mining.Blast.Other.On=[[GREEN]]{0}[[DARK_GREEN]] har anv\u00e4nt [[RED]]Explosions Gruvdrift -Mining.Blast.Refresh=[[GREEN]]Din [[YELLOW]]Explosionshacknings [[GREEN]]f\u00f6rm\u00e5ga har vederkvickas! +Mining.Skills.SuperBreaker.Other.Off=Supebrytning&a har avklingat för &e{0} +Mining.Skills.SuperBreaker.Refresh=&aDin &eSuperbrytar &aförmåga har uppdaterats! +Mining.Skillup=Hackfärdigheten ökade med {0}. Totalt ({1}) +Mining.Blast.Radius.Increase=ÖKNING AV SPRÄNGNINGSRADIEN: &e+{0} +Mining.Blast.Rank=Explosions Gruvdrift: &e Grad {0}/8 &7({1}) +Mining.Blast.Other.On=&a{0}&2 har använt &cExplosions Gruvdrift +Mining.Blast.Refresh=&aDin &eExplosionshacknings &aförmåga har vederkvickas! Repair.SubSkill.Repair.Name=Reparera -Repair.SubSkill.RepairMastery.Name=Reparationsm\u00e4stare -Repair.SubSkill.RepairMastery.Description=\u00d6kad reparationsm\u00e4ngd +Repair.SubSkill.RepairMastery.Name=Reparationsmästare +Repair.SubSkill.RepairMastery.Description=Ökad reparationsmängd Repair.SubSkill.SuperRepair.Name=Super reparation Repair.SubSkill.SuperRepair.Description=Dubbel effektivitet Repair.SubSkill.DiamondRepair.Name=Diamant Reparation ({0}+ SKILL) @@ -54,98 +54,101 @@ Repair.SubSkill.ArcaneForging.Name=Magisk smide Repair.SubSkill.ArcaneForging.Description=Reparera magiska objekt Repair.Listener=Reparera Repair.SkillName=Reparera -Repair.Skills.AdeptDiamond=[[DARK_RED]]Du \u00e4r inte skicklig nog f\u00f6r att reparera Diamant. -Repair.Skills.AdeptGold=[[DARK_RED]]Du \u00e4r inte skicklig nog f\u00f6r att reparera Guld. -Repair.Skills.AdeptStone=[[DARK_RED]]Du \u00e4r inte skicklig nog f\u00f6r att reparera Sten. -Repair.Skillup=Smidesf\u00e4rdigheten \u00f6kade med {0}. Totalt ({1}) -Repair.Arcane.Chance.Downgrade=[[GRAY]]AF Chans f\u00f6r nedgradering: [[YELLOW]]{0}% -Repair.Arcane.Chance.Success=[[GRAY]]AF Framg\u00e5ngsgrad: [[YELLOW]]{0}% -Repair.Arcane.Fail=Sv\u00e5rbegriplig kraft har permanent l\u00e4mnat f\u00f6rem\u00e5let. -Repair.Arcane.Lost=Du har inte f\u00e4rdigheter nog f\u00f6r att beh\u00e5lla n\u00e5gra f\u00f6rtrollningar -Swords.Ability.Lower=[[GRAY]]**DU S\u00c4NKER DITT SV\u00c4RD** -Swords.Ability.Ready=[[GREEN]]**DU G\u00d6R DIG REDO MED SV\u00c4RDET** -Swords.Combat.Bleeding.Stopped=[[GRAY]]F\u00f6rbl\u00f6dningen har [[GREEN]]stoppats[[GRAY]]! -Swords.Combat.Bleeding=[[GREEN]]**FIENDEN BL\u00d6DER** -Swords.Combat.Counter.Hit=[[DARK_RED]]Tr\u00e4ff med en motattack -Swords.Combat.Countered=[[GREEN]]**MOTATTACK** -Swords.Combat.SS.Struck=[[DARK_RED]]Tr\u00e4ffad av S\u00c5GTANDAT SLAG: -Swords.SubSkill.SerratedStrikes.Name=Bl\u00f6dande slag -Swords.Effect.4=S\u00e5gtandat slag bl\u00f6dning+ -Swords.Listener=Sv\u00e4rd: -Swords.SkillName=SV\u00c4RD -Swords.Skills.SS.On=[[GREEN]]**S\u00c5GTANDADE SLAG AKTIVERADE** -Swords.Skills.SS.Refresh=[[GREEN]]Dina [[YELLOW]]Bl\u00f6dande slag [[GREEN]]har vederkvickas! -Swords.Skills.SS.Other.Off=S\u00e5gtandat slag[[GREEN]] hat avklingat h\u00e4r f\u00f6r [[YELLOW]]{0} -Swords.Skills.SS.Other.On=[[GREEN]]{0}[[DARK_GREEN]] har anv\u00e4nt [[RED]]S\u00e5gtandat slag! -Taming.Ability.Bonus.2=Tjock P\u00e4ls -Taming.SubSkill.ShockProof.Name=Shocks\u00e4ker +Repair.Skills.AdeptDiamond=&4Du är inte skicklig nog för att reparera Diamant. +Repair.Skills.AdeptGold=&4Du är inte skicklig nog för att reparera Guld. +Repair.Skills.AdeptStone=&4Du är inte skicklig nog för att reparera Sten. +Repair.Skillup=Smidesfärdigheten ökade med {0}. Totalt ({1}) +Repair.Arcane.Chance.Downgrade=&7AF Chans för nedgradering: &e{0}% +Repair.Arcane.Chance.Success=&7AF Framgångsgrad: &e{0}% +Repair.Arcane.Fail=Svårbegriplig kraft har permanent lämnat föremålet. +Repair.Arcane.Lost=Du har inte färdigheter nog för att behålla några förtrollningar +Swords.Ability.Lower=&7**DU SÄNKER DITT SVÄRD** +Swords.Ability.Ready=&a**DU GÖR DIG REDO MED SVÄRDET** +Swords.Combat.Bleeding.Stopped=&7Förblödningen har &astoppats&7! +Swords.Combat.Bleeding=&a**FIENDEN BLÖDER** +Swords.Combat.Counter.Hit=&4Träff med en motattack +Swords.Combat.Countered=&a**MOTATTACK** +Swords.Combat.SS.Struck=&4Träffad av SÅGTANDAT SLAG: +Swords.SubSkill.SerratedStrikes.Name=Blödande slag +Swords.Effect.4=Sågtandat slag blödning+ +Swords.Listener=Svärd: +Swords.SkillName=SVÄRD +Swords.Skills.SS.On=&a**SÅGTANDADE SLAG AKTIVERADE** +Swords.Skills.SS.Refresh=&aDina &eBlödande slag &ahar vederkvickas! +Swords.Skills.SS.Other.Off=Sågtandat slag&a hat avklingat här för &e{0} +Swords.Skills.SS.Other.On=&a{0}&2 har använt &cSågtandat slag! +Taming.Ability.Bonus.2=Tjock Päls +Taming.SubSkill.ShockProof.Name=Shocksäker Taming.SubSkill.ShockProof.Description=Explotionsskademinskning Taming.SubSkill.CallOfTheWild.Name=Det vildas rop Taming.SubSkill.CallOfTheWild.Description=Frammana ett djur till din sida -Taming.SubSkill.CallOfTheWild.Description.2=[[GRAY]]COTW (Ocelot): Huka och v\u00e4nster-klicka med {0} Fisk i handen -Taming.Effect.15=[[GRAY]]COTW (Wolf): Huka och v\u00e4sterklicka med {0} ett ben i handen -Taming.SubSkill.FastFoodService.Name=Snabbmattj\u00e4nst. -Taming.SubSkill.FastFoodService.Description=Chans f\u00f6r vargar att l\u00e4ka vid attak -Taming.Listener.Wolf=[[DARK_GRAY]]din varg rusar tillbaka till dig... -Taming.Listener=T\u00e4mja: -Taming.Skillup=T\u00e4mjningsf\u00e4rdigheten \u00f6kade med {0}. Totalt ({1}) -Unarmed.Ability.Berserk.Length=Berserk l\u00e4ngd: [[YELLOW]]{0}s -Unarmed.Listener=Obev\u00e4pnad -Unarmed.Skills.Berserk.Off=**B\u00e4rs\u00e4rk slut** -Unarmed.Skills.Berserk.Other.Off=B\u00e4rs\u00e4rk[[GREEN]] har avklingat f\u00f6r [[YELLOW]]{0} -Unarmed.Skills.Berserk.Other.On=[[GREEN]]{0}[[DARK_GREEN]] har anv\u00e4nt [[RED]]B\u00e4rs\u00e4rk! -Woodcutting.Ability.0=L\u00f6vbl\u00e5sare -Woodcutting.Ability.1=Bl\u00e5s bort l\u00f6v -Woodcutting.SkillName=TR\u00c4DHUGGNING -Woodcutting.Skills.TreeFeller.Off=**Tr\u00e4df\u00e4llning har avklingat** -Woodcutting.Skills.TreeFeller.Refresh=[[GREEN]Din [[YELLOW]]tr\u00e4df\u00e4llarkraft [[GREEN]]har vederkvickats! -Woodcutting.Skills.TreeFeller.Other.Off=tr\u00e5df\u00e4llning[[GREEN]] har avklingat f\u00f6r [[YELLOW]]{0} -Woodcutting.Skills.TreeFeller.Other.On=[[GREEN]]{0}[[DARK_GREEN]] har anv\u00e4nt [[RED]]Tr\u00e4d f\u00e4llare +Taming.SubSkill.CallOfTheWild.Description.2=&7COTW (Ocelot): Huka och vänster-klicka med {0} Fisk i handen +Taming.Effect.15=&7COTW (Wolf): Huka och västerklicka med {0} ett ben i handen +Taming.SubSkill.FastFoodService.Name=Snabbmattjänst. +Taming.SubSkill.FastFoodService.Description=Chans för vargar att läka vid attak +Taming.Listener.Wolf=&8din varg rusar tillbaka till dig... +Taming.Listener=Tämja: +Taming.Skillup=Tämjningsfärdigheten ökade med {0}. Totalt ({1}) +Unarmed.Ability.Berserk.Length=Berserk längd: &e{0}s +Unarmed.Listener=Obeväpnad +Unarmed.Skills.Berserk.Off=**Bärsärk slut** +Unarmed.Skills.Berserk.Other.Off=Bärsärk&a har avklingat för &e{0} +Unarmed.Skills.Berserk.Other.On=&a{0}&2 har använt &cBärsärk! +Woodcutting.Ability.0=Lövblåsare +Woodcutting.Ability.1=Blås bort löv +Woodcutting.SkillName=TRÄDHUGGNING +Woodcutting.Skills.TreeFeller.Off=**Trädfällning har avklingat** +Woodcutting.Skills.TreeFeller.Refresh=&aDin &eträdfällarkraft &ahar vederkvickats! +Woodcutting.Skills.TreeFeller.Other.Off=trådfällning&a har avklingat för &e{0} +Woodcutting.Skills.TreeFeller.Other.On=&a{0}&2 har använt &cTräd fällare Woodcutting.Skills.TreeFeller.Splinter=DIN YXA SPLITTRAS I TUSEN BITAR! -Woodcutting.Skillup=Tr\u00e4dhuggningsf\u00e4rdigheten har \u00f6kat med {0}. Totalt ({1}) -Ability.Generic.Template.Lock=[[GRAY]]{0} -Ability.Generic.Template=[[GOLD]]{0}: [[DARK_AQUA]]{1} -Combat.BeastLore=[[GREEN]]**MONSTERKUNSKAP** -Combat.BeastLoreHealth=[[DARK_AQUA]]H\u00e4lsa ([[GREEN]]{0}[[DARK_AQUA]]/{1}) -Combat.TouchedFuzzy=[[DARK_RED]]R\u00f6rde luddigt. K\u00e4nde suddigt. -Commands.AdminChat.Off=Admin chatt endast [[RED]]Av -Commands.AdminToggle=- V\u00e4xla admin chat -Commands.Disabled=Det h\u00e4r kommandot \u00e4r avst\u00e4ngt. +Woodcutting.Skillup=Trädhuggningsfärdigheten har ökat med {0}. Totalt ({1}) +Ability.Generic.Template.Lock=&7{0} +Ability.Generic.Template=&6{0}: &3{1} +Combat.BeastLore=&a**MONSTERKUNSKAP** +Combat.BeastLoreHealth=&3Hälsa (&a{0}&3/{1}) +Combat.TouchedFuzzy=&4Rörde luddigt. Kände suddigt. +Commands.AdminChat.Off=Admin chatt endast &cAv +Commands.AdminToggle=- Växla admin chat +Commands.Disabled=Det här kommandot är avstängt. Commands.DoesNotExist=Spelaren finns inte i databasen! -Commands.GodMode.Disabled=mcMMO Gudsl\u00e4ge avaktiverat -Commands.Party.Invite.Accepted=[[GREEN]]F\u00f6rfr\u00e5gan accepterad. Du har nu g\u00e5tt med i gruppen {0} -Commands.mcgod=- V\u00e4xla till gudsl\u00e4ge -Commands.mmoedit=[player] [[RED]] - \u00c4ndra m\u00e5l -Commands.ModDescription=- L\u00e4s sammanfattad mod beskrivning. +Commands.GodMode.Disabled=mcMMO Gudsläge avaktiverat +Commands.Party.Invite.Accepted=&aFörfrågan accepterad. Du har nu gått med i gruppen {0} +Commands.mcgod=- Växla till gudsläge +Commands.mmoedit=[player] &c - Ändra mål +Commands.ModDescription=- Läs sammanfattad mod beskrivning. Commands.Party.Accept=- Acceptera gruppinbjudan -Commands.Party.Chat.Off=Endast Gruppchat [[RED]]av. -Commands.Party.Invite.0=VARNING: [[GREEN]]Du har f\u00e5tt en gruppinbjudan till {0} fr\u00e5n {1} -Commands.Party.Kick=Du blev kickad fr\u00e5n gruppen {0}! -Commands.Party.Leave=Du har l\u00e4mnat gruppen -Commands.PowerLevel.Leaderboard=--mcMMO[[BLUE]] Kraftniv\u00e5[[YELLOW]]Leaderboard-- -Commands.PowerLevel=[[DARK_RED]]KRAFTNIV\u00c5: [[GREEN]]{0} -Commands.ToggleAbility=- V\u00e4xla aktiv egenskap med h\u00f6gerklick. -mcMMO.NoSkillNote=[[DARK_GRAY]]Om du inte har tillg\u00e5ng till en f\u00e4rdighet visas den inte h\u00e4r. -Party.Player.Invalid=Det \u00e4r ingen giltlig spelare. -Party.Teleport.Dead=Du kan inte teleportera dig till en d\u00f6d spelare. -Party.Teleport.Target=[[GREEN]]{0} har teleporterat till dig. -Party.Unlocked=[[GRAY]]Gruppen \u00e4r nu uppl\u00e5st +Commands.Party.Chat.Off=Endast Gruppchat &cav. +Commands.Party.Invite.0=VARNING: &aDu har fått en gruppinbjudan till {0} från {1} +Commands.Party.Kick=Du blev kickad från gruppen {0}! +Commands.Party.Leave=Du har lämnat gruppen +Commands.PowerLevel.Leaderboard=--mcMMO&9 Kraftnivå&eLeaderboard-- +Commands.PowerLevel=&4KRAFTNIVÅ: &a{0} +Commands.ToggleAbility=- Växla aktiv egenskap med högerklick. +mcMMO.NoSkillNote=&8Om du inte har tillgång till en färdighet visas den inte här. +Party.Player.Invalid=Det är ingen giltlig spelare. +Party.Teleport.Dead=Du kan inte teleportera dig till en död spelare. +Party.Teleport.Target=&a{0} har teleporterat till dig. +Party.Unlocked=&7Gruppen är nu upplåst Commands.XPGain.Axes=Anfallande monster -Commands.XPGain.Excavation=Gr\u00e4va och hitta skatter -Commands.XPGain.Fishing=Fiske (Ta reda p\u00e5 det!) -Commands.XPGain.Herbalism=Sk\u00f6rda \u00f6rter +Commands.XPGain.Excavation=Gräva och hitta skatter +Commands.XPGain.Fishing=Fiske (Ta reda på det!) +Commands.XPGain.Herbalism=Skörda örter Commands.XPGain.Mining=Hugger Sten & Mineraler Commands.XPGain.Swords=Attackerar Monster -Commands.XPGain.Taming=Djurt\u00e4mjning, eller sl\u00e5ss m/ dina vargar -Commands.XPGain=[[DARK_GRAY]]XP \u00d6KAT: [[WHITE]]{0} -Commands.xprate.proper.0=Riktigt anv\u00e4ndande f\u00f6r att \u00e4ndra XP graden \u00e4r /xprate -XPRate.Event=[[GOLD]]mcMMO \u00e4r f\u00f6rnuvarande med i ett XP evenemang! XP f\u00f6rh\u00e5llandet ligger p\u00e5 {0}x! +Commands.XPGain.Taming=Djurtämjning, eller slåss m/ dina vargar +Commands.XPGain=&8XP ÖKAT: &f{0} +Commands.xprate.proper.0=Riktigt användande för att ändra XP graden är /xprate +XPRate.Event=&6mcMMO är förnuvarande med i ett XP evenemang! XP förhållandet ligger på {0}x! Effects.Effects=EFFEKTER -Effects.Template=[[DARK_AQUA]]{0}: [[GREEN]]{1} +Effects.Template=&3{0}: &a{1} Item.ChimaeraWing.Pass=**CHIMAERA VINGE** -Item.Injured.Wait=Du blev skadad f\u00f6r en liten stund sedan och m\u00e5ste v\u00e4nta med att anv\u00e4nda den h\u00e4r skillen. [[YELLOW]]({0}s) -Skills.Disarmed=[[DARK_RED]]Du har avv\u00e4pnats! -Stats.Header.Combat=[[GOLD]]-=Stridsf\u00e4rdigheter=- -Stats.Header.Gathering=[[GOLD]]-=SAMLA F\u00d6RM\u00c5GOR=- -Stats.Header.Misc=[[GOLD]]-=Varierande F\u00e4rdogheter=- -Stats.Own.Stats=[[GREEN]][mcMMO] Stats +Item.Injured.Wait=Du blev skadad för en liten stund sedan och måste vänta med att använda den här skillen. &e({0}s) +Skills.Disarmed=&4Du har avväpnats! +Stats.Header.Combat=&6-=Stridsfärdigheter=- +Stats.Header.Gathering=&6-=SAMLA FÖRMÅGOR=- +Stats.Header.Misc=&6-=Varierande Färdogheter=- +Stats.Own.Stats=&a[mcMMO] Stats +Commands.XPBar.Usage=Proper usage is /mmoxpbar +Commands.Description.mmoxpbar=Player settings for mcMMO XP bars +Commands.Description.mmocompat=Information about mcMMO and whether or not its in compatibility mode or fully functional. diff --git a/src/main/resources/locale/locale_th_TH.properties b/src/main/resources/locale/locale_th_TH.properties index 003fd5246..4faa11011 100644 --- a/src/main/resources/locale/locale_th_TH.properties +++ b/src/main/resources/locale/locale_th_TH.properties @@ -1,635 +1,637 @@ -Acrobatics.Ability.Proc=[[GREEN]]**\u0e43\u0e0a\u0e49\u0e17\u0e31\u0e01\u0e29\u0e30 Graceful Landing** -Acrobatics.Combat.Proc=[[GREEN]]**Dodged** -Acrobatics.DodgeChance=Dodge \u0e42\u0e2d\u0e01\u0e32\u0e2a: [[YELLOW]]{0} +Acrobatics.Ability.Proc=&a**ใช้ทักษะ Graceful Landing** +Acrobatics.Combat.Proc=&a**Dodged** +Acrobatics.DodgeChance=Dodge โอกาส: &e{0} Acrobatics.SubSkill.Roll.Name=Roll -Acrobatics.SubSkill.Roll.Description=\u0e25\u0e14\u0e04\u0e27\u0e32\u0e21\u0e40\u0e2a\u0e35\u0e22\u0e2b\u0e32\u0e22\u0e40\u0e21\u0e37\u0e48\u0e2d\u0e15\u0e01\u0e08\u0e32\u0e01\u0e17\u0e35\u0e48\u0e2a\u0e39\u0e07 +Acrobatics.SubSkill.Roll.Description=ลดความเสียหายเมื่อตกจากที่สูง Acrobatics.SubSkill.GracefulRoll.Name=Graceful Roll -Acrobatics.SubSkill.GracefulRoll.Description=\u0e40\u0e1e\u0e34\u0e48\u0e21\u0e1b\u0e23\u0e30\u0e2a\u0e34\u0e17\u0e18\u0e34\u0e20\u0e32\u0e1e\u0e2a\u0e2d\u0e07\u0e40\u0e17\u0e48\u0e32 +Acrobatics.SubSkill.GracefulRoll.Description=เพิ่มประสิทธิภาพสองเท่า Acrobatics.SubSkill.Dodge.Name=Dodge -Acrobatics.SubSkill.Dodge.Description=\u0e25\u0e14\u0e01\u0e32\u0e23\u0e44\u0e14\u0e49\u0e23\u0e31\u0e1a\u0e04\u0e27\u0e32\u0e21\u0e40\u0e2a\u0e35\u0e22\u0e2b\u0e32\u0e22\u0e04\u0e23\u0e36\u0e48\u0e07\u0e2b\u0e19\u0e36\u0e48\u0e07 -Acrobatics.Listener=\u0e17\u0e31\u0e01\u0e29\u0e30 Acrobatics: -Acrobatics.SubSkill.Roll.Chance=Roll \u0e42\u0e2d\u0e01\u0e32\u0e2a: [[YELLOW]]{0} -Acrobatics.SubSkill.Roll.GraceChance=Graceful Roll \u0e42\u0e2d\u0e01\u0e32\u0e2a: [[YELLOW]]{0} -Acrobatics.Roll.Text=**\u0e43\u0e0a\u0e49\u0e17\u0e31\u0e01\u0e29\u0e30 Rolled** +Acrobatics.SubSkill.Dodge.Description=ลดการได้รับความเสียหายครึ่งหนึ่ง +Acrobatics.Listener=ทักษะ Acrobatics: +Acrobatics.SubSkill.Roll.Chance=Roll โอกาส: &e{0} +Acrobatics.SubSkill.Roll.GraceChance=Graceful Roll โอกาส: &e{0} +Acrobatics.Roll.Text=**ใช้ทักษะ Rolled** Acrobatics.SkillName=ACROBATICS -Acrobatics.Skillup=\u0e17\u0e31\u0e01\u0e29\u0e30 Acrobatics \u0e40\u0e1e\u0e34\u0e48\u0e21\u0e02\u0e36\u0e49\u0e19 {0}. \u0e21\u0e35\u0e17\u0e31\u0e49\u0e07\u0e2b\u0e21\u0e14 ({1}) -Archery.Combat.DazeChance=Daze \u0e42\u0e2d\u0e01\u0e32\u0e2a: [[YELLOW]]{0} -Archery.Combat.RetrieveChance=Retrieve Arrows \u0e42\u0e2d\u0e01\u0e32\u0e2a: [[YELLOW]]{0} -Archery.Combat.SkillshotBonus=\u0e40\u0e1e\u0e34\u0e48\u0e21\u0e04\u0e27\u0e32\u0e21\u0e40\u0e2a\u0e35\u0e22\u0e2b\u0e32\u0e22\u0e14\u0e49\u0e27\u0e22\u0e18\u0e19\u0e39: [[YELLOW]]{0} +Acrobatics.Skillup=ทักษะ Acrobatics เพิ่มขึ้น {0}. มีทั้งหมด ({1}) +Archery.Combat.DazeChance=Daze โอกาส: &e{0} +Archery.Combat.RetrieveChance=Retrieve Arrows โอกาส: &e{0} +Archery.Combat.SkillshotBonus=เพิ่มความเสียหายด้วยธนู: &e{0} Archery.SubSkill.SkillShot.Name=Skill Shot -Archery.SubSkill.SkillShot.Description=\u0e04\u0e27\u0e32\u0e21\u0e40\u0e2a\u0e35\u0e22\u0e2b\u0e32\u0e22\u0e14\u0e49\u0e27\u0e22\u0e18\u0e19\u0e39\u0e40\u0e1e\u0e34\u0e48\u0e21\u0e02\u0e36\u0e49\u0e19 -Archery.SubSkill.Daze.Name=(Players) \u0e16\u0e39\u0e01\u0e17\u0e33\u0e43\u0e2b\u0e49\u0e21\u0e36\u0e19\u0e07\u0e07 -Archery.SubSkill.Daze.Description=Disorients \u0e28\u0e31\u0e15\u0e23\u0e39\u0e40\u0e1e\u0e34\u0e48\u0e21\u0e04\u0e27\u0e32\u0e21\u0e40\u0e2a\u0e35\u0e22\u0e2b\u0e32\u0e22 {0} +Archery.SubSkill.SkillShot.Description=ความเสียหายด้วยธนูเพิ่มขึ้น +Archery.SubSkill.Daze.Name=(Players) ถูกทำให้มึนงง +Archery.SubSkill.Daze.Description=Disorients ศัตรูเพิ่มความเสียหาย {0} Archery.SubSkill.ArrowRetrieval.Name=Arrow Retrieval -Archery.SubSkill.ArrowRetrieval.Description=\u0e21\u0e35\u0e42\u0e2d\u0e01\u0e32\u0e2a\u0e44\u0e14\u0e49\u0e23\u0e31\u0e1a\u0e18\u0e19\u0e39\u0e04\u0e37\u0e19\u0e2b\u0e25\u0e31\u0e07\u0e01\u0e32\u0e23\u0e2a\u0e31\u0e07\u0e2b\u0e32\u0e23 -Archery.Listener=\u0e17\u0e31\u0e01\u0e29\u0e30 Archery: +Archery.SubSkill.ArrowRetrieval.Description=มีโอกาสได้รับธนูคืนหลังการสังหาร +Archery.Listener=ทักษะ Archery: Archery.SkillName=ARCHERY -Archery.Skillup=\u0e17\u0e31\u0e01\u0e29\u0e30 Archery \u0e40\u0e1e\u0e34\u0e48\u0e21\u0e02\u0e36\u0e49\u0e19{0}. \u0e21\u0e35\u0e17\u0e31\u0e49\u0e07\u0e2b\u0e21\u0e14 ({1}) -Axes.Ability.Bonus.0=\u0e17\u0e31\u0e01\u0e29\u0e30 Axe Mastery -Axes.Ability.Bonus.1=\u0e40\u0e1e\u0e34\u0e48\u0e21\u0e04\u0e27\u0e32\u0e21\u0e40\u0e2a\u0e35\u0e22\u0e2b\u0e32\u0e22 {0} +Archery.Skillup=ทักษะ Archery เพิ่มขึ้น{0}. มีทั้งหมด ({1}) +Axes.Ability.Bonus.0=ทักษะ Axe Mastery +Axes.Ability.Bonus.1=เพิ่มความเสียหาย {0} Axes.Ability.Bonus.2=Armor Impact -Axes.Ability.Bonus.3=\u0e40\u0e1e\u0e34\u0e48\u0e21\u0e04\u0e27\u0e32\u0e21\u0e40\u0e2a\u0e35\u0e22\u0e2b\u0e32\u0e22 {0} \u0e43\u0e2b\u0e49\u0e01\u0e31\u0e1a\u0e40\u0e01\u0e23\u0e32\u0e30 +Axes.Ability.Bonus.3=เพิ่มความเสียหาย {0} ให้กับเกราะ Axes.Ability.Bonus.4=Greater Impact -Axes.Ability.Bonus.5=\u0e40\u0e1e\u0e34\u0e48\u0e21\u0e04\u0e27\u0e32\u0e21\u0e40\u0e2a\u0e35\u0e22\u0e2b\u0e32\u0e22 {0} \u0e43\u0e2b\u0e49\u0e17\u0e31\u0e01\u0e29\u0e30 unarmored -Axes.Ability.Lower=[[GRAY]]**\u0e22\u0e01\u0e40\u0e25\u0e34\u0e01\u0e01\u0e32\u0e23\u0e43\u0e0a\u0e49\u0e17\u0e31\u0e01\u0e29\u0e30\u0e02\u0e2d\u0e07 Axe** -Axes.Ability.Ready=[[GREEN]]**\u0e04\u0e38\u0e13\u0e1e\u0e23\u0e49\u0e2d\u0e21\u0e17\u0e35\u0e48\u0e08\u0e30\u0e43\u0e0a\u0e49\u0e17\u0e31\u0e01\u0e29\u0e30\u0e02\u0e2d\u0e07 Axe** -Axes.Combat.CritStruck=[[DARK_RED]]\u0e04\u0e38\u0e13\u0e44\u0e14\u0e49\u0e17\u0e33 CRITICALLY HIT \u0e43\u0e2a\u0e48\u0e1c\u0e39\u0e49\u0e40\u0e25\u0e48\u0e19! -Axes.Combat.CritChance=Critically Strike \u0e42\u0e2d\u0e01\u0e32\u0e2a: [[YELLOW]]{0} -Axes.Combat.CriticalHit=\u0e42\u0e08\u0e21\u0e15\u0e35 CRITICAL! -Axes.Combat.GI.Proc=[[GREEN]]**\u0e17\u0e33\u0e04\u0e27\u0e32\u0e21\u0e40\u0e2a\u0e35\u0e22\u0e2b\u0e32\u0e22\u0e14\u0e49\u0e27\u0e22 GREAT FORCE** -Axes.Combat.GI.Struck=**\u0e42\u0e08\u0e21\u0e15\u0e35\u0e14\u0e49\u0e27\u0e22 GREATER IMPACT** -Axes.Combat.SS.Length=Skull Splitter \u0e21\u0e35\u0e23\u0e30\u0e22\u0e30\u0e40\u0e27\u0e25\u0e32: [[YELLOW]]{0}\u0e27\u0e34\u0e19\u0e32\u0e17\u0e35 +Axes.Ability.Bonus.5=เพิ่มความเสียหาย {0} ให้ทักษะ unarmored +Axes.Ability.Lower=&7**ยกเลิกการใช้ทักษะของ Axe** +Axes.Ability.Ready=&a**คุณพร้อมที่จะใช้ทักษะของ Axe** +Axes.Combat.CritStruck=&4คุณได้ทำ CRITICALLY HIT ใส่ผู้เล่น! +Axes.Combat.CritChance=Critically Strike โอกาส: &e{0} +Axes.Combat.CriticalHit=โจมตี CRITICAL! +Axes.Combat.GI.Proc=&a**ทำความเสียหายด้วย GREAT FORCE** +Axes.Combat.GI.Struck=**โจมตีด้วย GREATER IMPACT** +Axes.Combat.SS.Length=Skull Splitter มีระยะเวลา: &e{0}วินาที Axes.SubSkill.SkullSplitter.Name=Skull Splitter -Axes.SubSkill.SkullSplitter.Description=\u0e17\u0e33\u0e04\u0e27\u0e32\u0e21\u0e40\u0e2a\u0e35\u0e22\u0e2b\u0e32\u0e22\u0e27\u0e07\u0e01\u0e27\u0e49\u0e32\u0e07 +Axes.SubSkill.SkullSplitter.Description=ทำความเสียหายวงกว้าง Axes.SubSkill.CriticalStrikes.Name=Critical Strikes -Axes.SubSkill.CriticalStrikes.Description=\u0e01\u0e32\u0e23\u0e42\u0e08\u0e21\u0e15\u0e35\u0e40\u0e1e\u0e34\u0e48\u0e21\u0e02\u0e36\u0e49\u0e19 -Axes.SubSkill.AxeMastery.Name=\u0e17\u0e31\u0e01\u0e29\u0e30 Axe Mastery -Axes.SubSkill.AxeMastery.Description=\u0e40\u0e1e\u0e34\u0e48\u0e21\u0e42\u0e1a\u0e19\u0e31\u0e2a\u0e04\u0e27\u0e32\u0e21\u0e40\u0e2a\u0e35\u0e22\u0e2b\u0e32\u0e22 +Axes.SubSkill.CriticalStrikes.Description=การโจมตีเพิ่มขึ้น +Axes.SubSkill.AxeMastery.Name=ทักษะ Axe Mastery +Axes.SubSkill.AxeMastery.Description=เพิ่มโบนัสความเสียหาย Axes.SubSkill.ArmorImpact.Name=Armor Impact -Axes.SubSkill.ArmorImpact.Description=\u0e42\u0e08\u0e21\u0e15\u0e35\u0e40\u0e02\u0e49\u0e32\u0e40\u0e2a\u0e37\u0e49\u0e2d\u0e40\u0e01\u0e23\u0e32\u0e30\u0e17\u0e33\u0e43\u0e2b\u0e49\u0e40\u0e01\u0e23\u0e32\u0e30\u0e40\u0e2a\u0e35\u0e22\u0e2b\u0e32\u0e22\u0e21\u0e32\u0e01 +Axes.SubSkill.ArmorImpact.Description=โจมตีเข้าเสื้อเกราะทำให้เกราะเสียหายมาก Axes.SubSkill.GreaterImpact.Name=Greater Impact -Axes.SubSkill.GreaterImpact.Description=\u0e40\u0e1e\u0e34\u0e48\u0e21\u0e04\u0e27\u0e32\u0e21\u0e40\u0e2a\u0e35\u0e22\u0e2b\u0e32\u0e22\u0e43\u0e2b\u0e49\u0e01\u0e31\u0e1a\u0e17\u0e31\u0e01\u0e29\u0e30 Unarmored -Axes.Listener=\u0e17\u0e31\u0e01\u0e29\u0e30 Axes: +Axes.SubSkill.GreaterImpact.Description=เพิ่มความเสียหายให้กับทักษะ Unarmored +Axes.Listener=ทักษะ Axes: Axes.SkillName=AXES -Axes.Skills.SS.Off=**\u0e17\u0e31\u0e01\u0e29\u0e30 Skull Splitter \u0e2b\u0e21\u0e14\u0e2a\u0e20\u0e32\u0e1e** -Axes.Skills.SS.On=[[GREEN]]**\u0e43\u0e0a\u0e49\u0e17\u0e31\u0e01\u0e29\u0e30 Skull Splitter** -Axes.Skills.SS.Refresh=[[GREEN]]\u0e04\u0e27\u0e32\u0e21\u0e2a\u0e32\u0e21\u0e32\u0e23\u0e16\u0e17\u0e31\u0e01\u0e29\u0e30 [[YELLOW]]Skull Splitter [[GREEN]]\u0e04\u0e39\u0e25\u0e14\u0e32\u0e27\u0e19\u0e4c\u0e40\u0e2a\u0e23\u0e47\u0e08\u0e41\u0e25\u0e49\u0e27! -Axes.Skills.SS.Other.Off=Skull Splitter[[GREEN]] \u0e23\u0e2d\u0e01\u0e32\u0e23\u0e04\u0e39\u0e25\u0e14\u0e32\u0e27\u0e19\u0e4c [[YELLOW]]{0} -Axes.Skills.SS.Other.On=[[GREEN]]{0}[[DARK_GREEN]] \u0e44\u0e14\u0e49\u0e43\u0e0a\u0e49\u0e17\u0e31\u0e01\u0e29\u0e30 [[RED]]Skull Splitter! -Axes.Skillup=\u0e17\u0e31\u0e01\u0e29\u0e30 Axes \u0e40\u0e1e\u0e34\u0e48\u0e21\u0e02\u0e36\u0e49\u0e19 {0}. \u0e21\u0e35\u0e17\u0e31\u0e49\u0e07\u0e2b\u0e21\u0e14 ({1}) -Excavation.Ability.Lower=[[GRAY]]**\u0e22\u0e01\u0e40\u0e25\u0e34\u0e01\u0e01\u0e32\u0e23\u0e43\u0e0a\u0e49\u0e17\u0e31\u0e01\u0e29\u0e30\u0e02\u0e2d\u0e07 Shovel** -Excavation.Ability.Ready=[[GREEN]]**\u0e04\u0e38\u0e13\u0e1e\u0e23\u0e49\u0e2d\u0e21\u0e17\u0e35\u0e48\u0e08\u0e30\u0e43\u0e0a\u0e49\u0e17\u0e31\u0e01\u0e29\u0e30\u0e02\u0e2d\u0e07 Shovel** +Axes.Skills.SS.Off=**ทักษะ Skull Splitter หมดสภาพ** +Axes.Skills.SS.On=&a**ใช้ทักษะ Skull Splitter** +Axes.Skills.SS.Refresh=&aความสามารถทักษะ &eSkull Splitter &aคูลดาวน์เสร็จแล้ว! +Axes.Skills.SS.Other.Off=Skull Splitter&a รอการคูลดาวน์ &e{0} +Axes.Skills.SS.Other.On=&a{0}&2 ได้ใช้ทักษะ &cSkull Splitter! +Axes.Skillup=ทักษะ Axes เพิ่มขึ้น {0}. มีทั้งหมด ({1}) +Excavation.Ability.Lower=&7**ยกเลิกการใช้ทักษะของ Shovel** +Excavation.Ability.Ready=&a**คุณพร้อมที่จะใช้ทักษะของ Shovel** Excavation.SubSkill.GigaDrillBreaker.Name=Giga Drill Breaker -Excavation.SubSkill.GigaDrillBreaker.Description=\u0e2d\u0e31\u0e15\u0e23\u0e32\u0e14\u0e23\u0e2d\u0e1b 3x , EXP 3x, +\u0e04\u0e27\u0e32\u0e21\u0e40\u0e23\u0e47\u0e27 +Excavation.SubSkill.GigaDrillBreaker.Description=อัตราดรอป 3x , EXP 3x, +ความเร็ว Excavation.SubSkill.TreasureHunter.Name=Treasure Hunter -Excavation.SubSkill.TreasureHunter.Description=\u0e04\u0e27\u0e32\u0e21\u0e2a\u0e32\u0e21\u0e32\u0e23\u0e16\u0e43\u0e19\u0e01\u0e32\u0e23\u0e02\u0e38\u0e14\u0e2b\u0e32\u0e2a\u0e21\u0e1a\u0e31\u0e15\u0e34 -Excavation.Effect.Length=Giga Drill Breaker \u0e21\u0e35\u0e23\u0e30\u0e22\u0e30\u0e40\u0e27\u0e25\u0e32: [[YELLOW]]{0}\u0e27\u0e34\u0e19\u0e32\u0e17\u0e35 -Excavation.Listener=\u0e17\u0e31\u0e01\u0e29\u0e30 Excavation: +Excavation.SubSkill.TreasureHunter.Description=ความสามารถในการขุดหาสมบัติ +Excavation.Effect.Length=Giga Drill Breaker มีระยะเวลา: &e{0}วินาที +Excavation.Listener=ทักษะ Excavation: Excavation.SkillName=EXCAVATION -Excavation.Skills.GigaDrillBreaker.Off=**\u0e17\u0e31\u0e01\u0e29\u0e30 Giga Drill Breaker \u0e2b\u0e21\u0e14\u0e2a\u0e20\u0e32\u0e1e** -Excavation.Skills.GigaDrillBreaker.On=[[GREEN]]**\u0e43\u0e0a\u0e49\u0e17\u0e31\u0e01\u0e29\u0e30 GIGA DRILL BREAKER** -Excavation.Skills.GigaDrillBreaker.Refresh=[[GREEN]]\u0e04\u0e27\u0e32\u0e21\u0e2a\u0e32\u0e21\u0e32\u0e23\u0e16\u0e17\u0e31\u0e01\u0e29\u0e30 [[YELLOW]]Giga Drill Breaker [[GREEN]]\u0e04\u0e39\u0e25\u0e14\u0e32\u0e27\u0e19\u0e4c\u0e40\u0e2a\u0e23\u0e47\u0e08\u0e41\u0e25\u0e49\u0e27! -Excavation.Skills.GigaDrillBreaker.Other.Off=Giga Drill Breaker[[GREEN]] \u0e23\u0e2d\u0e01\u0e32\u0e23\u0e04\u0e39\u0e25\u0e14\u0e32\u0e27\u0e19\u0e4c [[YELLOW]]{0} -Excavation.Skills.GigaDrillBreaker.Other.On=[[GREEN]]{0}[[DARK_GREEN]] \u0e44\u0e14\u0e49\u0e43\u0e0a\u0e49\u0e17\u0e31\u0e01\u0e29\u0e30 [[RED]]Giga Drill Breaker! -Excavation.Skillup=\u0e17\u0e31\u0e01\u0e29\u0e30 Excavation \u0e40\u0e1e\u0e34\u0e48\u0e21\u0e02\u0e36\u0e49\u0e19 {0}. \u0e21\u0e35\u0e17\u0e31\u0e49\u0e07\u0e2b\u0e21\u0e14 ({1}) -Fishing.Ability.Chance=Bite \u0e42\u0e2d\u0e01\u0e32\u0e2a: [[YELLOW]]{0} -Fishing.Ability.Info=\u0e17\u0e31\u0e01\u0e29\u0e30 Magic Hunter: [[GRAY]] **\u0e40\u0e1b\u0e25\u0e35\u0e48\u0e22\u0e19\u0e41\u0e1b\u0e25\u0e07\u0e42\u0e14\u0e22\u0e23\u0e30\u0e14\u0e31\u0e1a\u0e17\u0e31\u0e01\u0e29\u0e30 Treasure Hunter** -Fishing.Ability.Locked.0=\u0e2a\u0e32\u0e21\u0e32\u0e23\u0e16\u0e1b\u0e25\u0e14\u0e25\u0e47\u0e2d\u0e01\u0e44\u0e14\u0e49\u0e40\u0e21\u0e37\u0e48\u0e2d\u0e23\u0e30\u0e14\u0e31\u0e1a {0}+ (SHAKE) -Fishing.Ability.Locked.1=\u0e2a\u0e32\u0e21\u0e32\u0e23\u0e16\u0e1b\u0e25\u0e14\u0e25\u0e47\u0e2d\u0e01\u0e44\u0e14\u0e49\u0e40\u0e21\u0e37\u0e48\u0e2d\u0e23\u0e30\u0e14\u0e31\u0e1a {0} (ICE FISHING) -Fishing.Ability.Rank=Treasure Hunter \u0e23\u0e30\u0e14\u0e31\u0e1a: [[YELLOW]]{0}/5 -Fishing.Ability.TH.MagicRate=Magic Hunter \u0e42\u0e2d\u0e01\u0e32\u0e2a: [[YELLOW]]{0} -Fishing.Ability.Shake=Shake \u0e42\u0e2d\u0e01\u0e32\u0e2a: [[YELLOW]]{0} -Fishing.Ability.IceFishing=Ice Fishing: \u0e2a\u0e32\u0e21\u0e32\u0e23\u0e16\u0e15\u0e01\u0e1b\u0e25\u0e32\u0e43\u0e19\u0e19\u0e49\u0e33\u0e41\u0e02\u0e47\u0e07\u0e44\u0e14\u0e49 -Fishing.Ability.FD=Fisherman\'\'s Diet \u0e23\u0e30\u0e14\u0e31\u0e1a: [[YELLOW]]{0} +Excavation.Skills.GigaDrillBreaker.Off=**ทักษะ Giga Drill Breaker หมดสภาพ** +Excavation.Skills.GigaDrillBreaker.On=&a**ใช้ทักษะ GIGA DRILL BREAKER** +Excavation.Skills.GigaDrillBreaker.Refresh=&aความสามารถทักษะ &eGiga Drill Breaker &aคูลดาวน์เสร็จแล้ว! +Excavation.Skills.GigaDrillBreaker.Other.Off=Giga Drill Breaker&a รอการคูลดาวน์ &e{0} +Excavation.Skills.GigaDrillBreaker.Other.On=&a{0}&2 ได้ใช้ทักษะ &cGiga Drill Breaker! +Excavation.Skillup=ทักษะ Excavation เพิ่มขึ้น {0}. มีทั้งหมด ({1}) +Fishing.Ability.Chance=Bite โอกาส: &e{0} +Fishing.Ability.Info=ทักษะ Magic Hunter: &7 **เปลี่ยนแปลงโดยระดับทักษะ Treasure Hunter** +Fishing.Ability.Locked.0=สามารถปลดล็อกได้เมื่อระดับ {0}+ (SHAKE) +Fishing.Ability.Locked.1=สามารถปลดล็อกได้เมื่อระดับ {0} (ICE FISHING) +Fishing.Ability.Rank=Treasure Hunter ระดับ: &e{0}/5 +Fishing.Ability.TH.MagicRate=Magic Hunter โอกาส: &e{0} +Fishing.Ability.Shake=Shake โอกาส: &e{0} +Fishing.Ability.IceFishing=Ice Fishing: สามารถตกปลาในน้ำแข็งได้ +Fishing.Ability.FD=Fisherman\'\'s Diet ระดับ: &e{0} Fishing.SubSkill.TreasureHunter.Name=Treasure Hunter (Passive) -Fishing.SubSkill.TreasureHunter.Description=\u0e44\u0e14\u0e49\u0e23\u0e31\u0e1a\u0e27\u0e31\u0e15\u0e16\u0e38\u0e08\u0e32\u0e01\u0e01\u0e32\u0e23\u0e15\u0e01\u0e1b\u0e25\u0e32 +Fishing.SubSkill.TreasureHunter.Description=ได้รับวัตถุจากการตกปลา Fishing.SubSkill.MagicHunter.Name=Magic Hunter -Fishing.SubSkill.MagicHunter.Description=\u0e04\u0e49\u0e19\u0e2b\u0e32\u0e2a\u0e34\u0e48\u0e07\u0e02\u0e2d\u0e07 enchanted +Fishing.SubSkill.MagicHunter.Description=ค้นหาสิ่งของ enchanted Fishing.SubSkill.Shake.Name=Shake (vs. Entities) -Fishing.SubSkill.Shake.Description=\u0e40\u0e02\u0e22\u0e48\u0e32\u0e40\u0e2d\u0e32\u0e2a\u0e34\u0e48\u0e07\u0e02\u0e2d\u0e07\u0e08\u0e32\u0e01 monster w/ \u0e14\u0e49\u0e27\u0e22\u0e04\u0e31\u0e19\u0e40\u0e1a\u0e47\u0e14 +Fishing.SubSkill.Shake.Description=เขย่าเอาสิ่งของจาก monster w/ ด้วยคันเบ็ด Fishing.SubSkill.FishermansDiet.Name=Fisherman\'s Diet -Fishing.SubSkill.FishermansDiet.Description=\u0e40\u0e1e\u0e34\u0e48\u0e21\u0e04\u0e27\u0e32\u0e21\u0e2d\u0e34\u0e48\u0e21\u0e08\u0e32\u0e01\u0e01\u0e32\u0e23\u0e01\u0e34\u0e19\u0e1b\u0e25\u0e32 +Fishing.SubSkill.FishermansDiet.Description=เพิ่มความอิ่มจากการกินปลา Fishing.SubSkill.MasterAngler.Name=Master Angler -Fishing.SubSkill.MasterAngler.Description=\u0e40\u0e1e\u0e34\u0e48\u0e21\u0e42\u0e2d\u0e01\u0e32\u0e2a\u0e44\u0e14\u0e49\u0e23\u0e31\u0e1a\u0e1b\u0e25\u0e32\u0e21\u0e32\u0e01\u0e02\u0e36\u0e49\u0e19\u0e08\u0e32\u0e01\u0e01\u0e32\u0e23\u0e15\u0e01\u0e1b\u0e25\u0e32 Fishing.SubSkill.IceFishing.Name=Ice Fishing -Fishing.SubSkill.IceFishing.Description=\u0e2d\u0e19\u0e38\u0e0d\u0e32\u0e15\u0e34\u0e43\u0e2b\u0e49\u0e15\u0e01\u0e1b\u0e25\u0e32\u0e43\u0e19\u0e19\u0e49\u0e33\u0e41\u0e02\u0e47\u0e07 -Fishing.Chance.Raining=[[BLUE]] Rain Bonus -Fishing.Listener=\u0e17\u0e31\u0e01\u0e29\u0e30 Fishing: -Fishing.Ability.TH.MagicFound=[[GRAY]]\u0e04\u0e38\u0e13\u0e23\u0e39\u0e49\u0e2a\u0e36\u0e01\u0e44\u0e14\u0e49\u0e16\u0e36\u0e07\u0e2a\u0e31\u0e21\u0e1c\u0e31\u0e2a\u0e02\u0e2d\u0e07\u0e40\u0e27\u0e17\u0e21\u0e19\u0e15\u0e23\u0e4c\u0e14\u0e49\u0e27\u0e22\u0e01\u0e32\u0e23\u0e08\u0e31\u0e1a\u0e2a\u0e34\u0e48\u0e07\u0e19\u0e35\u0e49 ... +Fishing.SubSkill.IceFishing.Description=อนุญาติให้ตกปลาในน้ำแข็ง +Fishing.Chance.Raining=&9 Rain Bonus +Fishing.Listener=ทักษะ Fishing: +Fishing.Ability.TH.MagicFound=&7คุณรู้สึกได้ถึงสัมผัสของเวทมนตร์ด้วยการจับสิ่งนี้ ... Fishing.SkillName=FISHING -Fishing.Skillup=\u0e17\u0e31\u0e01\u0e29\u0e30 Fishing \u0e40\u0e1e\u0e34\u0e48\u0e21\u0e02\u0e36\u0e49\u0e19 {0}. \u0e21\u0e35\u0e17\u0e31\u0e49\u0e07\u0e2b\u0e21\u0e14 ({1}) -Herbalism.Ability.DoubleDropChance=Double Drop \u0e42\u0e2d\u0e01\u0e32\u0e2a: [[YELLOW]]{0} -Herbalism.Ability.FD=Farmer\'\'s Diet \u0e23\u0e30\u0e14\u0e31\u0e1a: [[YELLOW]] {0} -Herbalism.Ability.GTe.Length=Green Terra \u0e21\u0e35\u0e23\u0e30\u0e22\u0e30\u0e40\u0e27\u0e25\u0e32: [[YELLOW]]{0}\u0e27\u0e34\u0e19\u0e32\u0e17\u0e35 -Herbalism.Ability.GTe.NeedMore=\u0e41\u0e15\u0e48\u0e04\u0e38\u0e13\u0e15\u0e49\u0e2d\u0e07\u0e01\u0e32\u0e23\u0e40\u0e21\u0e25\u0e47\u0e14\u0e1e\u0e31\u0e19\u0e18\u0e38\u0e4c\u0e21\u0e32\u0e01\u0e02\u0e36\u0e49\u0e19\u0e40\u0e1e\u0e37\u0e48\u0e2d\u0e43\u0e0a\u0e49 Green Terra. -Herbalism.Ability.GTh.Chance=Green Thumb \u0e42\u0e2d\u0e01\u0e32\u0e2a: [[YELLOW]]{0} -Herbalism.Ability.GTh.Fail=**GREEN THUMB \u0e25\u0e49\u0e21\u0e40\u0e2b\u0e25\u0e27** -Herbalism.Ability.GTh.Stage=Green Thumb \u0e08\u0e33\u0e19\u0e27\u0e19: [[YELLOW]]{0} -Herbalism.Ability.GTh=[[GREEN]]**\u0e43\u0e0a\u0e49\u0e17\u0e31\u0e01\u0e29\u0e30 GREEN THUMB** -Herbalism.Ability.HylianLuck=Hylian Luck \u0e42\u0e2d\u0e01\u0e32\u0e2a: [[YELLOW]]{0} -Herbalism.Ability.Lower=[[GRAY]]**\u0e22\u0e01\u0e40\u0e25\u0e34\u0e01\u0e01\u0e32\u0e23\u0e43\u0e0a\u0e49\u0e17\u0e31\u0e01\u0e29\u0e30\u0e02\u0e2d\u0e07 Hoe** -Herbalism.Ability.Ready=[[GREEN]]**\u0e04\u0e38\u0e13\u0e1e\u0e23\u0e49\u0e2d\u0e21\u0e17\u0e35\u0e48\u0e08\u0e30\u0e43\u0e0a\u0e49\u0e17\u0e31\u0e01\u0e29\u0e30\u0e02\u0e2d\u0e07 Hoe** -Herbalism.Ability.ShroomThumb.Chance=Shroom Thumb \u0e42\u0e2d\u0e01\u0e32\u0e2a: [[YELLOW]]{0} -Herbalism.Ability.ShroomThumb.Fail=**SHROOM THUMB \u0e25\u0e49\u0e21\u0e40\u0e2b\u0e25\u0e27** +Fishing.Skillup=ทักษะ Fishing เพิ่มขึ้น {0}. มีทั้งหมด ({1}) +Herbalism.Ability.DoubleDropChance=Double Drop โอกาส: &e{0} +Herbalism.Ability.FD=Farmer\'\'s Diet ระดับ: &e {0} +Herbalism.Ability.GTe.Length=Green Terra มีระยะเวลา: &e{0}วินาที +Herbalism.Ability.GTe.NeedMore=แต่คุณต้องการเมล็ดพันธุ์มากขึ้นเพื่อใช้ Green Terra. +Herbalism.Ability.GTh.Chance=Green Thumb โอกาส: &e{0} +Herbalism.Ability.GTh.Fail=**GREEN THUMB ล้มเหลว** +Herbalism.Ability.GTh.Stage=Green Thumb จำนวน: &e{0} +Herbalism.Ability.GTh=&a**ใช้ทักษะ GREEN THUMB** +Herbalism.Ability.HylianLuck=Hylian Luck โอกาส: &e{0} +Herbalism.Ability.Lower=&7**ยกเลิกการใช้ทักษะของ Hoe** +Herbalism.Ability.Ready=&a**คุณพร้อมที่จะใช้ทักษะของ Hoe** +Herbalism.Ability.ShroomThumb.Chance=Shroom Thumb โอกาส: &e{0} +Herbalism.Ability.ShroomThumb.Fail=**SHROOM THUMB ล้มเหลว** Herbalism.SubSkill.GreenTerra.Name=Green Terra -Herbalism.SubSkill.GreenTerra.Description=\u0e40\u0e1e\u0e34\u0e48\u0e21\u0e2d\u0e31\u0e15\u0e23\u0e32\u0e01\u0e32\u0e23\u0e14\u0e23\u0e2d\u0e1b x3 -Herbalism.SubSkill.GreenThumb.Name=Green Thumb (\u0e02\u0e49\u0e32\u0e27\u0e40\u0e17\u0e48\u0e32\u0e19\u0e31\u0e49\u0e19) -Herbalism.SubSkill.GreenThumb.Description=\u0e1e\u0e37\u0e0a\u0e42\u0e15\u0e2d\u0e31\u0e15\u0e42\u0e19\u0e21\u0e31\u0e15\u0e34\u0e40\u0e21\u0e37\u0e48\u0e2d\u0e40\u0e01\u0e47\u0e1a\u0e40\u0e01\u0e35\u0e48\u0e22\u0e27 -Herbalism.SubSkill.GreenThumb.Description.2=\u0e17\u0e33\u0e2d\u0e34\u0e10\u0e40\u0e2a\u0e35\u0e22\u0e2b\u0e23\u0e37\u0e2d\u0e17\u0e33\u0e43\u0e2b\u0e49\u0e2b\u0e0d\u0e49\u0e32\u0e40\u0e15\u0e34\u0e1a\u0e42\u0e15 +Herbalism.SubSkill.GreenTerra.Description=เพิ่มอัตราการดรอป x3 +Herbalism.SubSkill.GreenThumb.Name=Green Thumb (ข้าวเท่านั้น) +Herbalism.SubSkill.GreenThumb.Description=พืชโตอัตโนมัติเมื่อเก็บเกี่ยว +Herbalism.SubSkill.GreenThumb.Description.2=ทำอิฐเสียหรือทำให้หญ้าเติบโต Herbalism.SubSkill.FarmersDiet.Name=Farmer\'s Diet -Herbalism.SubSkill.FarmersDiet.Description=\u0e40\u0e1e\u0e34\u0e48\u0e21\u0e04\u0e27\u0e32\u0e21\u0e2d\u0e34\u0e48\u0e21\u0e08\u0e32\u0e01\u0e01\u0e32\u0e23\u0e01\u0e34\u0e19\u0e2d\u0e32\u0e2b\u0e32\u0e23 -Herbalism.SubSkill.DoubleDrops.Name=Drops x2 (\u0e2a\u0e21\u0e38\u0e19\u0e44\u0e1e\u0e23\u0e17\u0e31\u0e49\u0e07\u0e2b\u0e21\u0e14) -Herbalism.SubSkill.DoubleDrops.Description=\u0e40\u0e1e\u0e34\u0e48\u0e21\u0e2d\u0e31\u0e04\u0e23\u0e32\u0e01\u0e32\u0e23 Drops +Herbalism.SubSkill.FarmersDiet.Description=เพิ่มความอิ่มจากการกินอาหาร +Herbalism.SubSkill.DoubleDrops.Name=Drops x2 (สมุนไพรทั้งหมด) +Herbalism.SubSkill.DoubleDrops.Description=เพิ่มอัคราการ Drops Herbalism.SubSkill.HylianLuck.Name=Hylian Luck -Herbalism.SubSkill.HylianLuck.Description=\u0e43\u0e2b\u0e49\u0e21\u0e35\u0e42\u0e2d\u0e01\u0e32\u0e2a\u0e40\u0e25\u0e47\u0e01\u0e19\u0e49\u0e2d\u0e22\u0e43\u0e19\u0e01\u0e32\u0e23\u0e2b\u0e32\u0e2a\u0e34\u0e48\u0e07\u0e02\u0e2d\u0e07\u0e17\u0e35\u0e48\u0e2b\u0e32\u0e22\u0e32\u0e01 +Herbalism.SubSkill.HylianLuck.Description=ให้มีโอกาสเล็กน้อยในการหาสิ่งของที่หายาก Herbalism.SubSkill.ShroomThumb.Name=Shroom Thumb -Herbalism.SubSkill.ShroomThumb.Description=\u0e01\u0e23\u0e30\u0e08\u0e32\u0e22\u0e40\u0e2a\u0e49\u0e19\u0e43\u0e22\u0e14\u0e34\u0e19\u0e41\u0e25\u0e30\u0e2b\u0e0d\u0e49\u0e32 -Herbalism.HylianLuck=[[GREEN]]\u0e04\u0e38\u0e13\u0e21\u0e35\u0e42\u0e0a\u0e04\u0e43\u0e19\u0e27\u0e31\u0e19\u0e19\u0e35\u0e49! -Herbalism.Listener=\u0e17\u0e31\u0e01\u0e29\u0e30 Herbalism: +Herbalism.SubSkill.ShroomThumb.Description=กระจายเส้นใยดินและหญ้า +Herbalism.HylianLuck=&aคุณมีโชคในวันนี้! +Herbalism.Listener=ทักษะ Herbalism: Herbalism.SkillName=HERBALISM -Herbalism.Skills.GTe.On=[[GREEN]]**\u0e43\u0e0a\u0e49\u0e17\u0e31\u0e01\u0e29\u0e30 GREEN TERRA** -Herbalism.Skills.GTe.Refresh=[[GREEN]]Your [[YELLOW]]Green Terra [[GREEN]]\u0e04\u0e39\u0e25\u0e14\u0e32\u0e27\u0e19\u0e4c\u0e40\u0e2a\u0e23\u0e47\u0e08\u0e41\u0e25\u0e49\u0e27! -Herbalism.Skills.GTe.Other.Off=Green Terra[[GREEN]] \u0e23\u0e2d\u0e01\u0e32\u0e23\u0e04\u0e39\u0e25\u0e14\u0e32\u0e27\u0e19\u0e4c [[YELLOW]]{0} -Herbalism.Skills.GTe.Other.On=[[GREEN]]{0}[[DARK_GREEN]] \u0e44\u0e14\u0e49\u0e43\u0e0a\u0e49\u0e17\u0e31\u0e01\u0e29\u0e30 [[RED]]Green Terra! -Herbalism.Skillup=\u0e17\u0e31\u0e01\u0e29\u0e30 Herbalism \u0e40\u0e1e\u0e34\u0e48\u0e21\u0e02\u0e36\u0e49\u0e19 {0}. \u0e21\u0e35\u0e17\u0e31\u0e49\u0e07\u0e2b\u0e21\u0e14 ({1}) -Mining.Ability.Length=Super Breaker \u0e23\u0e30\u0e22\u0e30\u0e40\u0e27\u0e25\u0e32: [[YELLOW]]{0}s -Mining.Ability.Locked.0=\u0e2a\u0e32\u0e21\u0e32\u0e23\u0e16\u0e1b\u0e25\u0e14\u0e25\u0e47\u0e2d\u0e01\u0e44\u0e14\u0e49\u0e40\u0e21\u0e37\u0e48\u0e2d\u0e23\u0e30\u0e14\u0e31\u0e1a {0}+ (BLAST MINING) -Mining.Ability.Locked.1=\u0e2a\u0e32\u0e21\u0e32\u0e23\u0e16\u0e1b\u0e25\u0e14\u0e25\u0e47\u0e2d\u0e01\u0e44\u0e14\u0e49\u0e40\u0e21\u0e37\u0e48\u0e2d\u0e23\u0e30\u0e14\u0e31\u0e1a {0}+ (BIGGER BOMBS) -Mining.Ability.Locked.2=\u0e2a\u0e32\u0e21\u0e32\u0e23\u0e16\u0e1b\u0e25\u0e14\u0e25\u0e47\u0e2d\u0e01\u0e44\u0e14\u0e49\u0e40\u0e21\u0e37\u0e48\u0e2d\u0e23\u0e30\u0e14\u0e31\u0e1a {0}+ (DEMOLITIONS EXPERTISE) -Mining.Ability.Lower=[[GRAY]]**\u0e22\u0e01\u0e40\u0e25\u0e34\u0e01\u0e01\u0e32\u0e23\u0e43\u0e0a\u0e49\u0e17\u0e31\u0e01\u0e29\u0e30\u0e02\u0e2d\u0e07 Pickaxe** -Mining.Ability.Ready=[[GREEN]]**\u0e04\u0e38\u0e13\u0e1e\u0e23\u0e49\u0e2d\u0e21\u0e17\u0e35\u0e48\u0e08\u0e30\u0e43\u0e0a\u0e49\u0e17\u0e31\u0e01\u0e29\u0e30\u0e02\u0e2d\u0e07 Pickaxe** +Herbalism.Skills.GTe.On=&a**ใช้ทักษะ GREEN TERRA** +Herbalism.Skills.GTe.Refresh=&aYour &eGreen Terra &aคูลดาวน์เสร็จแล้ว! +Herbalism.Skills.GTe.Other.Off=Green Terra&a รอการคูลดาวน์ &e{0} +Herbalism.Skills.GTe.Other.On=&a{0}&2 ได้ใช้ทักษะ &cGreen Terra! +Herbalism.Skillup=ทักษะ Herbalism เพิ่มขึ้น {0}. มีทั้งหมด ({1}) +Mining.Ability.Length=Super Breaker ระยะเวลา: &e{0}s +Mining.Ability.Locked.0=สามารถปลดล็อกได้เมื่อระดับ {0}+ (BLAST MINING) +Mining.Ability.Locked.1=สามารถปลดล็อกได้เมื่อระดับ {0}+ (BIGGER BOMBS) +Mining.Ability.Locked.2=สามารถปลดล็อกได้เมื่อระดับ {0}+ (DEMOLITIONS EXPERTISE) +Mining.Ability.Lower=&7**ยกเลิกการใช้ทักษะของ Pickaxe** +Mining.Ability.Ready=&a**คุณพร้อมที่จะใช้ทักษะของ Pickaxe** Mining.SubSkill.SuperBreaker.Name=Super Breaker -Mining.SubSkill.SuperBreaker.Description=+\u0e04\u0e27\u0e32\u0e21\u0e40\u0e23\u0e47\u0e27, \u0e40\u0e1e\u0e34\u0e48\u0e21\u0e42\u0e2d\u0e01\u0e32\u0e2a\u0e14\u0e23\u0e2d\u0e1b x3 +Mining.SubSkill.SuperBreaker.Description=+ความเร็ว, เพิ่มโอกาสดรอป x3 Mining.SubSkill.DoubleDrops.Name=Drops x2 -Mining.SubSkill.DoubleDrops.Description=\u0e40\u0e1e\u0e34\u0e48\u0e21\u0e2d\u0e31\u0e04\u0e23\u0e32\u0e01\u0e32\u0e23 Drops +Mining.SubSkill.DoubleDrops.Description=เพิ่มอัคราการ Drops Mining.SubSkill.BlastMining.Name=Blast Mining -Mining.SubSkill.BlastMining.Description=\u0e40\u0e1e\u0e34\u0e48\u0e21\u0e41\u0e23\u0e48\u0e08\u0e32\u0e01\u0e01\u0e32\u0e23\u0e43\u0e0a\u0e49 TNT +Mining.SubSkill.BlastMining.Description=เพิ่มแร่จากการใช้ TNT Mining.SubSkill.BiggerBombs.Name=Bigger Bombs -Mining.SubSkill.BiggerBombs.Description=\u0e40\u0e1e\u0e34\u0e48\u0e21\u0e23\u0e31\u0e28\u0e21\u0e35\u0e02\u0e2d\u0e07 TNT +Mining.SubSkill.BiggerBombs.Description=เพิ่มรัศมีของ TNT Mining.SubSkill.DemolitionsExpertise.Name=Demolitions Expertise -Mining.SubSkill.DemolitionsExpertise.Description=\u0e25\u0e14\u0e01\u0e32\u0e23\u0e44\u0e14\u0e49\u0e23\u0e31\u0e1a\u0e04\u0e27\u0e32\u0e21\u0e40\u0e2a\u0e35\u0e22\u0e2b\u0e32\u0e22\u0e08\u0e32\u0e01 TNT -Mining.Effect.Decrease=Demolitions \u0e25\u0e14\u0e04\u0e27\u0e32\u0e21\u0e40\u0e2a\u0e35\u0e22\u0e2b\u0e32\u0e22: [[YELLOW]]{0} -Mining.Effect.DropChance=Double Drop \u0e42\u0e2d\u0e01\u0e32\u0e2a: [[YELLOW]]{0} -Mining.Listener=\u0e17\u0e31\u0e01\u0e29\u0e30 Mining: +Mining.SubSkill.DemolitionsExpertise.Description=ลดการได้รับความเสียหายจาก TNT +Mining.Effect.Decrease=Demolitions ลดความเสียหาย: &e{0} +Mining.Effect.DropChance=Double Drop โอกาส: &e{0} +Mining.Listener=ทักษะ Mining: Mining.SkillName=MINING -Mining.Skills.SuperBreaker.Off=**\u0e17\u0e31\u0e01\u0e29\u0e30 Super Breaker \u0e2b\u0e21\u0e14\u0e2a\u0e20\u0e32\u0e1e** -Mining.Skills.SuperBreaker.On=[[GREEN]]**\u0e43\u0e0a\u0e49\u0e17\u0e31\u0e01\u0e29\u0e30 SUPER BREAKER** -Mining.Skills.SuperBreaker.Other.Off=Super Breaker[[GREEN]] \u0e23\u0e2d\u0e01\u0e32\u0e23\u0e04\u0e39\u0e25\u0e14\u0e32\u0e27\u0e19\u0e4c [[YELLOW]]{0} -Mining.Skills.SuperBreaker.Other.On=[[GREEN]]{0}[[DARK_GREEN]] \u0e44\u0e14\u0e49\u0e43\u0e0a\u0e49\u0e17\u0e31\u0e01\u0e29\u0e30 [[RED]]Super Breaker! -Mining.Skills.SuperBreaker.Refresh=[[GREEN]]\u0e04\u0e27\u0e32\u0e21\u0e2a\u0e32\u0e21\u0e23\u0e16\u0e17\u0e31\u0e01\u0e29\u0e30 [[YELLOW]]Super Breaker [[GREEN]]\u0e04\u0e39\u0e25\u0e14\u0e32\u0e27\u0e19\u0e4c\u0e40\u0e2a\u0e23\u0e47\u0e08\u0e41\u0e25\u0e49\u0e27! -Mining.Skillup=\u0e17\u0e31\u0e01\u0e29\u0e30 Mining \u0e40\u0e1e\u0e34\u0e48\u0e21\u0e02\u0e36\u0e49\u0e19 {0}. \u0e21\u0e35\u0e17\u0e31\u0e49\u0e07\u0e2b\u0e21\u0e14 ({1}) -Mining.Blast.Boom=[[GRAY]]**BOOM** -Mining.Blast.Effect=+{0} \u0e1c\u0e25\u0e1c\u0e25\u0e34\u0e15\u0e41\u0e23\u0e48, {1}x \u0e14\u0e23\u0e2d\u0e1b -Mining.Blast.Radius.Increase=\u0e23\u0e31\u0e28\u0e21\u0e35\u0e02\u0e2d\u0e07\u0e23\u0e30\u0e40\u0e1a\u0e34\u0e14\u0e40\u0e1e\u0e34\u0e48\u0e21\u0e02\u0e36\u0e49\u0e19: [[YELLOW]]+{0} -Mining.Blast.Rank=\u0e17\u0e31\u0e01\u0e29\u0e30 Blast Mining: [[YELLOW]] \u0e23\u0e30\u0e14\u0e31\u0e1a {0}/8 [[GRAY]]({1}) -Mining.Blast.Other.On=[[GREEN]]{0}[[DARK_GREEN]] \u0e44\u0e14\u0e49\u0e43\u0e0a\u0e49\u0e17\u0e31\u0e01\u0e29\u0e30 [[RED]]Blast Mining! -Mining.Blast.Refresh=[[GREEN]]\u0e04\u0e27\u0e32\u0e21\u0e2a\u0e32\u0e21\u0e32\u0e23\u0e16\u0e17\u0e31\u0e01\u0e29\u0e30 [[YELLOW]]Blast Mining [[GREEN]]\u0e04\u0e39\u0e25\u0e14\u0e32\u0e27\u0e19\u0e4c\u0e40\u0e2a\u0e23\u0e47\u0e08\u0e41\u0e25\u0e49\u0e27! -Repair.SubSkill.Repair.Name=\u0e0b\u0e48\u0e2d\u0e21\u0e41\u0e0b\u0e21 -Repair.SubSkill.Repair.Description=\u0e0b\u0e48\u0e2d\u0e21\u0e41\u0e0b\u0e21\u0e2d\u0e38\u0e1b\u0e01\u0e23\u0e13\u0e4c\u0e41\u0e25\u0e30\u0e40\u0e01\u0e23\u0e32\u0e30 -Repair.SubSkill.GoldRepair.Name=\u0e0b\u0e48\u0e2d\u0e21\u0e2d\u0e38\u0e1b\u0e01\u0e23\u0e13\u0e4c\u0e17\u0e2d\u0e07 (\u0e17\u0e31\u0e01\u0e29\u0e30\u0e15\u0e49\u0e2d\u0e07\u0e01\u0e32\u0e23 {0}+) -Repair.SubSkill.GoldRepair.Description=\u0e0b\u0e48\u0e2d\u0e21\u0e41\u0e0b\u0e21 \u0e2d\u0e38\u0e1b\u0e01\u0e23\u0e13\u0e4c\u0e17\u0e2d\u0e07\u0e41\u0e25\u0e30\u0e40\u0e01\u0e23\u0e32\u0e30 -Repair.SubSkill.IronRepair.Name=\u0e0b\u0e48\u0e2d\u0e21\u0e2d\u0e38\u0e1b\u0e01\u0e23\u0e13\u0e4c\u0e40\u0e2b\u0e25\u0e47\u0e01 (\u0e17\u0e31\u0e01\u0e29\u0e30\u0e15\u0e49\u0e2d\u0e07\u0e01\u0e32\u0e23 {0}+) -Repair.SubSkill.IronRepair.Description=\u0e0b\u0e48\u0e2d\u0e21\u0e41\u0e0b\u0e21 \u0e2d\u0e38\u0e1b\u0e01\u0e23\u0e13\u0e4c\u0e40\u0e2b\u0e25\u0e47\u0e01\u0e41\u0e25\u0e30\u0e40\u0e01\u0e23\u0e32\u0e30 -Repair.SubSkill.StoneRepair.Name=\u0e0b\u0e48\u0e2d\u0e21\u0e2d\u0e38\u0e1b\u0e01\u0e23\u0e13\u0e4c\u0e2b\u0e34\u0e19 (\u0e17\u0e31\u0e01\u0e29\u0e30\u0e15\u0e49\u0e2d\u0e07\u0e01\u0e32\u0e23 {0}+) -Repair.SubSkill.StoneRepair.Description=\u0e0b\u0e48\u0e2d\u0e21\u0e41\u0e0b\u0e21\u0e2d\u0e38\u0e1b\u0e01\u0e23\u0e13\u0e4c\u0e2b\u0e34\u0e19 -Repair.SubSkill.RepairMastery.Name=\u0e17\u0e31\u0e01\u0e29\u0e30 Repair Mastery -Repair.SubSkill.RepairMastery.Description=\u0e08\u0e33\u0e19\u0e27\u0e19\u0e40\u0e07\u0e34\u0e19\u0e17\u0e35\u0e48\u0e40\u0e1e\u0e34\u0e48\u0e21\u0e02\u0e36\u0e49\u0e19\u0e43\u0e19\u0e01\u0e32\u0e23\u0e0b\u0e48\u0e2d\u0e21 +Mining.Skills.SuperBreaker.Off=**ทักษะ Super Breaker หมดสภาพ** +Mining.Skills.SuperBreaker.On=&a**ใช้ทักษะ SUPER BREAKER** +Mining.Skills.SuperBreaker.Other.Off=Super Breaker&a รอการคูลดาวน์ &e{0} +Mining.Skills.SuperBreaker.Other.On=&a{0}&2 ได้ใช้ทักษะ &cSuper Breaker! +Mining.Skills.SuperBreaker.Refresh=&aความสามรถทักษะ &eSuper Breaker &aคูลดาวน์เสร็จแล้ว! +Mining.Skillup=ทักษะ Mining เพิ่มขึ้น {0}. มีทั้งหมด ({1}) +Mining.Blast.Boom=&7**BOOM** +Mining.Blast.Effect=+{0} ผลผลิตแร่, {1}x ดรอป +Mining.Blast.Radius.Increase=รัศมีของระเบิดเพิ่มขึ้น: &e+{0} +Mining.Blast.Rank=ทักษะ Blast Mining: &e ระดับ {0}/8 &7({1}) +Mining.Blast.Other.On=&a{0}&2 ได้ใช้ทักษะ &cBlast Mining! +Mining.Blast.Refresh=&aความสามารถทักษะ &eBlast Mining &aคูลดาวน์เสร็จแล้ว! +Repair.SubSkill.Repair.Name=ซ่อมแซม +Repair.SubSkill.Repair.Description=ซ่อมแซมอุปกรณ์และเกราะ +Repair.SubSkill.GoldRepair.Name=ซ่อมอุปกรณ์ทอง (ทักษะต้องการ {0}+) +Repair.SubSkill.GoldRepair.Description=ซ่อมแซม อุปกรณ์ทองและเกราะ +Repair.SubSkill.IronRepair.Name=ซ่อมอุปกรณ์เหล็ก (ทักษะต้องการ {0}+) +Repair.SubSkill.IronRepair.Description=ซ่อมแซม อุปกรณ์เหล็กและเกราะ +Repair.SubSkill.StoneRepair.Name=ซ่อมอุปกรณ์หิน (ทักษะต้องการ {0}+) +Repair.SubSkill.StoneRepair.Description=ซ่อมแซมอุปกรณ์หิน +Repair.SubSkill.RepairMastery.Name=ทักษะ Repair Mastery +Repair.SubSkill.RepairMastery.Description=จำนวนเงินที่เพิ่มขึ้นในการซ่อม Repair.SubSkill.SuperRepair.Name=Super Repair -Repair.SubSkill.SuperRepair.Description=\u0e1c\u0e25\u0e01\u0e32\u0e23\u0e44\u0e14\u0e49 Double -Repair.SubSkill.DiamondRepair.Name=\u0e17\u0e31\u0e01\u0e29\u0e30 Diamond Repair ({0}+ SKILL) -Repair.SubSkill.DiamondRepair.Description=\u0e0b\u0e48\u0e2d\u0e21\u0e41\u0e0b\u0e21 \u0e2d\u0e38\u0e1b\u0e01\u0e23\u0e13\u0e4c\u0e40\u0e1e\u0e0a\u0e23\u0e41\u0e25\u0e30\u0e40\u0e01\u0e23\u0e32\u0e30 +Repair.SubSkill.SuperRepair.Description=ผลการได้ Double +Repair.SubSkill.DiamondRepair.Name=ทักษะ Diamond Repair ({0}+ SKILL) +Repair.SubSkill.DiamondRepair.Description=ซ่อมแซม อุปกรณ์เพชรและเกราะ Repair.SubSkill.ArcaneForging.Name=Arcane Forging -Repair.SubSkill.ArcaneForging.Description=\u0e0b\u0e48\u0e2d\u0e21\u0e2a\u0e34\u0e48\u0e07\u0e02\u0e2d\u0e07\u0e44\u0e14\u0e49\u0e23\u0e31\u0e1a\u0e01\u0e32\u0e23\u0e40\u0e1e\u0e34\u0e48\u0e21\u0e1b\u0e23\u0e30\u0e2a\u0e34\u0e17\u0e18\u0e34\u0e20\u0e32\u0e1e\u0e02\u0e36\u0e49\u0e19 -Repair.SubSkill.Salvage.Name=\u0e17\u0e31\u0e01\u0e29\u0e30 Salvage (\u0e15\u0e49\u0e2d\u0e07\u0e01\u0e32\u0e23\u0e17\u0e31\u0e01\u0e29\u0e30 {0}+) -Repair.SubSkill.Salvage.Description=\u0e01\u0e39\u0e2d\u0e38\u0e1b\u0e01\u0e23\u0e13\u0e4c\u0e41\u0e25\u0e30\u0e40\u0e01\u0e23\u0e32\u0e30 -Repair.Error=[[DARK_RED]]mcMMO \u0e1e\u0e1a\u0e02\u0e49\u0e2d\u0e1c\u0e34\u0e14\u0e1e\u0e25\u0e32\u0e14\u0e1e\u0e22\u0e32\u0e22\u0e32\u0e21\u0e17\u0e35\u0e48\u0e08\u0e30\u0e0b\u0e48\u0e2d\u0e21\u0e41\u0e0b\u0e21\u0e2a\u0e34\u0e19\u0e04\u0e49\u0e32\u0e23\u0e32\u0e22\u0e01\u0e32\u0e23\u0e19\u0e35\u0e49! -Repair.Listener.Anvil=[[DARK_RED]]\u0e04\u0e38\u0e13\u0e44\u0e14\u0e49\u0e27\u0e32\u0e07 Anvil \u0e2a\u0e32\u0e21\u0e32\u0e23\u0e16\u0e0b\u0e48\u0e2d\u0e21\u0e41\u0e0b\u0e21\u0e40\u0e04\u0e23\u0e37\u0e48\u0e2d\u0e07\u0e21\u0e37\u0e2d\u0e41\u0e25\u0e30\u0e40\u0e01\u0e23\u0e32\u0e30. -Repair.Listener.Anvil2=[[DARK_RED]]\u0e04\u0e38\u0e13\u0e44\u0e14\u0e49\u0e27\u0e32\u0e07\u0e17\u0e31\u0e48\u0e07\u0e2a\u0e32\u0e21\u0e32\u0e23\u0e16\u0e01\u0e39\u0e49\u0e40\u0e04\u0e23\u0e37\u0e48\u0e2d\u0e07\u0e21\u0e37\u0e2d\u0e41\u0e25\u0e30\u0e40\u0e01\u0e23\u0e32\u0e30. -Repair.Listener=\u0e17\u0e31\u0e01\u0e29\u0e30 Repair: +Repair.SubSkill.ArcaneForging.Description=ซ่อมสิ่งของได้รับการเพิ่มประสิทธิภาพขึ้น +Repair.SubSkill.Salvage.Name=ทักษะ Salvage (ต้องการทักษะ {0}+) +Repair.SubSkill.Salvage.Description=กูอุปกรณ์และเกราะ +Repair.Error=&4mcMMO พบข้อผิดพลาดพยายามที่จะซ่อมแซมสินค้ารายการนี้! +Repair.Listener.Anvil=&4คุณได้วาง Anvil สามารถซ่อมแซมเครื่องมือและเกราะ. +Repair.Listener.Anvil2=&4คุณได้วางทั่งสามารถกู้เครื่องมือและเกราะ. +Repair.Listener=ทักษะ Repair: Repair.SkillName=REPAIR -Repair.Skills.AdeptSalvage=[[DARK_RED]]\u0e04\u0e38\u0e13\u0e44\u0e21\u0e48\u0e0a\u0e33\u0e19\u0e32\u0e0d\u0e1e\u0e2d\u0e17\u0e35\u0e48\u0e08\u0e30\u0e01\u0e2d\u0e1a\u0e01\u0e39\u0e49\u0e2a\u0e34\u0e48\u0e07\u0e02\u0e2d\u0e07\u0e19\u0e35\u0e49. -Repair.Skills.AdeptDiamond=[[DARK_RED]]\u0e17\u0e31\u0e01\u0e29\u0e30 Repair \u0e44\u0e21\u0e48\u0e1e\u0e2d\u0e17\u0e35\u0e48\u0e08\u0e30\u0e0b\u0e48\u0e2d\u0e21\u0e2d\u0e38\u0e1b\u0e01\u0e23\u0e13\u0e4c\u0e40\u0e1e\u0e0a\u0e23. -Repair.Skills.AdeptGold=[[DARK_RED]]\u0e17\u0e31\u0e01\u0e29\u0e30 Repair \u0e44\u0e21\u0e48\u0e1e\u0e2d\u0e17\u0e35\u0e48\u0e08\u0e30\u0e0b\u0e48\u0e2d\u0e21\u0e2d\u0e38\u0e1b\u0e01\u0e23\u0e13\u0e4c\u0e17\u0e2d\u0e07. -Repair.Skills.AdeptIron=[[DARK_RED]]\u0e17\u0e31\u0e01\u0e29\u0e30 Repair \u0e44\u0e21\u0e48\u0e1e\u0e2d\u0e17\u0e35\u0e48\u0e08\u0e30\u0e0b\u0e48\u0e2d\u0e21\u0e2d\u0e38\u0e1b\u0e01\u0e23\u0e13\u0e4c\u0e40\u0e2b\u0e25\u0e47\u0e01. -Repair.Skills.AdeptStone=[[DARK_RED]]\u0e17\u0e31\u0e01\u0e29\u0e30 Repair \u0e44\u0e21\u0e48\u0e1e\u0e2d\u0e17\u0e35\u0e48\u0e08\u0e30\u0e0b\u0e48\u0e2d\u0e21\u0e2d\u0e38\u0e1b\u0e01\u0e23\u0e13\u0e4c\u0e2b\u0e34\u0e19. -Repair.Skills.Adept=\u0e04\u0e38\u0e13\u0e21\u0e35\u0e23\u0e30\u0e14\u0e31\u0e1a\u0e01\u0e32\u0e23\u0e0b\u0e48\u0e2d\u0e21\u0e41\u0e0b\u0e21 [[YELLOW]]{0}[[RED]] \u0e40\u0e1e\u0e35\u0e22\u0e07\u0e1e\u0e2d\u0e17\u0e35\u0e48\u0e08\u0e30\u0e0b\u0e48\u0e2d\u0e21\u0e41\u0e0b\u0e21 [[YELLOW]]{1} -Repair.Skills.FeltEasy=[[GRAY]]\u0e23\u0e39\u0e49\u0e2a\u0e36\u0e01\u0e27\u0e48\u0e32\u0e21\u0e31\u0e19\u0e07\u0e48\u0e32\u0e22. -Repair.Skills.FullDurability=[[GRAY]]\u0e2a\u0e34\u0e48\u0e07\u0e19\u0e35\u0e49\u0e21\u0e35\u0e04\u0e27\u0e32\u0e21\u0e04\u0e07\u0e17\u0e19\u0e40\u0e15\u0e47\u0e21\u0e41\u0e25\u0e49\u0e27. -Repair.Skills.SalvageSuccess=[[GRAY]]\u0e2a\u0e34\u0e48\u0e07\u0e02\u0e2d\u0e07\u0e16\u0e39\u0e01\u0e01\u0e39\u0e49\u0e04\u0e37\u0e19! -Repair.Skills.NotFullDurability=[[DARK_RED]]\u0e04\u0e38\u0e13\u0e44\u0e21\u0e48\u0e2a\u0e32\u0e21\u0e32\u0e23\u0e16\u0e01\u0e2d\u0e1a\u0e01\u0e39\u0e49\u0e04\u0e27\u0e32\u0e21\u0e40\u0e2a\u0e35\u0e22\u0e2b\u0e32\u0e22\u0e2a\u0e34\u0e48\u0e07\u0e02\u0e2d\u0e07\u0e19\u0e35\u0e49. -Repair.Skills.Mastery=Repair Mastery: [[YELLOW]]\u0e40\u0e1e\u0e34\u0e48\u0e21 {0} \u0e15\u0e48\u0e2d\u0e01\u0e32\u0e23\u0e0b\u0e48\u0e2d\u0e21\u0e41\u0e0b\u0e21 -Repair.Skills.StackedItems=[[DARK_RED]]\u0e04\u0e38\u0e13\u0e44\u0e21\u0e48\u0e2a\u0e32\u0e21\u0e32\u0e23\u0e16\u0e0b\u0e48\u0e2d\u0e21\u0e41\u0e0b\u0e21\u0e23\u0e32\u0e22\u0e01\u0e32\u0e23\u0e0b\u0e49\u0e2d\u0e19\u0e01\u0e31\u0e19\u0e44\u0e14\u0e49. -Repair.Skills.Super.Chance=Super Repair \u0e42\u0e2d\u0e01\u0e32\u0e2a: [[YELLOW]]{0} -Repair.Skillup=\u0e17\u0e31\u0e01\u0e29\u0e30 Repair \u0e40\u0e1e\u0e34\u0e48\u0e21\u0e02\u0e36\u0e49\u0e19 {0}. \u0e21\u0e35\u0e17\u0e31\u0e49\u0e07\u0e2b\u0e21\u0e14 ({1}) +Repair.Skills.AdeptSalvage=&4คุณไม่ชำนาญพอที่จะกอบกู้สิ่งของนี้. +Repair.Skills.AdeptDiamond=&4ทักษะ Repair ไม่พอที่จะซ่อมอุปกรณ์เพชร. +Repair.Skills.AdeptGold=&4ทักษะ Repair ไม่พอที่จะซ่อมอุปกรณ์ทอง. +Repair.Skills.AdeptIron=&4ทักษะ Repair ไม่พอที่จะซ่อมอุปกรณ์เหล็ก. +Repair.Skills.AdeptStone=&4ทักษะ Repair ไม่พอที่จะซ่อมอุปกรณ์หิน. +Repair.Skills.Adept=คุณมีระดับการซ่อมแซม &e{0}&c เพียงพอที่จะซ่อมแซม &e{1} +Repair.Skills.FeltEasy=&7รู้สึกว่ามันง่าย. +Repair.Skills.FullDurability=&7สิ่งนี้มีความคงทนเต็มแล้ว. +Repair.Skills.SalvageSuccess=&7สิ่งของถูกกู้คืน! +Repair.Skills.NotFullDurability=&4คุณไม่สามารถกอบกู้ความเสียหายสิ่งของนี้. +Repair.Skills.Mastery=Repair Mastery: &eเพิ่ม {0} ต่อการซ่อมแซม +Repair.Skills.StackedItems=&4คุณไม่สามารถซ่อมแซมรายการซ้อนกันได้. +Repair.Skills.Super.Chance=Super Repair โอกาส: &e{0} +Repair.Skillup=ทักษะ Repair เพิ่มขึ้น {0}. มีทั้งหมด ({1}) Repair.Pretty.Name=Repair Salvage.Pretty.Name=Salvage -Repair.Arcane.Chance.Downgrade=[[GRAY]]AF \u0e21\u0e35\u0e42\u0e2d\u0e01\u0e32\u0e2a\u0e25\u0e14\u0e04\u0e27\u0e32\u0e21\u0e40\u0e2a\u0e35\u0e22\u0e2b\u0e32\u0e22: [[YELLOW]]{0}% -Repair.Arcane.Chance.Success=[[GRAY]]AF \u0e42\u0e2d\u0e01\u0e32\u0e2a\u0e2a\u0e33\u0e40\u0e23\u0e47\u0e08: [[YELLOW]]{0}% -Repair.Arcane.Downgrade=\u0e2d\u0e33\u0e19\u0e32\u0e08\u0e25\u0e35\u0e49\u0e25\u0e31\u0e1a\u0e44\u0e14\u0e49\u0e25\u0e14\u0e25\u0e07\u0e2a\u0e33\u0e2b\u0e23\u0e31\u0e1a\u0e23\u0e32\u0e22\u0e01\u0e32\u0e23\u0e19\u0e35\u0e49. -Repair.Arcane.Fail=\u0e2d\u0e33\u0e19\u0e32\u0e08\u0e25\u0e35\u0e49\u0e25\u0e31\u0e1a\u0e44\u0e14\u0e49\u0e17\u0e34\u0e49\u0e07\u0e2d\u0e22\u0e48\u0e32\u0e07\u0e16\u0e32\u0e27\u0e23. -Repair.Arcane.Lost=\u0e04\u0e38\u0e13\u0e44\u0e21\u0e48\u0e21\u0e35\u0e17\u0e31\u0e01\u0e29\u0e30\u0e1e\u0e2d\u0e17\u0e35\u0e48\u0e08\u0e30\u0e40\u0e1e\u0e34\u0e48\u0e21\u0e1b\u0e23\u0e30\u0e2a\u0e34\u0e17\u0e18\u0e34\u0e20\u0e32\u0e1e -Repair.Arcane.Perfect=[[GREEN]]\u0e04\u0e38\u0e13\u0e44\u0e14\u0e49\u0e2d\u0e22\u0e48\u0e32\u0e07\u0e22\u0e31\u0e48\u0e07\u0e22\u0e37\u0e19\u0e1e\u0e25\u0e31\u0e07\u0e07\u0e32\u0e19\u0e25\u0e35\u0e49\u0e25\u0e31\u0e1a\u0e43\u0e19\u0e23\u0e32\u0e22\u0e01\u0e32\u0e23\u0e19\u0e35\u0e49. -Repair.Arcane.Rank=Arcane Forging \u0e23\u0e30\u0e14\u0e31\u0e1a: [[YELLOW]]{0}/4 -Swords.Ability.Lower=[[GRAY]]**\u0e22\u0e01\u0e40\u0e25\u0e34\u0e01\u0e01\u0e32\u0e23\u0e43\u0e0a\u0e49\u0e17\u0e31\u0e01\u0e29\u0e30 Sword** -Swords.Ability.Ready=[[GREEN]]**\u0e04\u0e38\u0e13\u0e1e\u0e23\u0e49\u0e2d\u0e21\u0e17\u0e35\u0e48\u0e08\u0e30\u0e43\u0e0a\u0e49\u0e17\u0e31\u0e01\u0e29\u0e30\u0e02\u0e2d\u0e07 Sword** -Swords.Combat.Bleed.Chance=Bleed \u0e42\u0e2d\u0e01\u0e32\u0e2a: [[YELLOW]]{0} -Swords.Combat.Bleed.Length=Bleed \u0e21\u0e35\u0e23\u0e30\u0e22\u0e30\u0e40\u0e27\u0e25\u0e32: [[YELLOW]]{0} ticks -Swords.Combat.Bleed.Note=[[GRAY]]NOTE: [[YELLOW]]1 Tick \u0e40\u0e01\u0e34\u0e14\u0e02\u0e36\u0e49\u0e19\u0e17\u0e38\u0e01 2 \u0e27\u0e34\u0e19\u0e32\u0e17\u0e35 -Swords.Combat.Bleeding.Started=[[DARK_RED]] \u0e04\u0e38\u0e13\u0e01\u0e33\u0e25\u0e31\u0e07\u0e40\u0e25\u0e37\u0e2d\u0e14\u0e44\u0e2b\u0e25! -Swords.Combat.Bleeding.Stopped=[[GRAY]]\u0e17\u0e31\u0e01\u0e29\u0e30 Enemy Bleeding \u0e2b\u0e21\u0e14\u0e2a\u0e20\u0e32\u0e1e[[GREEN]] -Swords.Combat.Bleeding=[[GREEN]]**\u0e43\u0e0a\u0e49\u0e17\u0e31\u0e01\u0e29\u0e30 ENEMY BLEEDING** -Swords.Combat.Counter.Chance=Counter Attack \u0e42\u0e2d\u0e01\u0e32\u0e2a: [[YELLOW]]{0} -Swords.Combat.Counter.Hit=[[DARK_RED]]\u0e42\u0e08\u0e21\u0e15\u0e35\u0e14\u0e49\u0e27\u0e22 counter-attack! -Swords.Combat.Countered=[[GREEN]]**\u0e43\u0e0a\u0e49\u0e17\u0e31\u0e01\u0e29\u0e30 COUNTER-ATTACKED** -Swords.Combat.SS.Struck=[[DARK_RED]]\u0e23\u0e39\u0e49\u0e2a\u0e36\u0e01\u0e21\u0e36\u0e19\u0e07\u0e07 \u0e40\u0e1e\u0e23\u0e32\u0e30 \u0e17\u0e31\u0e01\u0e29\u0e30 SERRATED STRIKES! +Repair.Arcane.Chance.Downgrade=&7AF มีโอกาสลดความเสียหาย: &e{0}% +Repair.Arcane.Chance.Success=&7AF โอกาสสำเร็จ: &e{0}% +Repair.Arcane.Downgrade=อำนาจลี้ลับได้ลดลงสำหรับรายการนี้. +Repair.Arcane.Fail=อำนาจลี้ลับได้ทิ้งอย่างถาวร. +Repair.Arcane.Lost=คุณไม่มีทักษะพอที่จะเพิ่มประสิทธิภาพ +Repair.Arcane.Perfect=&aคุณได้อย่างยั่งยืนพลังงานลี้ลับในรายการนี้. +Repair.Arcane.Rank=Arcane Forging ระดับ: &e{0}/4 +Swords.Ability.Lower=&7**ยกเลิกการใช้ทักษะ Sword** +Swords.Ability.Ready=&a**คุณพร้อมที่จะใช้ทักษะของ Sword** +Swords.Combat.Bleed.Chance=Bleed โอกาส: &e{0} +Swords.Combat.Bleed.Length=Bleed มีระยะเวลา: &e{0} ticks +Swords.Combat.Bleed.Note=&7NOTE: &e1 Tick เกิดขึ้นทุก 2 วินาที +Swords.Combat.Bleeding.Started=&4 คุณกำลังเลือดไหล! +Swords.Combat.Bleeding.Stopped=&7ทักษะ Enemy Bleeding หมดสภาพ&a +Swords.Combat.Bleeding=&a**ใช้ทักษะ ENEMY BLEEDING** +Swords.Combat.Counter.Chance=Counter Attack โอกาส: &e{0} +Swords.Combat.Counter.Hit=&4โจมตีด้วย counter-attack! +Swords.Combat.Countered=&a**ใช้ทักษะ COUNTER-ATTACKED** +Swords.Combat.SS.Struck=&4รู้สึกมึนงง เพราะ ทักษะ SERRATED STRIKES! Swords.SubSkill.CounterAttack.Name=Counter Attack Swords.SubSkill.SerratedStrikes.Name=Serrated Strikes -Swords.SubSkill.SerratedStrikes.Description={0} \u0e04\u0e27\u0e32\u0e21\u0e40\u0e2a\u0e35\u0e22\u0e2b\u0e32\u0e22\u0e01\u0e23\u0e30\u0e08\u0e32\u0e22, \u0e40\u0e25\u0e37\u0e2d\u0e14\u0e44\u0e2b\u0e25+ \u0e01\u0e23\u0e30\u0e08\u0e32\u0e22 +Swords.SubSkill.SerratedStrikes.Description={0} ความเสียหายกระจาย, เลือดไหล+ กระจาย Swords.Effect.4=Serrated Strikes Bleed+ -Swords.Effect.5={0} Tick \u0e15\u0e48\u0e2d\u0e01\u0e32\u0e23\u0e40\u0e25\u0e37\u0e2d\u0e14\u0e44\u0e2b\u0e25 +Swords.Effect.5={0} Tick ต่อการเลือดไหล Swords.SubSkill.Bleed.Name=Bleed -Swords.SubSkill.Bleed.Description=\u0e40\u0e25\u0e37\u0e2d\u0e14\u0e44\u0e2b\u0e25\u0e2d\u0e2d\u0e01 -Swords.Listener=\u0e17\u0e31\u0e01\u0e29\u0e30 Swords: +Swords.SubSkill.Bleed.Description=เลือดไหลออก +Swords.Listener=ทักษะ Swords: Swords.SkillName=SWORDS -Swords.Skills.SS.Off=**\u0e17\u0e31\u0e01\u0e29\u0e30 Serrated Strikes \u0e2b\u0e21\u0e14\u0e2a\u0e20\u0e32\u0e1e** -Swords.Skills.SS.On=[[GREEN]]**\u0e43\u0e0a\u0e49\u0e17\u0e31\u0e01\u0e28\u0e30 SERRATED STRIKES** -Swords.Skills.SS.Refresh=[[GREEN]]\u0e04\u0e27\u0e32\u0e21\u0e2a\u0e32\u0e21\u0e32\u0e23\u0e16\u0e17\u0e31\u0e01\u0e29\u0e30 [[YELLOW]]Serrated Strikes [[GREEN]]\u0e04\u0e39\u0e25\u0e14\u0e32\u0e27\u0e19\u0e4c\u0e40\u0e2a\u0e23\u0e47\u0e08\u0e41\u0e25\u0e49\u0e27! -Swords.Skills.SS.Other.Off=Serrated Strikes[[GREEN]] \u0e23\u0e2d\u0e01\u0e32\u0e23\u0e04\u0e39\u0e25\u0e14\u0e32\u0e27\u0e19\u0e4c [[YELLOW]]{0} -Swords.Skills.SS.Other.On=[[GREEN]]{0}[[DARK_GREEN]] \u0e44\u0e14\u0e49\u0e43\u0e0a\u0e49\u0e17\u0e31\u0e01\u0e29\u0e30 [[RED]]Serrated Strikes! -Swords.Skillup=\u0e17\u0e31\u0e01\u0e29\u0e30 Swords \u0e40\u0e1e\u0e34\u0e48\u0e21\u0e02\u0e36\u0e49\u0e19 {0}. \u0e21\u0e35\u0e17\u0e31\u0e49\u0e07\u0e2b\u0e21\u0e14 ({1}) -Swords.SS.Length=Serrated Strikes \u0e21\u0e35\u0e23\u0e30\u0e22\u0e30\u0e40\u0e27\u0e25\u0e32: [[YELLOW]]{0}\u0e27\u0e34\u0e19\u0e32\u0e17\u0e35 +Swords.Skills.SS.Off=**ทักษะ Serrated Strikes หมดสภาพ** +Swords.Skills.SS.On=&a**ใช้ทักศะ SERRATED STRIKES** +Swords.Skills.SS.Refresh=&aความสามารถทักษะ &eSerrated Strikes &aคูลดาวน์เสร็จแล้ว! +Swords.Skills.SS.Other.Off=Serrated Strikes&a รอการคูลดาวน์ &e{0} +Swords.Skills.SS.Other.On=&a{0}&2 ได้ใช้ทักษะ &cSerrated Strikes! +Swords.Skillup=ทักษะ Swords เพิ่มขึ้น {0}. มีทั้งหมด ({1}) +Swords.SS.Length=Serrated Strikes มีระยะเวลา: &e{0}วินาที Taming.Ability.Bonus.0=Environmentally Aware -Taming.Ability.Bonus.1=\u0e2b\u0e21\u0e32\u0e1b\u0e48\u0e32\u0e2b\u0e25\u0e35\u0e01\u0e40\u0e25\u0e35\u0e48\u0e22\u0e07\u0e2d\u0e31\u0e19\u0e15\u0e23\u0e32\u0e22 +Taming.Ability.Bonus.1=หมาป่าหลีกเลี่ยงอันตราย Taming.Ability.Bonus.2=Thick Fur -Taming.Ability.Bonus.3=1/{0} \u0e04\u0e27\u0e32\u0e21\u0e40\u0e2a\u0e35\u0e22\u0e2b\u0e32\u0e22 \u0e15\u0e49\u0e32\u0e19\u0e17\u0e32\u0e19\u0e44\u0e1f +Taming.Ability.Bonus.3=1/{0} ความเสียหาย ต้านทานไฟ Taming.Ability.Bonus.4=Shock Proof -Taming.Ability.Bonus.5=\u0e41\u0e23\u0e07\u0e23\u0e30\u0e40\u0e1a\u0e34\u0e14\u0e40\u0e1b\u0e47\u0e19 1/{0} \u0e08\u0e32\u0e01\u0e04\u0e27\u0e32\u0e21\u0e40\u0e2a\u0e35\u0e22\u0e2b\u0e32\u0e22\u0e1b\u0e01\u0e15\u0e34 +Taming.Ability.Bonus.5=แรงระเบิดเป็น 1/{0} จากความเสียหายปกติ Taming.Ability.Bonus.6=Sharpened Claws -Taming.Ability.Bonus.7=\u0e04\u0e27\u0e32\u0e21\u0e40\u0e2a\u0e35\u0e22\u0e2b\u0e32\u0e22+{0} +Taming.Ability.Bonus.7=ความเสียหาย+{0} Taming.Ability.Bonus.8=Fast Food Service -Taming.Ability.Bonus.9={0} \u0e42\u0e2d\u0e01\u0e32\u0e2a\u0e40\u0e21\u0e37\u0e48\u0e2d\u0e42\u0e08\u0e21\u0e15\u0e35\u0e41\u0e25\u0e49\u0e27\u0e08\u0e30\u0e40\u0e1e\u0e34\u0e48\u0e21\u0e1e\u0e25\u0e31\u0e07\u0e0a\u0e35\u0e27\u0e34\u0e15 +Taming.Ability.Bonus.9={0} โอกาสเมื่อโจมตีแล้วจะเพิ่มพลังชีวิต Taming.Ability.Bonus.10=Holy Hound -Taming.Ability.Bonus.11=\u0e1f\u0e37\u0e49\u0e19\u0e2a\u0e38\u0e02\u0e20\u0e32\u0e1e\u0e40\u0e21\u0e37\u0e48\u0e2d\u0e40\u0e01\u0e34\u0e14\u0e04\u0e27\u0e32\u0e21\u0e40\u0e2a\u0e35\u0e22\u0e2b\u0e32\u0e22\u0e08\u0e32\u0e01\u0e40\u0e27\u0e17\u0e21\u0e19\u0e15\u0e23\u0e4c\u0e2b\u0e23\u0e37\u0e2d\u0e22\u0e32\u0e1e\u0e34\u0e29 -Taming.Ability.Locked.0=\u0e2a\u0e32\u0e21\u0e32\u0e23\u0e16\u0e1b\u0e25\u0e14\u0e25\u0e47\u0e2d\u0e01\u0e44\u0e14\u0e49\u0e40\u0e21\u0e37\u0e48\u0e2d\u0e23\u0e30\u0e14\u0e31\u0e1a {0}+ (ENVIRONMENTALLY AWARE) -Taming.Ability.Locked.1=\u0e2a\u0e32\u0e21\u0e32\u0e23\u0e16\u0e1b\u0e25\u0e14\u0e25\u0e47\u0e2d\u0e01\u0e44\u0e14\u0e49\u0e40\u0e21\u0e37\u0e48\u0e2d\u0e23\u0e30\u0e14\u0e31\u0e1a {0}+ (THICK FUR) -Taming.Ability.Locked.2=\u0e2a\u0e32\u0e21\u0e32\u0e23\u0e16\u0e1b\u0e25\u0e14\u0e25\u0e47\u0e2d\u0e01\u0e44\u0e14\u0e49\u0e40\u0e21\u0e37\u0e48\u0e2d\u0e23\u0e30\u0e14\u0e31\u0e1a {0}+ (SHOCK PROOF) -Taming.Ability.Locked.3=\u0e2a\u0e32\u0e21\u0e32\u0e23\u0e16\u0e1b\u0e25\u0e14\u0e25\u0e47\u0e2d\u0e01\u0e44\u0e14\u0e49\u0e40\u0e21\u0e37\u0e48\u0e2d\u0e23\u0e30\u0e14\u0e31\u0e1a {0}+ (SHARPENED CLAWS) -Taming.Ability.Locked.4=\u0e2a\u0e32\u0e21\u0e32\u0e23\u0e16\u0e1b\u0e25\u0e14\u0e25\u0e47\u0e2d\u0e01\u0e44\u0e14\u0e49\u0e40\u0e21\u0e37\u0e48\u0e2d\u0e23\u0e30\u0e14\u0e31\u0e1a {0}+ (FAST FOOD SERVICE) -Taming.Ability.Locked.5=\u0e2a\u0e32\u0e21\u0e32\u0e23\u0e16\u0e1b\u0e25\u0e14\u0e25\u0e47\u0e2d\u0e01\u0e44\u0e14\u0e49\u0e40\u0e21\u0e37\u0e48\u0e2d\u0e23\u0e30\u0e14\u0e31\u0e1a {0}+ (HOLY HOUND) -Taming.Combat.Chance.Gore=Gore \u0e42\u0e2d\u0e01\u0e32\u0e2a: [[YELLOW]]{0} +Taming.Ability.Bonus.11=ฟื้นสุขภาพเมื่อเกิดความเสียหายจากเวทมนตร์หรือยาพิษ +Taming.Ability.Locked.0=สามารถปลดล็อกได้เมื่อระดับ {0}+ (ENVIRONMENTALLY AWARE) +Taming.Ability.Locked.1=สามารถปลดล็อกได้เมื่อระดับ {0}+ (THICK FUR) +Taming.Ability.Locked.2=สามารถปลดล็อกได้เมื่อระดับ {0}+ (SHOCK PROOF) +Taming.Ability.Locked.3=สามารถปลดล็อกได้เมื่อระดับ {0}+ (SHARPENED CLAWS) +Taming.Ability.Locked.4=สามารถปลดล็อกได้เมื่อระดับ {0}+ (FAST FOOD SERVICE) +Taming.Ability.Locked.5=สามารถปลดล็อกได้เมื่อระดับ {0}+ (HOLY HOUND) +Taming.Combat.Chance.Gore=Gore โอกาส: &e{0} Taming.SubSkill.BeastLore.Name=Beast Lore -Taming.SubSkill.BeastLore.Description=\u0e01\u0e23\u0e30\u0e14\u0e39\u0e01\u0e43\u0e0a\u0e49\u0e15\u0e23\u0e27\u0e08\u0e2b\u0e21\u0e32\u0e1b\u0e48\u0e32\u0e41\u0e25\u0e30 ocelots +Taming.SubSkill.BeastLore.Description=กระดูกใช้ตรวจหมาป่าและ ocelots Taming.SubSkill.ShockProof.Name=Shock Proof -Taming.SubSkill.ShockProof.Description=\u0e04\u0e27\u0e32\u0e21\u0e40\u0e2a\u0e35\u0e22\u0e2b\u0e32\u0e22\u0e08\u0e32\u0e01\u0e23\u0e30\u0e40\u0e1a\u0e34\u0e14\u0e25\u0e14\u0e25\u0e07 +Taming.SubSkill.ShockProof.Description=ความเสียหายจากระเบิดลดลง Taming.SubSkill.CallOfTheWild.Name=Call of the Wild -Taming.SubSkill.CallOfTheWild.Description=\u0e40\u0e23\u0e35\u0e22\u0e01\u0e2a\u0e31\u0e15\u0e27\u0e4c\u0e21\u0e32\u0e14\u0e49\u0e32\u0e19\u0e02\u0e49\u0e32\u0e07\u0e02\u0e2d\u0e07\u0e04\u0e38\u0e13 -Taming.SubSkill.CallOfTheWild.Description.2=[[GRAY]]COTW (Ocelot): \u0e21\u0e2d\u0e1a\u0e1b\u0e25\u0e32\u0e43\u0e19\u0e21\u0e37\u0e2d {0} \u0e0a\u0e34\u0e49\u0e19\u0e42\u0e14\u0e22\u0e01\u0e32\u0e23\u0e04\u0e25\u0e34\u0e01\u0e0b\u0e49\u0e32\u0e22 -Taming.Effect.15=[[GRAY]]COTW (Wolf): \u0e21\u0e2d\u0e1a\u0e01\u0e23\u0e30\u0e14\u0e39\u0e01\u0e43\u0e19\u0e21\u0e37\u0e2d {0} \u0e0a\u0e34\u0e49\u0e19\u0e42\u0e14\u0e22\u0e04\u0e25\u0e34\u0e01\u0e0b\u0e49\u0e32\u0e22 +Taming.SubSkill.CallOfTheWild.Description=เรียกสัตว์มาด้านข้างของคุณ +Taming.SubSkill.CallOfTheWild.Description.2=&7COTW (Ocelot): มอบปลาในมือ {0} ชิ้นโดยการคลิกซ้าย +Taming.Effect.15=&7COTW (Wolf): มอบกระดูกในมือ {0} ชิ้นโดยคลิกซ้าย Taming.SubSkill.FastFoodService.Name=Fast Food Service -Taming.SubSkill.FastFoodService.Description=\u0e42\u0e2d\u0e01\u0e32\u0e2a\u0e2a\u0e33\u0e2b\u0e23\u0e31\u0e1a\u0e2b\u0e21\u0e32\u0e1b\u0e48\u0e32\u0e17\u0e35\u0e48\u0e08\u0e30\u0e23\u0e31\u0e01\u0e29\u0e32\u0e15\u0e31\u0e27\u0e40\u0e2d\u0e07\u0e43\u0e19\u0e01\u0e32\u0e23\u0e42\u0e08\u0e21\u0e15\u0e35 +Taming.SubSkill.FastFoodService.Description=โอกาสสำหรับหมาป่าที่จะรักษาตัวเองในการโจมตี Taming.SubSkill.HolyHound.Name=Holy Hound -Taming.SubSkill.HolyHound.Description=\u0e23\u0e31\u0e01\u0e29\u0e32\u0e1e\u0e34\u0e29\u0e41\u0e25\u0e30\u0e40\u0e27\u0e17\u0e21\u0e19\u0e15\u0e4c +Taming.SubSkill.HolyHound.Description=รักษาพิษและเวทมนต์ Taming.SubSkill.Gore.Name=Gore -Taming.SubSkill.Gore.Description=\u0e42\u0e08\u0e21\u0e15\u0e35\u0e17\u0e33 Critical \u0e41\u0e25\u0e30\u0e42\u0e2d\u0e01\u0e32\u0e2a\u0e17\u0e33\u0e43\u0e2b\u0e49\u0e40\u0e25\u0e37\u0e2d\u0e14\u0e44\u0e2b\u0e25 +Taming.SubSkill.Gore.Description=โจมตีทำ Critical และโอกาสทำให้เลือดไหล Taming.SubSkill.SharpenedClaws.Name=Sharpened Claws -Taming.SubSkill.SharpenedClaws.Description=\u0e40\u0e1e\u0e34\u0e48\u0e21\u0e04\u0e27\u0e32\u0e21\u0e40\u0e2a\u0e35\u0e22\u0e2b\u0e32\u0e22 +Taming.SubSkill.SharpenedClaws.Description=เพิ่มความเสียหาย Taming.SubSkill.EnvironmentallyAware.Name=Environmentally Aware -Taming.SubSkill.EnvironmentallyAware.Description=\u0e25\u0e14\u0e04\u0e27\u0e32\u0e21\u0e40\u0e2a\u0e35\u0e22\u0e2b\u0e32\u0e22\u0e08\u0e32\u0e01\u0e01\u0e23\u0e30\u0e1a\u0e2d\u0e07\u0e40\u0e1e\u0e0a\u0e23 \u0e25\u0e32\u0e27\u0e32 \u0e01\u0e32\u0e23\u0e15\u0e01\u0e08\u0e32\u0e01\u0e17\u0e35\u0e48\u0e2a\u0e39\u0e07 +Taming.SubSkill.EnvironmentallyAware.Description=ลดความเสียหายจากกระบองเพชร ลาวา การตกจากที่สูง Taming.SubSkill.ThickFur.Name=Thick Fur -Taming.SubSkill.ThickFur.Description=\u0e25\u0e14\u0e04\u0e27\u0e32\u0e21\u0e40\u0e2a\u0e35\u0e22\u0e2b\u0e32\u0e22\u0e08\u0e32\u0e01\u0e44\u0e1f -Taming.Listener.Wolf=[[DARK_GRAY]]\u0e2b\u0e21\u0e32\u0e1b\u0e48\u0e32\u0e02\u0e2d\u0e07\u0e04\u0e38\u0e13\u0e44\u0e14\u0e49\u0e01\u0e25\u0e31\u0e1a\u0e21\u0e32\u0e2b\u0e32\u0e04\u0e38\u0e13... -Taming.Listener=\u0e17\u0e31\u0e01\u0e29\u0e30 Taming: +Taming.SubSkill.ThickFur.Description=ลดความเสียหายจากไฟ +Taming.Listener.Wolf=&8หมาป่าของคุณได้กลับมาหาคุณ... +Taming.Listener=ทักษะ Taming: Taming.SkillName=TAMING -Taming.Skillup=\u0e17\u0e31\u0e01\u0e29\u0e30 Taming \u0e40\u0e1e\u0e34\u0e48\u0e21\u0e02\u0e36\u0e49\u0e19 {0}. \u0e21\u0e35\u0e17\u0e31\u0e49\u0e07\u0e2b\u0e21\u0e14 ({1}) -Taming.Summon.Complete=[[GREEN]]\u0e40\u0e23\u0e35\u0e22\u0e01\u0e2a\u0e31\u0e15\u0e27\u0e4c\u0e2d\u0e2d\u0e01\u0e21\u0e32\u0e2a\u0e33\u0e40\u0e23\u0e47\u0e08 -Taming.Summon.Fail.Ocelot=\u0e04\u0e38\u0e13\u0e21\u0e35 ocelots \u0e21\u0e32\u0e01\u0e40\u0e01\u0e34\u0e19\u0e44\u0e1b\u0e44\u0e21\u0e48\u0e2a\u0e32\u0e21\u0e32\u0e23\u0e16\u0e40\u0e23\u0e35\u0e22\u0e01\u0e2d\u0e2d\u0e01\u0e21\u0e32\u0e44\u0e14\u0e49 -Taming.Summon.Fail.Wolf=\u0e04\u0e38\u0e13\u0e21\u0e35 wolf \u0e21\u0e32\u0e01\u0e40\u0e01\u0e34\u0e19\u0e44\u0e1b\u0e44\u0e21\u0e48\u0e2a\u0e32\u0e21\u0e32\u0e23\u0e16\u0e40\u0e23\u0e35\u0e22\u0e01\u0e2d\u0e2d\u0e01\u0e21\u0e32\u0e44\u0e14\u0e49 +Taming.Skillup=ทักษะ Taming เพิ่มขึ้น {0}. มีทั้งหมด ({1}) +Taming.Summon.Complete=&aเรียกสัตว์ออกมาสำเร็จ +Taming.Summon.Fail.Ocelot=คุณมี ocelots มากเกินไปไม่สามารถเรียกออกมาได้ +Taming.Summon.Fail.Wolf=คุณมี wolf มากเกินไปไม่สามารถเรียกออกมาได้ Taming.Summon.Name.Format={0}s {1} -Unarmed.Ability.Berserk.Length=Berserk \u0e21\u0e35\u0e23\u0e30\u0e22\u0e30\u0e40\u0e27\u0e25\u0e32: [[YELLOW]]{0}\u0e27\u0e34\u0e19\u0e32\u0e17\u0e35 +Unarmed.Ability.Berserk.Length=Berserk มีระยะเวลา: &e{0}วินาที Unarmed.Ability.Bonus.0=Iron Arm Style -Unarmed.Ability.Bonus.1=+{0} \u0e04\u0e27\u0e32\u0e21\u0e40\u0e2a\u0e35\u0e22\u0e2b\u0e32\u0e22\u0e40\u0e1e\u0e34\u0e48\u0e21\u0e02\u0e36\u0e49\u0e19 -Unarmed.Ability.Chance.ArrowDeflect=Arrow Deflect \u0e42\u0e2d\u0e01\u0e32\u0e2a: [[YELLOW]]{0} -Unarmed.Ability.Chance.Disarm=Disarm \u0e42\u0e2d\u0e01\u0e32\u0e2a: [[YELLOW]]{0} -Unarmed.Ability.Chance.IronGrip=Iron Grip \u0e42\u0e2d\u0e01\u0e32\u0e2a: [[YELLOW]]{0} -Unarmed.Ability.IronGrip.Attacker=\u0e1d\u0e48\u0e32\u0e22\u0e15\u0e23\u0e07\u0e02\u0e49\u0e32\u0e21\u0e21\u0e35 iron grip! -Unarmed.Ability.IronGrip.Defender=[[GREEN]]Iron grip \u0e17\u0e33\u0e43\u0e2b\u0e49\u0e04\u0e38\u0e13\u0e44\u0e21\u0e48\u0e44\u0e14\u0e49\u0e23\u0e31\u0e1a\u0e04\u0e27\u0e32\u0e21\u0e40\u0e2a\u0e35\u0e22\u0e2b\u0e32\u0e22! -Unarmed.Ability.Lower=[[GRAY]]**\u0e04\u0e38\u0e13\u0e1e\u0e23\u0e49\u0e2d\u0e21\u0e17\u0e35\u0e48\u0e08\u0e30\u0e43\u0e0a\u0e49\u0e17\u0e31\u0e01\u0e29\u0e30\u0e02\u0e2d\u0e07 \u0e21\u0e37\u0e2d** -Unarmed.Ability.Ready=[[GREEN]]**\u0e04\u0e38\u0e13\u0e1e\u0e23\u0e49\u0e2d\u0e21\u0e17\u0e35\u0e48\u0e08\u0e30\u0e43\u0e0a\u0e49\u0e17\u0e31\u0e01\u0e29\u0e30\u0e02\u0e2d\u0e07 \u0e21\u0e37\u0e2d** +Unarmed.Ability.Bonus.1=+{0} ความเสียหายเพิ่มขึ้น +Unarmed.Ability.Chance.ArrowDeflect=Arrow Deflect โอกาส: &e{0} +Unarmed.Ability.Chance.Disarm=Disarm โอกาส: &e{0} +Unarmed.Ability.Chance.IronGrip=Iron Grip โอกาส: &e{0} +Unarmed.Ability.IronGrip.Attacker=ฝ่ายตรงข้ามมี iron grip! +Unarmed.Ability.IronGrip.Defender=&aIron grip ทำให้คุณไม่ได้รับความเสียหาย! +Unarmed.Ability.Lower=&7**คุณพร้อมที่จะใช้ทักษะของ มือ** +Unarmed.Ability.Ready=&a**คุณพร้อมที่จะใช้ทักษะของ มือ** Unarmed.SubSkill.Berserk.Name=Berserk -Unarmed.SubSkill.Berserk.Description=\u0e40\u0e1e\u0e34\u0e48\u0e21\u0e01\u0e32\u0e23\u0e17\u0e33\u0e04\u0e27\u0e32\u0e21\u0e40\u0e2a\u0e35\u0e22\u0e2b\u0e32\u0e22 +50%, \u0e17\u0e33\u0e25\u0e32\u0e22\u0e27\u0e31\u0e15\u0e16\u0e38\u0e17\u0e35\u0e48\u0e2d\u0e48\u0e2d\u0e19 +Unarmed.SubSkill.Berserk.Description=เพิ่มการทำความเสียหาย +50%, ทำลายวัตถุที่อ่อน Unarmed.SubSkill.Disarm.Name=Disarm (Players) -Unarmed.SubSkill.Disarm.Description=\u0e02\u0e42\u0e21\u0e22\u0e2a\u0e34\u0e48\u0e07\u0e02\u0e2d\u0e07\u0e43\u0e19\u0e21\u0e37\u0e2d\u0e02\u0e2d\u0e07\u0e1c\u0e39\u0e49\u0e40\u0e25\u0e48\u0e19 +Unarmed.SubSkill.Disarm.Description=ขโมยสิ่งของในมือของผู้เล่น Unarmed.SubSkill.IronArmStyle.Name=Iron Arm Style -Unarmed.SubSkill.IronArmStyle.Description=\u0e41\u0e02\u0e47\u0e07\u0e15\u0e31\u0e27\u0e41\u0e02\u0e19\u0e02\u0e2d\u0e07\u0e04\u0e38\u0e13\u0e40\u0e21\u0e37\u0e48\u0e2d\u0e40\u0e27\u0e25\u0e32\u0e1c\u0e48\u0e32\u0e19\u0e44\u0e1b +Unarmed.SubSkill.IronArmStyle.Description=แข็งตัวแขนของคุณเมื่อเวลาผ่านไป Unarmed.SubSkill.ArrowDeflect.Name=Arrow Deflect Unarmed.SubSkill.ArrowDeflect.Description=Deflect arrows Unarmed.SubSkill.IronGrip.Name=Iron Grip -Unarmed.SubSkill.IronGrip.Description=\u0e1b\u0e49\u0e2d\u0e07\u0e01\u0e31\u0e19\u0e44\u0e21\u0e48\u0e43\u0e2b\u0e49\u0e04\u0e38\u0e13\u0e08\u0e32\u0e01\u0e01\u0e32\u0e23\u0e16\u0e39\u0e01\u0e1b\u0e25\u0e14 -Unarmed.Listener=\u0e17\u0e31\u0e01\u0e29\u0e30 Unarmed: +Unarmed.SubSkill.IronGrip.Description=ป้องกันไม่ให้คุณจากการถูกปลด +Unarmed.Listener=ทักษะ Unarmed: Unarmed.SkillName=UNARMED -Unarmed.Skills.Berserk.Off=**\u0e17\u0e31\u0e01\u0e29\u0e30 Berserk \u0e2b\u0e21\u0e14\u0e2a\u0e20\u0e32\u0e1e** -Unarmed.Skills.Berserk.On=[[GREEN]]**\u0e43\u0e0a\u0e49\u0e17\u0e31\u0e01\u0e29\u0e30 BERSERK** -Unarmed.Skills.Berserk.Other.Off=Berserk[[GREEN]] \u0e23\u0e2d\u0e01\u0e32\u0e23\u0e04\u0e39\u0e25\u0e14\u0e32\u0e27\u0e19\u0e4c [[YELLOW]]{0} -Unarmed.Skills.Berserk.Other.On=[[GREEN]]{0}[[DARK_GREEN]] \u0e44\u0e14\u0e49\u0e43\u0e0a\u0e49\u0e17\u0e31\u0e01\u0e29\u0e30 [[RED]]Berserk! -Unarmed.Skills.Berserk.Refresh=[[GREEN]]\u0e04\u0e27\u0e32\u0e21\u0e2a\u0e32\u0e21\u0e32\u0e23\u0e16\u0e17\u0e31\u0e01\u0e29\u0e30 [[YELLOW]]Berserk [[GREEN]]\u0e04\u0e39\u0e25\u0e14\u0e32\u0e27\u0e19\u0e4c\u0e40\u0e2a\u0e23\u0e47\u0e08\u0e41\u0e25\u0e49\u0e27! -Unarmed.Skillup=\u0e17\u0e31\u0e01\u0e29\u0e30 Unarmed \u0e40\u0e1e\u0e34\u0e48\u0e21\u0e02\u0e36\u0e49\u0e19 {0}. \u0e21\u0e35\u0e17\u0e31\u0e49\u0e07\u0e2b\u0e21\u0e14 ({1}) -Woodcutting.Ability.0=\u0e17\u0e31\u0e01\u0e29\u0e30 Leaf Blower -Woodcutting.Ability.1=\u0e17\u0e33\u0e25\u0e32\u0e22\u0e43\u0e1a\u0e44\u0e21\u0e49\u0e2d\u0e2d\u0e01 -Woodcutting.Ability.Chance.DDrop=Double Drop \u0e42\u0e2d\u0e01\u0e32\u0e2a: [[YELLOW]]{0} -Woodcutting.Ability.Length=Tree Feller \u0e21\u0e35\u0e23\u0e30\u0e22\u0e30\u0e40\u0e27\u0e25\u0e32: [[YELLOW]]{0}\u0e27\u0e34\u0e19\u0e32\u0e17\u0e35 -Woodcutting.Ability.Locked.0=\u0e2a\u0e32\u0e21\u0e32\u0e23\u0e16\u0e1b\u0e25\u0e14\u0e25\u0e47\u0e2d\u0e01\u0e44\u0e14\u0e49\u0e40\u0e21\u0e37\u0e48\u0e2d\u0e23\u0e30\u0e14\u0e31\u0e1a {0}+ (LEAF BLOWER) +Unarmed.Skills.Berserk.Off=**ทักษะ Berserk หมดสภาพ** +Unarmed.Skills.Berserk.On=&a**ใช้ทักษะ BERSERK** +Unarmed.Skills.Berserk.Other.Off=Berserk&a รอการคูลดาวน์ &e{0} +Unarmed.Skills.Berserk.Other.On=&a{0}&2 ได้ใช้ทักษะ &cBerserk! +Unarmed.Skills.Berserk.Refresh=&aความสามารถทักษะ &eBerserk &aคูลดาวน์เสร็จแล้ว! +Unarmed.Skillup=ทักษะ Unarmed เพิ่มขึ้น {0}. มีทั้งหมด ({1}) +Woodcutting.Ability.0=ทักษะ Leaf Blower +Woodcutting.Ability.1=ทำลายใบไม้ออก +Woodcutting.Ability.Chance.DDrop=Double Drop โอกาส: &e{0} +Woodcutting.Ability.Length=Tree Feller มีระยะเวลา: &e{0}วินาที +Woodcutting.Ability.Locked.0=สามารถปลดล็อกได้เมื่อระดับ {0}+ (LEAF BLOWER) Woodcutting.SubSkill.TreeFeller.Name=Tree Feller -Woodcutting.SubSkill.TreeFeller.Description=\u0e17\u0e33\u0e43\u0e2b\u0e49\u0e15\u0e49\u0e19\u0e44\u0e21\u0e49\u0e23\u0e30\u0e40\u0e1a\u0e34\u0e14 +Woodcutting.SubSkill.TreeFeller.Description=ทำให้ต้นไม้ระเบิด Woodcutting.SubSkill.LeafBlower.Name=Leaf Blower -Woodcutting.SubSkill.LeafBlower.Description=\u0e17\u0e33\u0e25\u0e32\u0e22\u0e43\u0e1a\u0e44\u0e21\u0e49\u0e2d\u0e2d\u0e01 -Woodcutting.SubSkill.HarvestLumber.Name=\u0e40\u0e1e\u0e34\u0e48\u0e21\u0e2d\u0e31\u0e15\u0e23\u0e32\u0e01\u0e32\u0e23 Drops -Woodcutting.SubSkill.HarvestLumber.Description=\u0e40\u0e1e\u0e34\u0e48\u0e21\u0e2d\u0e31\u0e04\u0e23\u0e32\u0e01\u0e32\u0e23 Drops -Woodcutting.Listener=\u0e17\u0e31\u0e01\u0e29\u0e30 Woodcutting: +Woodcutting.SubSkill.LeafBlower.Description=ทำลายใบไม้ออก +Woodcutting.SubSkill.HarvestLumber.Name=เพิ่มอัตราการ Drops +Woodcutting.SubSkill.HarvestLumber.Description=เพิ่มอัคราการ Drops +Woodcutting.Listener=ทักษะ Woodcutting: Woodcutting.SkillName=WOODCUTTING -Woodcutting.Skills.TreeFeller.Off=**\u0e17\u0e31\u0e01\u0e29\u0e30 Tree Feller \u0e2b\u0e21\u0e14\u0e2a\u0e20\u0e32\u0e1e** -Woodcutting.Skills.TreeFeller.On=[[GREEN]]**\u0e43\u0e0a\u0e49\u0e17\u0e31\u0e01\u0e29\u0e30 TREE FELLER** -Woodcutting.Skills.TreeFeller.Refresh=[[GREEN]]\u0e04\u0e27\u0e32\u0e21\u0e2a\u0e32\u0e21\u0e32\u0e23\u0e16\u0e17\u0e31\u0e01\u0e29\u0e30 [[YELLOW]]Tree Feller [[GREEN]]\u0e04\u0e39\u0e25\u0e14\u0e32\u0e27\u0e19\u0e4c\u0e40\u0e2a\u0e23\u0e47\u0e08\u0e41\u0e25\u0e49\u0e27! -Woodcutting.Skills.TreeFeller.Other.Off=Tree Feller[[GREEN]] \u0e23\u0e2d\u0e01\u0e32\u0e23\u0e04\u0e39\u0e25\u0e14\u0e32\u0e27\u0e19\u0e4c [[YELLOW]]{0} -Woodcutting.Skills.TreeFeller.Other.On=[[GREEN]]{0}[[DARK_GREEN]] \u0e44\u0e14\u0e49\u0e43\u0e0a\u0e49\u0e17\u0e31\u0e01\u0e29\u0e30 [[RED]]Tree Feller! -Woodcutting.Skills.TreeFeller.Splinter=\u0e02\u0e27\u0e32\u0e19\u0e02\u0e2d\u0e07\u0e04\u0e38\u0e13\u0e1e\u0e31\u0e07\u0e41\u0e25\u0e49\u0e27! -Woodcutting.Skills.TreeFeller.Threshold=\u0e15\u0e49\u0e19\u0e44\u0e21\u0e49\u0e15\u0e49\u0e19\u0e19\u0e35\u0e49\u0e43\u0e2b\u0e0d\u0e48\u0e40\u0e01\u0e34\u0e19\u0e44\u0e1b! -Woodcutting.Skillup=\u0e17\u0e31\u0e01\u0e29\u0e30 Woodcutting \u0e40\u0e1e\u0e34\u0e48\u0e21\u0e02\u0e36\u0e49\u0e19 {0}. \u0e21\u0e35\u0e17\u0e31\u0e49\u0e07\u0e2b\u0e21\u0e14 ({1}) -Ability.Generic.Refresh=[[GREEN]]**\u0e43\u0e0a\u0e49\u0e17\u0e31\u0e01\u0e29\u0e30 ABILITIES REFRESHED!** -Ability.Generic.Template.Lock=[[GRAY]]{0} -Ability.Generic.Template=[[GOLD]]{0}: [[DARK_AQUA]]{1} -Combat.ArrowDeflect=[[WHITE]]**\u0e43\u0e0a\u0e49\u0e17\u0e31\u0e01\u0e29\u0e30 ARROW DEFLECT** -Combat.BeastLore=[[GREEN]]**\u0e43\u0e0a\u0e49\u0e17\u0e31\u0e01\u0e29\u0e30 BEAST LORE** -Combat.BeastLoreHealth=[[DARK_AQUA]]\u0e23\u0e30\u0e14\u0e31\u0e1a\u0e40\u0e25\u0e37\u0e2d\u0e14 ([[GREEN]]{0}[[DARK_AQUA]]/{1}) -Combat.BeastLoreOwner=[[DARK_AQUA]]\u0e40\u0e08\u0e49\u0e32\u0e02\u0e2d\u0e07 ([[RED]]{0}[[DARK_AQUA]]) -Combat.Gore=[[GREEN]]**\u0e43\u0e0a\u0e49\u0e17\u0e31\u0e01\u0e29\u0e30 GORED** -Combat.StruckByGore=**\u0e04\u0e38\u0e13\u0e16\u0e39\u0e01\u0e17\u0e31\u0e01\u0e29\u0e30 Gored** -Combat.TargetDazed=\u0e40\u0e1b\u0e49\u0e32\u0e2b\u0e21\u0e32\u0e22\u0e17\u0e35\u0e48 [[DARK_RED]]\u0e21\u0e36\u0e19\u0e07\u0e07 -Combat.TouchedFuzzy=[[DARK_RED]]\u0e04\u0e38\u0e13\u0e23\u0e39\u0e49\u0e2a\u0e36\u0e01\u0e21\u0e36\u0e19 \u0e40\u0e1e\u0e23\u0e32\u0e30 \u0e17\u0e31\u0e01\u0e29\u0e30 Touched Fuzzy. -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]]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]]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]]\u0e04\u0e38\u0e13\u0e44\u0e14\u0e49\u0e23\u0e31\u0e1a\u0e23\u0e32\u0e07\u0e27\u0e31\u0e25 {0} \u0e17\u0e38\u0e01\u0e17\u0e31\u0e01\u0e29\u0e30! -Commands.addlevels.AwardAll.2=\u0e17\u0e31\u0e01\u0e29\u0e30\u0e17\u0e31\u0e49\u0e07\u0e2b\u0e21\u0e14\u0e44\u0e14\u0e49\u0e23\u0e31\u0e1a\u0e01\u0e32\u0e23\u0e41\u0e01\u0e49\u0e44\u0e02\u0e40\u0e1e\u0e37\u0e48\u0e2d {0}. -Commands.addlevels.AwardSkill.1=[[GREEN]]\u0e04\u0e38\u0e13\u0e44\u0e14\u0e49\u0e23\u0e31\u0e1a\u0e23\u0e32\u0e07\u0e27\u0e31\u0e25 {0} \u0e43\u0e19\u0e17\u0e31\u0e01\u0e29\u0e30 {1}! -Commands.addlevels.AwardSkill.2={0} \u0e44\u0e14\u0e49\u0e23\u0e31\u0e1a\u0e01\u0e32\u0e23\u0e41\u0e01\u0e49\u0e44\u0e02\u0e2a\u0e33\u0e2b\u0e23\u0e31\u0e1a {1}. -Commands.addxp.AwardAll=[[GREEN]]\u0e04\u0e38\u0e13\u0e44\u0e14\u0e49\u0e23\u0e31\u0e1a\u0e23\u0e32\u0e07\u0e27\u0e31\u0e25 {0} \u0e1b\u0e23\u0e30\u0e2a\u0e1a\u0e01\u0e32\u0e23\u0e13\u0e4c\u0e43\u0e19\u0e17\u0e31\u0e01\u0e29\u0e30\u0e17\u0e31\u0e49\u0e07\u0e2b\u0e21\u0e14! -Commands.addxp.AwardSkill=[[GREEN]]\u0e04\u0e38\u0e13\u0e44\u0e14\u0e49\u0e23\u0e31\u0e1a\u0e23\u0e32\u0e07\u0e27\u0e31\u0e25 {0} \u0e1b\u0e23\u0e30\u0e2a\u0e1a\u0e01\u0e32\u0e23\u0e13\u0e4c\u0e17\u0e31\u0e01\u0e29\u0e30 {1}! -Commands.Ability.Off=Ability \u0e2d\u0e22\u0e39\u0e48\u0e43\u0e19\u0e42\u0e2b\u0e21\u0e14[[GREEN]]\u0e1b\u0e34\u0e14 -Commands.Ability.On=Ability \u0e2d\u0e22\u0e39\u0e48\u0e43\u0e19\u0e42\u0e2b\u0e21\u0e14[[GREEN]]\u0e40\u0e1b\u0e34\u0e14 -Commands.AdminChat.Off=Admin Chat [[RED]]\u0e16\u0e39\u0e01\u0e1b\u0e34\u0e14 -Commands.AdminChat.On=Admin Chat [[GREEN]]\u0e40\u0e1b\u0e34\u0e14\u0e43\u0e0a\u0e49\u0e07\u0e32\u0e19 -Commands.AdminToggle=- \u0e40\u0e1b\u0e25\u0e35\u0e48\u0e22\u0e19\u0e42\u0e2b\u0e21\u0e14 admin chat +Woodcutting.Skills.TreeFeller.Off=**ทักษะ Tree Feller หมดสภาพ** +Woodcutting.Skills.TreeFeller.On=&a**ใช้ทักษะ TREE FELLER** +Woodcutting.Skills.TreeFeller.Refresh=&aความสามารถทักษะ &eTree Feller &aคูลดาวน์เสร็จแล้ว! +Woodcutting.Skills.TreeFeller.Other.Off=Tree Feller&a รอการคูลดาวน์ &e{0} +Woodcutting.Skills.TreeFeller.Other.On=&a{0}&2 ได้ใช้ทักษะ &cTree Feller! +Woodcutting.Skills.TreeFeller.Splinter=ขวานของคุณพังแล้ว! +Woodcutting.Skills.TreeFeller.Threshold=ต้นไม้ต้นนี้ใหญ่เกินไป! +Woodcutting.Skillup=ทักษะ Woodcutting เพิ่มขึ้น {0}. มีทั้งหมด ({1}) +Ability.Generic.Refresh=&a**ใช้ทักษะ ABILITIES REFRESHED!** +Ability.Generic.Template.Lock=&7{0} +Ability.Generic.Template=&6{0}: &3{1} +Combat.ArrowDeflect=&f**ใช้ทักษะ ARROW DEFLECT** +Combat.BeastLore=&a**ใช้ทักษะ BEAST LORE** +Combat.BeastLoreHealth=&3ระดับเลือด (&a{0}&3/{1}) +Combat.BeastLoreOwner=&3เจ้าของ (&c{0}&3) +Combat.Gore=&a**ใช้ทักษะ GORED** +Combat.StruckByGore=**คุณถูกทักษะ Gored** +Combat.TargetDazed=เป้าหมายที่ &4มึนงง +Combat.TouchedFuzzy=&4คุณรู้สึกมึน เพราะ ทักษะ Touched Fuzzy. +mcMMO.Description=&3About the &emcMMO&3 Project:,&6mcMMO is an &copen source&6 RPG mod created in February 2011,&6by &9nossr50&6. The goal is to provide a quality RPG experience.,&3Tips:,&6 - &aUse &c/mcmmo help&a to see commands,&6 - &aType &c/SKILLNAME&a to see detailed skill info,&3Developers:,&6 - &anossr50 &9(Founder & Project Lead),&6 - &aGJ &9(Former Project Lead),&6 - &aNuclearW &9(Developer),&6 - &abm01 &9(Developer),&6 - &aTfT_02 &9(Developer),&6 - &aGlitchfinder &9(Developer),&6 - &at00thpick1 &9(Developer),&3Useful Links:,&6 - &ahttps://github.com/mcMMO-Dev/mcMMO/issues&6 Bug Reporting,&6 - &a#mcmmo @ irc.esper.net&6 IRC Chat, +Commands.addlevels.AwardAll.1=&aคุณได้รับรางวัล {0} ทุกทักษะ! +Commands.addlevels.AwardAll.2=ทักษะทั้งหมดได้รับการแก้ไขเพื่อ {0}. +Commands.addlevels.AwardSkill.1=&aคุณได้รับรางวัล {0} ในทักษะ {1}! +Commands.addlevels.AwardSkill.2={0} ได้รับการแก้ไขสำหรับ {1}. +Commands.addxp.AwardAll=&aคุณได้รับรางวัล {0} ประสบการณ์ในทักษะทั้งหมด! +Commands.addxp.AwardSkill=&aคุณได้รับรางวัล {0} ประสบการณ์ทักษะ {1}! +Commands.Ability.Off=Ability อยู่ในโหมด&aปิด +Commands.Ability.On=Ability อยู่ในโหมด&aเปิด +Commands.AdminChat.Off=Admin Chat &cถูกปิด +Commands.AdminChat.On=Admin Chat &aเปิดใช้งาน +Commands.AdminToggle=- เปลี่ยนโหมด admin chat Commands.Chat.Console=*Console* -Commands.Disabled=\u0e04\u0e33\u0e2a\u0e31\u0e48\u0e07\u0e19\u0e35\u0e49\u0e16\u0e39\u0e01\u0e1b\u0e34\u0e14\u0e44\u0e27\u0e49. -Commands.DoesNotExist=\u0e44\u0e21\u0e48\u0e1e\u0e1a\u0e1c\u0e39\u0e49\u0e40\u0e25\u0e48\u0e19\u0e43\u0e19\u0e10\u0e32\u0e19\u0e02\u0e49\u0e2d\u0e21\u0e39\u0e25! -Commands.GodMode.Disabled=mcMMO \u0e42\u0e2b\u0e21\u0e14 God \u0e16\u0e39\u0e01\u0e1b\u0e34\u0e14\u0e2d\u0e22\u0e39\u0e48 -Commands.GodMode.Enabled=mcMMO \u0e42\u0e2b\u0e21\u0e14 God \u0e16\u0e39\u0e01\u0e40\u0e1b\u0e34\u0e14 -Commands.GodMode.Forbidden=[mcMMO] \u0e04\u0e38\u0e13\u0e44\u0e21\u0e48\u0e44\u0e14\u0e49\u0e23\u0e31\u0e1a\u0e2d\u0e19\u0e38\u0e0d\u0e32\u0e15\u0e1a\u0e19\u0e42\u0e25\u0e01\u0e19\u0e35\u0e49 (\u0e14\u0e39 Permissions) -Commands.Inspect= [[RED]]- \u0e14\u0e39\u0e02\u0e49\u0e2d\u0e21\u0e39\u0e25\u0e23\u0e32\u0e22\u0e25\u0e30\u0e40\u0e2d\u0e35\u0e22\u0e14\u0e02\u0e2d\u0e07\u0e1c\u0e39\u0e49\u0e40\u0e25\u0e48\u0e19 -Commands.Party.Invite.Accepted=[[GREEN]]\u0e22\u0e34\u0e19\u0e22\u0e2d\u0e21\u0e01\u0e32\u0e23\u0e23\u0e31\u0e1a\u0e40\u0e0a\u0e34\u0e0d. \u0e04\u0e38\u0e13\u0e44\u0e14\u0e49\u0e40\u0e02\u0e49\u0e32 party {0} -Commands.Invite.Success=[[GREEN]]\u0e2a\u0e48\u0e07\u0e04\u0e33\u0e40\u0e0a\u0e34\u0e0d\u0e41\u0e25\u0e49\u0e27\u0e1b\u0e23\u0e30\u0e2a\u0e1a\u0e04\u0e27\u0e32\u0e21\u0e2a\u0e33\u0e40\u0e23\u0e47\u0e08. -Commands.Leaderboards= [[RED]]- Leaderboards -Commands.mcc.Header=---[][[YELLOW]]\u0e04\u0e33\u0e2a\u0e31\u0e48\u0e07 mcMMO[[RED]][]--- -Commands.mcgod=- \u0e42\u0e2b\u0e21\u0e14 God -Commands.mchud.Invalid=\u0e44\u0e21\u0e48\u0e1e\u0e1a HUD \u0e0a\u0e19\u0e34\u0e14\u0e19\u0e35\u0e49. -Commands.mcpurge.Success=[[GREEN]]\u0e10\u0e32\u0e19\u0e02\u0e49\u0e2d\u0e21\u0e39\u0e25\u0e01\u0e33\u0e25\u0e31\u0e07\u0e25\u0e49\u0e32\u0e07\u0e40\u0e23\u0e35\u0e22\u0e1a\u0e23\u0e49\u0e2d\u0e22\u0e41\u0e25\u0e49\u0e27! -Commands.mcrank.Heading=[[GOLD]]-=\u0e01\u0e32\u0e23\u0e08\u0e31\u0e14\u0e2d\u0e31\u0e19\u0e14\u0e31\u0e1a\u0e02\u0e2d\u0e07\u0e1a\u0e38\u0e04\u0e04\u0e25=- -Commands.mcrank.Overall=\u0e23\u0e27\u0e21\u0e17\u0e31\u0e49\u0e07\u0e2b\u0e21\u0e14[[GREEN]] - [[GOLD]]\u0e23\u0e30\u0e14\u0e31\u0e1a [[WHITE]]#[[GREEN]]{0} -Commands.mcrank.Player=\u0e40\u0e1b\u0e49\u0e32\u0e2b\u0e21\u0e32\u0e22: [[WHITE]]{0} -Commands.mcrank.Skill={0}[[GREEN]] - [[GOLD]]\u0e25\u0e33\u0e14\u0e31\u0e1a [[WHITE]]#[[GREEN]]{1} -Commands.mcrank.Unranked=[[WHITE]]Unranked -Commands.mcrefresh.Success={0}\'\'\u0e27\u0e34\u0e19\u0e32\u0e17\u0e35 \u0e04\u0e39\u0e25\u0e14\u0e32\u0e27\u0e19\u0e4c\u0e2a\u0e33\u0e40\u0e23\u0e47\u0e08. -Commands.mcremove.Success=[[GREEN]]{0} \u0e08\u0e30\u0e16\u0e39\u0e01\u0e25\u0e1a\u0e2d\u0e2d\u0e01\u0e08\u0e32\u0e01\u0e10\u0e32\u0e19\u0e02\u0e49\u0e2d\u0e21\u0e39\u0e25\u0e17\u0e35\u0e48\u0e1b\u0e23\u0e30\u0e2a\u0e1a\u0e04\u0e27\u0e32\u0e21\u0e2a\u0e33\u0e40\u0e23\u0e47\u0e08! -Commands.mctop.Tip=[[GOLD]]Tip: \u0e43\u0e0a\u0e49 [[RED]]/mcrank[[GOLD]] \u0e40\u0e1e\u0e37\u0e48\u0e2d\u0e14\u0e39\u0e25\u0e33\u0e14\u0e31\u0e1a\u0e02\u0e2d\u0e07\u0e1a\u0e38\u0e04\u0e04\u0e25! -Commands.mmoedit=[player] [[RED]] - \u0e41\u0e01\u0e49\u0e44\u0e02\u0e40\u0e1b\u0e49\u0e32\u0e2b\u0e21\u0e32\u0e22 -Commands.mmoedit.AllSkills.1=[[GREEN]]\u0e23\u0e30\u0e14\u0e31\u0e1a\u0e17\u0e31\u0e01\u0e29\u0e30\u0e17\u0e31\u0e49\u0e07\u0e2b\u0e21\u0e14\u0e16\u0e39\u0e01\u0e15\u0e31\u0e49\u0e07\u0e40\u0e1b\u0e47\u0e19 {0}! -Commands.mmoedit.Modified.1=[[GREEN]]\u0e23\u0e30\u0e14\u0e31\u0e1a\u0e40\u0e14\u0e34\u0e21\u0e04\u0e38\u0e13\u0e04\u0e37\u0e2d {0} \u0e16\u0e39\u0e01\u0e40\u0e1b\u0e25\u0e35\u0e48\u0e22\u0e19\u0e40\u0e1b\u0e47\u0e19 {1}! -Commands.mmoedit.Modified.2={0} \u0e44\u0e14\u0e49\u0e23\u0e31\u0e1a\u0e01\u0e32\u0e23\u0e41\u0e01\u0e49\u0e44\u0e02\u0e2a\u0e33\u0e2b\u0e23\u0e31\u0e1a {1}. -Commands.ModDescription=- \u0e2d\u0e48\u0e32\u0e19\u0e04\u0e33\u0e2d\u0e18\u0e34\u0e1a\u0e32\u0e22 -Commands.NoConsole=\u0e04\u0e33\u0e2a\u0e31\u0e48\u0e07\u0e19\u0e35\u0e49\u0e08\u0e30\u0e44\u0e21\u0e48\u0e2a\u0e19\u0e31\u0e1a\u0e2a\u0e19\u0e38\u0e19\u0e01\u0e32\u0e23\u0e43\u0e0a\u0e49\u0e04\u0e2d\u0e19\u0e42\u0e0b\u0e25. -Commands.Notifications.Off=\u0e01\u0e32\u0e23\u0e41\u0e08\u0e49\u0e07\u0e40\u0e15\u0e37\u0e2d\u0e19\u0e04\u0e27\u0e32\u0e21\u0e2a\u0e32\u0e21\u0e32\u0e23\u0e16\u0e43\u0e19\u0e01\u0e32\u0e23\u0e2a\u0e25\u0e31\u0e1a [[RED]]\u0e16\u0e39\u0e01\u0e1b\u0e34\u0e14 -Commands.Notifications.On=\u0e01\u0e32\u0e23\u0e41\u0e08\u0e49\u0e07\u0e40\u0e15\u0e37\u0e2d\u0e19\u0e04\u0e27\u0e32\u0e21\u0e2a\u0e32\u0e21\u0e32\u0e23\u0e16\u0e43\u0e19\u0e01\u0e32\u0e23\u0e2a\u0e25\u0e31\u0e1a [[RED]]\u0e16\u0e39\u0e01\u0e40\u0e1b\u0e34\u0e14 -Commands.Offline=\u0e04\u0e33\u0e2a\u0e31\u0e48\u0e07\u0e19\u0e35\u0e49\u0e08\u0e30\u0e44\u0e21\u0e48\u0e17\u0e33\u0e07\u0e32\u0e19\u0e2a\u0e33\u0e2b\u0e23\u0e31\u0e1a\u0e1c\u0e39\u0e49\u0e40\u0e25\u0e48\u0e19 Offline. -Commands.Other=[[GREEN]]--\u0e04\u0e33\u0e2a\u0e31\u0e48\u0e07\u0e2d\u0e37\u0e48\u0e19\u0e46-- -Commands.Party.Header=-----[][[GREEN]]PARTY[[RED]][]----- -Commands.Party.Status=[[DARK_GRAY]]\u0e0a\u0e37\u0e48\u0e2d: [[WHITE]]{0} {1} -Commands.Party.ShareMode=[[DARK_GRAY]]\u0e42\u0e2b\u0e21\u0e14\u0e41\u0e1a\u0e48\u0e07\u0e1b\u0e31\u0e19: -Commands.Party.ItemShare=[[GRAY]]\u0e2a\u0e34\u0e48\u0e07\u0e02\u0e2d\u0e07 [[DARK_AQUA]]({0}) -Commands.Party.ExpShare=[[GRAY]]EXP [[DARK_AQUA]]({0}) -Commands.Party.ItemShareCategories=[[DARK_GRAY]]\u0e41\u0e1a\u0e48\u0e07\u0e1b\u0e31\u0e19\u0e2a\u0e34\u0e48\u0e07\u0e02\u0e2d\u0e07: [[GRAY]][[ITALIC]]{0} -Commands.Party.MembersNear=[[DARK_GRAY]]\u0e17\u0e35\u0e48\u0e2d\u0e22\u0e39\u0e48\u0e43\u0e01\u0e25\u0e49\u0e04\u0e38\u0e13 [[DARK_AQUA]]{0}[[DARK_GRAY]]/[[DARK_AQUA]]{1} -Commands.Party.Accept=- \u0e22\u0e34\u0e19\u0e22\u0e2d\u0e21\u0e04\u0e33\u0e40\u0e0a\u0e34\u0e0d -Commands.Party.Chat.Off=Party Chat [[RED]]\u0e16\u0e39\u0e01\u0e1b\u0e34\u0e14 -Commands.Party.Chat.On=Party Chat [[GREEN]]\u0e40\u0e1b\u0e34\u0e14 -Commands.Party.Commands=[[GREEN]]--\u0e04\u0e33\u0e2a\u0e31\u0e48\u0e07 PARTY-- -Commands.Party.Invite.0=ALERT: [[GREEN]]\u0e04\u0e38\u0e13\u0e16\u0e39\u0e01\u0e40\u0e0a\u0e34\u0e0d\u0e40\u0e02\u0e49\u0e32 party {0} \u0e08\u0e32\u0e01 {1} -Commands.Party.Invite.1=\u0e43\u0e0a\u0e49 [[GREEN]]/party accept[[YELLOW]] \u0e40\u0e1e\u0e34\u0e48\u0e2d\u0e22\u0e2d\u0e21\u0e23\u0e31\u0e1a\u0e01\u0e32\u0e23\u0e23\u0e31\u0e1a\u0e40\u0e0a\u0e34\u0e0d -Commands.Party.Invite=- \u0e2a\u0e48\u0e07\u0e04\u0e33\u0e40\u0e0a\u0e34\u0e0d Party -Commands.Party.Join=[[GRAY]]\u0e44\u0e14\u0e49\u0e40\u0e02\u0e49\u0e32\u0e23\u0e48\u0e27\u0e21 Party: {0} -Commands.Party.Create=[[GRAY]]\u0e2a\u0e23\u0e49\u0e32\u0e07 Party: {0} -Commands.Party.Rename=[[GRAY]]\u0e0a\u0e37\u0e48\u0e2d Party \u0e40\u0e1b\u0e25\u0e35\u0e48\u0e22\u0e19\u0e40\u0e1b\u0e47\u0e19: [[WHITE]]{0} -Commands.Party.SetSharing=[[GRAY]]Party {0} \u0e41\u0e1a\u0e48\u0e07\u0e1b\u0e31\u0e19\u0e16\u0e39\u0e01\u0e15\u0e31\u0e49\u0e07\u0e40\u0e1b\u0e47\u0e19: [[DARK_AQUA]]{1} -Commands.Party.ToggleShareCategory=[[GRAY]]Party \u0e41\u0e1a\u0e48\u0e07\u0e1b\u0e31\u0e19\u0e2a\u0e34\u0e48\u0e07\u0e02\u0e2d\u0e07\u0e43\u0e2b\u0e49 [[GOLD]]{0} [[GRAY]]\u0e44\u0e14\u0e49\u0e23\u0e31\u0e1a [[DARK_AQUA]]{1} -Commands.Party.AlreadyExists=[[DARK_RED]]Party {0} \u0e21\u0e35\u0e2d\u0e22\u0e39\u0e48\u0e41\u0e25\u0e49\u0e27! -Commands.Party.Kick=\u0e04\u0e38\u0e13\u0e16\u0e39\u0e01\u0e19\u0e33\u0e2d\u0e2d\u0e01\u0e08\u0e32\u0e01 party{0}! -Commands.Party.Leave=\u0e04\u0e38\u0e13\u0e44\u0e14\u0e49\u0e2d\u0e2d\u0e01\u0e08\u0e32\u0e01 party -Commands.Party.Members.Header=-----[][[GREEN]]\u0e2a\u0e21\u0e32\u0e0a\u0e34\u0e01[[RED]][]----- -Commands.Party.None=\u0e04\u0e38\u0e13\u0e44\u0e21\u0e48\u0e44\u0e14\u0e49\u0e2d\u0e22\u0e39\u0e48\u0e43\u0e19 party. -Commands.Party.Quit=- \u0e2d\u0e2d\u0e01\u0e08\u0e32\u0e01\u0e07\u0e32\u0e19 party \u0e02\u0e2d\u0e07\u0e04\u0e38\u0e13\u0e43\u0e19\u0e1b\u0e31\u0e08\u0e08\u0e38\u0e1a\u0e31\u0e19 -Commands.Party.Teleport= [[RED]]- Teleport to \u0e44\u0e1b\u0e2b\u0e32\u0e2a\u0e21\u0e32\u0e0a\u0e34\u0e01 party -Commands.Party.Toggle=- \u0e40\u0e1b\u0e25\u0e35\u0e48\u0e22\u0e19\u0e42\u0e2b\u0e21\u0e14 Party Chat -Commands.Party.1=- \u0e2a\u0e23\u0e49\u0e32\u0e07 Party \u0e43\u0e2b\u0e21\u0e48 -Commands.Party.2=- \u0e40\u0e02\u0e49\u0e32\u0e23\u0e48\u0e27\u0e21 Party \u0e02\u0e2d\u0e07\u0e1c\u0e39\u0e49\u0e40\u0e25\u0e48\u0e19 -Commands.ptp.Enabled=Party teleporting [[GREEN]]\u0e16\u0e39\u0e01\u0e40\u0e1b\u0e34\u0e14 -Commands.ptp.Disabled=Party teleporting [[RED]]\u0e16\u0e39\u0e01\u0e1b\u0e34\u0e14 -Commands.ptp.NoRequests=\u0e04\u0e38\u0e13\u0e22\u0e31\u0e07\u0e44\u0e21\u0e48\u0e21\u0e35\u0e01\u0e32\u0e23\u0e23\u0e49\u0e2d\u0e07\u0e02\u0e2d teleport \u0e43\u0e19\u0e40\u0e27\u0e25\u0e32\u0e19\u0e35\u0e49 -Commands.ptp.NoWorldPermissions=[mcMMO] \u0e04\u0e38\u0e13\u0e44\u0e21\u0e48\u0e44\u0e14\u0e49\u0e23\u0e31\u0e1a\u0e2d\u0e19\u0e38\u0e0d\u0e32\u0e15\u0e43\u0e2b\u0e49 teleport \u0e43\u0e19\u0e42\u0e25\u0e01\u0e19\u0e35\u0e49 {0}. -Commands.ptp.Request1={0} [[GREEN]]\u0e15\u0e49\u0e2d\u0e07\u0e01\u0e32\u0e23 teleport \u0e21\u0e32\u0e2b\u0e32\u0e04\u0e38\u0e13. -Commands.ptp.Request2=[[GREEN]]\u0e40\u0e1e\u0e37\u0e48\u0e2d teleport \u0e43\u0e0a\u0e49 [[YELLOW]]/ptp accept. [[GREEN]]\u0e20\u0e32\u0e22\u0e43\u0e19 [[RED]]{0} [[GREEN]]\u0e27\u0e34\u0e19\u0e32\u0e17\u0e35. -Commands.ptp.AcceptAny.Enabled=Party teleport [[GREEN]]\u0e16\u0e39\u0e01\u0e40\u0e1b\u0e34\u0e14 -Commands.ptp.AcceptAny.Disabled=Party teleport [[RED]]\u0e16\u0e39\u0e01\u0e1b\u0e34\u0e14 -Commands.ptp.RequestExpired=Party teleport \u0e2b\u0e21\u0e14\u0e40\u0e27\u0e25\u0e32\u0e41\u0e25\u0e49\u0e27! -Commands.PowerLevel.Leaderboard=--mcMMO[[BLUE]] \u0e23\u0e30\u0e14\u0e31\u0e1a\u0e1e\u0e25\u0e31\u0e07 [[YELLOW]]Leaderboard-- -Commands.PowerLevel.Capped=[[DARK_RED]]\u0e23\u0e30\u0e14\u0e31\u0e1a\u0e1e\u0e25\u0e31\u0e07: [[GREEN]]{0} [[DARK_RED]]\u0e23\u0e30\u0e14\u0e31\u0e1a\u0e40\u0e15\u0e47\u0e21: [[YELLOW]]{1} -Commands.PowerLevel=[[DARK_RED]]\u0e23\u0e30\u0e14\u0e31\u0e1a\u0e1e\u0e25\u0e31\u0e07: [[GREEN]]{0} -Commands.Reset.All=[[GREEN]]\u0e17\u0e31\u0e01\u0e29\u0e30\u0e17\u0e38\u0e01\u0e17\u0e31\u0e01\u0e29\u0e30\u0e16\u0e39\u0e01\u0e15\u0e31\u0e49\u0e07\u0e04\u0e48\u0e32\u0e43\u0e2b\u0e21\u0e48. -Commands.Reset.Single=[[GREEN]]\u0e17\u0e31\u0e01\u0e29\u0e30 {0} \u0e23\u0e30\u0e14\u0e31\u0e1a\u0e17\u0e31\u0e01\u0e29\u0e30\u0e44\u0e14\u0e49\u0e15\u0e31\u0e49\u0e07\u0e04\u0e48\u0e32\u0e43\u0e2b\u0e21\u0e48\u0e40\u0e23\u0e35\u0e22\u0e1a\u0e23\u0e49\u0e2d\u0e22\u0e41\u0e25\u0e49\u0e27. -Commands.Reset=\u0e15\u0e31\u0e49\u0e07\u0e04\u0e48\u0e32\u0e17\u0e31\u0e01\u0e29\u0e30\u0e43\u0e2b\u0e21\u0e48\u0e43\u0e2b\u0e49\u0e40\u0e1b\u0e47\u0e19 0 -Commands.Skill.Invalid=\u0e44\u0e21\u0e48\u0e21\u0e35\u0e0a\u0e37\u0e48\u0e2d\u0e17\u0e31\u0e01\u0e29\u0e30\u0e19\u0e35\u0e49! -Commands.Skill.Leaderboard=--mcMMO [[BLUE]]{0}[[YELLOW]] Leaderboard-- -Commands.Stats.Self=\u0e2a\u0e16\u0e34\u0e15\u0e34\u0e02\u0e2d\u0e07\u0e04\u0e38\u0e13 -Commands.Stats=- \u0e14\u0e39\u0e2a\u0e16\u0e34\u0e15\u0e34 mcMMO \u0e02\u0e2d\u0e07\u0e04\u0e38\u0e13 -Commands.ToggleAbility=- \u0e40\u0e1b\u0e34\u0e14\u0e43\u0e0a\u0e49\u0e04\u0e27\u0e32\u0e21\u0e2a\u0e32\u0e21\u0e32\u0e23\u0e16\u0e42\u0e14\u0e22\u0e01\u0e32\u0e23\u0e04\u0e25\u0e34\u0e01\u0e02\u0e27\u0e32 -Commands.Usage.0=\u0e04\u0e27\u0e23\u0e43\u0e0a\u0e49 /{0} -Commands.Usage.1=\u0e04\u0e27\u0e23\u0e43\u0e0a\u0e49 /{0} {1} -Commands.Usage.2=\u0e04\u0e27\u0e23\u0e43\u0e0a\u0e49 /{0} {1} {2} -Commands.Usage.3=\u0e04\u0e27\u0e23\u0e43\u0e0a\u0e49 /{0} {1} {2} {3} -Commands.Usage.Level=\u0e23\u0e30\u0e14\u0e31\u0e1a -Commands.Usage.Message=\u0e02\u0e49\u0e2d\u0e04\u0e27\u0e32\u0e21 -Commands.Usage.Page=\u0e2b\u0e19\u0e49\u0e32 -Commands.Usage.PartyName=\u0e0a\u0e37\u0e48\u0e2d -Commands.Usage.Password=\u0e23\u0e2b\u0e31\u0e2a\u0e1c\u0e48\u0e32\u0e19 -Commands.Usage.Player=\u0e1c\u0e39\u0e49\u0e40\u0e25\u0e48\u0e19 -Commands.Usage.Rate=\u0e2d\u0e31\u0e15\u0e23\u0e32 -Commands.Usage.Skill=\u0e17\u0e31\u0e01\u0e29\u0e30 +Commands.Disabled=คำสั่งนี้ถูกปิดไว้. +Commands.DoesNotExist=ไม่พบผู้เล่นในฐานข้อมูล! +Commands.GodMode.Disabled=mcMMO โหมด God ถูกปิดอยู่ +Commands.GodMode.Enabled=mcMMO โหมด God ถูกเปิด +Commands.GodMode.Forbidden=[mcMMO] คุณไม่ได้รับอนุญาตบนโลกนี้ (ดู Permissions) +Commands.Inspect= &c- ดูข้อมูลรายละเอียดของผู้เล่น +Commands.Party.Invite.Accepted=&aยินยอมการรับเชิญ. คุณได้เข้า party {0} +Commands.Invite.Success=&aส่งคำเชิญแล้วประสบความสำเร็จ. +Commands.Leaderboards= &c- Leaderboards +Commands.mcc.Header=---[]&eคำสั่ง mcMMO&c[]--- +Commands.mcgod=- โหมด God +Commands.mchud.Invalid=ไม่พบ HUD ชนิดนี้. +Commands.mcpurge.Success=&aฐานข้อมูลกำลังล้างเรียบร้อยแล้ว! +Commands.mcrank.Heading=&6-=การจัดอันดับของบุคคล=- +Commands.mcrank.Overall=รวมทั้งหมด&a - &6ระดับ &f#&a{0} +Commands.mcrank.Player=เป้าหมาย: &f{0} +Commands.mcrank.Skill={0}&a - &6ลำดับ &f#&a{1} +Commands.mcrank.Unranked=&fUnranked +Commands.mcrefresh.Success={0}\'\'วินาที คูลดาวน์สำเร็จ. +Commands.mcremove.Success=&a{0} จะถูกลบออกจากฐานข้อมูลที่ประสบความสำเร็จ! +Commands.mctop.Tip=&6Tip: ใช้ &c/mcrank&6 เพื่อดูลำดับของบุคคล! +Commands.mmoedit=[player] &c - แก้ไขเป้าหมาย +Commands.mmoedit.AllSkills.1=&aระดับทักษะทั้งหมดถูกตั้งเป็น {0}! +Commands.mmoedit.Modified.1=&aระดับเดิมคุณคือ {0} ถูกเปลี่ยนเป็น {1}! +Commands.mmoedit.Modified.2={0} ได้รับการแก้ไขสำหรับ {1}. +Commands.ModDescription=- อ่านคำอธิบาย +Commands.NoConsole=คำสั่งนี้จะไม่สนับสนุนการใช้คอนโซล. +Commands.Notifications.Off=การแจ้งเตือนความสามารถในการสลับ &cถูกปิด +Commands.Notifications.On=การแจ้งเตือนความสามารถในการสลับ &cถูกเปิด +Commands.Offline=คำสั่งนี้จะไม่ทำงานสำหรับผู้เล่น Offline. +Commands.Other=&a--คำสั่งอื่นๆ-- +Commands.Party.Header=-----[]&aPARTY&c[]----- +Commands.Party.Status=&8ชื่อ: &f{0} {1} +Commands.Party.ShareMode=&8โหมดแบ่งปัน: +Commands.Party.ItemShare=&7สิ่งของ &3({0}) +Commands.Party.ExpShare=&7EXP &3({0}) +Commands.Party.ItemShareCategories=&8แบ่งปันสิ่งของ: &7&o{0} +Commands.Party.MembersNear=&8ที่อยู่ใกล้คุณ &3{0}&8/&3{1} +Commands.Party.Accept=- ยินยอมคำเชิญ +Commands.Party.Chat.Off=Party Chat &cถูกปิด +Commands.Party.Chat.On=Party Chat &aเปิด +Commands.Party.Commands=&a--คำสั่ง PARTY-- +Commands.Party.Invite.0=ALERT: &aคุณถูกเชิญเข้า party {0} จาก {1} +Commands.Party.Invite.1=ใช้ &a/party accept&e เพิ่อยอมรับการรับเชิญ +Commands.Party.Invite=- ส่งคำเชิญ Party +Commands.Party.Join=&7ได้เข้าร่วม Party: {0} +Commands.Party.Create=&7สร้าง Party: {0} +Commands.Party.Rename=&7ชื่อ Party เปลี่ยนเป็น: &f{0} +Commands.Party.SetSharing=&7Party {0} แบ่งปันถูกตั้งเป็น: &3{1} +Commands.Party.ToggleShareCategory=&7Party แบ่งปันสิ่งของให้ &6{0} &7ได้รับ &3{1} +Commands.Party.AlreadyExists=&4Party {0} มีอยู่แล้ว! +Commands.Party.Kick=คุณถูกนำออกจาก party{0}! +Commands.Party.Leave=คุณได้ออกจาก party +Commands.Party.Members.Header=-----[]&aสมาชิก&c[]----- +Commands.Party.None=คุณไม่ได้อยู่ใน party. +Commands.Party.Quit=- ออกจากงาน party ของคุณในปัจจุบัน +Commands.Party.Teleport= &c- Teleport to ไปหาสมาชิก party +Commands.Party.Toggle=- เปลี่ยนโหมด Party Chat +Commands.Party.1=- สร้าง Party ใหม่ +Commands.Party.2=- เข้าร่วม Party ของผู้เล่น +Commands.ptp.Enabled=Party teleporting &aถูกเปิด +Commands.ptp.Disabled=Party teleporting &cถูกปิด +Commands.ptp.NoRequests=คุณยังไม่มีการร้องขอ teleport ในเวลานี้ +Commands.ptp.NoWorldPermissions=[mcMMO] คุณไม่ได้รับอนุญาตให้ teleport ในโลกนี้ {0}. +Commands.ptp.Request1={0} &aต้องการ teleport มาหาคุณ. +Commands.ptp.Request2=&aเพื่อ teleport ใช้ &e/ptp accept. &aภายใน &c{0} &aวินาที. +Commands.ptp.AcceptAny.Enabled=Party teleport &aถูกเปิด +Commands.ptp.AcceptAny.Disabled=Party teleport &cถูกปิด +Commands.ptp.RequestExpired=Party teleport หมดเวลาแล้ว! +Commands.PowerLevel.Leaderboard=--mcMMO&9 ระดับพลัง &eLeaderboard-- +Commands.PowerLevel.Capped=&4ระดับพลัง: &a{0} &4ระดับเต็ม: &e{1} +Commands.PowerLevel=&4ระดับพลัง: &a{0} +Commands.Reset.All=&aทักษะทุกทักษะถูกตั้งค่าใหม่. +Commands.Reset.Single=&aทักษะ {0} ระดับทักษะได้ตั้งค่าใหม่เรียบร้อยแล้ว. +Commands.Reset=ตั้งค่าทักษะใหม่ให้เป็น 0 +Commands.Skill.Invalid=ไม่มีชื่อทักษะนี้! +Commands.Skill.Leaderboard=--mcMMO &9{0}&e Leaderboard-- +Commands.Stats.Self=สถิติของคุณ +Commands.Stats=- ดูสถิติ mcMMO ของคุณ +Commands.ToggleAbility=- เปิดใช้ความสามารถโดยการคลิกขวา +Commands.Usage.0=ควรใช้ /{0} +Commands.Usage.1=ควรใช้ /{0} {1} +Commands.Usage.2=ควรใช้ /{0} {1} {2} +Commands.Usage.3=ควรใช้ /{0} {1} {2} {3} +Commands.Usage.Level=ระดับ +Commands.Usage.Message=ข้อความ +Commands.Usage.Page=หน้า +Commands.Usage.PartyName=ชื่อ +Commands.Usage.Password=รหัสผ่าน +Commands.Usage.Player=ผู้เล่น +Commands.Usage.Rate=อัตรา +Commands.Usage.Skill=ทักษะ Commands.Usage.XP=Exp -mcMMO.NoInvites=\u0e04\u0e38\u0e13\u0e22\u0e31\u0e07\u0e44\u0e21\u0e48\u0e44\u0e14\u0e49\u0e16\u0e39\u0e01\u0e40\u0e0a\u0e34\u0e0d\u0e15\u0e2d\u0e19\u0e19\u0e35\u0e49 -mcMMO.NoPermission=[[DARK_RED]]\u0e2a\u0e34\u0e17\u0e18\u0e34\u0e4c\u0e44\u0e21\u0e48\u0e40\u0e1e\u0e35\u0e22\u0e07\u0e1e\u0e2d. -mcMMO.NoSkillNote=[[DARK_GRAY]]\u0e2b\u0e32\u0e01\u0e04\u0e38\u0e13\u0e44\u0e21\u0e48\u0e44\u0e14\u0e49\u0e21\u0e35\u0e01\u0e32\u0e23\u0e40\u0e02\u0e49\u0e32\u0e16\u0e36\u0e07\u0e17\u0e31\u0e01\u0e29\u0e30\u0e21\u0e31\u0e19\u0e08\u0e30\u0e44\u0e21\u0e48\u0e16\u0e39\u0e01\u0e41\u0e2a\u0e14\u0e07\u0e17\u0e35\u0e48\u0e19\u0e35\u0e48 -Party.Forbidden=[mcMMO] \u0e04\u0e38\u0e13\u0e44\u0e21\u0e48\u0e44\u0e14\u0e49\u0e23\u0e31\u0e1a\u0e2d\u0e19\u0e38\u0e0d\u0e32\u0e15\u0e1a\u0e19\u0e42\u0e25\u0e01\u0e19\u0e35\u0e49 (\u0e14\u0e39 Permissions) -Party.Help.0=\u0e04\u0e27\u0e23\u0e43\u0e0a\u0e49 [[DARK_AQUA]]{0} [password]. -Party.Help.1=\u0e2a\u0e23\u0e49\u0e32\u0e07 Party \u0e43\u0e2b\u0e21\u0e48\u0e43\u0e0a\u0e49 [[DARK_AQUA]]{0} [password]. -Party.Help.2=\u0e1b\u0e23\u0e36\u0e01\u0e29\u0e32 [[DARK_AQUA]]{0} [[RED]]\u0e2a\u0e33\u0e2b\u0e23\u0e31\u0e1a\u0e02\u0e49\u0e2d\u0e21\u0e39\u0e25\u0e40\u0e1e\u0e34\u0e48\u0e21\u0e40\u0e15\u0e34\u0e21 -Party.Help.3=\u0e43\u0e0a\u0e49 [[DARK_AQUA]]{0} [password] [[RED]]\u0e40\u0e1e\u0e37\u0e48\u0e2d\u0e40\u0e02\u0e49\u0e32 [[DARK_AQUA]]{1} [[RED]]\u0e2b\u0e23\u0e37\u0e2d\u0e2d\u0e2d\u0e01 -Party.Help.4=\u0e40\u0e1e\u0e37\u0e48\u0e2d\u0e25\u0e47\u0e2d\u0e04\u0e2b\u0e23\u0e37\u0e2d\u0e1b\u0e25\u0e14\u0e25\u0e47\u0e2d\u0e04 Party \u0e43\u0e0a\u0e49 [[DARK_AQUA]]{0} -Party.Help.5=\u0e23\u0e2b\u0e31\u0e2a\u0e1c\u0e48\u0e32\u0e19\u0e40\u0e1e\u0e37\u0e48\u0e2d\u0e1b\u0e49\u0e2d\u0e07\u0e01\u0e31\u0e19 Party \u0e43\u0e0a\u0e49 [[DARK_AQUA]]{0} -Party.Help.6=\u0e40\u0e15\u0e30\u0e1c\u0e39\u0e49\u0e40\u0e25\u0e48\u0e19\u0e08\u0e32\u0e01 Party \u0e02\u0e2d\u0e07\u0e04\u0e38\u0e13\u0e43\u0e0a\u0e49 [[DARK_AQUA]]{0} -Party.Help.7=\u0e43\u0e19\u0e01\u0e32\u0e23\u0e42\u0e2d\u0e19\u0e2b\u0e31\u0e27\u0e2b\u0e19\u0e49\u0e32\u0e02\u0e2d\u0e07 Party \u0e43\u0e0a\u0e49 [[DARK_AQUA]]{0} -Party.Help.8=\u0e22\u0e01\u0e40\u0e25\u0e34\u0e01 Party \u0e43\u0e0a\u0e49 [[DARK_AQUA]]{0} -Party.Help.9=\u0e43\u0e0a\u0e49 [[DARK_AQUA]]{0} [[RED]]\u0e40\u0e1e\u0e37\u0e48\u0e2d\u0e41\u0e1a\u0e48\u0e07\u0e1b\u0e31\u0e19\u0e2a\u0e34\u0e48\u0e07\u0e02\u0e2d\u0e07\u0e43\u0e19 party \u0e02\u0e2d\u0e07\u0e04\u0e38\u0e13 -Party.Help.10=\u0e43\u0e0a\u0e49 [[DARK_AQUA]]{0} [[RED]]\u0e40\u0e1e\u0e37\u0e48\u0e2d\u0e41\u0e1a\u0e48\u0e07\u0e1b\u0e31\u0e19 EXP \u0e43\u0e2b\u0e49\u0e01\u0e31\u0e1a party \u0e02\u0e2d\u0e07\u0e04\u0e38\u0e13 -Party.InformedOnJoin={0} [[GREEN]]\u0e44\u0e14\u0e49\u0e40\u0e02\u0e49\u0e32\u0e23\u0e48\u0e27\u0e21 Party \u0e02\u0e2d\u0e07\u0e04\u0e38\u0e13 -Party.InformedOnQuit={0} [[GREEN]]\u0e44\u0e14\u0e49\u0e2d\u0e2d\u0e01\u0e08\u0e32\u0e01 Party \u0e02\u0e2d\u0e07\u0e04\u0e38\u0e13 -Party.InformedOnNameChange=[[GOLD]]{0} [[GREEN]]\u0e44\u0e14\u0e49\u0e40\u0e1b\u0e25\u0e35\u0e48\u0e22\u0e19\u0e0a\u0e37\u0e48\u0e2d Party \u0e40\u0e1b\u0e47\u0e19 [[WHITE]]{1} -Party.InvalidName=[[DARK_RED]]\u0e44\u0e21\u0e48\u0e1e\u0e1a\u0e0a\u0e37\u0e48\u0e2d party \u0e19\u0e35\u0e49. -Party.Invite.Self=\u0e04\u0e38\u0e13\u0e44\u0e21\u0e48\u0e2a\u0e32\u0e21\u0e32\u0e23\u0e16\u0e40\u0e0a\u0e34\u0e0d\u0e15\u0e31\u0e27\u0e40\u0e2d\u0e07\u0e44\u0e14\u0e49! -Party.IsLocked=Party \u0e16\u0e39\u0e01\u0e1b\u0e25\u0e14\u0e25\u0e47\u0e2d\u0e01\u0e2d\u0e22\u0e39\u0e48\u0e41\u0e25\u0e49\u0e27! -Party.IsntLocked=party \u0e22\u0e31\u0e07\u0e44\u0e21\u0e48\u0e1b\u0e25\u0e14\u0e25\u0e47\u0e2d\u0e01! -Party.Locked=Party \u0e16\u0e39\u0e01\u0e25\u0e47\u0e2d\u0e01\u0e44\u0e27\u0e49 \u0e15\u0e49\u0e2d\u0e07\u0e43\u0e2b\u0e49\u0e2b\u0e31\u0e27\u0e2b\u0e19\u0e49\u0e32 Party \u0e40\u0e0a\u0e34\u0e0d\u0e40\u0e17\u0e48\u0e32\u0e19\u0e31\u0e49\u0e19. -Party.NotInYourParty=[[DARK_RED]]{0} \u0e44\u0e21\u0e48\u0e44\u0e14\u0e49\u0e2d\u0e22\u0e39\u0e48\u0e43\u0e19 party \u0e02\u0e2d\u0e07\u0e04\u0e38\u0e13 -Party.NotOwner=[[DARK_RED]]\u0e04\u0e38\u0e13\u0e44\u0e21\u0e48\u0e44\u0e14\u0e49\u0e40\u0e1b\u0e47\u0e19\u0e2b\u0e31\u0e27\u0e2b\u0e19\u0e49\u0e32 Party. -Party.Owner.New=[[GREEN]]{0} \u0e44\u0e14\u0e49\u0e40\u0e1b\u0e47\u0e19\u0e2b\u0e31\u0e27\u0e2b\u0e19\u0e49\u0e32 Party \u0e43\u0e2b\u0e21\u0e48. -Party.Owner.NotLeader=[[DARK_RED]]\u0e04\u0e38\u0e13\u0e08\u0e30\u0e44\u0e21\u0e48\u0e44\u0e14\u0e49\u0e40\u0e1b\u0e47\u0e19\u0e2b\u0e31\u0e27\u0e2b\u0e19\u0e49\u0e32 Party. -Party.Owner.Player=[[DARK_RED]]\u0e04\u0e38\u0e13\u0e44\u0e14\u0e49\u0e40\u0e1b\u0e47\u0e19\u0e2b\u0e31\u0e27\u0e2b\u0e19\u0e49\u0e32 Party. -Party.Password.None=Party \u0e19\u0e35\u0e49\u0e21\u0e35\u0e23\u0e2b\u0e31\u0e2a\u0e1c\u0e48\u0e32\u0e19\u0e1b\u0e49\u0e2d\u0e07\u0e01\u0e31\u0e19 \u0e42\u0e1b\u0e23\u0e14\u0e23\u0e30\u0e1a\u0e38\u0e23\u0e2b\u0e31\u0e2a\u0e1c\u0e48\u0e32\u0e19\u0e17\u0e35\u0e48\u0e08\u0e30\u0e40\u0e02\u0e49\u0e32\u0e23\u0e48\u0e27\u0e21. -Party.Password.Incorrect=\u0e23\u0e2b\u0e31\u0e2a\u0e1c\u0e48\u0e32\u0e19 Party \u0e44\u0e21\u0e48\u0e16\u0e39\u0e01\u0e15\u0e49\u0e2d\u0e07. -Party.Password.Set=[[GREEN]]\u0e23\u0e2b\u0e31\u0e2a\u0e1c\u0e48\u0e32\u0e19 Party \u0e16\u0e39\u0e01\u0e15\u0e31\u0e49\u0e07\u0e40\u0e1b\u0e47\u0e19 {0} -Party.Password.Removed=[[GREEN]]\u0e23\u0e2b\u0e31\u0e2a\u0e1c\u0e48\u0e32\u0e19 Party \u0e16\u0e39\u0e01\u0e25\u0e49\u0e32\u0e07\u0e2d\u0e2d\u0e01. -Party.Player.Invalid=\u0e0a\u0e37\u0e48\u0e2d\u0e1c\u0e39\u0e49\u0e40\u0e25\u0e48\u0e19\u0e1c\u0e34\u0e14\u0e1e\u0e25\u0e32\u0e14. -Party.NotOnline=[[DARK_RED]]{0} \u0e44\u0e21\u0e48\u0e44\u0e14\u0e49 Online! -Party.Player.InSameParty={0} \u0e44\u0e14\u0e49\u0e2d\u0e22\u0e39\u0e48\u0e43\u0e19 Party \u0e02\u0e2d\u0e07\u0e04\u0e38\u0e13\u0e41\u0e25\u0e49\u0e27! -Party.PlayerNotInParty=[[DARK_RED]]{0} \u0e44\u0e21\u0e48\u0e44\u0e14\u0e49\u0e2d\u0e22\u0e39\u0e48\u0e43\u0e19 Party -Party.Specify=\u0e04\u0e38\u0e13\u0e15\u0e49\u0e2d\u0e07\u0e23\u0e30\u0e1a\u0e38 Party. -Party.Teleport.Dead=\u0e04\u0e39\u0e13\u0e44\u0e21\u0e48\u0e2a\u0e32\u0e21\u0e32\u0e23\u0e16 teleport \u0e44\u0e1b\u0e2b\u0e32\u0e1c\u0e39\u0e40\u0e25\u0e48\u0e19\u0e19\u0e35\u0e49\u0e44\u0e14\u0e49. -Party.Teleport.Hurt=\u0e04\u0e38\u0e13\u0e44\u0e14\u0e49\u0e23\u0e31\u0e1a\u0e1a\u0e32\u0e14\u0e40\u0e08\u0e47\u0e1a\u0e43\u0e19\u0e0a\u0e48\u0e27\u0e07 {0} \u0e27\u0e34\u0e19\u0e32\u0e17\u0e35\u0e41\u0e25\u0e30\u0e44\u0e21\u0e48\u0e2a\u0e32\u0e21\u0e32\u0e23\u0e16 teleport. -Party.Teleport.Player=[[GREEN]]\u0e04\u0e38\u0e13\u0e44\u0e14\u0e49 teleport \u0e44\u0e1b\u0e2b\u0e32 {0}. -Party.Teleport.Self=\u0e04\u0e38\u0e13\u0e44\u0e21\u0e48\u0e2a\u0e32\u0e21\u0e32\u0e23\u0e16 teleport \u0e44\u0e1b\u0e2b\u0e32\u0e04\u0e38\u0e13\u0e40\u0e2d\u0e07\u0e44\u0e14\u0e49 -Party.Teleport.Target=[[GREEN]]{0} \u0e44\u0e14\u0e49\u0e17\u0e33\u0e01\u0e32\u0e23 teleport \u0e21\u0e32\u0e2b\u0e32\u0e04\u0e38\u0e13. -Party.Teleport.Disabled={0} \u0e44\u0e21\u0e48\u0e2d\u0e19\u0e38\u0e0d\u0e32\u0e15\u0e43\u0e2b\u0e49\u0e1a\u0e38\u0e04\u0e04\u0e25 teleport. -Party.Rename.Same=\u0e0a\u0e37\u0e48\u0e2d\u0e19\u0e35\u0e49\u0e21\u0e35\u0e43\u0e19 Party \u0e41\u0e25\u0e49\u0e27! -Party.Join.Self=\u0e04\u0e38\u0e13\u0e44\u0e21\u0e48\u0e2a\u0e32\u0e21\u0e32\u0e23\u0e16\u0e40\u0e02\u0e49\u0e32\u0e23\u0e48\u0e27\u0e21\u0e14\u0e49\u0e27\u0e22\u0e15\u0e31\u0e27\u0e04\u0e38\u0e13\u0e40\u0e2d\u0e07! -Party.Unlocked=[[GRAY]]Party \u0e16\u0e39\u0e01\u0e1b\u0e25\u0e14\u0e25\u0e47\u0e2d\u0e01 -Party.Disband=[[GRAY]]Party \u0e16\u0e39\u0e01\u0e1b\u0e34\u0e14\u0e44\u0e27\u0e49 -Party.Status.Locked=[[DARK_RED]](\u0e40\u0e0a\u0e34\u0e0d\u0e2d\u0e22\u0e48\u0e32\u0e07\u0e40\u0e14\u0e35\u0e22\u0e27) -Party.Status.Unlocked=[[DARK_GREEN]](\u0e40\u0e1b\u0e34\u0e14) +mcMMO.NoInvites=คุณยังไม่ได้ถูกเชิญตอนนี้ +mcMMO.NoPermission=&4สิทธิ์ไม่เพียงพอ. +mcMMO.NoSkillNote=&8หากคุณไม่ได้มีการเข้าถึงทักษะมันจะไม่ถูกแสดงที่นี่ +Party.Forbidden=[mcMMO] คุณไม่ได้รับอนุญาตบนโลกนี้ (ดู Permissions) +Party.Help.0=ควรใช้ &3{0} [password]. +Party.Help.1=สร้าง Party ใหม่ใช้ &3{0} [password]. +Party.Help.2=ปรึกษา &3{0} &cสำหรับข้อมูลเพิ่มเติม +Party.Help.3=ใช้ &3{0} [password] &cเพื่อเข้า &3{1} &cหรือออก +Party.Help.4=เพื่อล็อคหรือปลดล็อค Party ใช้ &3{0} +Party.Help.5=รหัสผ่านเพื่อป้องกัน Party ใช้ &3{0} +Party.Help.6=เตะผู้เล่นจาก Party ของคุณใช้ &3{0} +Party.Help.7=ในการโอนหัวหน้าของ Party ใช้ &3{0} +Party.Help.8=ยกเลิก Party ใช้ &3{0} +Party.Help.9=ใช้ &3{0} &cเพื่อแบ่งปันสิ่งของใน party ของคุณ +Party.Help.10=ใช้ &3{0} &cเพื่อแบ่งปัน EXP ให้กับ party ของคุณ +Party.InformedOnJoin={0} &aได้เข้าร่วม Party ของคุณ +Party.InformedOnQuit={0} &aได้ออกจาก Party ของคุณ +Party.InformedOnNameChange=&6{0} &aได้เปลี่ยนชื่อ Party เป็น &f{1} +Party.InvalidName=&4ไม่พบชื่อ party นี้. +Party.Invite.Self=คุณไม่สามารถเชิญตัวเองได้! +Party.IsLocked=Party ถูกปลดล็อกอยู่แล้ว! +Party.IsntLocked=party ยังไม่ปลดล็อก! +Party.Locked=Party ถูกล็อกไว้ ต้องให้หัวหน้า Party เชิญเท่านั้น. +Party.NotInYourParty=&4{0} ไม่ได้อยู่ใน party ของคุณ +Party.NotOwner=&4คุณไม่ได้เป็นหัวหน้า Party. +Party.Owner.New=&a{0} ได้เป็นหัวหน้า Party ใหม่. +Party.Owner.NotLeader=&4คุณจะไม่ได้เป็นหัวหน้า Party. +Party.Owner.Player=&4คุณได้เป็นหัวหน้า Party. +Party.Password.None=Party นี้มีรหัสผ่านป้องกัน โปรดระบุรหัสผ่านที่จะเข้าร่วม. +Party.Password.Incorrect=รหัสผ่าน Party ไม่ถูกต้อง. +Party.Password.Set=&aรหัสผ่าน Party ถูกตั้งเป็น {0} +Party.Password.Removed=&aรหัสผ่าน Party ถูกล้างออก. +Party.Player.Invalid=ชื่อผู้เล่นผิดพลาด. +Party.NotOnline=&4{0} ไม่ได้ Online! +Party.Player.InSameParty={0} ได้อยู่ใน Party ของคุณแล้ว! +Party.PlayerNotInParty=&4{0} ไม่ได้อยู่ใน Party +Party.Specify=คุณต้องระบุ Party. +Party.Teleport.Dead=คูณไม่สามารถ teleport ไปหาผูเล่นนี้ได้. +Party.Teleport.Hurt=คุณได้รับบาดเจ็บในช่วง {0} วินาทีและไม่สามารถ teleport. +Party.Teleport.Player=&aคุณได้ teleport ไปหา {0}. +Party.Teleport.Self=คุณไม่สามารถ teleport ไปหาคุณเองได้ +Party.Teleport.Target=&a{0} ได้ทำการ teleport มาหาคุณ. +Party.Teleport.Disabled={0} ไม่อนุญาตให้บุคคล teleport. +Party.Rename.Same=ชื่อนี้มีใน Party แล้ว! +Party.Join.Self=คุณไม่สามารถเข้าร่วมด้วยตัวคุณเอง! +Party.Unlocked=&7Party ถูกปลดล็อก +Party.Disband=&7Party ถูกปิดไว้ +Party.Status.Locked=&4(เชิญอย่างเดียว) +Party.Status.Unlocked=&2(เปิด) Party.ShareType.Xp=EXP -Party.ShareType.Item=\u0e2a\u0e34\u0e48\u0e07\u0e02\u0e2d\u0e07 +Party.ShareType.Item=สิ่งของ Party.ShareMode.None=NONE -Party.ShareMode.Equal=\u0e40\u0e17\u0e48\u0e32\u0e01\u0e31\u0e19 -Party.ShareMode.Random=\u0e2a\u0e38\u0e48\u0e21 -Party.XpShare.Disabled=Party \u0e41\u0e1a\u0e48\u0e07\u0e1b\u0e31\u0e19\u0e1b\u0e23\u0e30\u0e2a\u0e1a\u0e01\u0e32\u0e23\u0e13\u0e4c\u0e16\u0e39\u0e01\u0e1b\u0e34\u0e14. -Party.ItemShare.Disabled=Party \u0e41\u0e1a\u0e48\u0e07\u0e1b\u0e31\u0e19\u0e2a\u0e34\u0e48\u0e07\u0e02\u0e2d\u0e07\u0e16\u0e39\u0e01\u0e1b\u0e34\u0e14. +Party.ShareMode.Equal=เท่ากัน +Party.ShareMode.Random=สุ่ม +Party.XpShare.Disabled=Party แบ่งปันประสบการณ์ถูกปิด. +Party.ItemShare.Disabled=Party แบ่งปันสิ่งของถูกปิด. Party.ItemShare.Category.Loot=Loot Party.ItemShare.Category.Mining=Mining Party.ItemShare.Category.Herbalism=Herbalism Party.ItemShare.Category.Woodcutting=Woodcutting Party.ItemShare.Category.Misc=Misc Commands.XPGain.Acrobatics=Falling -Commands.XPGain.Archery=\u0e17\u0e33\u0e01\u0e32\u0e23\u0e42\u0e08\u0e21\u0e15\u0e35 Monster -Commands.XPGain.Axes=\u0e17\u0e33\u0e01\u0e32\u0e23\u0e42\u0e08\u0e21\u0e15\u0e35 Monster -Commands.XPGain.Child=\u0e23\u0e30\u0e14\u0e31\u0e1a\u0e23\u0e32\u0e07\u0e27\u0e31\u0e25\u0e08\u0e32\u0e01\u0e01\u0e32\u0e23\u0e43\u0e0a\u0e49\u0e17\u0e31\u0e01\u0e29\u0e30 -Commands.XPGain.Excavation=\u0e02\u0e38\u0e14\u0e41\u0e25\u0e30\u0e2b\u0e32\u0e2a\u0e21\u0e1a\u0e31\u0e15\u0e34 +Commands.XPGain.Archery=ทำการโจมตี Monster +Commands.XPGain.Axes=ทำการโจมตี Monster +Commands.XPGain.Child=ระดับรางวัลจากการใช้ทักษะ +Commands.XPGain.Excavation=ขุดและหาสมบัติ Commands.XPGain.Fishing=Fishing! Commands.XPGain.Herbalism=Harvesting Herbs -Commands.XPGain.Mining=\u0e01\u0e32\u0e23\u0e17\u0e33\u0e40\u0e2b\u0e21\u0e37\u0e2d\u0e07\u0e41\u0e23\u0e48\u0e2b\u0e34\u0e19\u0e41\u0e25\u0e30\u0e41\u0e23\u0e48 +Commands.XPGain.Mining=การทำเหมืองแร่หินและแร่ Commands.XPGain.Repair=Repairing -Commands.XPGain.Swords=\u0e17\u0e33\u0e01\u0e32\u0e23\u0e42\u0e08\u0e21\u0e15\u0e35 Monster -Commands.XPGain.Taming=\u0e2a\u0e31\u0e15\u0e27\u0e4c\u0e40\u0e25\u0e35\u0e49\u0e22\u0e07\u0e02\u0e2d\u0e07\u0e04\u0e38\u0e13\u0e01\u0e33\u0e25\u0e31\u0e07\u0e1d\u0e36\u0e01\u0e1d\u0e19\u0e01\u0e32\u0e23\u0e15\u0e48\u0e2d\u0e2a\u0e39\u0e49 -Commands.XPGain.Unarmed=\u0e17\u0e33\u0e01\u0e32\u0e23\u0e42\u0e08\u0e21\u0e15\u0e35 Monster -Commands.XPGain.Woodcutting=\u0e2a\u0e31\u0e1a\u0e15\u0e49\u0e19\u0e44\u0e21\u0e49\u0e25\u0e49\u0e21\u0e25\u0e07 -Commands.XPGain=[[DARK_GRAY]]EXP \u0e17\u0e35\u0e48\u0e44\u0e14\u0e49\u0e23\u0e31\u0e1a: [[WHITE]]{0} -Commands.xplock.locked=[[GOLD]]BAR EXP \u0e16\u0e39\u0e01\u0e1b\u0e14\u0e25\u0e47\u0e2d\u0e01 {0}! -Commands.xplock.unlocked=[[GOLD]]EXP BAR \u0e02\u0e2d\u0e07\u0e04\u0e38\u0e13\u0e44\u0e14\u0e49\u0e16\u0e39\u0e01 [[GREEN]]\u0e1b\u0e25\u0e14\u0e25\u0e47\u0e2d\u0e01[[GOLD]]! -Commands.xprate.modified=\u0e2d\u0e31\u0e04\u0e23\u0e32 EXP \u0e16\u0e39\u0e01\u0e41\u0e01\u0e49\u0e44\u0e02\u0e40\u0e1b\u0e47\u0e19 {0} -Commands.xprate.over=mcMMO \u0e2d\u0e31\u0e15\u0e23\u0e32EXP \u0e15\u0e2d\u0e19\u0e19\u0e35\u0e49\u0e21\u0e32\u0e01\u0e02\u0e36\u0e49\u0e19!! -Commands.xprate.proper.0=\u0e01\u0e32\u0e23\u0e43\u0e0a\u0e49\u0e07\u0e32\u0e19\u0e17\u0e35\u0e48\u0e40\u0e2b\u0e21\u0e32\u0e30\u0e2a\u0e21\u0e43\u0e19\u0e01\u0e32\u0e23\u0e40\u0e1b\u0e25\u0e35\u0e48\u0e22\u0e19\u0e2d\u0e31\u0e15\u0e23\u0e32 EXP \u0e40\u0e1b\u0e47\u0e19 /xprate -Commands.xprate.proper.1=\u0e01\u0e32\u0e23\u0e43\u0e0a\u0e49\u0e07\u0e32\u0e19\u0e17\u0e35\u0e48\u0e40\u0e2b\u0e21\u0e32\u0e30\u0e2a\u0e21\u0e43\u0e19\u0e01\u0e32\u0e23\u0e40\u0e23\u0e35\u0e22\u0e01\u0e04\u0e37\u0e19\u0e2d\u0e31\u0e15\u0e23\u0e32 EXP \u0e40\u0e1e\u0e37\u0e48\u0e2d\u0e40\u0e23\u0e34\u0e48\u0e21\u0e15\u0e49\u0e19\u0e16\u0e39\u0e01\u0e15\u0e31\u0e49\u0e07\u0e04\u0e48\u0e32\u0e43\u0e2b\u0e21\u0e48 xprate / -Commands.xprate.proper.2=\u0e42\u0e1b\u0e23\u0e14\u0e23\u0e30\u0e1a\u0e38\u0e08\u0e23\u0e34\u0e07\u0e2b\u0e23\u0e37\u0e2d\u0e40\u0e17\u0e47\u0e08\u0e40\u0e1e\u0e37\u0e48\u0e2d\u0e41\u0e2a\u0e14\u0e07\u0e27\u0e48\u0e32\u0e19\u0e35\u0e49\u0e40\u0e1b\u0e47\u0e19\u0e40\u0e2b\u0e15\u0e38\u0e01\u0e32\u0e23\u0e13\u0e4c EXP \u0e2b\u0e23\u0e37\u0e2d\u0e44\u0e21\u0e48 -Commands.xprate.started.0=[[GOLD]]\u0e40\u0e2b\u0e15\u0e38\u0e01\u0e32\u0e23\u0e13\u0e4c EXP \u0e2a\u0e33\u0e2b\u0e23\u0e31\u0e1a mcMMO \u0e44\u0e14\u0e49\u0e40\u0e23\u0e34\u0e48\u0e21\u0e15\u0e49\u0e19! -Commands.xprate.started.1=[[GOLD]]mcMMO \u0e2d\u0e31\u0e15\u0e23\u0e32 EXP \u0e15\u0e2d\u0e19\u0e19\u0e35\u0e49 {0}x! -XPRate.Event=[[GOLD]]mcMMO \u0e02\u0e13\u0e30\u0e19\u0e35\u0e49\u0e2d\u0e22\u0e39\u0e48\u0e43\u0e19\u0e40\u0e2b\u0e15\u0e38\u0e01\u0e32\u0e23\u0e13\u0e4c\u0e40\u0e1e\u0e34\u0e48\u0e21\u0e2d\u0e31\u0e15\u0e23\u0e32\u0e1b\u0e23\u0e30\u0e2a\u0e1a\u0e01\u0e32\u0e23\u0e13\u0e4c! \u0e2d\u0e31\u0e15\u0e23\u0e32\u0e1b\u0e23\u0e30\u0e2a\u0e1a\u0e01\u0e32\u0e23\u0e13\u0e4c \u0e40\u0e1b\u0e47\u0e19 {0} \u0e40\u0e17\u0e48\u0e32! +Commands.XPGain.Swords=ทำการโจมตี Monster +Commands.XPGain.Taming=สัตว์เลี้ยงของคุณกำลังฝึกฝนการต่อสู้ +Commands.XPGain.Unarmed=ทำการโจมตี Monster +Commands.XPGain.Woodcutting=สับต้นไม้ล้มลง +Commands.XPGain=&8EXP ที่ได้รับ: &f{0} +Commands.xplock.locked=&6BAR EXP ถูกปดล็อก {0}! +Commands.xplock.unlocked=&6EXP BAR ของคุณได้ถูก &aปลดล็อก&6! +Commands.xprate.modified=อัครา EXP ถูกแก้ไขเป็น {0} +Commands.xprate.over=mcMMO อัตราEXP ตอนนี้มากขึ้น!! +Commands.xprate.proper.0=การใช้งานที่เหมาะสมในการเปลี่ยนอัตรา EXP เป็น /xprate +Commands.xprate.proper.1=การใช้งานที่เหมาะสมในการเรียกคืนอัตรา EXP เพื่อเริ่มต้นถูกตั้งค่าใหม่ xprate / +Commands.xprate.proper.2=โปรดระบุจริงหรือเท็จเพื่อแสดงว่านี้เป็นเหตุการณ์ EXP หรือไม่ +Commands.xprate.started.0=&6เหตุการณ์ EXP สำหรับ mcMMO ได้เริ่มต้น! +Commands.xprate.started.1=&6mcMMO อัตรา EXP ตอนนี้ {0}x! +XPRate.Event=&6mcMMO ขณะนี้อยู่ในเหตุการณ์เพิ่มอัตราประสบการณ์! อัตราประสบการณ์ เป็น {0} เท่า! Effects.Effects=EFFECTS -Effects.Child=[[DARK_GRAY]]\u0e23\u0e30\u0e14\u0e31\u0e1a: [[GREEN]]{0} -Effects.Level=[[DARK_GRAY]]\u0e23\u0e30\u0e14\u0e31\u0e1a: [[GREEN]]{0} [[DARK_AQUA]]EXP[[YELLOW]]([[GOLD]]{1}[[YELLOW]]/[[GOLD]]{2}[[YELLOW]]) -Effects.Parent=[[GOLD]]{0} - -Effects.Template=[[DARK_AQUA]]{0}: [[GREEN]]{1} -Guides.Available=[[GRAY]]\u0e41\u0e19\u0e30\u0e19\u0e33 {0} \u0e04\u0e27\u0e23\u0e43\u0e0a\u0e49 - \u0e0a\u0e19\u0e34\u0e14 /{1} ? [\u0e2b\u0e19\u0e49\u0e32] -Guides.Header=[[GOLD]]-=[[GREEN]]{0} \u0e41\u0e19\u0e30\u0e19\u0e33[[GOLD]]=- -Guides.Page.Invalid=\u0e44\u0e21\u0e48\u0e43\u0e0a\u0e48\u0e15\u0e31\u0e27\u0e40\u0e25\u0e02\u0e17\u0e35\u0e48\u0e16\u0e39\u0e01\u0e15\u0e49\u0e2d\u0e07! -Guides.Page.OutOfRange=\u0e44\u0e21\u0e48\u0e21\u0e35\u0e2b\u0e19\u0e49\u0e32\u0e19\u0e35\u0e2d\u0e22\u0e39\u0e48 \u0e21\u0e35\u0e40\u0e1e\u0e35\u0e22\u0e07 {0} \u0e2b\u0e19\u0e49\u0e32. -Guides.Usage= \u0e43\u0e0a\u0e49 /{0} ? [\u0e2b\u0e19\u0e49\u0e32] -Guides.Smelting.Section.0=\u0e40\u0e23\u0e47\u0e27\u0e46\u0e19\u0e35\u0e49... -Inspect.Offline=\u0e04\u0e38\u0e13\u0e44\u0e21\u0e48\u0e44\u0e14\u0e49\u0e23\u0e31\u0e1a\u0e2a\u0e34\u0e17\u0e18\u0e34\u0e4c\u0e43\u0e19\u0e01\u0e32\u0e23\u0e15\u0e23\u0e27\u0e08\u0e2a\u0e2d\u0e1a\u0e1c\u0e39\u0e49\u0e40\u0e25\u0e48\u0e19 Offline! -Inspect.OfflineStats=mcMMO \u0e2a\u0e16\u0e34\u0e15\u0e34\u0e1c\u0e39\u0e49\u0e40\u0e25\u0e48\u0e19 Offline [[YELLOW]]{0} -Inspect.Stats=[[GREEN]]mcMMO \u0e2a\u0e16\u0e34\u0e15\u0e34\u0e02\u0e2d\u0e07 [[YELLOW]]{0} -Inspect.TooFar=\u0e04\u0e38\u0e13\u0e2d\u0e22\u0e39\u0e48\u0e44\u0e01\u0e25\u0e40\u0e01\u0e34\u0e19\u0e44\u0e1b\u0e17\u0e35\u0e48\u0e08\u0e30\u0e15\u0e23\u0e27\u0e08\u0e2a\u0e2d\u0e1a\u0e1c\u0e39\u0e49\u0e40\u0e25\u0e48\u0e19\u0e17\u0e35\u0e48! -Item.ChimaeraWing.Fail=**\u0e43\u0e0a\u0e49\u0e17\u0e31\u0e01\u0e29\u0e30 CHIMAERA WING \u0e25\u0e49\u0e21\u0e40\u0e2b\u0e25\u0e27!** -Item.ChimaeraWing.Pass=**\u0e43\u0e0a\u0e49\u0e17\u0e31\u0e01\u0e29\u0e30 CHIMAERA WING** +Effects.Child=&8ระดับ: &a{0} +Effects.Level=&8ระดับ: &a{0} &3EXP&e(&6{1}&e/&6{2}&e) +Effects.Parent=&6{0} - +Effects.Template=&3{0}: &a{1} +Guides.Available=&7แนะนำ {0} ควรใช้ - ชนิด /{1} ? [หน้า] +Guides.Header=&6-=&a{0} แนะนำ&6=- +Guides.Page.Invalid=ไม่ใช่ตัวเลขที่ถูกต้อง! +Guides.Page.OutOfRange=ไม่มีหน้านีอยู่ มีเพียง {0} หน้า. +Guides.Usage= ใช้ /{0} ? [หน้า] +Guides.Smelting.Section.0=เร็วๆนี้... +Inspect.Offline=คุณไม่ได้รับสิทธิ์ในการตรวจสอบผู้เล่น Offline! +Inspect.OfflineStats=mcMMO สถิติผู้เล่น Offline &e{0} +Inspect.Stats=&amcMMO สถิติของ &e{0} +Inspect.TooFar=คุณอยู่ไกลเกินไปที่จะตรวจสอบผู้เล่นที่! +Item.ChimaeraWing.Fail=**ใช้ทักษะ CHIMAERA WING ล้มเหลว!** +Item.ChimaeraWing.Pass=**ใช้ทักษะ CHIMAERA WING** Item.ChimaeraWing.Name=Chimaera Wing -Item.ChimaeraWing.Lore=[[GRAY]]Teleports \u0e44\u0e1b\u0e22\u0e31\u0e07\u0e40\u0e15\u0e35\u0e22\u0e07\u0e02\u0e2d\u0e07\u0e04\u0e38\u0e13. -Item.Generic.Wait=\u0e04\u0e38\u0e13\u0e15\u0e49\u0e2d\u0e07\u0e23\u0e2d\u0e40\u0e1e\u0e37\u0e48\u0e2d\u0e43\u0e0a\u0e49\u0e21\u0e31\u0e19\u0e2d\u0e35\u0e01\u0e04\u0e23\u0e31\u0e49\u0e07\u0e43\u0e19! [[YELLOW]]({0}\u0e27\u0e34\u0e19\u0e32\u0e17\u0e35) -Item.Injured.Wait=\u0e04\u0e39\u0e13\u0e44\u0e14\u0e49\u0e23\u0e31\u0e1a\u0e04\u0e27\u0e32\u0e21\u0e40\u0e2a\u0e35\u0e22\u0e2b\u0e32\u0e22\u0e15\u0e48\u0e2d\u0e40\u0e19\u0e37\u0e48\u0e2d\u0e07\u0e15\u0e49\u0e2d\u0e07\u0e23\u0e2d. [[YELLOW]]({0} \u0e27\u0e34\u0e19\u0e32\u0e17\u0e35) -Teleport.Commencing=[[GRAY]]\u0e04\u0e33\u0e2a\u0e31\u0e48\u0e07 teleport \u0e15\u0e49\u0e2d\u0e07\u0e23\u0e2d [[GOLD]]({0}) [[GRAY]]\u0e27\u0e34\u0e19\u0e32\u0e17\u0e35, \u0e01\u0e23\u0e38\u0e13\u0e32\u0e22\u0e37\u0e19\u0e2d\u0e22\u0e39\u0e48\u0e01\u0e31\u0e1a\u0e17\u0e35\u0e48... -Teleport.Cancelled=[[DARK_RED]]Teleportation \u0e16\u0e39\u0e01\u0e22\u0e01\u0e40\u0e25\u0e34\u0e01! -Skills.Child=[[GOLD]](\u0e17\u0e31\u0e01\u0e29\u0e30 CHILD) -Skills.Disarmed=[[DARK_RED]]\u0e04\u0e38\u0e13\u0e44\u0e14\u0e49\u0e1b\u0e25\u0e14\u0e25\u0e47\u0e2d\u0e01! -Skills.Header=-----[][[GREEN]]{0}[[RED]][]----- -Skills.NeedMore=[[DARK_RED]]\u0e04\u0e38\u0e13\u0e15\u0e49\u0e2d\u0e07\u0e01\u0e32\u0e23\u0e02\u0e49\u0e2d\u0e21\u0e39\u0e25\u0e40\u0e1e\u0e34\u0e48\u0e21\u0e40\u0e15\u0e34\u0e21 [[GRAY]]{0} +Item.ChimaeraWing.Lore=&7Teleports ไปยังเตียงของคุณ. +Item.Generic.Wait=คุณต้องรอเพื่อใช้มันอีกครั้งใน! &e({0}วินาที) +Item.Injured.Wait=คูณได้รับความเสียหายต่อเนื่องต้องรอ. &e({0} วินาที) +Teleport.Commencing=&7คำสั่ง teleport ต้องรอ &6({0}) &7วินาที, กรุณายืนอยู่กับที่... +Teleport.Cancelled=&4Teleportation ถูกยกเลิก! +Skills.Child=&6(ทักษะ CHILD) +Skills.Disarmed=&4คุณได้ปลดล็อก! +Skills.Header=-----[]&a{0}&c[]----- +Skills.NeedMore=&4คุณต้องการข้อมูลเพิ่มเติม &7{0} Skills.Parents=PARENTS -Skills.Stats={0}[[GREEN]]{1}[[DARK_AQUA]] EXP([[GRAY]]{2}[[DARK_AQUA]]/[[GRAY]]{3}[[DARK_AQUA]]) -Skills.TooTired=\u0e04\u0e38\u0e13\u0e40\u0e2b\u0e19\u0e37\u0e48\u0e2d\u0e22\u0e40\u0e01\u0e34\u0e19\u0e44\u0e1b\u0e17\u0e35\u0e48\u0e08\u0e30\u0e43\u0e0a\u0e49\u0e04\u0e27\u0e32\u0e21\u0e2a\u0e32\u0e21\u0e32\u0e23\u0e16\u0e19\u0e31\u0e49\u0e19\u0e2d\u0e35\u0e01\u0e04\u0e23\u0e31\u0e49\u0e07. [[YELLOW]]({0}s) -Skills.Cancelled={0} \u0e16\u0e39\u0e01\u0e22\u0e01\u0e40\u0e25\u0e34\u0e01! -Skills.ConfirmOrCancel=[[GOLD]]-=[[GREEN]]{0} \u0e41\u0e19\u0e30\u0e19\u0e33[[GOLD]]=- -Stats.Header.Combat=[[GOLD]]-=\u0e17\u0e31\u0e01\u0e29\u0e30\u0e01\u0e32\u0e23\u0e15\u0e48\u0e2d\u0e2a\u0e39\u0e49=- -Stats.Header.Gathering=[[GOLD]]-=\u0e17\u0e31\u0e01\u0e29\u0e30 GATHERING=- -Stats.Header.Misc=[[GOLD]]-=\u0e17\u0e31\u0e01\u0e29\u0e30 MISC=- -Stats.Own.Stats=[[GREEN]][mcMMO] \u0e2a\u0e16\u0e34\u0e15\u0e34 -Perks.XP.Name=\u0e1b\u0e23\u0e30\u0e2a\u0e1a\u0e01\u0e32\u0e23\u0e13\u0e4c -Perks.XP.Desc=\u0e44\u0e14\u0e49\u0e23\u0e31\u0e1a {0}x EXP. -Perks.Lucky.Name=\u0e42\u0e0a\u0e04 -Perks.Lucky.Desc=\u0e43\u0e2b\u0e49\u0e17\u0e31\u0e01\u0e29\u0e30 {0} \u0e41\u0e25\u0e30\u0e04\u0e27\u0e32\u0e21\u0e2a\u0e32\u0e21\u0e32\u0e23\u0e16\u0e21\u0e35\u0e42\u0e2d\u0e01\u0e32\u0e2a 33.3% \u0e14\u0e35\u0e01\u0e27\u0e48\u0e32\u0e17\u0e35\u0e48\u0e08\u0e30\u0e40\u0e1b\u0e34\u0e14\u0e43\u0e0a\u0e49\u0e07\u0e32\u0e19 -Perks.Lucky.Desc.Login=\u0e43\u0e2b\u0e49\u0e17\u0e31\u0e01\u0e29\u0e30\u0e1a\u0e32\u0e07\u0e2d\u0e22\u0e48\u0e32\u0e07\u0e41\u0e25\u0e30\u0e04\u0e27\u0e32\u0e21\u0e2a\u0e32\u0e21\u0e32\u0e23\u0e16\u0e43\u0e19\u0e42\u0e2d\u0e01\u0e32\u0e2a\u0e17\u0e35\u0e48 33.3% \u0e14\u0e35\u0e01\u0e27\u0e48\u0e32\u0e17\u0e35\u0e48\u0e08\u0e30\u0e40\u0e1b\u0e34\u0e14\u0e43\u0e0a\u0e49\u0e07\u0e32\u0e19 -Perks.Lucky.Bonus=[[GOLD]] ({0} \u0e14\u0e49\u0e27\u0e22 Lucky Perk) +Skills.Stats={0}&a{1}&3 EXP(&7{2}&3/&7{3}&3) +Skills.TooTired=คุณเหนื่อยเกินไปที่จะใช้ความสามารถนั้นอีกครั้ง. &e({0}s) +Skills.Cancelled={0} ถูกยกเลิก! +Skills.ConfirmOrCancel=&6-=&a{0} แนะนำ&6=- +Stats.Header.Combat=&6-=ทักษะการต่อสู้=- +Stats.Header.Gathering=&6-=ทักษะ GATHERING=- +Stats.Header.Misc=&6-=ทักษะ MISC=- +Stats.Own.Stats=&a[mcMMO] สถิติ +Perks.XP.Name=ประสบการณ์ +Perks.XP.Desc=ได้รับ {0}x EXP. +Perks.Lucky.Name=โชค +Perks.Lucky.Desc=ให้ทักษะ {0} และความสามารถมีโอกาส 33.3% ดีกว่าที่จะเปิดใช้งาน +Perks.Lucky.Desc.Login=ให้ทักษะบางอย่างและความสามารถในโอกาสที่ 33.3% ดีกว่าที่จะเปิดใช้งาน +Perks.Lucky.Bonus=&6 ({0} ด้วย Lucky Perk) Perks.Cooldowns.Name=Fast Recovery -Perks.Cooldowns.Desc=\u0e25\u0e14\u0e23\u0e30\u0e22\u0e30\u0e40\u0e27\u0e25\u0e32\u0e04\u0e39\u0e25\u0e14\u0e32\u0e27\u0e19\u0e4c {0}. -Perks.ActivationTime.Name=\u0e04\u0e27\u0e32\u0e21\u0e2d\u0e14\u0e17\u0e19 -Perks.ActivationTime.Desc=\u0e40\u0e1e\u0e34\u0e48\u0e21\u0e40\u0e27\u0e25\u0e32\u0e01\u0e32\u0e23\u0e40\u0e1b\u0e34\u0e14\u0e43\u0e0a\u0e49\u0e07\u0e32\u0e19\u0e04\u0e27\u0e32\u0e21\u0e2a\u0e32\u0e21\u0e32\u0e23\u0e16 {0} \u0e27\u0e34\u0e19\u0e32\u0e17\u0e35. -Perks.ActivationTime.Bonus=[[GOLD]] ({0}\u0e27\u0e34\u0e19\u0e32\u0e17\u0e35 \u0e14\u0e49\u0e27\u0e22 Endurance Perk) -MOTD.Donate=[[DARK_AQUA]]\u0e02\u0e49\u0e2d\u0e21\u0e39\u0e25 Donation: -MOTD.Hardcore.DeathStatLoss.Stats=[[GOLD]][mcMMO] [[DARK_AQUA]]\u0e17\u0e31\u0e01\u0e29\u0e30 Death Penalty: [[DARK_RED]]{0}% -MOTD.Hardcore.Vampirism.Stats=[[GOLD]][mcMMO] [[DARK_AQUA]]\u0e16\u0e39\u0e01\u0e02\u0e42\u0e21\u0e22\u0e2a\u0e16\u0e34\u0e15\u0e34: [[DARK_RED]]{0}% +Perks.Cooldowns.Desc=ลดระยะเวลาคูลดาวน์ {0}. +Perks.ActivationTime.Name=ความอดทน +Perks.ActivationTime.Desc=เพิ่มเวลาการเปิดใช้งานความสามารถ {0} วินาที. +Perks.ActivationTime.Bonus=&6 ({0}วินาที ด้วย Endurance Perk) +MOTD.Donate=&3ข้อมูล Donation: +MOTD.Hardcore.DeathStatLoss.Stats=&6[mcMMO] &3ทักษะ Death Penalty: &4{0}% +MOTD.Hardcore.Vampirism.Stats=&6[mcMMO] &3ถูกขโมยสถิติ: &4{0}% MOTD.PerksPrefix=[mcMMO Perks] -MOTD.Version=[[GOLD]][mcMMO] \u0e43\u0e0a\u0e49 version [[DARK_AQUA]]{0} -MOTD.Website=[[GOLD]][mcMMO] [[GREEN]]{0}[[YELLOW]] - mcMMO Website -Smelting.Ability.FluxMining=Flux Mining \u0e42\u0e2d\u0e01\u0e32\u0e2a: [[YELLOW]]{0} -Smelting.Ability.FuelEfficiency=Fuel Efficiency \u0e40\u0e1e\u0e34\u0e48\u0e21\u0e02\u0e36\u0e49\u0e19: [[YELLOW]]{0}x -Smelting.Ability.Locked.0=\u0e2a\u0e32\u0e21\u0e32\u0e23\u0e16\u0e1b\u0e25\u0e14\u0e25\u0e47\u0e2d\u0e01\u0e44\u0e14\u0e49\u0e40\u0e21\u0e37\u0e48\u0e2d\u0e23\u0e30\u0e14\u0e31\u0e1a {0}+ (VANILLA XP BOOST) -Smelting.Ability.Locked.1=\u0e2a\u0e32\u0e21\u0e32\u0e23\u0e16\u0e1b\u0e25\u0e14\u0e25\u0e47\u0e2d\u0e01\u0e44\u0e14\u0e49\u0e40\u0e21\u0e37\u0e48\u0e2d\u0e23\u0e30\u0e14\u0e31\u0e1a {0}+ (FLUX MINING) -Smelting.Ability.SecondSmelt=Second Smelt \u0e42\u0e2d\u0e01\u0e32\u0e2a: [[YELLOW]]{0} -Smelting.Ability.VanillaXPBoost=Vanilla EXP \u0e40\u0e1e\u0e34\u0e48\u0e21\u0e02\u0e36\u0e49\u0e19: [[YELLOW]]{0}x +MOTD.Version=&6[mcMMO] ใช้ version &3{0} +MOTD.Website=&6[mcMMO] &a{0}&e - mcMMO Website +Smelting.Ability.FluxMining=Flux Mining โอกาส: &e{0} +Smelting.Ability.FuelEfficiency=Fuel Efficiency เพิ่มขึ้น: &e{0}x +Smelting.Ability.Locked.0=สามารถปลดล็อกได้เมื่อระดับ {0}+ (VANILLA XP BOOST) +Smelting.Ability.Locked.1=สามารถปลดล็อกได้เมื่อระดับ {0}+ (FLUX MINING) +Smelting.Ability.SecondSmelt=Second Smelt โอกาส: &e{0} +Smelting.Ability.VanillaXPBoost=Vanilla EXP เพิ่มขึ้น: &e{0}x Smelting.SubSkill.FuelEfficiency.Name=Fuel Efficiency -Smelting.SubSkill.FuelEfficiency.Description=\u0e40\u0e1e\u0e34\u0e48\u0e21\u0e40\u0e27\u0e25\u0e32\u0e01\u0e32\u0e23\u0e40\u0e1c\u0e32\u0e44\u0e2b\u0e21\u0e49\u0e02\u0e2d\u0e07\u0e40\u0e0a\u0e37\u0e49\u0e2d\u0e40\u0e1e\u0e25\u0e34\u0e07\u0e17\u0e35\u0e48\u0e43\u0e0a\u0e49\u0e43\u0e19\u0e40\u0e15\u0e32\u0e2b\u0e25\u0e2d\u0e21\u0e16\u0e25\u0e38\u0e07 +Smelting.SubSkill.FuelEfficiency.Description=เพิ่มเวลาการเผาไหม้ของเชื้อเพลิงที่ใช้ในเตาหลอมถลุง Smelting.SubSkill.SecondSmelt.Name=Second Smelt -Smelting.SubSkill.SecondSmelt.Description=\u0e40\u0e1e\u0e34\u0e48\u0e21\u0e17\u0e23\u0e31\u0e1e\u0e22\u0e32\u0e01\u0e23\u0e17\u0e35\u0e48\u0e44\u0e14\u0e49\u0e08\u0e32\u0e01\u0e01\u0e32\u0e23\u0e16\u0e25\u0e38\u0e07 -Smelting.Effect.4=Vanilla EXP \u0e40\u0e1e\u0e34\u0e48\u0e21\u0e02\u0e36\u0e49\u0e19 -Smelting.Effect.5=\u0e40\u0e1e\u0e34\u0e48\u0e21 Vanilla EXP \u0e44\u0e14\u0e49\u0e23\u0e31\u0e1a\u0e43\u0e19\u0e02\u0e13\u0e30\u0e17\u0e35\u0e48\u0e16\u0e25\u0e38\u0e07 +Smelting.SubSkill.SecondSmelt.Description=เพิ่มทรัพยากรที่ได้จากการถลุง +Smelting.Effect.4=Vanilla EXP เพิ่มขึ้น +Smelting.Effect.5=เพิ่ม Vanilla EXP ได้รับในขณะที่ถลุง Smelting.SubSkill.FluxMining.Name=Flux Mining -Smelting.SubSkill.FluxMining.Description=\u0e42\u0e2d\u0e01\u0e32\u0e2a\u0e2a\u0e33\u0e2b\u0e23\u0e31\u0e1a\u0e41\u0e23\u0e48\u0e17\u0e35\u0e48\u0e08\u0e30\u0e16\u0e25\u0e38\u0e07\u0e17\u0e31\u0e19\u0e17\u0e35\u0e43\u0e19\u0e02\u0e13\u0e30\u0e17\u0e35\u0e48\u0e01\u0e32\u0e23\u0e17\u0e33\u0e40\u0e2b\u0e21\u0e37\u0e2d\u0e07\u0e41\u0e23\u0e48 -Smelting.FluxMining.Success=[[GREEN]]\u0e41\u0e23\u0e48\u0e16\u0e39\u0e01\u0e16\u0e25\u0e38\u0e07! -Smelting.Listener=\u0e17\u0e31\u0e01\u0e29\u0e30 Smelting: +Smelting.SubSkill.FluxMining.Description=โอกาสสำหรับแร่ที่จะถลุงทันทีในขณะที่การทำเหมืองแร่ +Smelting.FluxMining.Success=&aแร่ถูกถลุง! +Smelting.Listener=ทักษะ Smelting: Smelting.SkillName=SMELTING -Commands.Description.addlevels=\u0e40\u0e1e\u0e34\u0e48\u0e21\u0e23\u0e30\u0e14\u0e31\u0e1a\u0e43\u0e2b\u0e49\u0e01\u0e31\u0e1a\u0e1c\u0e39\u0e49\u0e43\u0e0a\u0e49 mcMMO -Commands.Description.adminchat=\u0e2a\u0e25\u0e31\u0e1a mcMMO \u0e1c\u0e39\u0e49\u0e14\u0e39\u0e41\u0e25\u0e23\u0e30\u0e1a\u0e1a\u0e41\u0e0a\u0e17\u0e1a\u0e19 on/off \u0e2b\u0e23\u0e37\u0e2d\u0e2a\u0e48\u0e07\u0e02\u0e49\u0e2d\u0e04\u0e27\u0e32\u0e21\u0e2a\u0e19\u0e17\u0e19\u0e32\u0e1c\u0e39\u0e49\u0e14\u0e39\u0e41\u0e25\u0e23\u0e30\u0e1a\u0e1a -Commands.Description.addxp=\u0e40\u0e1e\u0e34\u0e48\u0e21 mcMMO EXP \u0e43\u0e2b\u0e49\u0e01\u0e31\u0e1a\u0e1c\u0e39\u0e49\u0e43\u0e0a\u0e49 -Commands.Description.hardcore=\u0e41\u0e01\u0e49\u0e44\u0e02\u0e23\u0e49\u0e2d\u0e22\u0e25\u0e30 Hardcore mcMMO \u0e2b\u0e23\u0e37\u0e2d\u0e42\u0e2b\u0e21\u0e14 Hardcore \u0e2a\u0e25\u0e31\u0e1a on/off -Commands.Description.inspect=\u0e14\u0e39\u0e02\u0e49\u0e2d\u0e21\u0e39\u0e25\u0e23\u0e32\u0e22\u0e25\u0e30\u0e40\u0e2d\u0e35\u0e22\u0e14\u0e40\u0e01\u0e35\u0e48\u0e22\u0e27\u0e01\u0e31\u0e1a mcMMO \u0e1c\u0e39\u0e49\u0e40\u0e25\u0e48\u0e19\u0e04\u0e19\u0e2d\u0e37\u0e48\u0e19 -Commands.Description.mcability=\u0e04\u0e27\u0e32\u0e21\u0e2a\u0e32\u0e21\u0e32\u0e23\u0e16\u0e43\u0e19\u0e01\u0e32\u0e23\u0e2a\u0e25\u0e31\u0e1a mcMMO \u0e01\u0e32\u0e23\u0e40\u0e15\u0e23\u0e35\u0e22\u0e21\u0e40\u0e21\u0e37\u0e48\u0e2d\u0e04\u0e25\u0e34\u0e01\u0e02\u0e27\u0e32 on/off -Commands.Description.mcgod=\u0e2a\u0e25\u0e31\u0e1a mcMMO GodMode on/off -Commands.Description.mchud=\u0e40\u0e1b\u0e25\u0e35\u0e48\u0e22\u0e19\u0e2a\u0e44\u0e15\u0e25\u0e4c\u0e02\u0e2d\u0e07\u0e04\u0e38\u0e13 mcMMO HUD -Commands.Description.mcmmo=\u0e41\u0e2a\u0e14\u0e07\u0e04\u0e33\u0e2d\u0e18\u0e34\u0e1a\u0e32\u0e22\u0e2a\u0e31\u0e49\u0e19\u0e40\u0e01\u0e35\u0e48\u0e22\u0e27\u0e01\u0e31\u0e1a mcMMO -Commands.Description.mcnotify=\u0e04\u0e27\u0e32\u0e21\u0e2a\u0e32\u0e21\u0e32\u0e23\u0e16\u0e43\u0e19\u0e01\u0e32\u0e23\u0e2a\u0e25\u0e31\u0e1a mcMMO \u0e2a\u0e19\u0e17\u0e19\u0e32\u0e01\u0e32\u0e23\u0e41\u0e08\u0e49\u0e07\u0e40\u0e15\u0e37\u0e2d\u0e19\u0e01\u0e32\u0e23\u0e41\u0e2a\u0e14\u0e07\u0e1c\u0e25 on/off -Commands.Description.mcpurge=\u0e1c\u0e39\u0e49\u0e43\u0e0a\u0e49\u0e17\u0e35\u0e48\u0e44\u0e21\u0e48\u0e21\u0e35\u0e04\u0e27\u0e32\u0e21\u0e2a\u0e30\u0e2d\u0e32\u0e14\u0e23\u0e30\u0e14\u0e31\u0e1a mcMMO \u0e41\u0e25\u0e30\u0e1c\u0e39\u0e49\u0e43\u0e0a\u0e49\u0e17\u0e35\u0e48\u0e22\u0e31\u0e07\u0e44\u0e21\u0e48\u0e44\u0e14\u0e49\u0e40\u0e0a\u0e37\u0e48\u0e2d\u0e21\u0e15\u0e48\u0e2d\u0e43\u0e19\u0e0a\u0e48\u0e27\u0e07\u0e2b\u0e25\u0e32\u0e22\u0e40\u0e14\u0e37\u0e2d\u0e19\u0e17\u0e35\u0e48 {0} \u0e08\u0e32\u0e01\u0e10\u0e32\u0e19\u0e02\u0e49\u0e2d\u0e21\u0e39\u0e25 mcMMO -Commands.Description.mcrank=\u0e41\u0e2a\u0e14\u0e07\u0e01\u0e32\u0e23\u0e08\u0e31\u0e14\u0e2d\u0e31\u0e19\u0e14\u0e31\u0e1a mcMMO \u0e2a\u0e33\u0e2b\u0e23\u0e31\u0e1a\u0e1c\u0e39\u0e49\u0e40\u0e25\u0e48\u0e19 -Commands.Description.mcrefresh=\u0e23\u0e35\u0e40\u0e1f\u0e23\u0e0a\u0e04\u0e39\u0e25\u0e14\u0e32\u0e27\u0e19\u0e4c\u0e17\u0e31\u0e49\u0e07\u0e2b\u0e21\u0e14\u0e2a\u0e33\u0e2b\u0e23\u0e31\u0e1a mcMMO -Commands.Description.mcremove=\u0e25\u0e1a\u0e1c\u0e39\u0e49\u0e43\u0e0a\u0e49\u0e08\u0e32\u0e01\u0e10\u0e32\u0e19\u0e02\u0e49\u0e2d\u0e21\u0e39\u0e25 mcMMO -Commands.Description.mcstats=\u0e41\u0e2a\u0e14\u0e07\u0e23\u0e30\u0e14\u0e31\u0e1a mcMMO \u0e02\u0e2d\u0e07\u0e04\u0e38\u0e13\u0e41\u0e25\u0e30 EXP -Commands.Description.mctop=\u0e41\u0e2a\u0e14\u0e07\u0e01\u0e23\u0e30\u0e14\u0e32\u0e19\u0e1c\u0e39\u0e49\u0e19\u0e33 mcMMO -Commands.Description.mmoedit=\u0e41\u0e01\u0e49\u0e44\u0e02\u0e23\u0e30\u0e14\u0e31\u0e1a mcMMO \u0e2a\u0e33\u0e2b\u0e23\u0e31\u0e1a\u0e1c\u0e39\u0e49\u0e43\u0e0a\u0e49 -Commands.Description.party=\u0e04\u0e27\u0e1a\u0e04\u0e38\u0e21\u0e01\u0e32\u0e23\u0e15\u0e31\u0e49\u0e07\u0e04\u0e48\u0e32\u0e15\u0e48\u0e32\u0e07\u0e46 Party -Commands.Description.partychat=\u0e2a\u0e25\u0e31\u0e1a mcMMO Party \u0e01\u0e32\u0e23\u0e41\u0e0a\u0e17\u0e2b\u0e23\u0e37\u0e2d\u0e2a\u0e48\u0e07\u0e02\u0e49\u0e2d\u0e04\u0e27\u0e32\u0e21\u0e2a\u0e19\u0e17\u0e19\u0e32\u0e02\u0e2d\u0e07\u0e1a\u0e38\u0e04\u0e04\u0e25 -Commands.Description.ptp=Teleport \u0e44\u0e1b\u0e2b\u0e32\u0e2a\u0e21\u0e32\u0e0a\u0e34\u0e01 Party -Commands.Description.Skill=\u0e41\u0e2a\u0e14\u0e07\u0e02\u0e49\u0e2d\u0e21\u0e39\u0e25\u0e23\u0e32\u0e22\u0e25\u0e30\u0e40\u0e2d\u0e35\u0e22\u0e14\u0e17\u0e31\u0e01\u0e29\u0e30 mcMMO {0} -Commands.Description.skillreset=\u0e15\u0e31\u0e49\u0e07\u0e04\u0e48\u0e32\u0e23\u0e30\u0e14\u0e31\u0e1a mcMMO \u0e2a\u0e33\u0e2b\u0e23\u0e31\u0e1a\u0e1c\u0e39\u0e49\u0e43\u0e0a\u0e49 -Commands.Description.vampirism=\u0e41\u0e01\u0e49\u0e44\u0e02\u0e23\u0e49\u0e2d\u0e22\u0e25\u0e30 vampirism mcMMO \u0e2b\u0e23\u0e37\u0e2d\u0e42\u0e2b\u0e21\u0e14\u0e2a\u0e25\u0e31\u0e1a vampirism on/off -Commands.Description.xplock=\u0e25\u0e47\u0e2d\u0e04 mcMMO \u0e1a\u0e32\u0e23\u0e4c\u0e02\u0e2d\u0e07\u0e04\u0e38\u0e13 EXP \u0e17\u0e31\u0e01\u0e29\u0e30 mcMMO \u0e40\u0e09\u0e1e\u0e32\u0e30 -Commands.Description.xprate=\u0e41\u0e01\u0e49\u0e44\u0e02\u0e2d\u0e31\u0e15\u0e23\u0e32 mcMMO EXP \u0e2b\u0e23\u0e37\u0e2d\u0e40\u0e23\u0e34\u0e48\u0e21\u0e15\u0e49\u0e19\u0e40\u0e2b\u0e15\u0e38\u0e01\u0e32\u0e23\u0e13\u0e4c mcMMO EXP +Commands.Description.addlevels=เพิ่มระดับให้กับผู้ใช้ mcMMO +Commands.Description.adminchat=สลับ mcMMO ผู้ดูแลระบบแชทบน on/off หรือส่งข้อความสนทนาผู้ดูแลระบบ +Commands.Description.addxp=เพิ่ม mcMMO EXP ให้กับผู้ใช้ +Commands.Description.hardcore=แก้ไขร้อยละ Hardcore mcMMO หรือโหมด Hardcore สลับ on/off +Commands.Description.inspect=ดูข้อมูลรายละเอียดเกี่ยวกับ mcMMO ผู้เล่นคนอื่น +Commands.Description.mcability=ความสามารถในการสลับ mcMMO การเตรียมเมื่อคลิกขวา on/off +Commands.Description.mcgod=สลับ mcMMO GodMode on/off +Commands.Description.mchud=เปลี่ยนสไตล์ของคุณ mcMMO HUD +Commands.Description.mcmmo=แสดงคำอธิบายสั้นเกี่ยวกับ mcMMO +Commands.Description.mcnotify=ความสามารถในการสลับ mcMMO สนทนาการแจ้งเตือนการแสดงผล on/off +Commands.Description.mcpurge=ผู้ใช้ที่ไม่มีความสะอาดระดับ mcMMO และผู้ใช้ที่ยังไม่ได้เชื่อมต่อในช่วงหลายเดือนที่ {0} จากฐานข้อมูล mcMMO +Commands.Description.mcrank=แสดงการจัดอันดับ mcMMO สำหรับผู้เล่น +Commands.Description.mcrefresh=รีเฟรชคูลดาวน์ทั้งหมดสำหรับ mcMMO +Commands.Description.mcremove=ลบผู้ใช้จากฐานข้อมูล mcMMO +Commands.Description.mcstats=แสดงระดับ mcMMO ของคุณและ EXP +Commands.Description.mctop=แสดงกระดานผู้นำ mcMMO +Commands.Description.mmoedit=แก้ไขระดับ mcMMO สำหรับผู้ใช้ +Commands.Description.party=ควบคุมการตั้งค่าต่างๆ Party +Commands.Description.partychat=สลับ mcMMO Party การแชทหรือส่งข้อความสนทนาของบุคคล +Commands.Description.ptp=Teleport ไปหาสมาชิก Party +Commands.Description.Skill=แสดงข้อมูลรายละเอียดทักษะ mcMMO {0} +Commands.Description.skillreset=ตั้งค่าระดับ mcMMO สำหรับผู้ใช้ +Commands.Description.vampirism=แก้ไขร้อยละ vampirism mcMMO หรือโหมดสลับ vampirism on/off +Commands.Description.xplock=ล็อค mcMMO บาร์ของคุณ EXP ทักษะ mcMMO เฉพาะ +Commands.Description.xprate=แก้ไขอัตรา mcMMO EXP หรือเริ่มต้นเหตุการณ์ mcMMO EXP UpdateChecker.Outdated=You are using an outdated version of mcMMO! UpdateChecker.NewAvailable=There is a new version available on BukkitDev. +Commands.XPBar.Usage=Proper usage is /mmoxpbar +Commands.Description.mmoxpbar=Player settings for mcMMO XP bars +Commands.Description.mmocompat=Information about mcMMO and whether or not its in compatibility mode or fully functional. diff --git a/src/main/resources/locale/locale_zh_CN.properties b/src/main/resources/locale/locale_zh_CN.properties index f1473c859..fcb88284c 100644 --- a/src/main/resources/locale/locale_zh_CN.properties +++ b/src/main/resources/locale/locale_zh_CN.properties @@ -1,1110 +1,1144 @@ -#I'm going to try to normalize our locale file, forgive the mess for now. +#作者:我正计划统一mcMMO的本地化文件,请暂时原谅本地文件现在如此混乱 -#DO NOT USE COLOR CODES IN THE JSON KEYS -#COLORS ARE DEFINED IN advanced.yml IF YOU WISH TO CHANGE THEM -JSON.Rank=\u7b49\u7ea7 -JSON.DescriptionHeader=\u63cf\u8ff0 -JSON.JWrapper.Header=\u7ec6\u8282 -JSON.Type.Passive=\u88ab\u52a8 -JSON.Type.Active=Active -JSON.Type.SuperAbility=\u8d85\u80fd\u529b -JSON.Locked=-=[\u9501\u5b9a]=- -JSON.LevelRequirement=\u7b49\u7ea7\u9700\u6c42 -JSON.JWrapper.Target.Type=\u76ee\u6807\u7c7b\u578b: -JSON.JWrapper.Target.Block=\u65b9\u5757 -JSON.JWrapper.Target.Player=\u73a9\u5bb6 -JSON.JWrapper.Perks.Header=[[GOLD]]\u5e78\u8fd0\u6d25\u8d34 -JSON.JWrapper.Perks.Lucky={0}% \u66f4\u597d\u7684\u8d54\u7387 -JSON.Hover.Tips=\u63d0\u793a -JSON.Acrobatics=\u6742\u6280 -JSON.Alchemy=\u70bc\u91d1 -JSON.Archery=\u7bad\u672f -JSON.Axes=\u65a7\u6280 -JSON.Excavation=\u6316\u6398 -JSON.Fishing=\u9493\u9c7c -JSON.Herbalism=\u8349\u836f\u5b66 -JSON.Mining=\u6316\u77ff -JSON.Repair=\u4fee\u7406 -JSON.Salvage=\u5206\u89e3 -JSON.Swords=\u5251\u672f -JSON.Taming=\u9a6f\u517d -JSON.Unarmed=\u683c\u6597 -JSON.Woodcutting=\u4f10\u6728 -JSON.URL.Website=mcMMO\u5b98\u65b9\u7f51\u7ad9! -JSON.URL.Discord=mcMMO \u5b98\u65b9 Discord \u670d\u52a1\u5668! -JSON.URL.Patreon=\u652f\u6301nossr50\u548c\u4ed6\u5728Patreon\u4e0a\u4e3amcMMO\u6240\u505a\u7684\u5de5\u4f5c! -JSON.URL.Spigot=\u5b98\u65b9 mcMMO \u5728 Spigot \u4e0a\u7684\u8d44\u6e90\u9875\u9762! -JSON.URL.Translation=\u5c06mcMMO\u7ffb\u8bd1\u6210\u5176\u4ed6\u8bed\u8a00! -JSON.URL.Wiki=\u5b98\u65b9 mcMMO wiki\u767e\u79d1! -JSON.SkillUnlockMessage=[[GOLD]][ mcMMO[[YELLOW]] @[[DARK_AQUA]]{0} [[GOLD]]\u7b49\u7ea7 [[DARK_AQUA]]{1}[[GOLD]] \u89e3\u9501! ] -JSON.Hover.Rank=&e&l\u7b49\u7ea7:&r &f{0} -JSON.Hover.NextRank=&7&o\u4e0b\u6b21\u5347\u7ea7\u7b49\u7ea7 {0} -# for JSON.Hover.Mystery you can add {0} to insert the level required into the name, I don't like how that looks so I'm not doing that atm -JSON.Hover.Mystery=[[GRAY]]\u672a\u77e5\u80fd\u529b -JSON.Hover.Mystery2=[[YELLOW]][[[DARK_GRAY]]{0}[[YELLOW]]][[DARK_GRAY]]???&r -JSON.Hover.SkillName=[[DARK_AQUA]]{0}&r -JSON.Hover.SuperAbility=[[DARK_PURPLE]]{0}&r -JSON.Hover.MaxRankSkillName=[[GOLD]]{0}&r -JSON.Hover.AtSymbolSkills=[[YELLOW]]@ -JSON.Hover.AtSymbolURL=[[YELLOW]]@ +#不要在JSON关键字中使用颜色代码 +#如果你想修改颜色请在advanced.yml中修改 +JSON.Rank=等级 +JSON.DescriptionHeader=描述 +JSON.JWrapper.Header=细节 +JSON.Type.Passive=被动 +JSON.Type.Active=主动 +JSON.Type.SuperAbility=超能力 +JSON.Locked=-=[锁定]=- +JSON.LevelRequirement=等级需求 +JSON.JWrapper.Target.Type=目标类型: +JSON.JWrapper.Target.Block=方块 +JSON.JWrapper.Target.Player=玩家 +JSON.JWrapper.Perks.Header=&6幸运津贴 +JSON.JWrapper.Perks.Lucky={0}% 更好的赔率 +JSON.Hover.Tips=提示 +JSON.Acrobatics=杂技 +JSON.Alchemy=炼金 +JSON.Archery=箭术 +JSON.Axes=斧技 +JSON.Excavation=挖掘 +JSON.Fishing=钓鱼 +JSON.Herbalism=草药学 +JSON.Mining=挖矿 +JSON.Repair=修理 +JSON.Salvage=分解 +JSON.Swords=剑术 +JSON.Taming=驯兽 +JSON.Unarmed=格斗 +JSON.Woodcutting=伐木 +JSON.URL.Website=mcMMO官方网站! +JSON.URL.Discord=mcMMO 官方 Discord 服务器! +JSON.URL.Patreon=支持nossr50和他在Patreon上为mcMMO所做的工作! +JSON.URL.Spigot=官方 mcMMO 在 Spigot 上的资源页面! +JSON.URL.Translation=将mcMMO翻译成其他语言! +JSON.URL.Wiki=官方 mcMMO wiki百科! +JSON.SkillUnlockMessage=&6[ mcMMO&e @&3{0} &6等级 &3{1}&6 解锁! ] +JSON.Hover.Rank=&e&l等级:&r &f{0} +JSON.Hover.NextRank=&7&o下次升级等级 {0} +#对于 JSON.Hover.Mystery 你可以添加 {0} 以在名称中插入所需要的级别,我不喜欢他的外观所以现在不想搞它 +JSON.Hover.Mystery=&7未知能力 +JSON.Hover.Mystery2=&e[&8{0}&e]&8???&r +JSON.Hover.SkillName=&3{0}&r +JSON.Hover.SuperAbility=&5{0}&r +JSON.Hover.MaxRankSkillName=&6{0}&r +JSON.Hover.AtSymbolSkills=&e@ +JSON.Hover.AtSymbolURL=&e@ -#\u8fd9\u662f\u6280\u80fd\u6fc0\u6d3b\u65f6\u53d1\u9001\u7ed9\u73a9\u5bb6\u7684\u6d88\u606f +#这是技能激活时发送给玩家的消息 JSON.Notification.SuperAbility={0} -#These are the JSON Strings used for SubSkills -JSON.Acrobatics.Roll.Interaction.Activated=\u6d4b\u8bd5 [[RED]]\u7ffb\u6eda\u6d4b\u8bd5 -JSON.Acrobatics.SubSkill.Roll.Details.Tips=\u5982\u679c\u4f60\u5728\u6454\u843d\u65f6\u6309\u4e0b\u6f5c\u884c\u952e,\u4f60\u5c06\u89e6\u53d1\u4e24\u500d\u7ffb\u6eda\u6548\u679c -Anvil.SingleItemStack=[[RED]]\u4f60\u4e0d\u80fd\u5206\u89e3\u8d27\u4fee\u590d\u6709\u591a\u4e2a\u7269\u54c1\u7684\u7269\u54c1\u5806, \u8bf7\u62c6\u5206\u540e\u518d\u4f7f\u7528. +#这里是子技能使用的JSON字符串 +JSON.Acrobatics.Roll.Interaction.Activated=测试 &c翻滚测试 +JSON.Acrobatics.SubSkill.Roll.Details.Tips=如果你在摔落时按下潜行键,你将触发两倍翻滚效果 +Anvil.SingleItemStack=&c你不能分解货修复有多个物品的物品堆, 请拆分后再使用. -#DO NOT USE COLOR CODES IN THE JSON KEYS -#COLORS ARE DEFINED IN advanced.yml IF YOU WISH TO CHANGE THEM +#不要在JSON关键字中使用颜色代码 +#如果你想修改颜色请在advanced.yml中修改 -mcMMO.Template.Prefix=[[GOLD]]([[GREEN]]mcMMO[[GOLD]]) -# BEGIN STYLING -Ability.Generic.Refresh=[[GREEN]]**\u6280\u80fd\u51b7\u5374\u5b8c\u6bd5!** -Ability.Generic.Template.Lock=[[GRAY]]{0} -# Skill Command Styling -Ability.Generic.Template=[[DARK_AQUA]]{0}: [[GREEN]]{1} -Ability.Generic.Template.Custom=[[DARK_AQUA]]{0} -Skills.Overhaul.Header=[[RED]][]=====[][[GREEN]] {0} [[RED]][]=====[] -Effects.Effects=\u6548\u679c -Effects.SubSkills.Overhaul=\u5b50\u6280\u80fd -Effects.Child.Overhaul=[[DARK_AQUA]]\u5b50\u7b49\u7ea7 Lv.[[YELLOW]] {0}[[DARK_AQUA]]: {1} -Effects.Child.ParentList=[[GREEN]]{0}[[GOLD]]([[DARK_AQUA]]Lv.[[YELLOW]]{1}[[GOLD]]) -Effects.Level.Overhaul=[[GOLD]]\u7b49\u7ea7: [[YELLOW]]{0} [[DARK_AQUA]]XP[[YELLOW]]([[GOLD]]{1}[[YELLOW]]/[[GOLD]]{2}[[YELLOW]]) -Effects.Parent=[[GOLD]]{0} - -Effects.Template=[[DARK_AQUA]]{0}: [[GREEN]]{1} -Commands.Stats.Self.Overhaul=\u7edf\u8ba1 -Commands.XPGain.Overhaul=[[GOLD]]\u7ecf\u9a8c\u6765\u6e90: [[DARK_AQUA]]{0} -MOTD.Version.Overhaul=[[GOLD]][mcMMO] [[DARK_AQUA]]\u5927\u6539\u7248\u672c[[GOLD]] - [[DARK_AQUA]]{0} -Overhaul.mcMMO.Header=[[RED]][]=====[][[GREEN]] mcMMO - \u5927\u6539\u7248\u672c [[RED]][]=====[] -Overhaul.mcMMO.Url.Wrap.Prefix=[[RED]][| -Overhaul.mcMMO.Url.Wrap.Suffix=[[RED]]|] -Overhaul.mcMMO.MmoInfo.Wiki=[[YELLOW]][[[WHITE]]\u5728WIKI\u4e0a\u67e5\u770b\u6b64\u6280\u80fd![[YELLOW]]] -# Overhaul.Levelup can take {0} - Skill Name defined in Overhaul.Name {1} - Amount of levels gained {2} - Level in skill -Overhaul.Levelup=[[BOLD]]{0} \u589e\u52a0\u5230 [[RESET]][[GREEN]][[BOLD]]{2}[[RESET]][[WHITE]]. -Overhaul.Name.Acrobatics=\u6742\u6280 -Overhaul.Name.Alchemy=\u70bc\u91d1 -Overhaul.Name.Archery=\u7bad\u672f -Overhaul.Name.Axes=\u65a7\u6280 -Overhaul.Name.Excavation=\u6316\u6398 -Overhaul.Name.Fishing=\u9493\u9c7c -Overhaul.Name.Herbalism=\u8349\u836f\u5b66 -Overhaul.Name.Mining=\u6316\u77ff -Overhaul.Name.Repair=\u4fee\u7406 -Overhaul.Name.Salvage=\u5206\u89e3 -Overhaul.Name.Smelting=\u51b6\u70bc -Overhaul.Name.Swords=\u5251\u672f -Overhaul.Name.Taming=\u9a6f\u517d -Overhaul.Name.Unarmed=\u683c\u6597 -Overhaul.Name.Woodcutting=\u4f10\u6728 -# /mcMMO Command Style Stuff -Commands.mcc.Header=[[RED]]---[][[GREEN]]mcMMO \u547d\u4ee4[[RED]][]--- -Commands.Other=[[RED]]---[][[GREEN]]\u5176\u4ed6\u547d\u4ee4[[RED]][]--- -Commands.Party.Header=[[RED]]-----[][[GREEN]]\u961f\u4f0d[[RED]][]----- -Commands.Party.Features.Header=[[RED]]-----[][[GREEN]]FEATURES[[RED]][]----- -# XP BAR Allows for the following variables -- {0} = Skill Level, {1} Current XP, {2} XP Needed for next level, {3} Power Level, {4} Percentage of Level -# Make sure you turn on Experience_Bars.ThisMayCauseLag.AlwaysUpdateTitlesWhenXPIsGained if you want the XP bar title to update every time a player gains XP! +mcMMO.Template.Prefix=&6(&amcMMO&6) +# 开始风格化 +Ability.Generic.Refresh=&a**技能冷却完毕!** +Ability.Generic.Template.Lock=&7{0} +# 技能指令样式 +Ability.Generic.Template=&3{0}: &a{1} +Ability.Generic.Template.Custom=&3{0} +Skills.Overhaul.Header=&c[]=====[]&a {0} &c[]=====[] +Effects.Effects=效果 +Effects.SubSkills.Overhaul=子技能 +Effects.Child.Overhaul=&3子等级 Lv.&e {0}&3: {1} +Effects.Child.ParentList=&a{0}&6(&3Lv.&e{1}&6) +Effects.Level.Overhaul=&6等级: &e{0} &3XP&e(&6{1}&e/&6{2}&e) +Effects.Parent=&6{0} - +Effects.Template=&3{0}: &a{1} +Commands.Stats.Self.Overhaul=统计 +Commands.XPGain.Overhaul=&6经验来源: &3{0} +MOTD.Version.Overhaul=&6[mcMMO] &3大改版本&6 - &3{0} +Overhaul.mcMMO.Header=&c[]=====[]&a mcMMO - 大改版本 &c[]=====[] +Overhaul.mcMMO.Url.Wrap.Prefix=&c[| +Overhaul.mcMMO.Url.Wrap.Suffix=&c|] +Overhaul.mcMMO.MmoInfo.Wiki=&e[&f在WIKI上查看此技能!&e] +# Overhaul.Levelup 可以使用下面的变量 {0} - 在Overhaul.Name中定义的技能名称 {1} - 获得的等级数 {2} - 现在的技能等级 +Overhaul.Levelup=&l{0} 增加到 &r&a&l{2}&r&f. +Overhaul.Name.Acrobatics=杂技 +Overhaul.Name.Alchemy=炼金 +Overhaul.Name.Archery=箭术 +Overhaul.Name.Axes=斧技 +Overhaul.Name.Excavation=挖掘 +Overhaul.Name.Fishing=钓鱼 +Overhaul.Name.Herbalism=草药学 +Overhaul.Name.Mining=挖矿 +Overhaul.Name.Repair=修理 +Overhaul.Name.Salvage=分解 +Overhaul.Name.Smelting=冶炼 +Overhaul.Name.Swords=剑术 +Overhaul.Name.Taming=驯兽 +Overhaul.Name.Unarmed=格斗 +Overhaul.Name.Woodcutting=伐木 +# /mcMMO 命令风格 +Commands.mcc.Header=&c---[]&amcMMO 命令&c[]--- +Commands.Other=&c---[]&a其他命令&c[]--- +Commands.Party.Header=&c-----[]&a队伍&c[]----- +Commands.Party.Features.Header=&c-----[]&a特性&c[]----- +# 经验条可以使用下面的变量 -- {0} = 技能等级, {1} 当前经验, {2} 到下一等级所需的经验, {3} 技能等级, {4} 当前等级的百分比 +# 如果你想让玩家每次获得经验的时候显示经验条则确保选项 Experience_Bars.ThisMayCauseLag.AlwaysUpdateTitlesWhenXPIsGained 处于打开状态 XPBar.Template={0} -XPBar.Template.EarlyGameBoost=[[GOLD]]\u6b63\u5728\u5b66\u4e60\u65b0\u6280\u80fd... -XPBar.Acrobatics=\u6742\u6280 Lv.[[GOLD]]{0} -XPBar.Alchemy=\u70bc\u91d1 Lv.[[GOLD]]{0} -XPBar.Archery=\u7bad\u672f Lv.[[GOLD]]{0} -XPBar.Axes=\u65a7\u6280 Lv.[[GOLD]]{0} -XPBar.Excavation=\u6316\u6398 Lv.[[GOLD]]{0} -XPBar.Fishing=\u9493\u9c7c Lv.[[GOLD]]{0} -XPBar.Herbalism=\u8349\u836f\u5b66 Lv.[[GOLD]]{0} -XPBar.Mining=\u6316\u77ff Lv.[[GOLD]]{0} -XPBar.Repair=\u4fee\u7406 Lv.[[GOLD]]{0} -XPBar.Salvage=\u5206\u89e3 Lv.[[GOLD]]{0} -XPBar.Smelting=\u51b6\u70bc Lv.[[GOLD]]{0} -XPBar.Swords=\u5251\u672f Lv.[[GOLD]]{0} -XPBar.Taming=\u9a6f\u517d Lv.[[GOLD]]{0} -XPBar.Unarmed=\u683c\u6597 Lv.[[GOLD]]{0} -XPBar.Woodcutting=\u4f10\u6728 Lv.[[GOLD]]{0} -#This is just a preset template that gets used if the 'ExtraDetails' setting is turned on in experience.yml (off by default), you can ignore this template and just edit the strings above -XPBar.Complex.Template={0} [[DARK_AQUA]] {4}[[WHITE]]% [[DARK_AQUA]]([[WHITE]]{1}[[DARK_AQUA]]/[[WHITE]]{2}[[DARK_AQUA]]) -# XP BAR Allows for the following variables -- {0} = Skill Level, {1} Current XP, {2} XP Needed for next level, {3} Power Level, {4} Percentage of Level -# Make sure you turn on Experience_Bars.ThisMayCauseLag.AlwaysUpdateTitlesWhenXPIsGained if you want the XP bar title to update every time a player gains XP! -# END STYLING +XPBar.Template.EarlyGameBoost=&6正在学习新技能... +XPBar.Acrobatics=杂技 Lv.&6{0} +XPBar.Alchemy=炼金 Lv.&6{0} +XPBar.Archery=箭术 Lv.&6{0} +XPBar.Axes=斧技 Lv.&6{0} +XPBar.Excavation=挖掘 Lv.&6{0} +XPBar.Fishing=钓鱼 Lv.&6{0} +XPBar.Herbalism=草药学 Lv.&6{0} +XPBar.Mining=挖矿 Lv.&6{0} +XPBar.Repair=修理 Lv.&6{0} +XPBar.Salvage=分解 Lv.&6{0} +XPBar.Smelting=冶炼 Lv.&6{0} +XPBar.Swords=剑术 Lv.&6{0} +XPBar.Taming=驯兽 Lv.&6{0} +XPBar.Unarmed=格斗 Lv.&6{0} +XPBar.Woodcutting=伐木 Lv.&6{0} +#这只是一个预设模板,如果在 Experience.yml 中打开了“ExtraDetails”设置(默认情况下关闭),则可以使用该模板,您可以忽略此模板,只需编辑上面的字符串 +XPBar.Complex.Template={0} &3 {4}&f% &3(&f{1}&3/&f{2}&3) +# 经验条可以使用以下变量 -- {0} = 技能等级, {1} 当前经验, {2} 到下一等级所需的经验, {3} 技能等级, {4} 当前等级的百分比 +# 如果你想让玩家每次获得经验的时候显示经验条则确保选项 Experience_Bars.ThisMayCauseLag.AlwaysUpdateTitlesWhenXPIsGained 处于打开状态 +# 风格化结束 -#\u6742\u6280 -Acrobatics.Ability.Proc=[[GREEN]]**\u534e\u5c14\u5179\u822c\u7684\u964d\u843d** -Acrobatics.Combat.Proc=[[GREEN]]**\u95ea\u907f** -Acrobatics.SubSkill.Roll.Stats=[[GOLD]]\u7ffb\u6eda\u51e0\u7387 [[YELLOW]]{0}%[[GOLD]] \u4f18\u96c5\u7ffb\u6eda\u51e0\u7387[[YELLOW]] {1}% -Acrobatics.SubSkill.Roll.Stat=\u7ffb\u6eda\u51e0\u7387 -Acrobatics.SubSkill.Roll.Stat.Extra=\u4f18\u96c5\u7ffb\u6eda\u51e0\u7387 -Acrobatics.SubSkill.Roll.Name=\u7ffb\u6eda -Acrobatics.SubSkill.Roll.Description=\u51cf\u5c11\u6216\u8005\u53d6\u6d88\u6389\u843d\u4f24\u5bb3. -Acrobatics.SubSkill.Roll.Chance=\u7ffb\u6eda\u51e0\u7387: [[YELLOW]]{0} -Acrobatics.SubSkill.Roll.GraceChance=\u4f18\u96c5\u7684\u7ffb\u6eda\u51e0\u7387: [[YELLOW]]{0} -Acrobatics.SubSkill.Roll.Mechanics=[[GRAY]]\u7ffb\u6eda\u662f\u6742\u6280\u7684\u88ab\u52a8\u5b50\u6280\u80fd.\n\u5f53\u4f60\u6536\u5230\u6454\u843d\u4f24\u5bb3\u65f6,\u6709\u51e0\u7387\u4f1a\u6839\u636e\u4f60\u7684\u6742\u6280\u6280\u80fd\u7b49\u7ea7\u83b7\u5f97\u51cf\u4f24\u6216\u514d\u4f24, \u5728\u4f6050\u7ea7\u65f6\u4f60\u6709 [[YELLOW]]{0}%[[GRAY]] \u7684\u51e0\u7387\u83b7\u5f97\u51cf\u4f24\u6216\u514d\u4f24, \u5982\u679c\u4f60\u6fc0\u6d3b\u4f18\u96c5\u7684\u7ffb\u6eda\u5219\u6709 [[YELLOW]]{1}%[[GRAY]] \u7684\u51e0\u7387\u89e6\u53d1\u53cc\u500d\u7ffb\u6eda\u6548\u679c\uff0c.\n\u51fa\u53d1\u7684\u51e0\u7387\u4f1a\u6697\u8d26\u4f60\u6280\u80fd\u7b49\u7ea7\u7ebf\u6027\u589e\u957f,\u76f4\u5230 [[YELLOW]]{2}[[GRAY]] \u7ea7, \u6bcf\u4e00\u7ea7\u7684\u6742\u6280\u7b49\u7ea7\u63d0\u4f9b [[YELLOW]]{3}%[[GRAY]] \u7684\u89e6\u53d1\u51e0\u7387.\n\u901a\u8fc7\u6309\u4f4f\u6f5c\u884c\u952e(shift)\u53ef\u4ee5\u7ffb\u500d\u7ffb\u6eda\u51e0\u7387\u4ee5\u53ca\u4e24\u500d\u51cf\u4f24\u6548\u679c! \u7ffb\u6eda\u6700\u591a\u51cf\u4f24 [[RED]]{4}[[GRAY]] \u4f24\u5bb3. \u4f18\u96c5\u7ffb\u6eda\u6700\u591a\u51cf\u4f24 [[GREEN]]{5}[[GRAY]] \u4f24\u5bb3. -Acrobatics.SubSkill.GracefulRoll.Name=\u4f18\u96c5\u7ffb\u6eda -Acrobatics.SubSkill.GracefulRoll.Description=\u666e\u901a\u7ffb\u6eda\u7684\u4e24\u500d\u6548\u679c -Acrobatics.SubSkill.Dodge.Name=\u95ea\u907f -Acrobatics.SubSkill.Dodge.Description=\u51cf\u5c11\u4e00\u534a\u6240\u53d7\u653b\u51fb\u4f24\u5bb3 -Acrobatics.SubSkill.Dodge.Stat=\u95ea\u907f\u6982\u7387 -Acrobatics.Listener=\u6742\u6280(Acrobatics): -Acrobatics.Roll.Text=[[ITALIC]]**\u95ea\u907f** -Acrobatics.SkillName=\u6742\u6280 -#\u70bc\u91d1 -Alchemy.SubSkill.Catalysis.Name=\u50ac\u5316 -Alchemy.SubSkill.Catalysis.Description=\u63d0\u5347\u836f\u6c34\u917f\u9020\u901f\u5ea6 -Alchemy.SubSkill.Catalysis.Stat=\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.SubSkill.Concoctions.Stat=\u6df7\u5408\u7b49\u7ea7: [[GREEN]]{0}[[DARK_AQUA]]/[[GREEN]]{1} -Alchemy.SubSkill.Concoctions.Stat.Extra=\u914d\u65b9 [[[GREEN]]{0}[[DARK_AQUA]]]: [[GREEN]]{1} -Alchemy.Listener=\u70bc\u91d1(Alchemy): -Alchemy.Ability.Locked.0=\u9501\u5b9a\u72b6\u6001,\u76f4\u5230 {0}+ \u6280\u80fd\uff08\u50ac\u5316\uff09 -Alchemy.SkillName=\u70bc\u91d1 -#\u7bad\u672f +#杂技 +Acrobatics.Ability.Proc=&a**华尔兹般的降落** +Acrobatics.Combat.Proc=&a**闪避** +Acrobatics.SubSkill.Roll.Stats=&6翻滚几率 &e{0}%&6 优雅翻滚几率&e {1}% +Acrobatics.SubSkill.Roll.Stat=翻滚几率 +Acrobatics.SubSkill.Roll.Stat.Extra=优雅翻滚几率 +Acrobatics.SubSkill.Roll.Name=翻滚 +Acrobatics.SubSkill.Roll.Description=减少或者取消掉落伤害. +Acrobatics.SubSkill.Roll.Chance=翻滚几率: &e{0} +Acrobatics.SubSkill.Roll.GraceChance=优雅的翻滚几率: &e{0} +Acrobatics.SubSkill.Roll.Mechanics=&7翻滚是杂技的被动子技能.\n当你受到摔落伤害时,会根据你的杂技技能等级获得一定几率的减伤或免伤, 在你50级时你有 &e{0}%&7 的几率获得减伤或免伤, 如果你激活优雅的翻滚则有 &e{1}%&7 的几率触发双倍翻滚效果,.\n触发的几率会按照你技能等级线性增长,直到 &e{2}&7 级, 每一级的杂技等级提供 &e{3}%&7 的触发几率.\n通过按住潜行键(shift)可以翻倍翻滚几率以及两倍减伤效果! 翻滚最多减少 &c{4}&7 伤害. 优雅翻滚最多减少 &a{5}&7 伤害. +Acrobatics.SubSkill.GracefulRoll.Name=优雅翻滚 +Acrobatics.SubSkill.GracefulRoll.Description=普通翻滚的两倍效果 +Acrobatics.SubSkill.Dodge.Name=闪避 +Acrobatics.SubSkill.Dodge.Description=减少一半所受攻击伤害 +Acrobatics.SubSkill.Dodge.Stat=闪避概率 +Acrobatics.Listener=杂技(Acrobatics): +Acrobatics.Roll.Text=&o**闪避** +Acrobatics.SkillName=杂技 +#炼金 +Alchemy.SubSkill.Catalysis.Name=催化 +Alchemy.SubSkill.Catalysis.Description=提升药水酿造速度 +Alchemy.SubSkill.Catalysis.Stat=酿造速度 +Alchemy.SubSkill.Concoctions.Name=混合 +Alchemy.SubSkill.Concoctions.Description=酿造带有多重原料的药水 +Alchemy.SubSkill.Concoctions.Stat=混合等级: &a{0}&3/&a{1} +Alchemy.SubSkill.Concoctions.Stat.Extra=配方 [&a{0}&3]: &a{1} +Alchemy.Listener=炼金(Alchemy): +Alchemy.Ability.Locked.0=锁定状态,直到 {0}+ 技能(催化) +Alchemy.SkillName=炼金 +#箭术 -Archery.SubSkill.SkillShot.Name=\u6280\u5de7\u5c04\u51fb -Archery.SubSkill.SkillShot.Description=\u589e\u52a0\u5f13\u7bad\u9020\u6210\u7684\u4f24\u5bb3 -Archery.SubSkill.SkillShot.Stat=\u589e\u52a0\u5c04\u51fb\u9020\u6210\u7684\u4f24\u5bb3 -Archery.SubSkill.Daze.Name=\u51fb\u6655 -Archery.SubSkill.Daze.Description=\u8ff7\u60d1\u654c\u4eba\u5e76\u9020\u6210\u989d\u5916\u7684\u4f24\u5bb3 -Archery.SubSkill.Daze.Stat=\u51fb\u6655\u51e0\u7387 -Archery.SubSkill.ArrowRetrieval.Name=\u7bad\u77e2\u56de\u6536 -Archery.SubSkill.ArrowRetrieval.Description=\u6709\u51e0\u7387\u4ece\u5c38\u4f53\u4e0a\u56de\u6536\u7bad\u77e2 -Archery.SubSkill.ArrowRetrieval.Stat=\u7bad\u77e2\u56de\u6536\u51e0\u7387 -Archery.SubSkill.ArcheryLimitBreak.Name=\u7bad\u672f\u6781\u9650\u7a81\u7834 -Archery.SubSkill.ArcheryLimitBreak.Description=\u7a81\u7834\u4f60\u7684\u6781\u9650. -Archery.SubSkill.ArcheryLimitBreak.Stat=\u7a81\u7834\u6781\u9650\u7684\u4f24\u5bb3\u52a0\u6210 -Archery.Listener=\u7bad\u672f(Archery): -Archery.SkillName=\u7bad\u672f -#\u65a7\u6280 -Axes.Ability.Bonus.0=\u65a7\u5934\u7cbe\u901a -Axes.Ability.Bonus.1=\u9644\u52a0 {0} \u4f24\u5bb3 -Axes.Ability.Bonus.2=\u7834\u7532 -Axes.Ability.Bonus.3=\u5bf9\u62a4\u7532\u9020\u6210 {0} \u70b9\u989d\u5916\u4f24\u5bb3 -Axes.Ability.Bonus.4=\u5f3a\u529b\u51b2\u51fb -Axes.Ability.Bonus.5=\u5bf9\u65e0\u62a4\u7532\u7684\u654c\u4eba\u9020\u6210 {0} \u70b9\u989d\u5916\u4f24\u5bb3 -Axes.Ability.Lower=[[GRAY]]\u4f60\u653e\u4e0b\u4e86\u4f60\u7684\u65a7\u5b50. -Axes.Ability.Ready=[[DARK_AQUA]]\u4f60 [[GOLD]]\u63e1\u7d27[[DARK_AQUA]] \u4e86\u4f60\u7684\u65a7\u5b50. -Axes.Combat.CritStruck=[[DARK_RED]]\u4f60\u6253\u51fa\u4e86\u66b4\u51fb! -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.SubSkill.SkullSplitter.Name=\u65a9\u9996\u8005 (\u4e3b\u52a8\u6280\u80fd) -Axes.SubSkill.SkullSplitter.Description=\u9020\u6210\u8303\u56f4\u4f24\u5bb3 -Axes.SubSkill.SkullSplitter.Stat=\u65a9\u9996\u8005\u6301\u7eed\u65f6\u95f4 -Axes.SubSkill.CriticalStrikes.Name=\u66b4\u51fb -Axes.SubSkill.CriticalStrikes.Description=\u53cc\u500d\u4f24\u5bb3 -Axes.SubSkill.CriticalStrikes.Stat=\u66b4\u51fb\u51e0\u7387 -Axes.SubSkill.AxeMastery.Name=\u65a7\u5934\u7cbe\u901a -Axes.SubSkill.AxeMastery.Description=\u589e\u52a0\u989d\u5916\u4f24\u5bb3 -Axes.SubSkill.AxesLimitBreak.Name=\u65a7\u6280\u6781\u9650\u7a81\u7834 -Axes.SubSkill.AxesLimitBreak.Description=\u7a81\u7834\u4f60\u7684\u6781\u9650. -Axes.SubSkill.AxesLimitBreak.Stat=\u7a81\u7834\u6781\u9650\u7684\u4f24\u5bb3\u52a0\u6210 -Axes.SubSkill.ArmorImpact.Name=\u7834\u7532 -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\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\u53ef\u4ee5\u4f7f\u7528\u4e86! -Axes.Skills.SS.Other.Off=\u65a9\u9996\u8005[[GREEN]] \u7ed3\u675f\u4e86,\u8fdb\u5165\u51b7\u5374 [[YELLOW]]{0} -Axes.Skills.SS.Other.On=[[GREEN]]{0}[[DARK_GREEN]]\u4f7f\u7528\u4e86 [[RED]]\u65a9\u9996\u8005! -#\u6316\u6398 -Excavation.Ability.Lower=[[GRAY]]\u4f60\u653e\u4e0b\u4e86\u4f60\u7684\u94f2\u5b50. -Excavation.Ability.Ready=[[DARK_AQUA]]\u4f60 [[GOLD]]\u63e1\u7d27[[DARK_AQUA]] \u4e86\u4f60\u7684\u94f2\u5b50. -Excavation.SubSkill.GigaDrillBreaker.Name=\u66b4\u8d70\u94bb\u5934 -Excavation.SubSkill.GigaDrillBreaker.Description=3x \u6389\u843d, 3x \u7ecf\u9a8c, +\u901f\u5ea6 -Excavation.SubSkill.GigaDrillBreaker.Stat=\u66b4\u8d70\u94bb\u5934\u6301\u7eed\u65f6\u95f4 -Excavation.SubSkill.Archaeology.Name=\u8003\u53e4\u5b66 -Excavation.SubSkill.Archaeology.Description=\u53d1\u6398\u5927\u5730\u7684\u5bc6\u7801! \u8f83\u9ad8\u7684\u6316\u6398\u7b49\u7ea7\u4f7f\u4f60\u5728\u53d1\u6398\u571f\u5730\u5b9d\u85cf\u65f6\u6709\u8f83\u9ad8\u51e0\u7387\u83b7\u53d6\u7ecf\u9a8c\u7403! -Excavation.SubSkill.Archaeology.Stat=\u8003\u53e4\u5b66\u83b7\u53d6\u7ecf\u9a8c\u7403\u7684\u51e0\u7387 -Excavation.SubSkill.Archaeology.Stat.Extra=\u8003\u53e4\u5b66\u83b7\u53d6\u7ecf\u9a8c\u7403\u7684\u6570\u91cf -Excavation.Listener=\u6316\u6398(Excavation): -Excavation.SkillName=\u6316\u6398 -Excavation.Skills.GigaDrillBreaker.Off=**\u66b4\u8d70\u94bb\u5934\u5df2\u7ed3\u675f** -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\u53ef\u4ee5\u4f7f\u7528\u4e86! -Excavation.Skills.GigaDrillBreaker.Other.Off=\u66b4\u8d70\u94bb\u5934[[GREEN]] \u7ed3\u675f\u4e86,\u8fdb\u5165\u51b7\u5374 [[YELLOW]]{0} -Excavation.Skills.GigaDrillBreaker.Other.On=[[GREEN]]{0}[[DARK_GREEN]] \u4f7f\u7528\u4e86 [[RED]]\u66b4\u8d70\u94bb\u5934! -#\u9493\u9c7c -Fishing.ScarcityTip=[[YELLOW]]&o\u8be5\u533a\u57df\u5df2\u7ecf\u8fc7\u5ea6\u6355\u635e, \u8bf7\u6362\u4e00\u4e2a\u65b0\u533a\u57df\u518d\u5c1d\u8bd5,\u8bf7\u5230\u81f3\u5c11 {0} \u7684\u65b9\u5757\u4ee5\u5916. -Fishing.Scared=[[GRAY]]&o\u4e71\u52a8\u4f1a\u5413\u8dd1\u9c7c! -Fishing.Exhausting=[[RED]]&o\u4e0d\u6b63\u5f53\u4f7f\u7528\u9c7c\u7aff\u4f1a\u52a0\u5267\u8010\u4e45\u7684\u635f\u8017! -Fishing.LowResources=[[GRAY]]\u4f60\u89c9\u5f97\u8fd9\u5757\u533a\u57df\u4f3c\u4e4e\u6ca1\u6709\u591a\u5c11\u9c7c\u4e86. -Fishing.Ability.Info=\u9b54\u6cd5\u730e\u4eba: [[GRAY]] **\u968f\u7740\u6dd8\u91d1\u8005\u7b49\u7ea7\u63d0\u9ad8** -Fishing.Ability.Locked.0=\u9501\u5b9a\u72b6\u6001,\u76f4\u5230 {0}+ \u6280\u80fd\uff08\u6296\u52a8\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.SubSkill.TreasureHunter.Name=\u6dd8\u91d1\u8005 -Fishing.SubSkill.TreasureHunter.Description=\u9493\u51fa\u5404\u79cd\u5404\u6837\u7684\u7269\u54c1 -Fishing.SubSkill.TreasureHunter.Stat=\u6dd8\u91d1\u8005\u7b49\u7ea7: [[GREEN]]{0}[[DARK_AQUA]]/[[GREEN]]{1} -Fishing.SubSkill.TreasureHunter.Stat.Extra=\u6389\u843d\u7387: [[GRAY]]\u4e00\u822c: [[YELLOW]]{0} [[GREEN]]\u666e\u901a: [[YELLOW]]{1}\n[[BLUE]]\u7a00\u6709: [[YELLOW]]{2} [[LIGHT_PURPLE]]\u7f55\u89c1: [[YELLOW]]{3} [[GOLD]]\u53f2\u8bd7: [[YELLOW]]{4} [[AQUA]]\u4f20\u8bf4: [[YELLOW]]{5} -Fishing.SubSkill.MagicHunter.Name=\u9b54\u6cd5\u730e\u4eba -Fishing.SubSkill.MagicHunter.Description=\u627e\u5230\u9644\u9b54\u7269\u54c1 -Fishing.SubSkill.MagicHunter.Stat=\u9b54\u6cd5\u730e\u4eba\u51e0\u7387 -Fishing.SubSkill.Shake.Name=\u6296\u52a8 -Fishing.SubSkill.Shake.Description=\u7528\u9c7c\u7aff\u628a\u73a9\u5bb6\u6216\u751f\u7269\u8eab\u4e0a\u7684\u7269\u54c1\u6296\u4e0b\u6765 -Fishing.SubSkill.Shake.Stat=\u6296\u52a8\u51e0\u7387 -Fishing.SubSkill.FishermansDiet.Name=\u6e14\u592b\u7684\u98df\u8c31 -Fishing.SubSkill.FishermansDiet.Description=\u63d0\u9ad8\u9c7c\u7c7b\u98df\u7269\u6062\u590d\u7684\u9971\u98df\u5ea6 -Fishing.SubSkill.FishermansDiet.Stat=\u6e14\u592b\u7684\u98df\u8c31:[[GREEN]] \u7b49\u7ea7 {0} -Fishing.SubSkill.MasterAngler.Name=\u9493\u9c7c\u5927\u5e08 -Fishing.SubSkill.MasterAngler.Description=\u63d0\u9ad8\u9493\u9c7c\u54ac\u94a9\u51e0\u7387 -Fishing.SubSkill.MasterAngler.Stat=\u9493\u9c7c\u54ac\u94a9\u7387: [[GREEN]]+[[YELLOW]]{0} -Fishing.SubSkill.IceFishing.Name=\u51b0\u9493 -Fishing.SubSkill.IceFishing.Description=\u5141\u8bb8\u4f60\u5728\u51b0\u51b7\u7684\u73af\u5883\u4e0b\u9493\u9c7c -Fishing.SubSkill.IceFishing.Stat=\u51b0\u9493 -Fishing.Chance.Raining=[[BLUE]] \u5927\u91cf\u5956\u52b1 -Fishing.Listener=\u9493\u9c7c: -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]]\u6709\u4ec0\u4e48\u4e1c\u897f\u95fb\u7740\u4e0d\u592a\u5bf9\u52b2... -Fishing.SkillName=\u9493\u9c7c -#HERBALISM -Herbalism.Ability.GTe.NeedMore=\u4f60\u9700\u8981\u66f4\u591a\u79cd\u5b50\u4f7f\u7528\u7eff\u62c7\u6307. -Herbalism.Ability.GTh.Fail=**\u7eff\u5316\u5931\u8d25** -Herbalism.Ability.GTh=[[GREEN]]**\u7eff\u5316** -Herbalism.Ability.Lower=[[GRAY]]\u4f60\u653e\u4e0b\u4e86\u4f60\u7684\u9504\u5934. -Herbalism.Ability.Ready=[[DARK_AQUA]]\u4f60 [[GOLD]]\u6311\u8d77[[DARK_AQUA]] \u4e86\u4f60\u7684\u9504\u5934. -Herbalism.Ability.ShroomThumb.Fail=**\u83cc\u4e1d\u5316\u5931\u8d25** -Herbalism.SubSkill.GreenTerra.Name=\u5927\u5730\u795d\u798f -Herbalism.SubSkill.GreenTerra.Description=\u64ad\u6492\u5927\u5730\u4e4b\u795e\u7684\u6069\u60e0, \u83b7\u5f973\u500d\u6389\u7387 -Herbalism.SubSkill.GreenTerra.Stat=\u5927\u5730\u795d\u798f\u6301\u7eed\u65f6\u95f4 -Herbalism.SubSkill.GreenThumb.Name=\u7eff\u62c7\u6307 -Herbalism.SubSkill.GreenThumb.Description=\u6536\u83b7\u65f6\u81ea\u52a8\u64ad\u79cd\u79cd\u5b50 -Herbalism.SubSkill.GreenThumb.Stat=\u7eff\u62c7\u6307\u89e6\u53d1\u51e0\u7387 -Herbalism.SubSkill.GreenThumb.Stat.Extra=\u7eff\u62c7\u6307\u9636\u6bb5: [[GREEN]] \u4f5c\u7269\u751f\u957f\u5728\u7b2c {0} \u9636\u6bb5 -Herbalism.Effect.4=\u7eff\u5316 (\u65b9\u5757) -Herbalism.SubSkill.GreenThumb.Description.2=\u4f7f\u7816\u5757\u7b49\u957f\u82d4\u85d3,\u6216\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.FarmersDiet.Stat=\u519c\u592b\u98df\u8c31: [[GREEN]]\u7b49\u7ea7 {0} -Herbalism.SubSkill.DoubleDrops.Name=\u53cc\u500d\u6389\u843d -Herbalism.SubSkill.DoubleDrops.Description=\u53cc\u500d\u7269\u54c1 -Herbalism.SubSkill.DoubleDrops.Stat=\u53cc\u500d\u6389\u843d\u51e0\u7387 -Herbalism.SubSkill.HylianLuck.Name=\u6d77\u62c9\u5c14\u7684\u795d\u798f -Herbalism.SubSkill.HylianLuck.Description=\u7ed9\u4e88\u5c0f\u6982\u7387\u627e\u5230\u7a00\u6709\u7269\u54c1\u7684\u80fd\u529b -Herbalism.SubSkill.HylianLuck.Stat=\u6d77\u62c9\u5c14\u7684\u795d\u798f\u7684\u51e0\u7387 -Herbalism.SubSkill.ShroomThumb.Name=\u83cc\u4e1d\u5316 -Herbalism.SubSkill.ShroomThumb.Description=\u5411\u6ce5\u571f&\u8349\u5730\u6563\u64ad\u83cc\u4e1d -Herbalism.SubSkill.ShroomThumb.Stat=\u83cc\u4e1d\u5316\u6982\u7387 -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\u5df2\u7ed3\u675f** -Herbalism.Skills.GTe.On=[[GREEN]]**\u571f\u795e\u5e87\u4f51\u6fc0\u6d3b** -Herbalism.Skills.GTe.Refresh=[[GREEN]]\u4f60\u7684 [[YELLOW]]\u571f\u795e\u5e87\u4f51 [[GREEN]]\u6280\u80fd\u53ef\u4ee5\u4f7f\u7528\u4e86\uff01 -Herbalism.Skills.GTe.Other.Off=\u571f\u795e\u5e87\u4f51[[GREEN]] \u7ed3\u675f\u4e86,\u8fdb\u5165\u51b7\u5374 [[YELLOW]]{0} -Herbalism.Skills.GTe.Other.On=[[GREEN]]{0}[[DARK_GREEN]] \u4f7f\u7528\u4e86 [[RED]]\u571f\u795e\u5e87\u4f51! -#\u6316\u77ff -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\u653e\u4e0b\u4e86\u4f60\u7684\u9550\u5b50. -Mining.Ability.Ready=[[DARK_AQUA]]\u4f60 [[GOLD]]\u62ff\u8d77[[DARK_AQUA]] \u4e86\u4f60\u7684\u9550\u5b50. -Mining.SubSkill.SuperBreaker.Name=\u8d85\u7ea7\u788e\u77f3\u673a -Mining.SubSkill.SuperBreaker.Description=\u901f\u5ea6+, 3\u500d\u6389\u843d\u7387 -Mining.SubSkill.SuperBreaker.Stat=\u8d85\u7ea7\u788e\u77f3\u673a\u6301\u7eed\u65f6\u95f4 -Mining.SubSkill.DoubleDrops.Name=\u53cc\u500d\u6389\u843d -Mining.SubSkill.DoubleDrops.Description=\u53cc\u500d\u666e\u901a\u7269\u54c1 -Mining.SubSkill.DoubleDrops.Stat=\u53cc\u500d\u6389\u843d\u6982\u7387: [[YELLOW]]{0} -Mining.SubSkill.BlastMining.Name=\u7206\u7834\u5f00\u91c7 -Mining.SubSkill.BlastMining.Description=\u4f7f\u7528 TNT \u70b8\u77ff\u7269\u65f6\u4f1a\u83b7\u5f97\u989d\u5916\u7269\u54c1 -Mining.SubSkill.BlastMining.Stat=\u7206\u7834\u5f00\u91c7:[[GREEN]] \u7b49\u7ea7 {0}/{1} [[GRAY]]({2}) -Mining.SubSkill.BlastMining.Stat.Extra=\u7206\u7834\u534a\u5f84\u52a0\u6210: [[GREEN]]+{0} -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.SubSkill.DemolitionsExpertise.Stat=\u7206\u70b8\u4f24\u5bb3\u51cf\u5c11 +Archery.SubSkill.SkillShot.Name=技巧射击 +Archery.SubSkill.SkillShot.Description=增加弓箭造成的伤害 +Archery.SubSkill.SkillShot.Stat=增加射击造成的伤害 +Archery.SubSkill.Daze.Name=击晕 +Archery.SubSkill.Daze.Description=迷惑敌人并造成额外的伤害 +Archery.SubSkill.Daze.Stat=击晕几率 +Archery.SubSkill.ArrowRetrieval.Name=箭矢回收 +Archery.SubSkill.ArrowRetrieval.Description=有几率从尸体上回收箭矢 +Archery.SubSkill.ArrowRetrieval.Stat=箭矢回收几率 +Archery.SubSkill.ArcheryLimitBreak.Name=箭术极限突破 +Archery.SubSkill.ArcheryLimitBreak.Description=突破你的极限. +Archery.SubSkill.ArcheryLimitBreak.Stat=突破极限的伤害加成 +Archery.Listener=箭术(Archery): +Archery.SkillName=箭术 +#斧技 +Axes.Ability.Bonus.0=斧头精通 +Axes.Ability.Bonus.1=附加 {0} 伤害 +Axes.Ability.Bonus.2=破甲 +Axes.Ability.Bonus.3=对护甲造成 {0} 点额外伤害 +Axes.Ability.Bonus.4=强力冲击 +Axes.Ability.Bonus.5=对无护甲的敌人造成 {0} 点额外伤害 +Axes.Ability.Lower=&7你放下了你的斧子. +Axes.Ability.Ready=&3你 &6握紧&3 了你的斧子. +Axes.Ability.Ready.Extra=&3你 &6握紧&3 了你的斧子. &7({0} 正在冷却中 {1}s) +Axes.Combat.CritStruck=&4你打出了暴击! +Axes.Combat.CriticalHit=暴击! +Axes.Combat.GI.Proc=&a**巨力打击** +Axes.Combat.GI.Struck=**被强烈冲击击中** +Axes.Combat.SS.Struck=&4被斩首者技能攻击! +Axes.SubSkill.SkullSplitter.Name=斩首者 (主动技能) +Axes.SubSkill.SkullSplitter.Description=造成范围伤害 +Axes.SubSkill.SkullSplitter.Stat=斩首者持续时间 +Axes.SubSkill.CriticalStrikes.Name=暴击 +Axes.SubSkill.CriticalStrikes.Description=双倍伤害 +Axes.SubSkill.CriticalStrikes.Stat=暴击几率 +Axes.SubSkill.AxeMastery.Name=斧头精通 +Axes.SubSkill.AxeMastery.Description=增加额外伤害 +Axes.SubSkill.AxesLimitBreak.Name=斧技极限突破 +Axes.SubSkill.AxesLimitBreak.Description=突破你的极限. +Axes.SubSkill.AxesLimitBreak.Stat=突破极限的伤害加成 +Axes.SubSkill.ArmorImpact.Name=破甲 +Axes.SubSkill.ArmorImpact.Description=用足够的力量击碎护甲 +Axes.SubSkill.GreaterImpact.Name=强烈冲击 +Axes.SubSkill.GreaterImpact.Description=对无护甲敌人造成额外伤害 +Axes.Listener=斧技(Axes): +Axes.SkillName=斧技 +Axes.Skills.SS.Off=**斩首者技能结束** +Axes.Skills.SS.On=&a**斩首者技能启动** +Axes.Skills.SS.Refresh=&a你的 &e斩首者 &a技能可以使用了! +Axes.Skills.SS.Other.Off=斩首者&a 结束了,进入冷却 &e{0} +Axes.Skills.SS.Other.On=&a{0}&2使用了 &c斩首者! +#挖掘 +Excavation.Ability.Lower=&7你放下了你的铲子. +Excavation.Ability.Ready=&3你 &6握紧&3 了你的铲子. +Excavation.SubSkill.GigaDrillBreaker.Name=暴走钻头 +Excavation.SubSkill.GigaDrillBreaker.Description=三倍掉落, 三倍经验, 挖掘速度提升 +Excavation.SubSkill.GigaDrillBreaker.Stat=暴走钻头持续时间 +Excavation.SubSkill.Archaeology.Name=考古学 +Excavation.SubSkill.Archaeology.Description=发掘大地的密码! 较高的挖掘等级使你在发掘土地宝藏时有较高几率获取经验球! +Excavation.SubSkill.Archaeology.Stat=考古学获取经验球的几率 +Excavation.SubSkill.Archaeology.Stat.Extra=考古学获取经验球的数量 +Excavation.Listener=挖掘(Excavation): +Excavation.SkillName=挖掘 +Excavation.Skills.GigaDrillBreaker.Off=**暴走钻头已结束** +Excavation.Skills.GigaDrillBreaker.On=&a**暴走钻头激活** +Excavation.Skills.GigaDrillBreaker.Refresh=&a你的 &e暴走钻头 &a技能可以使用了! +Excavation.Skills.GigaDrillBreaker.Other.Off=暴走钻头&a 结束了,进入冷却 &e{0} +Excavation.Skills.GigaDrillBreaker.Other.On=&a{0}&2 使用了 &c暴走钻头! +#钓鱼 +Fishing.ScarcityTip=&e&o该区域已经过度捕捞, 请换一个新区域再尝试,请到至少 {0} 的方块以外. +Fishing.Scared=&7&o乱动会吓跑鱼! +Fishing.Exhausting=&c&o不正当使用鱼竿会加剧耐久的损耗! +Fishing.LowResources=&7你觉得这块区域似乎没有多少鱼了. +Fishing.Ability.Info=魔法猎人: &7 **随着淘金者等级提高** +Fishing.Ability.Locked.0=锁定状态,直到 {0}+ 技能(抖动) +Fishing.Ability.Locked.1={0}+ 级后解锁 (冰钓) +Fishing.Ability.Locked.2=锁定状态,直到 {0}+ 技能 (钓鱼大师) +Fishing.SubSkill.TreasureHunter.Name=淘金者 +Fishing.SubSkill.TreasureHunter.Description=钓出各种各样的物品 +Fishing.SubSkill.TreasureHunter.Stat=淘金者等级: &a{0}&3/&a{1} +Fishing.SubSkill.TreasureHunter.Stat.Extra=掉落率: &7一般: &e{0} &a普通: &e{1}\n&9稀有: &e{2} &d罕见: &e{3} &6史诗: &e{4} &b神话: &e{5} +Fishing.SubSkill.MagicHunter.Name=魔法猎人 +Fishing.SubSkill.MagicHunter.Description=找到附魔物品 +Fishing.SubSkill.MagicHunter.Stat=魔法猎人几率 +Fishing.SubSkill.Shake.Name=抖动 +Fishing.SubSkill.Shake.Description=用鱼竿把玩家或生物身上的物品抖下来 +Fishing.SubSkill.Shake.Stat=抖动几率 +Fishing.SubSkill.FishermansDiet.Name=渔夫的食谱 +Fishing.SubSkill.FishermansDiet.Description=提高鱼类食物恢复的饱食度 +Fishing.SubSkill.FishermansDiet.Stat=渔夫的食谱:&a 等级 {0} +Fishing.SubSkill.MasterAngler.Name=钓鱼大师 +Fishing.SubSkill.MasterAngler.Description=钓鱼的效率提升,如果在船上钓鱼效果会更好 +Fishing.SubSkill.MasterAngler.Stat=钓鱼的最短等待时间减少: &a{0} 秒 +Fishing.SubSkill.MasterAngler.Stat.Extra=钓鱼最长等待时间减少: &a{0} 秒 +Fishing.SubSkill.IceFishing.Name=冰钓 +Fishing.SubSkill.IceFishing.Description=允许你在冰冷的环境下钓鱼 +Fishing.SubSkill.IceFishing.Stat=冰钓 +Fishing.Chance.Raining=&9 大量奖励 +Fishing.Listener=钓鱼: +Fishing.Ability.TH.MagicFound=&7你感到一股魔力的波动... +Fishing.Ability.TH.Boom=&7繁荣时期!!! +Fishing.Ability.TH.Poison=&7有什么东西闻着不太对劲... +Fishing.SkillName=钓鱼 +#草药学 +Herbalism.Ability.GTe.NeedMore=你需要更多种子使用园艺大师. +Herbalism.Ability.GTh.Fail=**绿化失败** +Herbalism.Ability.GTh=&a**绿化** +Herbalism.Ability.Lower=&7你放下了你的锄头. +Herbalism.Ability.Ready=&3你 &6挑起&3 了你的锄头. +Herbalism.Ability.ShroomThumb.Fail=**菌丝化失败** +Herbalism.SubSkill.GreenTerra.Name=大地祝福 +Herbalism.SubSkill.GreenTerra.Description=播撒大地之神的恩惠, 获得3倍掉率 +Herbalism.SubSkill.GreenTerra.Stat=大地祝福持续时间 +Herbalism.SubSkill.GreenThumb.Name=园艺大师 +Herbalism.SubSkill.GreenThumb.Description=收获时自动播种种子 +Herbalism.SubSkill.GreenThumb.Stat=园艺大师触发几率 +Herbalism.SubSkill.GreenThumb.Stat.Extra=园艺大师阶段: &a 作物生长在第 {0} 阶段 +Herbalism.Effect.4=绿化 (方块) +Herbalism.SubSkill.GreenThumb.Description.2=使砖块等长苔藓,或让草生长 +Herbalism.SubSkill.FarmersDiet.Name=农夫食谱 +Herbalism.SubSkill.FarmersDiet.Description=食用农产品时额外回复饥饿度 +Herbalism.SubSkill.FarmersDiet.Stat=农夫食谱: &a等级 {0} +Herbalism.SubSkill.DoubleDrops.Name=双倍掉落 +Herbalism.SubSkill.DoubleDrops.Description=双倍物品 +Herbalism.SubSkill.DoubleDrops.Stat=双倍掉落几率 +Herbalism.SubSkill.HylianLuck.Name=海拉尔的祝福 +Herbalism.SubSkill.HylianLuck.Description=给予小概率找到稀有物品的能力 +Herbalism.SubSkill.HylianLuck.Stat=海拉尔的祝福的几率 +Herbalism.SubSkill.ShroomThumb.Name=菌丝化 +Herbalism.SubSkill.ShroomThumb.Description=向泥土&草地散播菌丝 +Herbalism.SubSkill.ShroomThumb.Stat=菌丝化概率 +Herbalism.HylianLuck=&a愿海拉尔的祝福与你同在! +Herbalism.Listener=草药学(Herbalism): +Herbalism.SkillName=草药学 +Herbalism.Skills.GTe.Off=**土神庇佑已结束** +Herbalism.Skills.GTe.On=&a**土神庇佑激活** +Herbalism.Skills.GTe.Refresh=&a你的 &e土神庇佑 &a技能可以使用了! +Herbalism.Skills.GTe.Other.Off=土神庇佑&a 结束了,进入冷却 &e{0} +Herbalism.Skills.GTe.Other.On=&a{0}&2 使用了 &c土神庇佑! +#挖矿 +Mining.Ability.Locked.0=锁定直到 {0}+ 技能 (爆破开采) +Mining.Ability.Locked.1=锁定直到 {0}+ 技能 (大号炸弹) +Mining.Ability.Locked.2=锁定直到 {0}+ 技能 (爆破专家) +Mining.Ability.Lower=&7你放下了你的镐子. +Mining.Ability.Ready=&3你 &6拿起&3 了你的镐子. +Mining.SubSkill.SuperBreaker.Name=超级碎石机 +Mining.SubSkill.SuperBreaker.Description=三倍掉落, 挖矿速度提升 +Mining.SubSkill.SuperBreaker.Stat=超级碎石机持续时间 +Mining.SubSkill.DoubleDrops.Name=双倍掉落 +Mining.SubSkill.DoubleDrops.Description=双倍普通物品 +Mining.SubSkill.DoubleDrops.Stat=双倍掉落概率: &e{0} +Mining.SubSkill.BlastMining.Name=爆破开采 +Mining.SubSkill.BlastMining.Description=使用 TNT 炸矿物时会获得额外物品 +Mining.SubSkill.BlastMining.Stat=爆破开采:&a 等级 {0}/{1} &7({2}) +Mining.SubSkill.BlastMining.Stat.Extra=爆破半径加成: &a+{0} +Mining.SubSkill.BiggerBombs.Name=大号炸弹 +Mining.SubSkill.BiggerBombs.Description=增加TNT爆炸范围 +Mining.SubSkill.DemolitionsExpertise.Name=爆破专家 +Mining.SubSkill.DemolitionsExpertise.Description=减少来自TNT的伤害 +Mining.SubSkill.DemolitionsExpertise.Stat=爆炸伤害减少 -Mining.Listener=\u6316\u77ff(Mining): -Mining.SkillName=\u6316\u77ff -Mining.Skills.SuperBreaker.Off=**\u8d85\u7ea7\u788e\u77f3\u673a\u7ed3\u675f** -Mining.Skills.SuperBreaker.On=[[GREEN]]**\u8d85\u7ea7\u788e\u77f3\u673a\u6fc0\u6d3b** -Mining.Skills.SuperBreaker.Other.Off=\u8d85\u7ea7\u788e\u77f3\u673a [[GREEN]] \u7ed3\u675f\u4e86,\u8fdb\u5165\u51b7\u5374 [[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\u53ef\u4ee5\u4f7f\u7528\u4e86\uff01 -#Blast Mining -Mining.Blast.Boom=[[GRAY]]**\u5623** +Mining.Listener=挖矿(Mining): +Mining.SkillName=挖矿 +Mining.Skills.SuperBreaker.Off=**超级碎石机结束** +Mining.Skills.SuperBreaker.On=&a**超级碎石机激活** +Mining.Skills.SuperBreaker.Other.Off=超级碎石机 &a 结束了,进入冷却 &e{0} +Mining.Skills.SuperBreaker.Other.On=&a{0}&2 使用了 &c超级碎石机! +Mining.Skills.SuperBreaker.Refresh=&a你的 &e超级碎石机 &a技能可以使用了! +#爆破挖矿 +Mining.Blast.Boom=&7**嘣** Mining.Blast.Cooldown= -Mining.Blast.Effect=+{0} \u77ff\u7269\u91cf, {1}x \u6389\u843d -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\u53ef\u4ee5\u4f7f\u7528\u4e86! -#REPAIR -Repair.SubSkill.Repair.Name=\u4fee\u7406 -Repair.SubSkill.Repair.Description=\u4fee\u7406\u5de5\u5177\u548c\u88c5\u5907 -Repair.SubSkill.GoldRepair.Name=\u4fee\u7406\u91d1\u5236\u7269\u54c1 ({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=\u4fee\u7406\u65f6\u63d0\u5347\u6062\u590d\u7684\u8010\u4e45\u5ea6 -Repair.SubSkill.RepairMastery.Stat=\u4fee\u7406\u7cbe\u901a: [[GREEN]]\u989d\u5916\u6062\u590d {0} \u8010\u4e45 -Repair.SubSkill.SuperRepair.Name=\u8d85\u7ea7\u4fee\u7406 -Repair.SubSkill.SuperRepair.Description=\u53cc\u500d\u4fee\u7406\u6548\u679c -Repair.SubSkill.SuperRepair.Stat=\u8d85\u7ea7\u4fee\u7406\u6982\u7387 -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.SubSkill.ArcaneForging.Stat=\u79d8\u6cd5\u953b\u9020: [[YELLOW]]\u7b49\u7ea7 {0}/{1} -Repair.SubSkill.ArcaneForging.Stat.Extra=[[DARK_AQUA]]\u79d8\u6cd5\u953b\u9020\u8d54\u7387:[[GRAY]] \u6210\u529f [[GREEN]]{0}[[GRAY]]%, \u5931\u8d25 [[RED]]{1}[[GRAY]]% -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(Repair): -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.StackedItems=[[DARK_RED]]\u4f60\u65e0\u6cd5\u4fee\u7406\u5df2\u53e0\u52a0\u7684\u7269\u54c1. -Repair.Pretty.Name=\u4fee\u7406 -#Arcane Forging -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. -#SALVAGE -Salvage.Pretty.Name=\u5206\u89e3 -Salvage.SubSkill.UnderstandingTheArt.Name=\u5206\u89e3\u7cbe\u901a -Salvage.SubSkill.UnderstandingTheArt.Description=\u4f60\u4e0d\u53ea\u662f\u518d\u7ffb\u90bb\u5c45\u7684\u5783\u573e, \u4f60\u662f\u5728\u4fdd\u62a4\u73af\u5883.\n\u589e\u5f3a\u5206\u89e3\u7684\u5404\u79cd\u5c5e\u6027. -Salvage.SubSkill.ScrapCollector.Name=\u5e9f\u6599\u56de\u6536 -Salvage.SubSkill.ScrapCollector.Description=\u4ece\u7269\u54c1\u4e2d\u5206\u89e3\u51fa\u6750\u6599, \u5b8c\u7f8e\u5206\u89e3\u53d6\u51b3\u4e8e\u6280\u80fd\u548c\u8fd0\u6c14. -Salvage.SubSkill.ScrapCollector.Stat=\u5e9f\u6599\u56de\u6536: [[GREEN]]\u6700\u591a\u5206\u89e3\u51fa [[YELLOW]]{0}[[GREEN]] \u4e2a\u7269\u54c1. \u5360\u4e00\u4e9b\u8fd0\u6c14\u6210\u5206. -Salvage.SubSkill.AdvancedSalvage.Name=\u8fdb\u9636\u5206\u89e3 -Salvage.SubSkill.AdvancedSalvage.Description=\u5206\u89e3\u635f\u574f\u7684\u7269\u54c1 -Salvage.SubSkill.ArcaneSalvage.Name=\u5965\u6570\u5206\u89e3 -Salvage.SubSkill.ArcaneSalvage.Description=\u4ece\u7269\u54c1\u4e2d\u62c6\u89e3\u9644\u9b54 -Salvage.SubSkill.ArcaneSalvage.Stat=\u5965\u6570\u5206\u89e3: [[YELLOW]]\u7b49\u7ea7 {0}/{1} -Salvage.Ability.Locked.0=\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.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. -Salvage.Skills.ArcaneFailed=[[RED]]\u60a8\u65e0\u6cd5\u62c6\u89e3\u51fa\u672c\u7269\u54c1\u6240\u8574\u542b\u7684\u77e5\u8bc6. -Salvage.Skills.ArcanePartial=[[RED]]\u60a8\u53ea\u80fd\u62c6\u89e3\u51fa\u672c\u7269\u54c1\u6240\u8574\u542b\u7684\u90e8\u5206\u77e5\u8bc6. -Salvage.Skills.ArcaneSuccess=[[GREEN]]\u60a8\u80fd\u591f\u5b8c\u5168\u62c6\u89e3\u51fa\u672c\u7269\u54c1\u6240\u542b\u7684\u77e5\u8bc6! -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. -Salvage.Listener=\u5206\u89e3(Salvage): -Salvage.SkillName=\u5206\u89e3 -#\u94c1\u7827 (\u5206\u89e3\u548c\u4fee\u7406\u516c\u7528) -Anvil.Unbreakable=\u8fd9\u4e2a\u7269\u54c1\u4e0d\u4f1a\u635f\u574f! -#SWORDS -Swords.Ability.Lower=[[GRAY]]\u4f60\u653e\u4e0b\u4e86\u4f60\u7684\u5251. -Swords.Ability.Ready=[[DARK_AQUA]]\u4f60 [[GOLD]]\u63e1\u7d27[[DARK_AQUA]] \u4e86\u4f60\u7684\u5251. -Swords.Combat.Rupture.Note=[[GRAY]]\u6ce8\u91ca: [[YELLOW]]1 Tick \u7b49\u4ef7\u4e8e 0.5 \u79d2! -Swords.Combat.Bleeding.Started=[[DARK_RED]] \u4f60\u5728\u6d41\u8840! -Swords.Combat.Bleeding.Stopped=[[GRAY]]\u6d41\u8840 [[GREEN]]\u5df2\u505c\u6b62[[GRAY]]! -Swords.Combat.Bleeding=[[GREEN]]**\u654c\u4eba\u6b63\u5728\u4e0d\u65ad\u6d41\u8840** -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=\u53d7\u5230\u653b\u51fb\u65f6\u53cd\u5c04\u4e00\u5b9a\u4f24\u5bb3! -Swords.SubSkill.CounterAttack.Stat=\u53cd\u51fb\u6982\u7387 -Swords.SubSkill.SerratedStrikes.Name=\u5229\u5203\u7a81\u523a -Swords.SubSkill.SerratedStrikes.Description=\u5728\u8303\u56f4\u653b\u51fb(\u6a2a\u626b)\u65f6,\u9020\u6210\u653b\u51fb\u7684\u90e8\u5206\u4f24\u5bb3.\u6709\u51e0\u7387\u4f34\u968f\u6495\u88c2! -Swords.SubSkill.SerratedStrikes.Stat=\u5229\u5203\u7a81\u523a\u6301\u7eed\u65f6\u95f4 -Swords.SubSkill.Rupture.Name=\u6495\u88c2 -Swords.SubSkill.Rupture.Description=\u9020\u6210\u6d41\u8840\u7684\u6301\u7eed\u6027\u4f24\u5bb3 -Swords.SubSkill.Stab.Name=\u7a7f\u523a -Swords.SubSkill.Stab.Description=\u4e3a\u4f60\u7684\u653b\u51fb\u589e\u52a0\u989d\u5916\u4f24\u5bb3. -Swords.SubSkill.Stab.Stat=\u7a7f\u523a\u4f24\u5bb3 -Swords.SubSkill.SwordsLimitBreak.Name=\u5251\u672f\u6781\u9650\u7a81\u7834 -Swords.SubSkill.SwordsLimitBreak.Description=\u7a81\u7834\u4f60\u7684\u6781\u9650. -Swords.SubSkill.SwordsLimitBreak.Stat=\u7a81\u7834\u6781\u9650\u7684\u4f24\u5bb3\u52a0\u6210 -Swords.SubSkill.Rupture.Stat=\u6495\u88c2\u6982\u7387 -Swords.SubSkill.Rupture.Stat.Extra=\u6495\u88c2: [[GREEN]]{0} tick \u65f6\u95f4 [\u5bf9\u73a9\u5bb6\u9020\u6210 {1} \u4f24\u5bb3] [\u5bf9\u602a\u7269\u9020\u6210 {2} \u4f24\u5bb3] -Swords.Effect.4=\u5229\u5203\u7a81\u523a \u6495\u88c2+ -Swords.Effect.5={0} Tick \u6495\u88c2 -Swords.Listener=\u5251\u672f(Swords): -Swords.SkillName=\u5251\u672f -Swords.Skills.SS.Off=**\u5229\u5203\u7a81\u523a\u7ed3\u675f** -Swords.Skills.SS.On=[[GREEN]]**\u5229\u5203\u7a81\u523a\u6fc0\u6d3b** -Swords.Skills.SS.Refresh=[[GREEN]]\u4f60\u7684 [[YELLOW]]\u5229\u5203\u7a81\u523a [[GREEN]]\u6280\u80fd\u53ef\u4ee5\u4f7f\u7528\u4e86! -Swords.Skills.SS.Other.Off=\u5229\u5203\u7a81\u523a[[GREEN]] \u7ed3\u675f\u4e86,\u8fdb\u5165\u51b7\u5374 [[YELLOW]]{0} -Swords.Skills.SS.Other.On=[[GREEN]]{0}[[DARK_GREEN]] \u4f7f\u7528\u4e86 [[RED]]\u5229\u5203\u7a81\u523a! -#\u9a6f\u517d -Taming.Ability.Bonus.0=\u73af\u5883\u611f\u77e5 -Taming.Ability.Bonus.1=\u72fc\u4f1a\u907f\u514d\u5371\u9669 -Taming.Ability.Bonus.2=\u6bdb\u76ae\u5f3a\u5316 -Taming.Ability.Bonus.3=1/{0} \u4f24\u5bb3, \u706b\u7130\u62b5\u6297 -Taming.Ability.Bonus.4=\u51b2\u51fb\u6297\u6027 -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 (\u6bdb\u76ae\u5f3a\u5316) -Taming.Ability.Locked.2=\u9501\u5b9a\u76f4\u5230 {0}+ \u6280\u80fd (\u51b2\u51fb\u6297\u6027) -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 -Taming.SubSkill.BeastLore.Name=\u91ce\u517d\u4fe1\u606f -Taming.SubSkill.BeastLore.Description=\u9aa8\u5934\u70b9\u51fb\u72fc\u6216\u8c79\u732b -Taming.SubSkill.ShockProof.Name=\u51b2\u51fb\u6297\u6027 -Taming.SubSkill.ShockProof.Description=\u51cf\u5c11\u7206\u70b8\u4f24\u5bb3 -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: \u6f5c\u884c+\u70b9\u51fb,\u624b\u6301\u6307\u5b9a\u7269\u54c1\n {0} {1} (\u8c79\u732b), {2} {3} (\u72fc), {4} {5} (\u9a6c) -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=\u989d\u5916\u4f24\u5bb3 -Taming.SubSkill.EnvironmentallyAware.Name=\u73af\u5883\u611f\u77e5 -Taming.SubSkill.EnvironmentallyAware.Description=\u611f\u77e5 \u4ed9\u4eba\u638c/\u5ca9\u6d46 \u6050\u60e7\u75c7 \u81ea\u52a8\u56de\u5230\u4f60\u8eab\u8fb9, \u51cf\u514d\u6454\u843d\u4f24\u5bb3 -Taming.SubSkill.ThickFur.Name=\u6bdb\u76ae\u5f3a\u5316 -Taming.SubSkill.ThickFur.Description=\u524a\u51cf\u53d7\u5230\u7684\u4f24\u5bb3, \u706b\u7130\u62b5\u6297 -Taming.SubSkill.Pummel.Name=\u731b\u51fb -Taming.SubSkill.Pummel.Description=\u4f60\u7684\u72fc\u6709\u51e0\u7387\u51fb\u9000\u654c\u4eba -Taming.SubSkill.Pummel.TargetMessage=\u4f60\u88ab\u72fc\u51fb\u9000\u4e86! -Taming.Listener.Wolf=[[DARK_GRAY]]\u4f60\u7684\u72fc\u8dd1\u5230\u4f60\u8eab\u8fb9... -Taming.Listener=\u9a6f\u517d(Taming): -Taming.SkillName=\u9a6f\u517d -Taming.Summon.Complete=[[GREEN]]\u53ec\u5524\u6309\u5b8c\u6210 -Taming.Summon.Lifespan= (\u5bff\u547d: {0}\u79d2) -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.Fail.TooMany=[[RED]]\u4f60\u5df2\u7ecf\u8fbe\u5230\u4e86\u53ec\u5524\u5ba0\u7269\u7684\u4e0a\u9650. [[YELLOW]]({0}) -Taming.Summon.Name.Format={0}\u7684 {1} -#\u683c\u6597 -Unarmed.Ability.Bonus.0=\u94c1\u81c2\u5f0f -Unarmed.Ability.Bonus.1=+{0} \u4f24\u5bb3\u52a0\u6210 -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\u677e\u5f00\u4e86\u4f60\u7684\u62f3\u5934. -Unarmed.Ability.Ready=[[DARK_AQUA]]\u4f60 [[GOLD]]\u63e1\u7d27[[DARK_AQUA]] \u4e86\u4f60\u7684\u62f3\u5934. -Unarmed.SubSkill.Berserk.Name=\u72c2\u66b4 -Unarmed.SubSkill.Berserk.Description=+50% \u4f24\u5bb3, \u80fd\u7834\u574f\u786c\u5ea6\u4f4e\u7684\u65b9\u5757 -Unarmed.SubSkill.Berserk.Stat=\u72c2\u66b4\u6301\u7eed\u65f6\u95f4 -Unarmed.SubSkill.Disarm.Name=\u7f34\u68b0 -Unarmed.SubSkill.Disarm.Description=\u51fb\u843d\u654c\u4eba\u624b\u4e2d\u7684\u6b66\u5668 -Unarmed.SubSkill.Disarm.Stat=\u7f34\u68b0\u6982\u7387 -Unarmed.SubSkill.UnarmedLimitBreak.Name=\u683c\u6597\u6781\u9650\u7a81\u7834 -Unarmed.SubSkill.UnarmedLimitBreak.Description=\u7a81\u7834\u4f60\u7684\u6781\u9650. -Unarmed.SubSkill.UnarmedLimitBreak.Stat=\u7a81\u7834\u6781\u9650\u7684\u4f24\u5bb3\u52a0\u6210 -Unarmed.SubSkill.IronArmStyle.Name=\u94c1\u81c2\u5f0f -Unarmed.SubSkill.IronArmStyle.Description=\u4f24\u5bb3\u52a0\u6210 -Unarmed.SubSkill.ArrowDeflect.Name=\u7bad\u77e2\u504f\u5411 -Unarmed.SubSkill.ArrowDeflect.Description=\u8ba9\u7bad\u77e2\u504f\u5411 -Unarmed.SubSkill.ArrowDeflect.Stat=\u7bad\u77e2\u504f\u5411\u51e0\u7387 -Unarmed.SubSkill.IronGrip.Name=\u94c1\u8155 -Unarmed.SubSkill.IronGrip.Description=\u9632\u6b62\u4f60\u88ab\u7f34\u68b0 -Unarmed.SubSkill.IronGrip.Stat=\u94c1\u8155\u89e6\u53d1\u6982\u7387 -Unarmed.SubSkill.BlockCracker.Name=\u65b9\u5757\u7c89\u788e\u673a -Unarmed.SubSkill.BlockCracker.Description=\u7528\u62f3\u5934\u6253\u788e\u662f\u5934 -Unarmed.Listener=\u683c\u6597(Unarmed): -Unarmed.SkillName=\u683c\u6597 -Unarmed.Skills.Berserk.Off=**\u72c2\u66b4\u7ed3\u675f** -Unarmed.Skills.Berserk.On=[[GREEN]]**\u72c2\u66b4\u6fc0\u6d3b** -Unarmed.Skills.Berserk.Other.Off=\u72c2\u66b4[[GREEN]] \u7ed3\u675f\u4e86,\u8fdb\u5165\u51b7\u5374 [[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\u53ef\u4ee5\u4f7f\u7528\u4e86! -#WOODCUTTING -Woodcutting.Ability.0=\u79cb\u98ce\u626b\u843d\u53f6 -Woodcutting.Ability.1=\u626b\u9664\u6811\u53f6 -Woodcutting.Ability.Locked.0=\u9501\u5b9a\u72b6\u6001,\u76f4\u5230 {0}+ \u6280\u80fd (\u79cb\u98ce\u626b\u843d\u53f6) -Woodcutting.SubSkill.TreeFeller.Name=\u4f10\u6728\u5de5 -Woodcutting.SubSkill.TreeFeller.Description=\u7206\u53d1\u5f0f\u780d\u6811 -Woodcutting.SubSkill.TreeFeller.Stat=\u7206\u53d1\u5f0f\u780d\u6811\u6301\u7eed\u65f6\u95f4 -Woodcutting.SubSkill.LeafBlower.Name=\u79cb\u98ce\u626b\u843d\u53f6 -Woodcutting.SubSkill.LeafBlower.Description=\u626b\u9664\u6811\u53f6 -Woodcutting.SubSkill.HarvestLumber.Name=\u6811\u6728\u4e30\u6536 -Woodcutting.SubSkill.HarvestLumber.Description=\u5de7\u5999\u5730\u83b7\u53d6\u66f4\u591a\u6728\u5934\n\u6709\u51e0\u7387\u53cc\u500d\u6389\u843d -Woodcutting.SubSkill.HarvestLumber.Stat=\u6811\u6728\u4e30\u6536\u53cc\u500d\u51e0\u7387 -Woodcutting.SubSkill.Splinter.Name=\u7c89\u788e -Woodcutting.SubSkill.Splinter.Description=\u66f4\u6709\u6548\u7684\u780d\u6811. -Woodcutting.SubSkill.BarkSurgeon.Name=\u6811\u6728\u5916\u79d1\u533b\u751f -Woodcutting.SubSkill.BarkSurgeon.Description=\u5265\u6811\u65f6\u63d0\u53d6\u6709\u7528\u7684\u6750\u6599. -Woodcutting.SubSkill.NaturesBounty.Name=\u5927\u81ea\u7136\u7684\u6069\u60e0 -Woodcutting.SubSkill.NaturesBounty.Description=\u4ece\u5927\u81ea\u7136\u4e2d\u83b7\u53d6\u7ecf\u9a8c. -Woodcutting.Listener=\u4f10\u6728(Woodcutting): -Woodcutting.SkillName=\u4f10\u6728 -Woodcutting.Skills.TreeFeller.Off=**\u4f10\u6728\u5de5\u7ed3\u675f** -Woodcutting.Skills.TreeFeller.On=[[GREEN]]**\u4f10\u6728\u5de5\u6fc0\u6d3b** -Woodcutting.Skills.TreeFeller.Refresh=[[GREEN]]\u4f60\u7684 [[YELLOW]]\u4f10\u6728\u5de5 [[GREEN]]\u6280\u80fd\u53ef\u4ee5\u4f7f\u7528\u4e86! -Woodcutting.Skills.TreeFeller.Other.Off=\u4f10\u6728\u6280\u80fd [[GREEN]] \u7ed3\u675f\u4e86,\u8fdb\u5165\u51b7\u5374 [[YELLOW]]{0} -Woodcutting.Skills.TreeFeller.Other.On=[[GREEN]]{0}[[DARK_GREEN]] \u4f7f\u7528\u4e86 [[RED]]\u4f10\u6728\u5de5\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! -#\u80fd\u529b +Mining.Blast.Effect=增加 {0} 矿物量, {1} 倍掉落 +Mining.Blast.Other.On=&a{0}&2 使用了 &c爆破开采! +Mining.Blast.Refresh=&a你的 &e爆破开采 &a技能可以使用了! +#修理 +Repair.SubSkill.Repair.Name=修理 +Repair.SubSkill.Repair.Description=修理工具和装备 +Repair.SubSkill.GoldRepair.Name=修理金制物品 ({0}+ SKILL) +Repair.SubSkill.GoldRepair.Description=修理黄金工具和装备 +Repair.SubSkill.IronRepair.Name=修理铁质物品 ({0}+ SKILL) +Repair.SubSkill.IronRepair.Description=修理铁质工具和护甲 +Repair.SubSkill.StoneRepair.Name=修理石头物品 ({0}+ SKILL) +Repair.SubSkill.StoneRepair.Description=修理石头工具 +Repair.SubSkill.RepairMastery.Name=修理精通 +Repair.SubSkill.RepairMastery.Description=修理时提升恢复的耐久度 +Repair.SubSkill.RepairMastery.Stat=修理精通: &a额外恢复 {0} 耐久 +Repair.SubSkill.SuperRepair.Name=超级修理 +Repair.SubSkill.SuperRepair.Description=双倍修理效果 +Repair.SubSkill.SuperRepair.Stat=超级修理概率 +Repair.SubSkill.DiamondRepair.Name=钻石修理 ({0}+ SKILL) +Repair.SubSkill.DiamondRepair.Description=修理钻石工具和装备 +Repair.SubSkill.ArcaneForging.Name=秘法锻造 +Repair.SubSkill.ArcaneForging.Description=修理附魔物品 +Repair.SubSkill.ArcaneForging.Stat=秘法锻造: &e等级 {0}/{1} +Repair.SubSkill.ArcaneForging.Stat.Extra=&3秘法锻造赔率:&7 成功 &a{0}&7%, 失败 &c{1}&7% +Repair.Error=&4mcMMO 在尝试修理此物品时发生了错误! +Repair.Listener.Anvil=&4你放置的铁方块可以用来修理工具和防具. +Repair.Listener=修理(Repair): +Repair.SkillName=修理 +Repair.Skills.AdeptDiamond=&4你的技能等级不足以修理钻石装备. +Repair.Skills.AdeptGold=&4你的技能等级不足以修理黄金装备. +Repair.Skills.AdeptIron=&4你的技能不足以修复铁质装备. +Repair.Skills.AdeptStone=&4你的技能等级不足以修复石头装备 +Repair.Skills.Adept=你必须达到等级 &e{0}&c 才能修理 &e{1} +Repair.Skills.FeltEasy=&7那看起来很简单. +Repair.Skills.FullDurability=&7你的装备已经满耐久度了 +Repair.Skills.StackedItems=&4你无法修理已叠加的物品. +Repair.Pretty.Name=修理 +#奥数锻造 +Repair.Arcane.Downgrade=这件物品的附魔等级已下降. +Repair.Arcane.Fail=这件物品的附魔已消失. +Repair.Arcane.Lost=你的技能等级不足以保留附魔属性. +Repair.Arcane.Perfect=&a你成功地保留了这件物品的附魔. +#分解 +Salvage.Pretty.Name=分解 +Salvage.SubSkill.UnderstandingTheArt.Name=分解精通 +Salvage.SubSkill.UnderstandingTheArt.Description=你不仅仅是在翻邻居的垃圾, 你是在保护环境.\n增强分解的各种属性. +Salvage.SubSkill.ScrapCollector.Name=废料回收 +Salvage.SubSkill.ScrapCollector.Description=从物品中分解出材料, 能否完美分解取决于技能等级和运气. +Salvage.SubSkill.ScrapCollector.Stat=废料回收: &a最多分解出 &e{0}&a 个物品. 占一些运气成分. +Salvage.SubSkill.AdvancedSalvage.Name=进阶分解 +Salvage.SubSkill.AdvancedSalvage.Description=分解损坏的物品 +Salvage.SubSkill.ArcaneSalvage.Name=奥数分解 +Salvage.SubSkill.ArcaneSalvage.Description=从物品中拆解附魔 +Salvage.SubSkill.ArcaneSalvage.Stat=奥数分解: &e等级 {0}/{1} +Salvage.Ability.Locked.0=锁定直至 {0}+ 技能等级 (进阶分解) +Salvage.Ability.Bonus.0=进阶分解 +Salvage.Ability.Bonus.1=最大限度回收 {0} 损坏的物品 +Salvage.Arcane.ExtractFull=&7完全拆解出附魔几率 +Salvage.Arcane.ExtractPartial=&7部分拆解出附魔几率 +Salvage.Skills.Success=&a物品已分解! +Salvage.Skills.Adept.Damaged=&4您的技能等级不足以分解损坏的物品。 +Salvage.Skills.Adept.Level=您必须达到 &e{0}&c 级才能分解 &e{1} +Salvage.Skills.TooDamaged=&4该物品损坏过于严重,无法分解. +Salvage.Skills.ArcaneFailed=&c您无法拆解出本物品所蕴含的知识. +Salvage.Skills.ArcanePartial=&c您只能拆解出本物品所蕴含的部分知识. +Salvage.Skills.ArcaneSuccess=&a您能够完全拆解出本物品所含的知识! +Salvage.Listener.Anvil=&4您已经放置了一个分解砧,使用它来分解工具和护甲. +Salvage.Listener=分解(Salvage): +Salvage.SkillName=分解 +# 铁砧 (分解和修理公用) +Anvil.Unbreakable=这个物品不会损坏! +# 剑术 +Swords.Ability.Lower=&7你放下了你的剑. +Swords.Ability.Ready=&3你 &6握紧&3 了你的剑. +Swords.Combat.Rupture.Note=&7注释: &e1 Tick 等价于 0.5 秒! +Swords.Combat.Bleeding.Started=&4 你在流血! +Swords.Combat.Bleeding.Stopped=&7流血 &a已停止&7! +Swords.Combat.Bleeding=&a**敌人正在不断流血** +Swords.Combat.Counter.Hit=&4你反击了对手! +Swords.Combat.Countered=&a**反击了敌人** +Swords.Combat.SS.Struck=&4发动利刃突刺! +Swords.SubSkill.CounterAttack.Name=反击 +Swords.SubSkill.CounterAttack.Description=受到攻击时反射一定伤害! +Swords.SubSkill.CounterAttack.Stat=反击概率 +Swords.SubSkill.SerratedStrikes.Name=利刃突刺 +Swords.SubSkill.SerratedStrikes.Description=在范围攻击(横扫)时,造成攻击的部分伤害.有几率伴随撕裂! +Swords.SubSkill.SerratedStrikes.Stat=利刃突刺持续时间 +Swords.SubSkill.Rupture.Name=撕裂 +Swords.SubSkill.Rupture.Description=造成流血的持续性伤害 +Swords.SubSkill.Stab.Name=穿刺 +Swords.SubSkill.Stab.Description=为你的攻击增加额外伤害. +Swords.SubSkill.Stab.Stat=穿刺伤害 +Swords.SubSkill.SwordsLimitBreak.Name=剑术极限突破 +Swords.SubSkill.SwordsLimitBreak.Description=突破你的极限. +Swords.SubSkill.SwordsLimitBreak.Stat=突破极限的伤害加成 +Swords.SubSkill.Rupture.Stat=撕裂概率 +Swords.SubSkill.Rupture.Stat.Extra=[[DARK_AQUA]]撕裂: &a{0} tick 时间 [对玩家造成 {1} 伤害] [对怪物造成 {2} 伤害] +Swords.SubSkill.Rupture.Stat.TickDamage=[[DARK_AQUA]]撕裂每造成的纯伤害: &e{0}&a 对玩家, &e{1}&a 对怪物. +Swords.SubSkill.Rupture.Stat.ExplosionDamage=[[DARK_AQUA]]爆炸伤害: &e{0}&a 对玩家, &e{1}&a 对怪物. +Swords.Effect.4=利刃突刺 撕裂+ +Swords.Effect.5={0} Tick 撕裂 +Swords.Listener=剑术(Swords): +Swords.SkillName=剑术 +Swords.Skills.SS.Off=**利刃突刺结束** +Swords.Skills.SS.On=&a**利刃突刺激活** +Swords.Skills.SS.Refresh=&a你的 &e利刃突刺 &a技能可以使用了! +Swords.Skills.SS.Other.Off=利刃突刺&a 结束了,进入冷却 &e{0} +Swords.Skills.SS.Other.On=&a{0}&2 使用了 &c利刃突刺! +#驯兽 +Taming.Ability.Bonus.0=环境感知 +Taming.Ability.Bonus.1=狼会避免危险 +Taming.Ability.Bonus.2=毛皮强化 +Taming.Ability.Bonus.3=1/{0} 伤害, 火焰抵抗 +Taming.Ability.Bonus.4=冲击抗性 +Taming.Ability.Bonus.5=爆炸造成 1/{0} 普通伤害 +Taming.Ability.Bonus.6=利爪 +Taming.Ability.Bonus.7=+{0} 伤害 +Taming.Ability.Bonus.8=快餐服务 +Taming.Ability.Bonus.9={0} 的几率攻击时回血 +Taming.Ability.Bonus.10=犬神的庇护 +Taming.Ability.Bonus.11=受到魔法或中毒伤害时恢复生命值 +Taming.Ability.Locked.0= {0}+ 级后解锁 (环境感知) +Taming.Ability.Locked.1=锁定直到 {0}+ 技能 (毛皮强化) +Taming.Ability.Locked.2=锁定直到 {0}+ 技能 (冲击抗性) +Taming.Ability.Locked.3=锁定直到 {0}+ 技能 (利爪) +Taming.Ability.Locked.4={0}+ 级后解锁 (快餐服务) +Taming.Ability.Locked.5={0}+ 级后解锁 (犬神的庇护) +Taming.Combat.Chance.Gore=嗜血 +Taming.SubSkill.BeastLore.Name=野兽信息 +Taming.SubSkill.BeastLore.Description=骨头点击狼或豹猫 +Taming.SubSkill.ShockProof.Name=冲击抗性 +Taming.SubSkill.ShockProof.Description=减少爆炸伤害 +Taming.SubSkill.CallOfTheWild.Name=野性呼唤 +Taming.SubSkill.CallOfTheWild.Description=为你召唤一只宠物 +Taming.SubSkill.CallOfTheWild.Description.2=&7召唤: 潜行+点击,手持指定物品\n {0} {1} (豹猫), {2} {3} (狼), {4} {5} (马) +Taming.SubSkill.FastFoodService.Name=快餐服务 +Taming.SubSkill.FastFoodService.Description=一定几率使狼在攻击时回复自身血量 +Taming.SubSkill.HolyHound.Name=犬神的庇护 +Taming.SubSkill.HolyHound.Description=已被魔法 & 中毒效果治愈 +Taming.SubSkill.Gore.Name=嗜血 +Taming.SubSkill.Gore.Description=致命攻击会给目标放血 +Taming.SubSkill.SharpenedClaws.Name=利爪 +Taming.SubSkill.SharpenedClaws.Description=额外伤害 +Taming.SubSkill.EnvironmentallyAware.Name=环境感知 +Taming.SubSkill.EnvironmentallyAware.Description=感知 仙人掌/岩浆 恐惧症 自动回到你身边, 减免摔落伤害 +Taming.SubSkill.ThickFur.Name=毛皮强化 +Taming.SubSkill.ThickFur.Description=削减受到的伤害, 火焰抵抗 +Taming.SubSkill.Pummel.Name=猛击 +Taming.SubSkill.Pummel.Description=你的狼有几率击退敌人 +Taming.SubSkill.Pummel.TargetMessage=你被狼击退了! +Taming.Listener.Wolf=&8你的狼跑到你身边... +Taming.Listener=驯兽(Taming): +Taming.SkillName=驯兽 +Taming.Summon.COTW.Success.WithoutLifespan=&a(野性的召唤) &7你已经召唤了一个 &6{0}&7 +Taming.Summon.COTW.Success.WithLifespan=&a(野性的召唤) &7你已经召唤了一个 &6{0}&7 它的持续时间为 &6{1}&7 秒. +Taming.Summon.COTW.Limit=&a(野性的召唤) &7你只能同时 &c{0} &7召唤 &7{1} 只宠物 +Taming.Summon.COTW.TimeExpired=&a(野性的召唤) &7时间到,你的 &6{0}&7 离开. +Taming.Summon.COTW.Removed=&a(野性的召唤) &7你召唤的 &6{0}&7 已经从这个世界上消失了. +Taming.Summon.COTW.BreedingDisallowed=&a(野性的召唤) &c你不能繁殖被召唤的动物. +Taming.Summon.COTW.NeedMoreItems=&a(野性的召唤) &7你需要 &e{0}&7 更多的 &3{1}&7(s) +Taming.Summon.Name.Format={0} 的 {1} +#格斗 +Unarmed.Ability.Bonus.0=铁臂式 +Unarmed.Ability.Bonus.1=+{0} 伤害加成 +Unarmed.Ability.IronGrip.Attacker=你的对手有超强握力! +Unarmed.Ability.IronGrip.Defender=&a你的超强握力抵挡住了对方的缴械攻击! +Unarmed.Ability.Lower=&7你松开了你的拳头. +Unarmed.Ability.Ready=&3你 &6握紧&3 了你的拳头. +Unarmed.SubSkill.Berserk.Name=狂暴 +Unarmed.SubSkill.Berserk.Description=+50% 伤害, 能破坏硬度低的方块 +Unarmed.SubSkill.Berserk.Stat=狂暴持续时间 +Unarmed.SubSkill.Disarm.Name=缴械 +Unarmed.SubSkill.Disarm.Description=击落敌人手中的武器 +Unarmed.SubSkill.Disarm.Stat=缴械概率 +Unarmed.SubSkill.UnarmedLimitBreak.Name=格斗极限突破 +Unarmed.SubSkill.UnarmedLimitBreak.Description=突破你的极限. +Unarmed.SubSkill.UnarmedLimitBreak.Stat=突破极限的伤害加成 +Unarmed.SubSkill.IronArmStyle.Name=铁臂式 +Unarmed.SubSkill.IronArmStyle.Description=伤害加成 +Unarmed.SubSkill.ArrowDeflect.Name=箭矢偏向 +Unarmed.SubSkill.ArrowDeflect.Description=让箭矢偏向 +Unarmed.SubSkill.ArrowDeflect.Stat=箭矢偏向几率 +Unarmed.SubSkill.IronGrip.Name=铁腕 +Unarmed.SubSkill.IronGrip.Description=防止你被缴械 +Unarmed.SubSkill.IronGrip.Stat=铁腕触发概率 +Unarmed.SubSkill.BlockCracker.Name=方块粉碎机 +Unarmed.SubSkill.BlockCracker.Description=用拳头打碎是头 +Unarmed.Listener=格斗(Unarmed): +Unarmed.SkillName=格斗 +Unarmed.Skills.Berserk.Off=**狂暴结束** +Unarmed.Skills.Berserk.On=&a**狂暴激活** +Unarmed.Skills.Berserk.Other.Off=狂暴&a 结束了,进入冷却 &e{0} +Unarmed.Skills.Berserk.Other.On=&a{0}&2 使用了 &c狂暴! +Unarmed.Skills.Berserk.Refresh=&a你的 &e狂暴 &a技能可以使用了! +#伐木 +Woodcutting.Ability.0=秋风扫落叶 +Woodcutting.Ability.1=扫除树叶 +Woodcutting.Ability.Locked.0=锁定状态,直到 {0}+ 技能 (秋风扫落叶) +Woodcutting.SubSkill.TreeFeller.Name=伐木工 +Woodcutting.SubSkill.TreeFeller.Description=爆发式砍树 +Woodcutting.SubSkill.TreeFeller.Stat=爆发式砍树持续时间 +Woodcutting.SubSkill.LeafBlower.Name=秋风扫落叶 +Woodcutting.SubSkill.LeafBlower.Description=扫除树叶 +Woodcutting.SubSkill.KnockOnWood.Name=走运 +Woodcutting.SubSkill.KnockOnWood.Description=使用伐木机时发现更多好东西 +Woodcutting.SubSkill.KnockOnWood.Stat=走运 +Woodcutting.SubSkill.KnockOnWood.Loot.Normal=从树上获取了正常的物品 +Woodcutting.SubSkill.KnockOnWood.Loot.Rank2=从树上获取了正常的物品和经验球 +Woodcutting.SubSkill.HarvestLumber.Name=树木丰收 +Woodcutting.SubSkill.HarvestLumber.Description=巧妙地获取更多木头\n有几率双倍掉落 +Woodcutting.SubSkill.HarvestLumber.Stat=树木丰收双倍几率 +Woodcutting.SubSkill.Splinter.Name=粉碎 +Woodcutting.SubSkill.Splinter.Description=更有效的砍树. +Woodcutting.SubSkill.BarkSurgeon.Name=树木外科医生 +Woodcutting.SubSkill.BarkSurgeon.Description=剥树时提取有用的材料. +Woodcutting.SubSkill.NaturesBounty.Name=大自然的恩惠 +Woodcutting.SubSkill.NaturesBounty.Description=从大自然中获取经验. +Woodcutting.Listener=伐木(Woodcutting): +Woodcutting.SkillName=伐木 +Woodcutting.Skills.TreeFeller.Off=**伐木工结束** +Woodcutting.Skills.TreeFeller.On=&a**伐木工激活** +Woodcutting.Skills.TreeFeller.Refresh=&a你的 &e伐木工 &a技能可以使用了! +Woodcutting.Skills.TreeFeller.Other.Off=伐木技能 &a 结束了,进入冷却 &e{0} +Woodcutting.Skills.TreeFeller.Other.On=&a{0}&2 使用了 &c伐木工技能! +Woodcutting.Skills.TreeFeller.Splinter=你的斧头变成了一堆碎片! +Woodcutting.Skills.TreeFeller.Threshold=那棵树太大了! +#能力 -#COMBAT -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.BeastLoreHorseSpeed=[[DARK_AQUA]]\u9a6c\u5339\u79fb\u901f ([[GREEN]]{0} \u683c/\u79d2[[DARK_AQUA]]) -Combat.BeastLoreHorseJumpStrength=[[DARK_AQUA]]\u9a6c\u5339\u8df3\u8dc3\u9ad8\u5ea6 ([[GREEN]]\u6700\u9ad8 {0} \u683c[[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 -#\u547d\u4ee4 -##\u901a\u7528 -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]]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]]nossr50 [[BLUE]](\u521b\u59cb\u4eba & \u9879\u76ee\u8d1f\u8d23\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)[[GOLD]],[[DARK_AQUA]]\u7ffb\u8bd1\u4f5c\u8005:,[[GOLD]] - [[GREEN]]Fu_Meng,[[DARK_AQUA]]\u6709\u7528\u94fe\u63a5:,[[GOLD]] - [[GREEN]]https://github.com/mcMMO-Dev/mcMMO/issues[[GOLD]] Bug \u62a5\u544a,[[GOLD]] - [[GREEN]]https://discord.gg/EJGVanb [[GOLD]] \u5b98\u65b9 Discord -mcMMO.Description.FormerDevs=[[DARK_AQUA]]\u524d\u5f00\u53d1\u8005: [[GREEN]]GJ, NuclearW, bm01, TfT_02, Glitchfinder -Commands.addlevels.AwardAll.1=\u4f60\u6240\u6709\u7684\u6280\u80fd\u7b49\u7ea7\u88ab\u63d0\u5347\u4e86 {0} \u7ea7! -Commands.addlevels.AwardAll.2=\u4f60\u6240\u6709\u7684\u6280\u80fd\u7b49\u7ea7\u5df2\u88ab {0} \u4fee\u6539. -Commands.addlevels.AwardSkill.1=[[GREEN]]\u4f60\u7684 {0} \u6280\u80fd\u7b49\u7ea7\u88ab\u63d0\u5347\u4e86 {1} \u7ea7! -Commands.addlevels.AwardSkill.2={0} \u6280\u80fd\u7b49\u7ea7\u5df2\u88ab {1} \u4fee\u6539. -Commands.addxp.AwardAll=[[GREEN]]\u4f60\u6240\u6709\u7684\u6280\u80fd\u83b7\u5f97 {0} \u7ecf\u9a8c! -Commands.addxp.AwardSkill=[[GREEN]\u4f60\u7684 {0} \u6280\u80fd\u83b7\u5f97\u4e86 {1} \u7ecf\u9a8c! -Commands.Ability.Off=\u80fd\u529b\u4f7f\u7528\u5207\u6362 [[RED]]\u5173\u95ed -Commands.Ability.On=\u80fd\u529b\u4f7f\u7528\u5207\u6362 [[GREEN]]\u5f00\u542f -Commands.Ability.Toggle=\u80fd\u529b\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=[[GREEN]]- \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} [[WHITE]]\u79d2 -Commands.Cooldowns.Row.Y=\ [[AQUA]]{0}[[WHITE]] - [[DARK_GREEN]]\u51c6\u5907\u5c31\u7eea! -Commands.Database.Cooldown=\u518d\u6b21\u4f7f\u7528\u8fd9\u4e2a\u547d\u4ee4\u8bf7\u7b49\u5f85 {0} \u79d2. -Commands.Database.Processing=\u4f60\u7684\u4e0a\u4e00\u4e2a\u547d\u4ee4\u6b63\u5728\u5904\u7406\u4e2d,\u8bf7\u8010\u5fc3\u7b49\u5f85. -Commands.Disabled=\u8fd9\u4e2a\u6307\u4ee4\u88ab\u7981\u7528\u4e86. -Commands.DoesNotExist= [[RED]]\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.AdminChatSpy.Enabled=mcMMO\u961f\u4f0d\u804a\u5929\u76d1\u89c6\u5df2\u542f\u7528 -Commands.AdminChatSpy.Disabled=mcMMO\u961f\u4f0d\u804a\u5929\u76d1\u89c6\u5df2\u7981\u7528 -Commands.AdminChatSpy.Toggle=mcMMO \u961f\u4f0d\u804a\u5929\u5df2\u5207\u6362\u4e3a[[YELLOW]] {0} -Commands.AdminChatSpy.Chat=[[GOLD]][\u76d1\u89c6: [[GREEN]]{0}[[GOLD]]] [[WHITE]]{1} -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= [[GREEN]]- \u67e5\u770b\u73a9\u5bb6\u8be6\u7ec6\u4fe1\u606f -Commands.Invite.Success=[[GREEN]]\u9080\u8bf7\u5df2\u6210\u529f\u53d1\u9001. -Commands.Leaderboards= [[GREEN]]- \u6392\u884c\u5427 -Commands.mcgod=[[GREEN]]- \u5207\u6362\u4e0a\u5e1d\u6a21\u5f0f -Commands.mchud.Invalid=\u8fd9\u4e0d\u662f\u6709\u6548\u7684 HUD \u7c7b\u578b. -Commands.mcpurge.Success=[[GREEN]]\u6570\u636e\u5e93\u5df2\u6210\u529f\u6e05\u9664! -Commands.mcrank.Heading=[[GOLD]]-=\u4e2a\u4eba\u6392\u540d=- -Commands.mcrank.Overall=\u7efc\u5408[[GREEN]] - [[GOLD]]\u6392\u540d [[WHITE]]#[[GREEN]]{0} -Commands.mcrank.Player=[[WHITE]]{0} [[YELLOW]]\u7684\u6392\u540d -Commands.mcrank.Skill=[[YELLOW]]{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} \u4e00\u4ece\u6570\u636e\u5e93\u4e2d\u5220\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] [[GREEN]] - \u7f16\u8f91\u76ee\u6807 -Commands.mmoedit.AllSkills.1=[[GREEN]]\u4f60\u6240\u6709\u7684\u6280\u80fd\u7b49\u7ea7\u88ab\u8bbe\u7f6e\u4e3a {0} \u7ea7! -Commands.mmoedit.Modified.1=[[GREEN]]\u4f60\u7684 {0} \u6280\u80fd\u7b49\u7ea7\u88ab\u8bbe\u7f6e\u4e3a {1} \u7ea7! -Commands.mmoedit.Modified.2={0} \u5df2\u88ab {1} \u4fee\u6539. -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.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=[[GREEN]]- \u63a5\u53d7\u961f\u4f0d\u9080\u8bf7 -Commands.Party.Chat.Off=\u53ea\u5141\u8bb8\u961f\u4f0d\u804a\u5929 [[RED]]\u5173\u95ed -Commands.Party.Chat.On=\u53ea\u5141\u8bb8\u961f\u4f0d\u804a\u5929 [[GREEN]]\u5f00\u542f -Commands.Party.Commands=[[RED]]---[][[GREEN]]\u961f\u4f0d\u547d\u4ee4[[RED]][]--- -Commands.Party.Invite.0=[[RED]]\u6ce8\u610f: [[GREEN]]\u4f60\u6536\u5230\u4e86\u4e00\u4e2a\u7ec4\u961f\u9080\u8bf7 {0} \u6765\u81ea {1} -Commands.Party.Invite.1=[[YELLOW]]\u8f93\u5165 [[GREEN]]/party accept[[YELLOW]] \u6765\u63a5\u53d7\u9080\u8bf7 -Commands.Party.Invite=[[GREEN]]- \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.PartyFull=[[GOLD]]{0}[[RED]] \u5df2\u6ee1! -Commands.Party.PartyFull.Invite=\u4f60\u4e0d\u80fd\u9080\u8bf7 [[YELLOW]]{0}[[RED]] \u5230 [[GREEN]]{1}[[RED]] \u56e0\u4e3a\u961f\u4f0d\u5df2\u7ecf\u6709 [[DARK_AQUA]]{2}[[RED]] \u4e2a\u73a9\u5bb6\u4e86! -Commands.Party.PartyFull.InviteAccept=\u4f60\u4e0d\u80fd\u52a0\u5165\u961f\u4f0d [[GREEN]]{0}[[RED]] \u56e0\u4e3a\u961f\u4f0d\u5df2\u7ecf\u6709 [[DARK_AQUA]]{1}[[RED]] \u4e2a\u73a9\u5bb6\u4e86! -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=[[RED]]\u4f60\u5df2\u88ab [[GREEN]]{0}[[RED]] [[RED]]\u8e22\u51fa!! -Commands.Party.Leave=[[YELLOW]]\u4f60\u79bb\u5f00\u4e86\u8fd9\u652f\u961f\u4f0d -Commands.Party.Members.Header=[[RED]]-----[][[GREEN]]\u6210\u5458[[RED]][]----- -Commands.Party.None=[[RED]]\u4f60\u4e0d\u5728\u961f\u4f0d\u4e2d. -Commands.Party.Quit=[[GREEN]]- \u79bb\u5f00\u4f60\u73b0\u6709\u7684\u961f\u4f0d -Commands.Party.Teleport=[[GREEN]]- \u4f20\u9001\u5230\u961f\u4f0d\u6210\u5458 -Commands.Party.Toggle=[[GREEN]]- \u5207\u6362\u961f\u4f0d\u804a\u5929 -Commands.Party1=[[GREEN]]- \u521b\u5efa\u4e00\u4e2a\u65b0\u961f\u4f0d -Commands.Party2=[[GREEN]]- \u52a0\u5165\u4e00\u4e2a\u73a9\u5bb6\u7684\u961f\u4f0d -Commands.Party.Alliance.Header=[[RED]]-----[][[GREEN]]\u961f\u4f0d\u540c\u76df[[RED]][]----- -Commands.Party.Alliance.Ally=[[WHITE]]{0} [[DARK_GRAY]]\u7684\u540c\u76df\u961f\u4f0d: [[WHITE]]{1} -Commands.Party.Alliance.Members.Header=[[RED]]-----[][[GREEN]]\u540c\u76df\u6210\u5458[[RED]][]----- -Commands.Party.Alliance.Invite.0=\u6ce8\u610f: [[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. -Commands.Party.Alliance.None=[[RED]]\u60a8\u6ca1\u6709\u540c\u76df.[[RED]][[GREEN]] -Commands.Party.Alliance.AlreadyAllies=[[RED]]\u60a8\u7684\u961f\u4f0d\u5df2\u7ecf\u6709\u4e00\u4e2a\u540c\u76df. \u4f7f\u7528 [[DARK_AQUA]]/party alliance disband [[RED]]\u6765\u89e3\u6563\u5f53\u524d\u540c\u76df -Commands.Party.Alliance.Help.0=[[RED]]\u8fd9\u4e2a\u961f\u4f0d\u8fd8\u6ca1\u6709\u540c\u76df,\u9080\u8bf7\u4ed6\u7684\u961f\u957f\u7ed3\u6210\u540c\u76df\uff0c -Commands.Party.Alliance.Help.1=[[RED]] \u4f7f\u7528 [[DARK_AQUA]]/party alliance invite <\u73a9\u5bb6>[[RED]]. -Commands.ptp.Enabled=\u961f\u4f0d\u4f20\u9001 [[GREEN]]\u542f\u7528 -Commands.ptp.Disabled=\u961f\u4f0d\u4f20\u9001 [[RED]]\u7981\u7528 -Commands.ptp.NoRequests=[[RED]]\u5f53\u524d\u6ca1\u6709\u4f20\u9001\u8bf7\u6c42 -Commands.ptp.NoWorldPermissions=[[RED]][mcMMO] \u4f60\u6ca1\u6709\u6743\u9650\u4f20\u9001\u5230\u4e16\u754c {0}. -Commands.ptp.Request1=[[YELLOW]]{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=[[RED]]\u961f\u4f0d\u4f20\u9001\u8bf7\u6c42\u5df2\u5931\u6548! -Commands.PowerLevel.Leaderboard=[[YELLOW]]--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\u80fd\u7b49\u7ea7\u5df2\u590d\u4f4d\u6210\u529f. -Commands.Reset.Single=[[GREEN]]\u4f60\u7684 {0} \u6280\u80fd\u7b49\u7ea7\u5df2\u6210\u529f\u91cd\u7f6e. -Commands.Reset=[[GREEN]]- \u91cd\u7f6e\u6280\u80fd\u7b49\u7ea7\u4e3a0 -Commands.Scoreboard.Clear=[[DARK_AQUA]]mcMMO \u8bb0\u5206\u677f\u5df2\u6e05\u7a7a. -Commands.Scoreboard.NoBoard=[[RED]]mcMMO \u8bb0\u5206\u677f\u5f53\u524d\u672a\u6fc0\u6d3b. -Commands.Scoreboard.Keep=[[DARK_AQUA]]mcMMO \u8bb0\u5206\u677f\u5c06\u60ac\u505c\u76f4\u5230\u60a8\u4f7f\u7528 [[GREEN]]/mcscoreboard clear[[DARK_AQUA]]. -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=[[GREEN]]- \u67e5\u770b\u6280\u80fd\u7684\u8be6\u7ec6\u4fe1\u606f -Commands.Stats=[[GREEN]]- \u4f60\u7684\u4fe1\u606f -Commands.ToggleAbility=[[GREEN]]- \u7528\u9f20\u6807\u53f3\u952e\u5207\u6362\u6280\u80fd\u6fc0\u6d3b\u6a21\u5f0f -Commands.Usage.0=[[RED]]Proper usage is /{0} -Commands.Usage.1=[[RED]]Proper usage is /{0} {1} -Commands.Usage.2=[[RED]]Proper usage is /{0} {1} {2} -Commands.Usage.3=[[RED]]Proper usage is /{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.SubSkill=\u5b50\u6280\u80fd -Commands.Usage.XP=\u7ecf\u9a8c\u503c -Commands.Description.mmoinfo=\u9605\u8bfb\u6709\u5173\u6280\u80fd\u6216\u673a\u5236\u7684\u8be6\u7ec6\u4fe1\u606f. -Commands.MmoInfo.Mystery=[[GRAY]]\u4f60\u6ca1\u6709\u89e3\u9501\u8fd9\u9879\u80fd\u529b,\u4f46\u5f53\u4f60\u89e3\u9501\u4e86\u8fd9\u9879\u80fd\u529b\u540e\u518d\u70b9\u51fb\u53ef\u4ee5\u67e5\u770b\u80fd\u529b\u7684\u8be6\u7ec6\u4fe1\u606f! -Commands.MmoInfo.NoMatch=\u90a3\u4e2a\u5b50\u6280\u80fd\u4e0d\u5b58\u5728! -Commands.MmoInfo.Header=[[DARK_AQUA]]-=[]=====[][[GOLD]] MMO \u4fe1\u606f [[DARK_AQUA]][]=====[]=- -Commands.MmoInfo.SubSkillHeader=[[GOLD]]\u540d\u5b57:[[YELLOW]] {0} -Commands.MmoInfo.DetailsHeader=[[DARK_AQUA]]-=[]=====[][[GREEN]] \u7ec6\u8282 [[DARK_AQUA]][]=====[]=- -Commands.MmoInfo.OldSkill=[[GRAY]]mcMMO\u6280\u80fd\u6b63\u5728\u88ab\u8f6c\u6362\u4e3a\u66f4\u5148\u8fdb\u7684\u6a21\u5757\u5316\u6280\u80fd\u7cfb\u7edf,\u9057\u61be\u7684\u662f\u8fd9\u9879\u6280\u80fd\u5c1a\u672a\u8f6c\u6362,\u7f3a\u5c11\u8be6\u7ec6\u7684\u7edf\u8ba1\u6570\u636e.\u65b0\u7cfb\u7edf\u5c06\u5141\u8bb8\u66f4\u5feb\u7684\u65b0mcMMO\u6280\u80fd\u66f4\u5feb\u5730\u91ca\u653e\u548c\u73b0\u6709\u6280\u80fd\u66f4\u5927\u7684\u7075\u6d3b\u6027. -Commands.MmoInfo.Mechanics=[[DARK_AQUA]]-=[]=====[][[GOLD]] \u673a\u68b0\u5b66 [[DARK_AQUA]][]=====[]=- -Commands.MmoInfo.Stats=\u7edf\u8ba1: {0} -Commands.Mmodebug.Toggle=mcMMO \u8c03\u8bd5\u6a21\u5f0f [[GOLD]]{0}[[GRAY]], \u4f7f\u7528\u8fd9\u4e2a\u547d\u4ee4\u5207\u6362\u72b6\u6001. \u5982\u679c\u5f00\u542f\u8c03\u8bd5\u6a21\u5f0f, \u4f60\u53ef\u4ee5\u70b9\u51fb\u65b9\u5757\u8f93\u51fa\u7528\u4e8e\u652f\u6301\u7684\u6709\u7528\u4fe1\u606f. -mcMMO.NoInvites=[[RED]]\u4f60\u73b0\u5728\u6ca1\u6709\u53d7\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 -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=[[RED]]\u6b63\u786e\u7684\u7528\u6cd5 [[DARK_AQUA]]{0} [password]. -Party.Help.1=[[RED]]\u521b\u5efa\u4e00\u4e2a\u961f\u4f0d, \u4f7f\u7528 [[DARK_AQUA]]{0} [password]. -Party.Help.2=[[RED]]\u67e5\u9605 [[DARK_AQUA]]{0} [[RED]]\u83b7\u53d6\u66f4\u591a\u4fe1\u606f -Party.Help.3=[[RED]]\u4f7f\u7528 [[DARK_AQUA]]{0} [password] [[RED]]\u52a0\u5165\u6216 [[DARK_AQUA]]{1} [[RED]]\u9000\u51fa -Party.Help.4=[[RED]]\u9501\u5b9a\u6216\u89e3\u9501\u4f60\u7684\u961f\u4f0d, \u4f7f\u7528 [[DARK_AQUA]]{0} -Party.Help.5=[[RED]]\u8bbe\u7f6e\u961f\u4f0d\u5bc6\u7801, \u4f7f\u7528 [[DARK_AQUA]]{0} -Party.Help.6=[[RED]]\u4ece\u4f60\u7684\u961f\u4f0d\u4e2d\u8e22\u51fa\u73a9\u5bb6, \u4f7f\u7528 [[DARK_AQUA]]{0} -Party.Help.7=[[RED]]\u79fb\u4ea4\u961f\u957f, \u4f7f\u7528 [[DARK_AQUA]]{0} -Party.Help.8=[[RED]]\u89e3\u6563\u961f\u4f0d, \u4f7f\u7528 [[DARK_AQUA]]{0} -Party.Help.9=[[RED]]\u4f7f\u7528 [[DARK_AQUA]]{0} [[RED]]\u6765\u4e0e\u4f60\u7684\u961f\u4f0d\u6210\u5458\u5206\u4eab\u7269\u54c1 -Party.Help.10=[[RED]]\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=[[RED]]\u4f60\u4e0d\u80fd\u9080\u8bf7\u81ea\u5df1! -Party.IsLocked=[[RED]]\u8fd9\u4e2a\u961f\u4f0d\u5df2\u7ecf\u9501\u5b9a! -Party.IsntLocked=[[RED]]\u8fd9\u4e2a\u961f\u4f0d\u5e76\u6ca1\u6709\u9501\u5b9a! -Party.Locked=[[RED]]\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=[[RED]]\u52a0\u5165\u8fd9\u4e2a\u961f\u4f0d\u9700\u8981\u5bc6\u7801. \u8bf7\u63d0\u4f9b\u5bc6\u7801\u518d\u52a0\u5165 -Party.Password.Incorrect=[[RED]]\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=[[RED]]\u8fd9\u4e0d\u662f\u4e00\u540d\u6709\u6548\u7684\u73a9\u5bb6 -Party.NotOnline=[[DARK_RED]]{0} \u4e0d\u5728\u7ebf! -Party.Player.InSameParty=[[RED]]{0} \u5df2\u7ecf\u5728\u961f\u4f0d\u4e2d! -Party.PlayerNotInParty=[[DARK_RED]]{0} \u4e0d\u5728\u961f\u4f0d\u91cc -Party.Specify=[[RED]]\u4f60\u5fc5\u987b\u6307\u5b9a\u4e00\u4e2a\u961f\u4f0d -Party.Teleport.Dead=[[RED]]\u4f60\u4e0d\u80fd\u4f20\u9001\u5230\u6b7b\u4ea1\u7684\u73a9\u5bb6\u8eab\u8fb9 -Party.Teleport.Hurt=[[RED]]\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=[[RED]]\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=[[RED]]{0} \u4e0d\u5141\u8bb8\u961f\u4f0d\u4f20\u9001 -Party.Rename.Same=[[RED]]\u8fd9\u5df2\u7ecf\u662f\u4f60\u7684\u961f\u4f0d\u540d\u5b57\u4e86! -Party.Join.Self=[[RED]]\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=[[YELLOW]]\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=[[RED]]\u961f\u4f0d\u804a\u5929\u5c1a\u672a\u89e3\u9501\u3002 -Party.Feature.Disabled.2=[[RED]]\u961f\u4f0d\u4f20\u9001\u5c1a\u672a\u89e3\u9501\u3002 -Party.Feature.Disabled.3=[[RED]]\u961f\u4f0d\u540c\u76df\u5c1a\u672a\u89e3\u9501\u3002 -Party.Feature.Disabled.4=[[RED]]\u961f\u4f0d\u7269\u54c1\u5171\u4eab\u5c1a\u672a\u89e3\u9501\u3002 -Party.Feature.Disabled.5=[[RED]]\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 -##xp -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]]\u7ecf\u9a8c\u6765\u6e90: [[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=[[RED]]\u7ecf\u9a8c\u500d\u7387\u5df2\u8bbe\u7f6e\u4e3a {0} -Commands.xprate.over=[[RED]]mcMMO \u9ad8\u7ecf\u9a8c\u4e8b\u4ef6\u7ed3\u675f!! -Commands.xprate.proper.0=[[RED]]\u60f3\u4fee\u6539\u7ecf\u9a8c\u83b7\u53d6\u7387\u8bf7\u8f93\u5165 /xprate -Commands.xprate.proper.1=[[RED]]\u60f3\u628a\u7ecf\u9a8c\u83b7\u53d6\u7387\u8c03\u6574\u4e3a\u9ed8\u8ba4\u8bf7\u8f93\u5165 /xprate reset -Commands.xprate.proper.2=[[RED]]\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! -Commands.NegativeNumberWarn=\u4e0d\u8981\u4f7f\u7528\u8d1f\u6570! -Commands.Event.Start=[[GREEN]]mcMMO[[GOLD]] \u4e8b\u4ef6! -Commands.Event.Stop=[[GREEN]]mcMMO[[DARK_AQUA]] \u4e8b\u4ef6\u7ed3\u675f! -Commands.Event.Stop.Subtitle=[[GREEN]]\u6211\u5e0c\u671b\u4f60\u73a9\u7684\u5f00\u5fc3! -Commands.Event.XP=[[DARK_AQUA]]\u591a\u500d\u7ecf\u9a8c\u901f\u7387\u4e3a [[GOLD]]{0}[[DARK_AQUA]] \u500d +#战斗 +Combat.ArrowDeflect=&f**箭矢偏向** +Combat.BeastLore=&a**驯兽知识** +Combat.BeastLoreHealth=&3生命值 (&a{0}&3/{1}) +Combat.BeastLoreOwner=&3拥有者 (&c{0}&3) +Combat.BeastLoreHorseSpeed=&3马匹移速 (&a{0} 格/秒&3) +Combat.BeastLoreHorseJumpStrength=&3马匹跳跃高度 (&a最高 {0} 格&3) +Combat.Gore=&a**目标被放血** +Combat.StruckByGore=**你被放血了** +Combat.TargetDazed=目标被 &4被击晕 +Combat.TouchedFuzzy=&4头晕目眩 +#命令 +##通用 +mcMMO.Description=&3关于 &emcMMO&3:,&6mcMMO 是一个 &c开源&6 RPG mod 创建于2011年2月,&6by &9nossr50&6. 目标为玩家提供一个高质量的RPG体验.,&3提示:,&6 - &a使用 &c/mcmmo help&a 查看指令,&6 - &a输入 &c/技能名&a 查看详细的技能信息,&3开发者:,&6 - &anossr50 &9(创始人 & 项目负责人),&6 - &aGJ &9(项目组长),&6 - &aNuclearW &9(开发者),&6 - &abm01 &9(开发者),&6 - &aTfT_02 &9(开发者),&6 - &aGlitchfinder &9(开发者),&6 - &at00thpick1 &9(开发者)&6,&3翻译作者:,&6 - &aFu_Meng/GhostDC,&3有用链接:,&6 - &ahttps://github.com/mcMMO-Dev/mcMMO/issues&6 Bug 报告,&6 - &ahttps://discord.gg/EJGVanb &6 官方 Discord +mcMMO.Description.FormerDevs=&3前开发者: &aGJ, NuclearW, bm01, TfT_02, Glitchfinder +Commands.addlevels.AwardAll.1=你所有的技能等级被提升了 {0} 级! +Commands.addlevels.AwardAll.2=你所有的技能等级已被 {0} 修改. +Commands.addlevels.AwardSkill.1=&a你的 {0} 技能等级被提升了 {1} 级! +Commands.addlevels.AwardSkill.2={0} 技能等级已被 {1} 修改. +Commands.addxp.AwardAll=&a你所有的技能获得 {0} 经验! +Commands.addxp.AwardSkill=&a你的 {0} 技能获得了 {1} 经验! +Commands.Ability.Off=能力使用切换 &c关闭 +Commands.Ability.On=能力使用切换 &a开启 +Commands.Ability.Toggle=能力使用已切换为 &e{0} +Commands.AdminChat.Off=仅管理聊天模式 &c关闭 +Commands.AdminChat.On=仅管理聊天模式 &a开启 +Commands.AdminToggle=&a- 切换管理员聊天 +Commands.Chat.Console=*控制台* +Commands.Cooldowns.Header=&6--= &amcMMO 能力冷却&6 =-- +Commands.Cooldowns.Row.N=\ &c{0}&f - 剩余 &6{1} &f秒 +Commands.Cooldowns.Row.Y=\ &b{0}&f - &2准备就绪! +Commands.Database.CooldownMS=你必须等待 {0} 毫秒后才能再次使用这个命令. +Commands.Database.Cooldown=再次使用这个命令请等待 {0} 秒. +Commands.Database.Processing=你的上一个命令正在处理中,请耐心等待. +Commands.Disabled=这个指令被禁用了. +Commands.DoesNotExist= &c该名玩家不存在于数据库中! +Commands.GodMode.Disabled=mcMMO 上帝模式关闭 +Commands.GodMode.Enabled=mcMMO 上帝模式开启 +Commands.AdminChatSpy.Enabled=mcMMO队伍聊天监视已启用 +Commands.AdminChatSpy.Disabled=mcMMO队伍聊天监视已禁用 +Commands.AdminChatSpy.Toggle=mcMMO 队伍聊天已切换为&e {0} +Commands.AdminChatSpy.Chat=&6[监视: &a{0}&6] &f{1} +Commands.GodMode.Forbidden=[mcMMO] 上帝模式不允许在这个世界开启 (详情请看权限配置) +Commands.GodMode.Toggle=上帝模式已切换为 &e{0} +Commands.Healthbars.Changed.HEARTS=[mcMMO] 你的血条显示类型已更改为 &c心形&f. +Commands.Healthbars.Changed.BAR=[mcMMO] 你的血条显示类型已更改为 &c方形&f. +Commands.Healthbars.Changed.DISABLED=[mcMMO] 你的怪物血条显示已被 &7禁用&f. +Commands.Healthbars.Invalid=无效的血条类型! +Commands.Inspect= &a- 查看玩家详细信息 +Commands.Invite.Success=&a邀请已成功发送. +Commands.Leaderboards= &a- 排行榜 +Commands.mcgod=&a- 切换上帝模式 +Commands.mchud.Invalid=这不是有效的 HUD 类型. +Commands.mcpurge.Success=&a数据库已成功清除! +Commands.mcrank.Heading=&6-=个人排名=- +Commands.mcrank.Overall=综合&a - &6排名 &f#&a{0} +Commands.mcrank.Player=&f{0} &e的排名 +Commands.mcrank.Skill=&e{0}&a - &6排名 &f#&a{1} +Commands.mcrank.Unranked=&f无排名 +Commands.mcrefresh.Success={0} 的冷却时间已刷新 +Commands.mcremove.Success=&a{0} 一从数据库中删除! +Commands.mctop.Tip=&6提示: 使用 &c/mcrank&6 来查看你所有的个人排名! +Commands.mmoedit=[player] &a - 编辑目标 +Commands.mmoedit.AllSkills.1=&a你所有的技能等级被设置为 {0} 级! +Commands.mmoedit.Modified.1=&a你的 {0} 技能等级被设置为 {1} 级! +Commands.mmoedit.Modified.2={0} 已被 {1} 修改. +Commands.mcconvert.Database.Same=你已经在使用 {0} 数据库! +Commands.mcconvert.Database.InvalidType={0} 不是一个有效的数据库类型. +Commands.mcconvert.Database.Start=&7开始从{0}转换至{1}... +Commands.mcconvert.Database.Finish=&7数据库迁移完成; {1}数据库现在拥有{0}数据库的所有数据. +Commands.mmoshowdb=当前使用的数据库为 &a{0} +Commands.mcconvert.Experience.Invalid=错误的公式类型! 有效类型为: &a线性 &c和 &a指数. +Commands.mcconvert.Experience.Same=正在使用公式{0} +Commands.mcconvert.Experience.Start=&7开始从{0}转换到{1}曲线 +Commands.mcconvert.Experience.Finish=&7公式转换完成; 现在使用 {0} 经验曲线. +Commands.ModDescription=- 请阅读简要插件描述 +Commands.NoConsole=这个指令不支持在控制台使用. +Commands.Notifications.Off=技能提示 &c关闭 +Commands.Notifications.On=技能提示 &a开启 +Commands.Offline=这个指令对离线玩家无效 +Commands.NotLoaded=玩家资料尚未加载。 +Commands.Party.Status=&8名字: &f{0} {1} &8等级: &3{2} +Commands.Party.Status.Alliance=&8同盟: &f{0} +Commands.Party.UnlockedFeatures=&8已解锁功能: &7&o{0} +Commands.Party.ShareMode=&8共享模式: +Commands.Party.ItemShare=&7物品 &3({0}) +Commands.Party.ExpShare=&7经验 &3({0}) +Commands.Party.ItemShareCategories=&8物品分配: &7&o{0} +Commands.Party.MembersNear=&8你附近 &3{0}&8/&3{1} +Commands.Party.Accept=&a- 接受队伍邀请 +Commands.Party.Chat.Off=只允许队伍聊天 &c关闭 +Commands.Party.Chat.On=只允许队伍聊天 &a开启 +Commands.Party.Commands=&c---[]&a队伍命令&c[]--- +Commands.Party.Invite.0=&c注意: &a你收到了一个组队邀请 {0} 来自 {1} +Commands.Party.Invite.1=&e输入 &a/party accept&e 来接受邀请 +Commands.Party.Invite=&a- 发送组队邀请 +Commands.Party.Invite.Accepted=&a已接受组队邀请。您已经加入队伍 {0} +Commands.Party.Join=&7加入的队伍: {0} +Commands.Party.PartyFull=&6{0}&c 已满! +Commands.Party.PartyFull.Invite=你不能邀请 &e{0}&c 到 &a{1}&c 因为队伍已经有 &3{2}&c 个玩家了! +Commands.Party.PartyFull.InviteAccept=你不能加入队伍 &a{0}&c 因为队伍已经有 &3{1}&c 个玩家了! +Commands.Party.Create=&7已创建队伍: {0} +Commands.Party.Rename=&7队伍名变更为: &f{0} +Commands.Party.SetSharing=&7队伍 {0} 共享设置为: &3{1} +Commands.Party.ToggleShareCategory=&7队伍物品分配由 &6{0} &7 变为 &3{1} +Commands.Party.AlreadyExists=&4队伍 {0} 已存在! +Commands.Party.Kick=&c你已被 &a{0}&c &c踢出!! +Commands.Party.Leave=&e你离开了这支队伍 +Commands.Party.Members.Header=&c-----[]&a成员&c[]----- +Commands.Party.None=&c你不在队伍中. +Commands.Party.Quit=&a- 离开你现有的队伍 +Commands.Party.Teleport=&a- 传送到队伍成员 +Commands.Party.Toggle=&a- 切换队伍聊天 +Commands.Party1=&a- 创建一个新队伍 +Commands.Party2=&a- 加入一个玩家的队伍 +Commands.Party.Alliance.Header=&c-----[]&a队伍同盟&c[]----- +Commands.Party.Alliance.Ally=&f{0} &8的同盟队伍: &f{1} +Commands.Party.Alliance.Members.Header=&c-----[]&a同盟成员&c[]----- +Commands.Party.Alliance.Invite.0=注意: &a您从 {1} 收到队伍同盟邀请来 {0} +Commands.Party.Alliance.Invite.1=输入 &a/party alliance accept&e 来接受邀请 +Commands.Party.Alliance.Invite.Accepted=&a已接受同盟邀请. +Commands.Party.Alliance.None=&c您没有同盟.&c&a +Commands.Party.Alliance.AlreadyAllies=&c您的队伍已经有一个同盟. 使用 &3/party alliance disband &c来解散当前同盟 +Commands.Party.Alliance.Help.0=&c这个队伍还没有同盟,邀请他的队长结成同盟, +Commands.Party.Alliance.Help.1=&c 使用 &3/party alliance invite <玩家>&c. +Commands.ptp.Enabled=队伍传送 &a启用 +Commands.ptp.Disabled=队伍传送 &c禁用 +Commands.ptp.NoRequests=&c当前没有传送请求 +Commands.ptp.NoWorldPermissions=&c[mcMMO] 你没有权限传送到世界 {0}. +Commands.ptp.Request1=&e{0} &a已经向你发出请求传送 +Commands.ptp.Request2=&a同意传送输入 &e/ptp accept. &a请求将在 &c{0} &a 秒后失效 +Commands.ptp.AcceptAny.Enabled=队伍传送请求确认 &a启用 +Commands.ptp.AcceptAny.Disabled=队伍传送请求确认 &c禁用 +Commands.ptp.RequestExpired=&c队伍传送请求已失效! +Commands.PowerLevel.Leaderboard=&e--mcMMO&9 战斗力 &e排行榜-- +Commands.PowerLevel.Capped=&4]战斗力: &a{0} &4最高等级: &e{1} +Commands.PowerLevel=&4战斗力: &a{0} +Commands.Reset.All=&a你的技能等级已复位成功. +Commands.Reset.Single=&a你的 {0} 技能等级已成功重置. +Commands.Reset=&a- 重置技能等级为0 +Commands.Scoreboard.Clear=&3mcMMO 记分板已关闭. +Commands.Scoreboard.NoBoard=&cmcMMO 记分板当前未激活. +Commands.Scoreboard.Keep=&3mcMMO 记分板将悬停直到您使用 &a/mcscoreboard clear&3 来关闭. +Commands.Scoreboard.Timer=&3mcMMO 记分板将在 &6{0}&3 秒后关闭 +Commands.Scoreboard.Help.0=&6 == &c/mcscoreboard &a帮助&6 == +Commands.Scoreboard.Help.1=&3/mcscoreboard&b clear &f - 清空 mcMMO 记分板 +Commands.Scoreboard.Help.2=&3/mcscoreboard&b keep &f - 保持 mcMMO 记分板悬停 +Commands.Scoreboard.Help.3=&3/mcscoreboard&b time [n] &f - &dn&f 秒后清空 mcMMO 记分板 +Commands.Scoreboard.Tip.Keep=&6提示: 当记分板显示时使用 &c/mcscoreboard keep&6 来保持它不消失。 +Commands.Scoreboard.Tip.Clear=&6提示: 使用 &c/mcscoreboard clear&6 来关闭计分板。 +Commands.XPBar.Reset=&6mcMMO 的经验条设置被重置. +Commands.XPBar.SettingChanged=&a{0}&6 的经验值设置被设置为 &a{1} +Commands.Skill.Invalid=这不是一个有效的技能名字! +Commands.Skill.ChildSkill=子技能对该命令无效! +Commands.Skill.Leaderboard=--mcMMO &9{0}&e 排行榜-- +Commands.SkillInfo=&a- 查看技能的详细信息 +Commands.Stats=&a- 你的信息 +Commands.ToggleAbility=&a- 用鼠标右键切换技能激活模式 +Commands.Usage.0=&c正确的用法是 /{0} +Commands.Usage.1=&c正确的用法是 /{0} {1} +Commands.Usage.2=&c正确的用法是 /{0} {1} {2} +Commands.Usage.3=&c正确的用法是 /{0} {1} {2} {3} +Commands.Usage.3.XP=&c正确的用法是 /{0} {1} {2} {3}&7 (您可以在末尾添加 -s 以在不通知玩家的情况下执行命令,从而有效地使其静音) +Commands.Usage.FullClassName=数据类型 +Commands.Usage.Level=等级 +Commands.Usage.Message=消息 +Commands.Usage.Page=页 +Commands.Usage.PartyName=名称 +Commands.Usage.Password=密码 +Commands.Usage.Player=玩家 +Commands.Usage.Rate=比率 +Commands.Usage.Skill=技能 +Commands.Usage.SubSkill=子技能 +Commands.Usage.XP=经验值 +Commands.Description.mmoinfo=阅读有关技能或机制的详细信息. +Commands.MmoInfo.Mystery=&7你没有解锁这项能力,但当你解锁了这项能力后再点击可以查看能力的详细信息! +Commands.MmoInfo.NoMatch=那个子技能不存在! +Commands.MmoInfo.Header=&3-=[]=====[]&6 MMO 信息 &3[]=====[]=- +Commands.MmoInfo.SubSkillHeader=&6名字:&e {0} +Commands.MmoInfo.DetailsHeader=&3-=[]=====[]&a 细节 &3[]=====[]=- +Commands.MmoInfo.OldSkill=&7mcMMO技能正在被转换为更先进的模块化技能系统,遗憾的是这项技能尚未转换,缺少详细的统计数据.新系统将允许更快的新mcMMO技能更快地释放和现有技能更大的灵活性. +Commands.MmoInfo.Mechanics=&3-=[]=====[]&6 机械学 &3[]=====[]=- +Commands.MmoInfo.Stats=统计: {0} +Commands.Mmodebug.Toggle=mcMMO 调试模式 &6{0}&7, 使用这个命令切换状态. 如果开启调试模式, 你可以点击方块输出用于支持的有用信息. +mcMMO.NoInvites=&c你现在没有受到任何邀请 +mcMMO.NoPermission=&4权限不足. +mcMMO.NoSkillNote=&8如果你没有某个技能的使用权限那么他将不会在这里显示.. +##小队 +Party.Forbidden=[mcMMO] 队伍功能不允许在这个世界开启 (详情请看权限配置) +Party.Help.0=&c正确的用法 &3{0} [password]. +Party.Help.1=&c创建一个队伍, 使用 &3{0} [password]. +Party.Help.2=&c查阅 &3{0} &c获取更多信息 +Party.Help.3=&c使用 &3{0} [password] &c加入或 &3{1} &c退出 +Party.Help.4=&c锁定或解锁你的队伍, 使用 &3{0} +Party.Help.5=&c设置队伍密码, 使用 &3{0} +Party.Help.6=&c从你的队伍中踢出玩家, 使用 &3{0} +Party.Help.7=&c移交队长, 使用 &3{0} +Party.Help.8=&c解散队伍, 使用 &3{0} +Party.Help.9=&c使用 &3{0} &c来与你的队伍成员分享物品 +Party.Help.10=&c使用 &3{0} &c开启与你的队伍成员分享经验 +Party.InformedOnJoin={0} &a已经加入你的队伍 +Party.InformedOnQuit={0} &a离开了队伍 +Party.InformedOnNameChange=&6{0} &a已设置队伍名为 &f{1} +Party.InvalidName=&4那不是一个有效的队伍名字. +Party.Invite.Self=&c你不能邀请自己! +Party.IsLocked=&c这个队伍已经锁定! +Party.IsntLocked=&c这个队伍并没有锁定! +Party.Locked=&c队伍被锁定, 只有队长可以邀请. +Party.NotInYourParty=&4{0} 你不在你的团队 +Party.NotOwner=&4你不是队长 +Party.Target.NotOwner=&4{0} 不是队长。 +Party.Owner.New=&a{0} 现在是新的派系领队. +Party.Owner.NotLeader=&4你已经不再是派系内的领队. +Party.Owner.Player=&a你现在不是队长了 +Party.Password.None=&c加入这个队伍需要密码. 请提供密码再加入 +Party.Password.Incorrect=&c队伍密码错误 +Party.Password.Set=&a队伍密码设置为 {0} +Party.Password.Removed=&a队伍密码已被清除 +Party.Player.Invalid=&c这不是一名有效的玩家 +Party.NotOnline=&4{0} 不在线! +Party.Player.InSameParty=&c{0} 已经在队伍中! +Party.PlayerNotInParty=&4{0} 不在队伍里 +Party.Specify=&c你必须指定一个队伍 +Party.Teleport.Dead=&c你不能传送到死亡的玩家身边 +Party.Teleport.Hurt=&c你受到伤害, 至少 {0} 秒内不能传送 +Party.Teleport.Player=&a你已经传送到 {0}. +Party.Teleport.Self=&c你不能传送到你自己那里! +Party.Teleport.Target=&a{0} 已经传送到你身边. +Party.Teleport.Disabled=&c{0} 不允许队伍传送 +Party.Rename.Same=&c这已经是你的队伍名字了! +Party.Join.Self=&c你不能加入你自己! +Party.Unlocked=&7队伍已解锁 +Party.Disband=&7队伍已解散 +Party.Alliance.Formed=&7您的队伍当前与 &a{0} &7结盟 +Party.Alliance.Disband=&7您的队伍不再与 &c{0} &7结盟 +Party.Status.Locked=&4(仅邀请) +Party.Status.Unlocked=&2(开启) +Party.LevelUp=&e队伍等级提升 {0} 级. 总计 ({1}) +Party.Feature.Chat=队伍聊天 +Party.Feature.Teleport=队伍传送 +Party.Feature.Alliance=同盟 +Party.Feature.ItemShare=物品共享 +Party.Feature.XpShare=经验共享 +Party.Feature.Locked.Chat=功能锁定直至 {0}+ 级(队伍聊天) +Party.Feature.Locked.Teleport=功能锁定直至 {0}+ (队伍传送) +Party.Feature.Locked.Alliance=功能锁定直至 {0}+ (同盟) +Party.Feature.Locked.ItemShare=功能锁定直至 {0}+ (物品共享) +Party.Feature.Locked.XpShare=功能锁定直至 {0}+ (经验共享) +Party.Feature.Disabled.1=&c队伍聊天尚未解锁。 +Party.Feature.Disabled.2=&c队伍传送尚未解锁。 +Party.Feature.Disabled.3=&c队伍同盟尚未解锁。 +Party.Feature.Disabled.4=&c队伍物品共享尚未解锁。 +Party.Feature.Disabled.5=&c队伍经验共享尚未解锁。 +Party.ShareType.Xp=经验 +Party.ShareType.Item=物品 +Party.ShareMode.None=无 +Party.ShareMode.Equal=均分 +Party.ShareMode.Random=随机 +Party.ItemShare.Category.Loot=掠夺 +Party.ItemShare.Category.Mining=挖矿 +Party.ItemShare.Category.Herbalism=草药学 +Party.ItemShare.Category.Woodcutting=伐木 +Party.ItemShare.Category.Misc=杂项 +##经验 +Commands.XPGain.Acrobatics=掉落 +Commands.XPGain.Alchemy=酿造药水 +Commands.XPGain.Archery=空手攻击怪物 +Commands.XPGain.Axes=攻击怪物 +Commands.XPGain.Child=从主技能获取等级 +Commands.XPGain.Excavation=挖到宝物 +Commands.XPGain.Fishing=钓鱼 (去研究吧!) +Commands.XPGain.Herbalism=收获作物 +Commands.XPGain.Mining=挖掘石头和矿物 +Commands.XPGain.Repair=修理 +Commands.XPGain.Swords=攻击怪物 +Commands.XPGain.Taming=驯兽, 和你的狼一起战斗 +Commands.XPGain.Unarmed=攻击怪物 +Commands.XPGain.Woodcutting=砍伐树木 +Commands.XPGain=&8经验来源: &f{0} +Commands.xplock.locked=&6你的经验条锁定在 {0}! +Commands.xplock.unlocked=&6你的经验条现在 &a解除锁定了&6! +Commands.xprate.modified=&c经验倍率已设置为 {0} +Commands.xprate.over=&cmcMMO 高倍经验事件结束!! +Commands.xprate.proper.0=&c想修改经验获取率请输入 /xprate +Commands.xprate.proper.1=&c想把经验获取率调整为默认请输入 /xprate reset +Commands.xprate.proper.2=&c请指定 true 或 false 来表明这是否是一个经验活动 +Commands.xprate.started.0=&6mcMMO 高倍经验活动已开始! +Commands.xprate.started.1=&6mcMMO 经验获取率现在为 {0} 倍! +Commands.NegativeNumberWarn=不要使用负数! +Commands.Event.Start=&amcMMO&6 活动! +Commands.Event.Stop=&amcMMO&3 活动结束! +Commands.Event.Stop.Subtitle=&a我希望你玩的开心! +Commands.Event.XP=&3多倍经验倍率为 &6{0}&3 倍 -# Admin Notifications -Server.ConsoleName=[[YELLOW]][Server] -Notifications.Admin.XPRate.Start.Self=[[GRAY]]\u4f60\u5df2\u5c06\u5168\u5c40\u591a\u500d\u7ecf\u9a8c\u8bbe\u7f6e\u4e3a [[GOLD]]{0} \u500d -Notifications.Admin.XPRate.End.Self=[[GRAY]]\u4f60\u7ed3\u675f\u4e86\u591a\u500d\u7ecf\u9a8c\u4e8b\u4ef6. -Notifications.Admin.XPRate.End.Others={0} [[GRAY]]\u7ed3\u675f\u4e86\u591a\u500d\u7ecf\u9a8c\u4e8b\u4ef6 -Notifications.Admin.XPRate.Start.Others={0} [[GRAY]]\u5df2\u542f\u52a8\u6216\u4fee\u6539\u5177\u6709\u5168\u5c40 {1} \u500d\u7684\u591a\u500d\u7ecf\u9a8c\u4e8b\u4ef6 -Notifications.Admin.Format.Others=[[GOLD]]([[GREEN]]mcMMO [[DARK_AQUA]]Admin[[GOLD]]) [[GRAY]]{0} -Notifications.Admin.Format.Self=[[GOLD]]([[GREEN]]mcMMO[[GOLD]]) [[GRAY]]{0} +# 管理员提醒 +Server.ConsoleName=&e[Server] +Notifications.Admin.XPRate.Start.Self=&7你已将全局多倍经验设置为 &6{0} 倍 +Notifications.Admin.XPRate.End.Self=&7你结束了多倍经验事件. +Notifications.Admin.XPRate.End.Others={0} &7结束了多倍经验事件 +Notifications.Admin.XPRate.Start.Others={0} &7已启动或修改具有全局 {1} 倍的多倍经验事件 +Notifications.Admin.Format.Others=&6(&amcMMO &3Admin&6) &7{0} +Notifications.Admin.Format.Self=&6(&amcMMO&6) &7{0} -# Event -XPRate.Event= [[GOLD]]mcMMO \u73b0\u5728\u6b63\u5904\u4e8e\u591a\u500d\u7ecf\u9a8c\u4e8b\u4ef6\u9636\u6bb5! \u7ecf\u9a8c\u83b7\u53d6\u7387\u4e3a {0}\u500d! +# 事件 +XPRate.Event= &6mcMMO 现在正处于多倍经验活动阶段! 经验获取率为 {0} 倍! -#GUIDES -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] -##\u6742\u6280 -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 -##\u70bc\u91d1 -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) -##\u683c\u6597 -Guides.Archery.Section.0=[[DARK_AQUA]]\u5173\u4e8e\u7bad\u672f:\n[[YELLOW]]\u7bad\u672f\u662f\u7528\u5f13\u5c04\u7bad.\n[[YELLOW]]\u4e3a\u4f60\u63d0\u4f9b\u5404\u79cd\u7ad9\u4e1c\u52a0\u6210, \n[[YELLOW]]\u4f8b\u5982\u968f\u7740\u4f60\u7684\u7b49\u7ea7\u63d0\u5347\u4f24\u5bb3\uff0c\u4ee5\u53ca\u5c06\u5bf9\u624b\u51fb\u6655\u7684\u80fd\u529b\n[[YELLOW]]\u9664\u6b64\u4e4b\u5916\u4f60\u8fd8\u80fd\u4ece\u5bf9\u624b\u7684\u8eab\u4e0a\u56de\u6536\u7bad\u77e2.\n\n\n[[DARK_AQUA]]\u7ecf\u9a8c\u6765\u6e90:\n[[YELLOW]]\u8981\u83b7\u53d6\u6b64\u4ec5\u80fd\u7684\u7ecf\u9a8c\n[[YELLOW]]\u4f60\u9700\u8981\u5c04\u51fb\u602a\u7269\u6216\u5176\u4ed6\u73a9\u5bb6. -Guides.Archery.Section.1=[[DARK_AQUA]]\u6280\u5de7\u5c04\u51fb\u5982\u4f55\u5de5\u4f5c?\n[[YELLOW]]\u6280\u5de7\u5c04\u51fb\u4f1a\u4f7f\u4f60\u7684\u5c04\u7bad\u653b\u51fb\u83b7\u5f97\u4f24\u5bb3\u52a0\u6210.\n[[YELLOW]]\u6280\u5de7\u5c04\u51fb\u63d0\u4f9b\u7684\u4f24\u5bb3\u52a0\u6210\u4f1a\u968f\u7740\n[[YELLOW]]\u7bad\u672f\u7b49\u7ea7\u7684\u63d0\u5347\u800c\u589e\u52a0.\n[[YELLOW]]\u4f7f\u7528\u9ed8\u8ba4\u8bbe\u7f6e\u4f60\u7684\u7bad\u672f\u6bcf\u4e94\u5341\u7ea7\u63d0\u9ad810%\u7684\u4f24\u5bb3\u52a0\u6210\n[[YELLOW]]\u6700\u9ad8\u63d0\u4f9b200%\u7684\u4f24\u5bb3\u52a0\u6210. -Guides.Archery.Section.2=[[DARK_AQUA]]\u51fb\u6655\u5982\u4f55\u5de5\u4f5c?\n[[YELLOW]]\u5f53\u4f60\u5c04\u51fb\u73a9\u5bb6\u65f6\uff0c\u8fd9\u4e2a\u88ab\u52a8\u6709\u51e0\u7387\u4f7f\u5176\u4ed6\u73a9\u5bb6\u83b7\u5f97\u7729\u6655.\n[[YELLOW]]\u5f53\u51fb\u6655\u89e6\u53d1\u65f6\u4ed6\u4f1a\u65f6\n[[YELLOW]]\u5bf9\u624b\u76f4\u89c6\u524d\u65b9\u4e00\u5b9a\u65f6\u95f4.\n[[YELLOW]]\u5e76\u63d0\u4f9b4\u70b9\u7684\u989d\u5916\u4f24\u5bb3\uff082 \u5fc3\uff09. -Guides.Archery.Section.3=[[DARK_AQUA]]\u7bad\u77e2\u56de\u6536\u5982\u4f55\u5de5\u4f5c?\n[[YELLOW]]\u5f53\u4f60\u7528\u5f13\u7bad\u51fb\u6740\u602a\u7269\u65f6\n[[YELLOW]]\u6709\u51e0\u7387\u56de\u6536\u7bad\u77e2.\n[[YELLOW]]\u8fd9\u4e2a\u51e0\u7387\u968f\u7740\u4f60\u7bad\u672f\u7b49\u7ea7\u7684\u63d0\u5347\u800c\u589e\u52a0.\n[[YELLOW]]\u9ed8\u8ba4\u60c5\u51b5\u4e0b\u8fd9\u4e2a\u80fd\u529b\u6bcf\u7ea7\u589e\u52a00.1%,\n[[YELLOW]]1000\u7ea7\u589e\u52a0100%. -##\u65a7\u6280 -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.4=[[DARK_AQUA]]\u4ec0\u4e48\u662f\u7834\u7532?\n[[YELLOW]]\u7528\u8db3\u591f\u7684\u529b\u91cf\u51fb\u788e\u62a4\u7532!\n[[YELLOW]]\u7834\u7532\u662f\u4e00\u4e2a\u88ab\u52a8\u7684\u80fd\u529b,\u5b83\u6709\u51e0\u7387\u4f1a\u635f\u8017\n[[YELLOW]]\u5bf9\u624b\u62a4\u7532\u7684\u8010\u4e45\u503c. \u8fd9\u4e2a\u4f24\u5bb3\u4f1a\u968f\u7740\u4f60\u65a7\u6280\u6280\u80fd\u7b49\u7ea7\u63d0\u5347. -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 -##\u6316\u6398 -Guides.Excavation.Section.0=[[DARK_AQUA]]\u5173\u4e8e\u6316\u6398:\n[[YELLOW]]\u6316\u6398\u662f\u4ee5\u6316\u6398\u6ce5\u571f\u4ee5\u5bfb\u627e\u5b9d\u85cf\u7684\u884c\u4e3a.\n[[YELLOW]]\u901a\u8fc7\u6316\u6398,\u4f60\u5c06\u4f1a\u627e\u5230\u9690\u85cf\u7684\u5b9d\u85cf.\n[[YELLOW]]\u4f60\u6316\u7684\u8d8a\u591a\u4f60\u627e\u5230\u7684\u5b9d\u85cf\u4e5f\u5c31\u8d8a\u591a.\n\n[[DARK_AQUA]]\u7ecf\u9a8c\u6765\u6e90:\n[[YELLOW]]\u8981\u83b7\u5f97\u8be5\u6280\u80fd\u7684\u7ecf\u9a8c\u4f60\u5fc5\u987b\u624b\u6301\u94f2\u5b50\u6316\u6398.\n[[YELLOW]]\u53ea\u6709\u7279\u5b9a\u7684\u65b9\u5757\u624d\u80fd\u83b7\u5f97\u7ecf\u9a8c,\u6316\u6398\u5230\u5b9d\u85cf. -Guides.Excavation.Section.1=[[DARK_AQUA]]\u53ef\u4ee5\u6316\u6398\u7684\u65b9\u5757:\n[[YELLOW]]\u8349\u65b9\u5757, \u6ce5\u571f, \u6c99\u5b50, \u7c98\u571f, \u7802\u783e, \u83cc\u4e1d, \u7075\u9b42\u6c99, \u96ea -Guides.Excavation.Section.2=[[DARK_AQUA]]\u5982\u4f55\u4f7f\u7528\u66b4\u8d70\u94bb\u5934:\n[[YELLOW]]\u624b\u62ff\u94f2\u5b50\u53f3\u952e\u5355\u51fb\u4ee5\u8fdb\u5165\u51c6\u5907\u72b6\u6001.\n[[YELLOW]]\u4e00\u65e6\u8fdb\u5165\u8fd9\u79cd\u72b6\u6001,\u4f60\u7ea6\u67094\u79d2\u7684\u65f6\u95f4\u8ba9\u5de5\u5177\n[[YELLOW]]\u70b9\u51fb\u4e0e\u6316\u6398\u673a\u80fd\u517c\u5bb9\u7684\u65b9\u5757\n[[YELLOW]]\u8fd9\u6837\u5c31\u4f1a\u6fc0\u6d3b\u66b4\u8d70\u94bb\u5934\u6280\u80fd. -Guides.Excavation.Section.3=[[DARK_AQUA]]\u4ec0\u4e48\u662f\u66b4\u8d70\u94bb\u5934?\n[[YELLOW]]\u66b4\u8d70\u94bb\u5934\u662f\u4e00\u79cd\u4e0e\u6316\u6398\u6280\u80fd\u76f8\u5173\u4e14\u6709\u65f6\u95f4\u9650\u5236\u7684\u80fd\u529b\n[[YELLOW]]\u5b83\u4f7f\u4f60\u627e\u5230\u5b9d\u85cf\u7684\u51e0\u7387\u589e\u52a0\u4e09\u500d\n[[YELLOW]]\u5e76\u4e14\u80fd\u77ac\u95f4\u6253\u7834\u517c\u5bb9\u7684\u65b9\u5757. -Guides.Excavation.Section.4=[[DARK_AQUA]]\u8003\u53e4\u5b66\u662f\u600e\u6837\u5de5\u4f5c\u7684?\n[[YELLOW]]\u6316\u6398\u51fa\u6765\u7684\u6bcf\u4e00\u4e2a\u5b9d\u85cf\u7684\u6389\u843d\u7269\u90fd\u6709\u81ea\u5df1\u7684\u6280\u80fd\u7b49\u7ea7\u8981\u6c42\n[[YELLOW]]\u56e0\u6b64\u5f88\u96be\u8bf4\u5b83\u5bf9\u4f60\u7684\u5e2e\u52a9\u6709\u591a\u5927\n[[YELLOW]]\u8bf7\u8bb0\u4f4f\uff0c\u6316\u6398\u673a\u80fd\u7b49\u7ea7\u8d8a\u9ad8\u6316\u5230\u7684\u5b9d\u85cf\u5c31\u8d8a\u591a.\n[[YELLOW]]\u8fd8\u8981\u8bb0\u5f97\u6bcf\u79cd\u517c\u5bb9\u6316\u6398\u7684\u65b9\u5757\u90fd\u6709\u81ea\u5df1\u72ec\u7279\u7684\u5b9d\u85cf\u6e05\u5355\n[[YELLOW]]\u6362\u53e5\u8bdd\u8bf4,\u4f60\u5728\u6ce5\u571f\u4e2d\u627e\u5230\u7684\u5b9d\u85cf.\n[[YELLOW]]\u5728\u7802\u783e\u4e2d\u4e0d\u4e00\u5b9a\u80fd\u627e\u5230. -Guides.Excavation.Section.5=[[DARK_AQUA]]\u5173\u4e8e\u6316\u6398\u6ce8\u610f\u4e8b\u9879:\n[[YELLOW]]\u6316\u6398\u6389\u843d\u7269\u662f\u5b8c\u5168\u53ef\u5b9a\u5236\u7684\n[[YELLOW]]\u56e0\u6b64\u6316\u51fa\u7684\u7ed3\u679c\u56e0\u670d\u52a1\u5668\u800c\u5f02. -##\u9493\u9c7c -Guides.Fishing.Section.0=[[DARK_AQUA]]\u5173\u4e8e\u9493\u9c7c:\n[[YELLOW]]\u5173\u4e8e\u9493\u9c7c\u6280\u80fd, \u9493\u9c7c\u518d\u6b21\u4f7f\u4eba\u632f\u594b!\n[[YELLOW]]\u627e\u5230\u9690\u85cf\u7684\u5b9d\u85cf\u4ece\u602a\u7269\u8eab\u4e0a\u6296\u843d\u7269\u54c1.\n\n[[DARK_AQUA]]\u7ecf\u9a8c\u6765\u6e90:\n[[YELLOW]]\u9493\u9c7c. -Guides.Fishing.Section.1=[[DARK_AQUA]]\u6dd8\u91d1\u8005\u5982\u4f55\u5de5\u4f5c?\n[[YELLOW]]\u8fd9\u4e2a\u80fd\u529b\u4f7f\u4f60\u5728\u9493\u9c7c\u65f6\u627e\u5230\u5b9d\u85cf \n[[YELLOW]]\u5e76\u4e14\u7269\u54c1\u6709\u5c0f\u51e0\u7387\u5e26\u6709\u9644\u9b54.\n[[YELLOW]]\u9493\u9c7c\u6280\u80fd\u7684\u6bcf\u4e00\u4e2a\u7ea7\u522b\u7684\u5b9d\u85cf\u90fd\u6709\u6982\u7387\u6389\u843d\n[[YELLOW]].\u5b9d\u85cf\u7684\u6982\u7387\u53d6\u51b3\u4e8e\u7a00\u6709\u5ea6\u7684\u6389\u843d\u51e0\u7387\n[[YELLOW]]\u4f60\u7684\u9493\u9c7c\u7b49\u7ea7\u8d8a\u9ad8,\u4f60\u8d8a\u6709\u53ef\u80fd\u627e\u5230\u66f4\u597d\u7684\u5b9d\u85cf.\n[[YELLOW]]\u83b7\u5f97\u5b9d\u85cf\u7684\u51e0\u7387\u4e5f\u8d8a\u9ad8. -Guides.Fishing.Section.2=[[DARK_AQUA]]\u51b0\u9493\u5982\u4f55\u5de5\u4f5c?\n[[YELLOW]]\u8fd9\u4e2a\u88ab\u52a8\u6280\u80fd\u53ef\u4ee5\u8ba9\u4f60\u5728\u51b0\u6e56\u4e2d\u9493\u9c7c!\n[[YELLOW]]\u5c06\u4f60\u7684\u9c7c\u7aff\u6254\u5728\u51b0\u6e56\u91cc\u8fd9\u4e2a\u80fd\u529b\u4f1a\u5728\u51b0\u4e0a\n[[YELLOW]]\u5f62\u6210\u4e00\u4e2a\u5c0f\u5b54\u4f9b\u4f60\u9493\u9c7c. -Guides.Fishing.Section.3=[[DARK_AQUA]]\u9493\u9c7c\u5927\u5e08\u5982\u4f55\u5de5\u4f5c?\n[[YELLOW]]\u8fd9\u4e2a\u88ab\u52a8\u589e\u52a0\u4e86\u9493\u9c7c\u65f6\u54ac\u94a9\u7684\u51e0\u7387.\n[[YELLOW]]\u5f53\u4f60\u89e3\u9501\u8fd9\u79cd\u80fd\u529b\u65f6\n[[YELLOW]]\u5728\u8239\u4e0a\u6216\u8005\u5728\u6d77\u6d0b\u751f\u7269\u7fa4\u7cfb\u9493\u9c7c\u65f6\u9493\u5230\u9c7c\u7684\u51e0\u7387\u589e\u52a0\u4e00\u500d. -Guides.Fishing.Section.4=[[DARK_AQUA]]\u6296\u52a8\u5982\u4f55\u5de5\u4f5c?\n[[YELLOW]]\u8fd9\u79cd\u4e3b\u52a8\u6280\u80fd\u53ef\u4ee5\u8ba9\u4f60\u7528\u9c7c\u7aff\u52fe\u4f4f\u751f\u7269\n[[YELLOW]]\u5e76\u4ece\u4ed6\u4eec\u8eab\u4e0a\u83b7\u53d6\u7269\u54c1. \n[[YELLOW]]\u751f\u7269\u4f1a\u6389\u843d\u4ed6\u4eec\u6b7b\u4ea1\u65f6\u6389\u843d\u7684\u7269\u54c1.\n[[YELLOW]]\u4e5f\u53ef\u80fd\u83b7\u5f97\u602a\u7269\u7684\u5934 \n[[YELLOW]]\u4e00\u822c\u60c5\u51b5\u4e0b\u8fd9\u4e9b\u5934\u65e0\u6cd5\u5728\u751f\u5b58\u6a21\u5f0f\u4e2d\u83b7\u5f97. -Guides.Fishing.Section.5=[[DARK_AQUA]]\u6e14\u592b\u7684\u98df\u8c31\u5982\u4f55\u5de5\u4f5c?\n[[YELLOW]]\u8fd9\u4e2a\u88ab\u52a8\u589e\u52a0\u4e86\u5403\u9c7c\u65f6\u6062\u590d\u7684\u9971\u98df\u5ea6. -Guides.Fishing.Section.6=[[DARK_AQUA]]\u5173\u4e8e\u9493\u9c7c\u7684\u8bf4\u660e:\n[[YELLOW]]\u9493\u9c7c\u7684\u6389\u843d\u7269\u662f\u53ef\u4ee5\u81ea\u5b9a\u4e49\u7684,\n[[YELLOW]]\u6240\u4ee5\u6389\u843d\u7269\u56e0\u670d\u52a1\u5668\u800c\u5f02. -##Herbalism -Guides.Herbalism.Section.0=[[DARK_AQUA]]\u5173\u4e8e\u8349\u836f\u5b66:\n[[YELLOW]]\u8349\u836f\u5b66\u662f\u5173\u4e8e\u91c7\u96c6\u8349\u836f\u4e0e\u690d\u7269\u7684\u6280\u80fd.\n\n[[DARK_AQUA]]\u7ecf\u9a8c\u62c9\u8fdc:\n[[YELLOW]]\u91c7\u96c6\u8349\u836f\u6216\u690d\u7269. -Guides.Herbalism.Section.1=[[DARK_AQUA]]\u53ef\u4f5c\u7528\u7684\u8349\u836f/\u690d\u7269\n[[YELLOW]]\u5c0f\u9ea6, \u9a6c\u94c3\u85af, \u80e1\u841d\u535c, \u897f\u74dc, \n[[YELLOW]]\u5357\u74dc, \u7518\u8517, \u53ef\u53ef\u8c46, \u82b1, \u4ed9\u4eba\u638c, \u8611\u83c7,\n[[YELLOW]]\u5730\u72f1\u75a3, \u83b2\u53f6, \u4e0e\u85e4\u8513. -Guides.Herbalism.Section.2=[[DARK_AQUA]]\u5927\u5730\u795d\u798f\u5982\u4f55\u5de5\u4f5c?\n[[YELLOW]]\u5927\u5730\u795d\u798f\u662f\u4e00\u4e2a\u4e3b\u52a8\u6280\u80fd, \u5f53\u4f60\u624b\u6301\u9504\u5934\u65f6\n[[YELLOW]]\u70b9\u51fb\u53f3\u952e\u53ef\u53d1\u52a8\u6280\u80fd. \u5927\u5730\u795d\u798f\u63d0\u9ad8\u4e09\u500d\u6536\u83b7\u7684\u673a\u7387. \n[[YELLOW]]\u540c\u65f6\u4e5f\u8ba9\u73a9\u5bb6\u6709\u80fd\u529b\u4f7f\u7528\u8eab\u4e0a\u7684\u79cd\u5b50\u6765\u8f6c\u5316\n[[YELLOW]]\u65b9\u5757\u5e76\u8d4b\u4e88\u751f\u547d. -Guides.Herbalism.Section.3=[[DARK_AQUA]]\u7eff\u62c7\u6307(\u4f5c\u7269)\u5982\u4f55\u5de5\u4f5c?\n[[YELLOW]]\u8fd9\u662f\u4e00\u4e2a\u88ab\u52a8\u6280\u80fd,\u8ba9\u4f5c\u7269\u5728\u91c7\u96c6\u65f6\n[[YELLOW]]\u81ea\u52a8\u79cd\u56de\u53bb.\n[[YELLOW]]\u6982\u7387\u53d6\u51b3\u4e8e\u4f60\u7684\u8349\u836f\u5b66\u6280\u80fd\u7b49\u7ea7. -Guides.Herbalism.Section.4=[[DARK_AQUA]]\u7eff\u624b\u6307(\u5706\u77f3/\u77f3\u7816/\u6ce5\u571f)\u5982\u4f55\u5de5\u4f5c?\n[[YELLOW]]\u8fd9\u662f\u4e00\u4e2a\u4e3b\u52a8\u6280\u80fd,\u8ba9\u4f60\u5728\u624b\u62ff\u7740\u79cd\u5b50\u65f6,\n[[YELLOW]]\u5bf9\u5706\u77f3\u77f3/\u77f3\u7816/\u6ce5\u571f,\u70b9\u51fb\u53f3\u952e,\u53ef\u4f7f\u5b83\u4eec\u53d8\u6210\n[[YELLOW]]\u82d4\u77f3\u8349\u65b9\u5757\u7b49,\u4f1a\u6d88\u8017\u4e00\u9897\u79cd\u5b50. -Guides.Herbalism.Section.5=[[DARK_AQUA]]\u519c\u592b\u98df\u8c31\u5982\u4f55\u5de5\u4f5c?\n[[YELLOW]]\u8fd9\u662f\u4e00\u4e2a\u88ab\u52a8\u6280\u80fd, \u53ef\u589e\u52a0\u4e0b\u5217\u98df\u7269\u7684\u9971\u98df\u5ea6\u6062\u590d -\n[[YELLOW]]\u9762\u5305, \u66f2\u5947, \u897f\u74dc, \u8611\u83c7\u6c64, \u80e1\u841d\u535c, \u9a6c\u94c3\u85af. -Guides.Herbalism.Section.6=[[DARK_AQUA]]\u6d77\u62c9\u5c14\u7684\u795d\u798f\u5982\u4f55\u5de5\u4f5c?\n[[YELLOW]]\u8fd9\u662f\u4e00\u4e2a\u4e3b\u52a8\u6280\u80fd,\u6709\u673a\u7387\u5728\u7528\u5251\u7834\u574f\u7279\u5b9a\n[[YELLOW]]\u65b9\u5757\u65f6\u83b7\u5f97\u7a00\u6709\u9053\u5177. -Guides.Herbalism.Section.7=[[DARK_AQUA]]\u53cc\u500d\u6389\u843d\u5982\u4f55\u5de5\u4f5c?\n[[YELLOW]]\u8fd9\u662f\u4e00\u4e2a\u88ab\u52a8\u6280\u80fd\u4f7f\u73a9\u5bb6\u80fd\u52a0\u500d\u6536\u83b7. -##\u6316\u77ff -Guides.Mining.Section.0=[[DARK_AQUA]]\u5173\u4e8e\u6316\u77ff:\n[[YELLOW]]\u6316\u77ff\u5305\u62ec\u6316\u6398\u77f3\u5934\u548c\u77ff\u7269. \n[[YELLOW]]\u6316\u77ff\u6280\u80fd\u53ef\u4ee5\u63d0\u4f9b\u591a\u91cd\u77ff\u7269\u6389\u843d\u7684\u5956\u52b1.\n\n[[DARK_AQUA]]\u7ecf\u9a8c\u6765\u6e90:\n[[YELLOW]]\u83b7\u53d6\u6b64\u6280\u80fd\u7684\u7ecf\u9a8c\u503c, \u4f60\u5fc5\u987b\u62ff\u7740\u77ff\u9550\u8fdb\u884c\u6316\u6398.\n[[YELLOW]]\u53ea\u6709\u7279\u5b9a\u65b9\u5757\u624d\u80fd\u83b7\u53d6\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 -##\u4fee\u7406 -Guides.Repair.Section.0=[[DARK_AQUA]]\u5173\u4e8e\u4fee\u7406:\n[[YELLOW]]\u4fee\u7406\u53ef\u4ee5\u8ba9\u4f60\u4f7f\u7528\u94c1\u5757\u6765\u4fee\u7406\u76d4\u7532\u548c\u5de5\u5177.\n\n[[DARK_AQUA]]\u7ecf\u9a8c\u6765\u6e90:\n[[YELLOW]]\u4f7f\u7528mcmmo\u7684\u94c1\u7827\u4fee\u7406\u5de5\u5177\u6216\u88c5\u5907. \n[[YELLOW]]mcmmo\u9ed8\u8ba4\u7684\u4fee\u7406\u53f0\u662f\u94c1\u5757\n[[YELLOW]]\u4e0d\u8981\u4e0e\u7528\u7ecf\u9a8c\u4fee\u590d\u7684\u94c1\u7827\u6df7\u6dc6. -Guides.Repair.Section.1=[[DARK_AQUA]]\u5982\u4f55\u4f7f\u7528\u4fee\u7406?\n[[YELLOW]]\u653e\u5047\u4e00\u4e2amcmmo\u94c1\u7827(\u94c1\u5757),\u624b\u6301\u9700\u8981\u4fee\u7406\u7684\u9053\u5177 \n[[YELLOW]]\uff0c\u53f3\u952e\u70b9\u51fb\u94c1\u5757\uff0c\u6bcf\u6b21\u4f7f\u7528\u6d88\u8017\u4e00\u4e2a\u7269\u54c1 -Guides.Repair.Section.2=[[DARK_AQUA]]\u4fee\u7406\u7cbe\u901a\u5982\u4f55\u5de5\u4f5c?\n[[YELLOW]]\u4fee\u7406\u7cbe\u901a\u63d0\u5347\u4fee\u7406\u65f6\u8010\u4e45\u6062\u590d\u91cf. \n[[YELLOW]]\u989d\u5916\u4fee\u7406\u7684\u8010\u4e45\u503c\u91cf\u53d6\u51b3\u4e8e\u4f60\u7684\u4fee\u7406\u6280\u80fd\u7b49\u7ea7. -Guides.Repair.Section.3=[[DARK_AQUA]]\u8d85\u7ea7\u4fee\u7406\u5982\u4f55\u5de5\u4f5c?\n[[YELLOW]]\u8d85\u7ea7\u4fee\u7406\u662f\u4e00\u4e2a\u88ab\u52a8\u6280\u80fd. \u5f53\u4fee\u7406\u4e00\u4e2a\u7269\u54c1\u65f6,\n[[YELLOW]]\u4f1a\u4f7f\u7269\u54c1\u7684\u4fee\u7406\u6548\u679c\u7ffb\u500d. -Guides.Repair.Section.4=[[DARK_AQUA]]\u79d8\u6cd5\u953b\u9020\u5982\u4f55\u5de5\u4f5c?\n[[YELLOW]]\u8fd9\u662f\u4e00\u4e2a\u88ab\u52a8\u6280\u80fd\uff0c\u5141\u8bb8\u4f60\u4fee\u590d\u9644\u9b54\u7269\u54c1\n[[YELLOW]]\u4fee\u7406\u7269\u54c1\u65f6\u6709\u4e00\u5b9a\u51e0\u7387\u4fdd\u7559\u9644\u9b54\u5c5e\u6027\n[[YELLOW]]\u9644\u9b54\u5c5e\u6027\u53ef\u4ee5\u4fdd\u6301\u73b0\u6709\u7684\u7b49\u7ea7\uff0c\n[[YELLOW]]\u964d\u7ea7\u5230\u4e00\u4e2a\u8f83\u4f4e\u7b49\u7ea7\u6216\u8005\u5b8c\u5168\u6d88\u5931. -##Salvage -Guides.Salvage.Section.0=[[DARK_AQUA]]\u5173\u4e8e\u5206\u89e3:\n[[YELLOW]]\u5206\u89e3\u4f7f\u4f60\u53ef\u4ee5\u4f7f\u7528\u91d1\u5757\u6765\u5206\u89e3\u88c5\u5907\u548c\u5de5\u5177.\n\n[[DARK_AQUA]]\u7ecf\u9a8c\u6765\u6e90:\n[[YELLOW]]\u5206\u89e3\u65f6\u4fee\u7406\u548c\u9493\u9c7c\u7684\u5b50\u6280\u80fd\uff0c\n[[YELLOW]]\u6280\u80fd\u7b49\u7ea7\u53d6\u51b3\u4e8e\u4f60\u7684\u9493\u9c7c\u548c\u4fee\u7406\u7684\u7b49\u7ea7. -Guides.Salvage.Section.1=[[DARK_AQUA]]\u5982\u4f55\u4f7f\u7528\u5206\u89e3?\n[[YELLOW]]\u653e\u4e00\u4e2amcmmo\u5206\u89e3\u7827(\u91d1\u5757)\u62ff\u7740\u7269\u54c1\u53f3\u952e\u91d1\u5757.\n[[YELLOW]]\u8fd9\u5c06\u62c6\u89e3\u7269\u54c1,\u5e76\u8fd4\u8fd8\u7269\u54c1\u7684\u5236\u4f5c\u539f\u6599\n[[YELLOW]]\u4f8b\u5982:\u62c6\u89e3\u94c1\u9550\u4f60\u5c06\u83b7\u5f97\u94c1\u952d. -Guides.Salvage.Section.2=[[DARK_AQUA]]\u5982\u4f55\u4f7f\u7528\u8fdb\u9636\u5206\u89e3?\n[[YELLOW]]\u89e3\u9501\u540e,\u6b64\u529f\u80fd\u4f7f\u4f60\u53ef\u4ee5\u5206\u89e3\u635f\u574f\u7684\u7269\u54c1.\n[[YELLOW]]\u968f\u7740\u7b49\u7ea7\u7684\u63d0\u5347\u5206\u89e3\u6240\u5f97\u7684\u7269\u54c1\u4f1a\u83b7\u5f97\u66f4\u591a\u7684\u6750\u6599\n[[YELLOW]]\u901a\u8fc7\u8fdb\u9636\u5206\u89e3\u4f60\u59cb\u7ec8\u80fd\u83b7\u5f97\u4e00\u4e2a\u6750\u6599.\n[[YELLOW]]\u4e0d\u7528\u62c5\u5fc3\u4e0d\u4f1a\u83b7\u5f97\u6750\u6599\uff0c\u9664\u975e\u4f60\u7684\u8010\u4e45\u503c\u592a\u4f4e. -Guides.Salvage.Section.3=[[DARK_AQUA]]\u4e3a\u4e86\u8bf4\u660e\u8fd9\u662f\u5982\u4f55\u5de5\u4f5c\u7684, \u8fd9\u6709\u4e00\u4e2a\u4f8b\u5b50:\n[[YELLOW]]\u5047\u8bbe\u6211\u4eec\u5206\u89e3\u4e86\u4e00\u4e2a\u635f\u574f\u4e8620%\u7684\u91d1\u9550,\n[[YELLOW]]\u4ea6\u4e3a\u4e4b\u4f60\u6700\u591a\u83b7\u5f97\u4e24\u4e2a\u91d1\u952d\n[[YELLOW]](\u56e0\u4e3a\u91d1\u9550\u4f7f\u7528\u4e09\u4e2a\u91d1\u952d\u5236\u4f5c\u7684\uff0c\n[[YELLOW]]33,33% \u7684\u635f\u8017) \u7b49\u4e8e 66% \u7684\u8010\u4e45\u503c. \n[[YELLOW]]\u5982\u679c\u4f60\u7684\u8010\u4e45\u503c\u5730\u72f166%\u5219\u65e0\u6cd5\u83b7\u5f97\u4e24\u4e2a\u539f\u6599.\u9ad8\u4e8e\u6b64\u503c\u83b7\u5f97\u4e24\u4e2a. -Guides.Salvage.Section.4=[[DARK_AQUA]]\u5982\u4f55\u4f7f\u7528\u5965\u672f\u5206\u89e3?\n[[YELLOW]]\u8fd9\u4e2a\u6280\u80fd\u53ef\u4ee5\u4f7f\u4f60\u5728\u5206\u89e3\u9644\u9b54\u7269\u54c1\u65f6\u83b7\u5f97\u9644\u9b54\u4e66\n[[YELLOW]]\u6839\u636e\u4f60\u7684\u5206\u89e3\u7b49\u7ea7\uff0c\u5206\u4e3a\u5168\u90e8\u63d0\u53d6\u548c\u90e8\u5206\u63d0\u53d6\n[[YELLOW]]\u5f53\u5206\u89e3\u4f4d\u90e8\u5206\u63d0\u53d6\u65f6.\n\n[[YELLOW]]\u9644\u9b54\u4e66\u7684\u9644\u9b54\u4e0e\u7269\u54c1\u76f8\u6bd4\n[[YELLOW]]\u9644\u9b54\u7b49\u7ea7\u504f\u4f4e. -##Smelting -Guides.Smelting.Section.0=\u9a6c\u4e0a\u5230\u6765... -##\u5251\u672f -Guides.Swords.Section.0=[[DARK_AQUA]]\u5173\u4e8e\u5251\u672f:\n[[YELLOW]]\u8fd9\u4e2a\u6280\u80fd\u5728\u4f7f\u7528\u5251\u8fdb\u884c\u6218\u6597\u65f6\n[[YELLOW]]\u63d0\u4f9b\u5404\u79cd\u52a0\u6210.\n\n[[DARK_AQUA]]\u7ecf\u9a8c\u6765\u6e90:\n[[YELLOW]]\u7ecf\u9a8c\u503c\u662f\u901a\u8fc7\u7528\u5251\u5bf9\u602a\u7269\u6216\u5176\u4ed6\u73a9\u5bb6 \n[[YELLOW]]\u9020\u6210\u4f24\u5bb3\u83b7\u5f97. -Guides.Swords.Section.1=[[DARK_AQUA]]\u5982\u4f55\u4f7f\u7528\u5229\u5203\u7a81\u523a?\n[[YELLOW]]\u5229\u5203\u7a81\u523a\u662f\u4e00\u4e2a\u4e3b\u52a8\u6280\u80fd,\u5c06\u5251\u62ff\u5728\u624b\u4e2d\u5e76\u6309\u4e0b\u53f3\u952e\u6fc0\u6d3b\n[[YELLOW]]\u8fd9\u4e2a\u6280\u80fd\u8ba9\u4f60\u53d1\u52a8\u8303\u56f4\u653b\u51fb\uff0c\u63d0\u4f9b25%\u7684\u4f24\u5bb3\u52a0\u6210 \n[[YELLOW]]\u5e76\u4f34\u6709\u6495\u88c2\u6548\u679c. -Guides.Swords.Section.2=[[DARK_AQUA]]\u53cd\u51fb\u5982\u4f55\u5de5\u4f5c?\n[[YELLOW]]\u53cd\u51fb\u662f\u4e00\u4e2a\u4e3b\u52a8\u6280\u80fd\uff0c\u683c\u6321\u5bf9\u624b\u5bf9\u4f60\u7684\u4f24\u5bb3\n[[YELLOW]]\u5e76\u6709\u51e0\u7387\u53cd\u5c0450%\u7684\u4f24\u5bb3\u7ed9\u5bf9\u624b. -Guides.Swords.Section.3=[[DARK_AQUA]]\u6495\u88c2\u5982\u4f55\u5de5\u4f5c?\n[[YELLOW]]\u6495\u88c2\u662f\u4e00\u4e2a\u88ab\u52a8\u6280\u80fd\uff0c\u653b\u51fb\u65f6\u6709\u51e0\u7387\u51fa\u53d1\u6495\u88c2. \n[[YELLOW]]\u6495\u88c2\u4f1a\u5bf9\u5bf9\u5c11\u9020\u6210\u6301\u7eed\u7684\u6d41\u8840\u4f24\u5bb3,\u76f4\u5230\u7ed3\u675f\u6216\u5bf9\u624b\u6b7b\u4ea1, \n[[YELLOW]]\u6301\u7eed\u65f6\u95f4\u53d6\u51b3\u4e8e\u4f60\u7684\u5251\u672f\u7b49\u7ea7. -##Taming -Guides.Taming.Section.0=[[DARK_AQUA]]\u9a6f\u517d\n[[YELLOW]]\u9a6f\u517d\u6280\u80fd\u8ba9\u73a9\u5bb6\u80fd\u5728\u7528\u72fc\u6218\u6597\u65f6\n[[YELLOW]]\u65f6\u6709\u52a0\u6210\u6548\u679c.\n\n[[DARK_AQUA]]\u7ecf\u9a8c\u6765\u6e90:\n[[YELLOW]]\u8981\u83b7\u53d6\u7ecf\u9a8c,\u987b\u8bad\u670d\u72fc\u6216\u8c79\u732b,\n[[YELLOW]]\u6216\u4e0e\u4f60\u7684\u72fc\u4e00\u540c\u6218\u6597. -Guides.Taming.Section.1=[[DARK_AQUA]]\u4ec0\u4e48\u662f\u91ce\u6027\u547c\u558a?\n[[YELLOW]]\u91ce\u6027\u547c\u558a\u662f\u4e00\u4e2a\u4e3b\u52a8\u6280\u80fd\u8ba9\u4f60\n[[YELLOW]]\u53ef\u4ee5\u53ec\u5524\u4e00\u53ea\u72fc\u6216\u8c79\u732b,\n[[YELLOW]]\u53ea\u8981\u624b\u6301\u9aa8\u5934\u6216\u751f\u9c7c,\u70b9\u5de6\u952e. -Guides.Taming.Section.2=[[DARK_AQUA]]\u4ec0\u4e48\u662f\u91ce\u517d\u4fe1\u606f?\n[[YELLOW]]\u91ce\u517d\u4fe1\u606f\u80fd\u8ba9\u4f60\u67e5\u770b\u5ba0\u7269\u7684\u72b6\u6001,\n[[YELLOW]]\u5bf9\u5ba0\u7269\u70b9\u51fb\u5de6\u952e\u5c31\u80fd\u4f7f\u7528\u8fd9\u9879\u80fd\u529b. -Guides.Taming.Section.3=[[DARK_AQUA]]\u4ec0\u4e48\u662f\u55dc\u8840?\n[[YELLOW]]\u8840\u8165\u653b\u51fb\u662f\u4e00\u4e2a\u4e3b\u52a8\u6280\u80fd,\u80fd\u9020\u6210\n[[YELLOW]]\u72fc\u7684\u653b\u51fb\u76ee\u6807\u6709\u673a\u7387\u9677\u5165\u6d41\u8840\u72b6\u6001. -Guides.Taming.Section.4=[[DARK_AQUA]]\u4ec0\u4e48\u662f\u5229\u722a?\n[[YELLOW]]\u5229\u722a\u4f7f\u72fc\u7684\u653b\u51fb\u529b\u968f\u7740\u9a6f\u517d\u7b49\u7ea7\n[[YELLOW]]\u589e\u52a0\u800c\u589e\u52a0. -Guides.Taming.Section.5=[[DARK_AQUA]]\u4ec0\u4e48\u662f\u73af\u5883\u611f\u77e5?\n[[YELLOW]]\u8fd9\u4e2a\u88ab\u52a8\u6280\u80fd\u80fd\u8ba9\u72fc\u5728\u9047\u5230\u5371\u9669\u65f6\n[[YELLOW]]\u8fc5\u901f\u56de\u5230\u4f60\u8eab\u8fb9(\u5982\u4ed9\u4eba\u638c\u6216\u5ca9\u6d46),\n[[YELLOW]]\u4e5f\u53ef\u4ee5\u51cf\u514d\u6454\u843d\u4f24\u5bb3. -Guides.Taming.Section.6=[[DARK_AQUA]]\u4ec0\u4e48\u662f\u6bdb\u76ae\u5f3a\u5316?\n[[YELLOW]]\u8fd9\u662f\u4e00\u4e2a\u88ab\u52a8\u6280\u80fd\u80fd\u8ba9\u72fc\n[[YELLOW]]\u53d7\u5230\u653b\u51fb\u6216\u71c3\u70e7\u65f6\u51cf\u514d\u4f24\u5bb3. -Guides.Taming.Section.7=[[DARK_AQUA]]\u4ec0\u4e48\u662f\u51b2\u51fb\u6297\u6027?\n[[YELLOW]]\u8fd9\u662f\u4e00\u4e2a\u88ab\u52a8\u6280\u80fd,\u8ba9\u72fc\u7fa4\n[[YELLOW]]\u51cf\u514d\u7206\u70b8\u4f24\u5bb3. -Guides.Taming.Section.8=[[DARK_AQUA]]\u4ec0\u4e48\u662f\u5feb\u9910\u670d\u52a1?\n[[YELLOW]]\u8fd9\u662f\u4e00\u4e2a\u88ab\u52a8\u6280\u80fd,\u8ba9\u72fc\u7fa4\u5728\u653b\u51fb\u65f6\n[[YELLOW]]\u6709\u51e0\u7387\u6062\u590d\u8840\u91cf. -##Unarmed -Guides.Unarmed.Section.0=[[DARK_AQUA]]\u683c\u6597:\n[[YELLOW]]\u683c\u6597\u4f7f\u73a9\u5bb6\u5728\u4f7f\u7528\u62f3\u5934\u4f5c\u6218\u65f6\u6709\n[[YELLOW]]\u5404\u79cd\u52a0\u6210\u6548\u679c.\n\n[[DARK_AQUA]]\u7ecf\u9a8c\u83b7\u53d6:\n[[YELLOW]]\u5728\u7528\u624b\u653b\u51fb\u602a\u7269\u6216\u73a9\u5bb6\u65f6\u53ef\u4ee5\u83b7\u53d6\u7ecf\u9a8c. -Guides.Unarmed.Section.1=[[DARK_AQUA]]\u4ec0\u4e48\u662f\u72c2\u66b4?\n[[YELLOW]]\u72c2\u66b4\u662f\u4e3b\u52a8\u6280\u80fd,\u7a7a\u624b\u65f6\u70b9\u51fb\u53f3\u952e\u53d1\u52a8.\n[[YELLOW]]\u72c2\u66b4\u53ef\u4ee5\u52a0\u621050%\u5bf9\u65b9\u5757\u7684\u4f24\u5bb3,\n[[YELLOW]]\u4f7f\u4f60\u53ef\u4ee5\u8f7b\u677e\u7834\u574f\u8106\u5f31\u7269\u4f53,\n[[YELLOW]]\u5982\u6ce5\u571f\u4e0e\u6c99\u5b50. -Guides.Unarmed.Section.2=[[DARK_AQUA]]\u4ec0\u4e48\u662f\u94c1\u81c2\u5f0f?\n[[YELLOW]]\u94c1\u81c2\u80fd\u589e\u52a0\u5f92\u624b\u653b\u51fb\u602a\u7269\u6216\n[[YELLOW]]\u73a9\u5bb6\u7684\u4f24\u5bb3. -Guides.Unarmed.Section.3=[[DARK_AQUA]]\u4ec0\u4e48\u662f\u7bad\u77e2\u504f\u5411?\n[[YELLOW]]\u7bad\u77e2\u504f\u5411\u662f\u4e00\u4e2a\u88ab\u52a8\u6280\u80fd,\u8ba9\u4f60\u6709\u673a\u7387\n[[YELLOW]]\u80fd\u6539\u53d8\u9ab7\u9ac5\u83b7\u73a9\u5bb6\u5c04\u5411\u4f60\u7684\u7bad\u7684\u65b9\u5411.\n[[YELLOW]]\u7bad\u4f1a\u843d\u81f3\u5730\u9762. -Guides.Unarmed.Section.4=[[DARK_AQUA]]\u4ec0\u4e48\u662f\u94c1\u8155?\n[[YELLOW]]\u94c1\u8155\u6709\u51e0\u7387\u9632\u6b62\u5bf9\u624b\u7684\u7f34\u68b0.\n[[YELLOW]]\u51fa\u53d1\u7684\u51e0\u7387\u5374\u51b3\u4e8e\u4f60\u683c\u6597\u7684\u7b49\u7ea7. -Guides.Unarmed.Section.5=[[DARK_AQUA]]\u4ec0\u4e48\u662f\u7f34\u68b0?\n[[YELLOW]]\u8fd9\u4e2a\u88ab\u52a8\u6280\u80fd\u8ba9\u73a9\u5bb6\u89e3\u9664\u5176\u4ed6\u73a9\u5bb6\u7684\u6b66\u88c5,\n[[YELLOW]]\u4f7f\u76ee\u6807\u6240\u88c5\u5907\u7684\u7269\u54c1\u6389\u843d\u5230\u5730\u4e0a. -##Woodcutting -Guides.Woodcutting.Section.0=[[DARK_AQUA]]\u5173\u4e8e\u4f10\u6728:\n[[YELLOW]]\u4f10\u6728\u662f\u5173\u4e8e\u780d\u6811\u7684.\n\n[[DARK_AQUA]]\u7ecf\u9a8c\u6765\u6e90:\n[[YELLOW]]\u7834\u574f\u6728\u5934\u7c7b\u7684\u65b9\u5757\u5c31\u4f1a\u83b7\u5f97\u4f10\u6728\u7ecf\u9a8c. -Guides.Woodcutting.Section.1=[[DARK_AQUA]]\u4f10\u6728\u5de5\u5982\u4f55\u5de5\u4f5c?\n[[YELLOW]]\u4f10\u6728\u5de5\u662f\u4e00\u4e2a\u4e3b\u52a8\u6280\u80fd\n[[YELLOW]]\u5728\u624b\u6301\u65a7\u5934\u7684\u540c\u65f6\u53f3\u952e\u5e76\u7834\u574f\u6728\u5934\u4ee5\u6fc0\u6d3b\u4f10\u6728\u5de5\n[[YELLOW]]\u8fd9\u5c06\u77ac\u95f4\u7834\u574f\u6574\u68f5\u6811. -Guides.Woodcutting.Section.2=[[DARK_AQUA]]\u79cb\u98ce\u626b\u843d\u53f6\u5982\u4f55\u5de5\u4f5c?\n[[YELLOW]]\u79cb\u98ce\u626b\u843d\u53f6\u662f\u4e00\u4e2a\u88ab\u52a8\u6280\u80fd\n[[YELLOW]]\u5f53\u65a7\u5934\u51fb\u4e2d\u6811\u53f6\u65b9\u5757\u65f6\u4f1a\u5bfc\u81f4\u77ac\u95f4\u6d88\u5931\n[[YELLOW]]\u9ed8\u8ba4\u60c5\u51b5\u4e0b\uff0c100\u7ea7\u89e3\u9501. -Guides.Woodcutting.Section.3=[[DARK_AQUA]]\u6811\u6728\u4e30\u6536\u5982\u4f55\u5de5\u4f5c?\n[[YELLOW]]\u8fd9\u4e2a\u88ab\u52a8\u6280\u80fd\u4f7f\u4f60\u5728\u780d\u6811\u65f6\n[[YELLOW]]\u6709\u51e0\u7387\u6389\u843d\u53cc\u500d\u6728\u5934. -#INSPECT -Inspect.Offline= [[RED]]\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=[[YELLOW]]{0} \u7684mcMMO\u7edf\u8ba1\u4fe1\u606f -Inspect.TooFar=\u4f60\u65e0\u6cd5\u68c0\u67e5\u90a3\u4e2a\u73a9\u5bb6\u56e0\u4e3a\u4f60\u4eec\u8ddd\u79bb\u592a\u8fdc\u4e86! -#ITEMS -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.ChimaeraWing.NotEnough=\u4f60\u9700\u8981 [[YELLOW]]{0}[[RED]] \u66f4\u591a [[GOLD]]{1}[[RED]]! -Item.NotEnough=\u4f60\u9700\u8981 [[YELLOW]]{0}[[RED]] \u66f4\u591a [[GOLD]]{1}[[RED]]! -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}+ -#TELEPORTATION -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 -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 [[GRAY]]{0} -Skills.NeedMore.Extra=[[DARK_RED]]\u4f60\u9700\u8981\u66f4\u591a [[GRAY]]{0}{1} -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.MaxXP=\u6700\u5927 -Skills.TooTired=\u4f60\u592a\u7d2f\u4e86\u6682\u65f6\u65e0\u6cd5\u4f7f\u7528\u8be5\u6280\u80fd.[[YELLOW]]({0}s) -Skills.Cancelled=[[GOLD]]{0} [[RED]]\u5df2\u53d6\u6d88! -Skills.ConfirmOrCancel=[[GREEN]]\u518d\u6b21\u53f3\u952e\u4ee5\u786e\u5b9a [[GOLD]]{0}[[GREEN]]. \u5de6\u952e\u53d6\u6d88. -Skills.AbilityGateRequirementFail=[[GRAY]]\u4f60\u9700\u8981 [[YELLOW]]{0}[[GRAY]] \u7ea7\u4ee5\u4e0a\u7684 [[DARK_AQUA]]{1}[[GRAY]] \u6765\u4f7f\u7528\u8fd9\u4e2a\u80fd\u529b. -#STATISTICS -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 -Perks.XP.Name=\u7ecf\u9a8c -Perks.XP.Desc=\u83b7\u5f97 {0} \u500d\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 -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}. +#指南 +Guides.Available=&7{0} 的向导 - 输入 /{1} ? [页数] +Guides.Header=&6-=&a{0} 向导&6=- +Guides.Page.Invalid=不是一个有效的页数! +Guides.Page.OutOfRange=那页不存在, 总共只有 {0} 页 +Guides.Usage= 用法 /{0} ? [页数] +##杂技 +Guides.Acrobatics.Section.0=&3关于杂技:\n&e杂技是 mcMMO 中优雅移动的艺术。\n&e它提供了战斗加成和环境伤害加成。\n\n&3经验获取:\n&e通过在战斗中闪避或者从高处\n&e跌落时受伤并幸存来获得经验。 +Guides.Acrobatics.Section.1=&3翻滚是如何工作的?\n&e当您受到跌落伤害时您有被动机会来免受伤害。\n&e您可以在跌落中按住潜行键来提升触发几率。\n&e这将触发一个优雅地翻滚而不是普通的翻滚。\n&e优雅地翻滚类似普通的翻滚但是它有双倍几率\n&e发生,并且能够提供比普通地翻滚更高的伤害减免。\n&e翻滚几率取决于您的技能等级 +Guides.Acrobatics.Section.2=&3闪避是如何工作的?\n&e闪避是一个被动技能\n&e他在你被攻击时有一定几率被激发\n&e这个几率和你的技能等级有关 +##炼金 +Guides.Alchemy.Section.0=&3关于炼金:\n&e炼金是药水酿造的技能。\n&e它提升了药水酿造时的速度,并且加入了\n&e新的(相对之前)无法获取的药水。\n\n\n&3经验获取:\n&e通过酿造药水来获取经验。 +Guides.Alchemy.Section.1=&3催化是如何工作的?\n&e催化提升酿造的速度,在 1000 级\n&e时能达到最高 4 倍。\n&e此能力默认在 100 级解锁。 +Guides.Alchemy.Section.2=&3混合是如何工作的?\n&e混合允许使用自定义原料酿造更多药水。\n&e特殊原料根据您的等级来解锁。\n&e总共有 8 个等级需要解锁。 +Guides.Alchemy.Section.3=&3混合第 1 阶原料:\n&e烈焰粉, 发酵蛛眼, 恶魂之泪, 红石,\n&e萤石粉, 糖, 闪烁的西瓜, 金胡萝卜,\n&e岩浆膏, 地狱疣, 蜘蛛眼, 火药, 睡莲,\n&e河豚\n&e(纯净药水) +Guides.Alchemy.Section.4=&3混合第 2 阶原料:\n&e胡萝卜 (急迫药水)\n&e粘液球 (迟钝药水)\n\n&3混合第 3 阶原料:\n&e下界石英 (伤害吸收药水)\n&e红色蘑菇 (跳跃药水) +Guides.Alchemy.Section.5=&3混合第 4 阶原料:\n&e苹果 (生命加成药水)\n&e腐肉 (饥饿药水)\n\n&3混合第 5 阶原料:\n&e褐色蘑菇 (反胃药水)\n&e墨囊 (失明药水) +Guides.Alchemy.Section.6=&3混合第 6 阶原料:\n&e蕨类 (饱和药水)\n\n&3混合第 7 阶原料:\n&e毒马铃薯 (Potion of Decay)\n\n[[腐烂药水]]混合第 8 阶原料:\n&e普通金苹果 (抗性提升药水) + +##格斗 +Guides.Archery.Section.0=&3关于箭术:\n&e箭术是用弓射箭.\n&e为你提供各种战斗加成, \n&e例如随着你的等级提升伤害,提升将对手击晕的能力\n&e除此之外你还能从对手的身上回收箭矢.\n\n\n&3经验来源:\n&e要获取此仅能的经验\n&e你需要射击怪物或其他玩家. +Guides.Archery.Section.1=&3技巧射击如何工作?\n&e技巧射击会使你的射箭攻击获得伤害加成.\n&e技巧射击提供的伤害加成会随着\n&e箭术等级的提升而增加.\n&e使用默认设置你的箭术每五十级提高10%的伤害加成\n&e最高提供200%的伤害加成. +Guides.Archery.Section.2=&3击晕如何工作?\n&e当你射击玩家时,这个被动有几率使其他玩家获得眩晕.\n&e当击晕触发时他会时\n&e对手直视前方一定时间.\n&e并提供4点的额外伤害(2 心). +Guides.Archery.Section.3=&3箭矢回收如何工作?\n&e当你用弓箭击杀怪物时\n&e有几率回收箭矢.\n&e这个几率随着你箭术等级的提升而增加.\n&e默认情况下这个能力每级增加0.1%,\n&e1000级增加100%. +##斧技 +Guides.Axes.Section.0=&3关于 斧技:\n&e有了斧头技能,斧子不再只是砍树而已.\n&e你还可以砍其他生物和玩家来赚取经验.\n&e打击生物时附加击退效果.\n&e还会对生物和玩家造成致命伤害.\n&e你的斧子会像伐木机一样.\n&e轻松削掉敌人的护甲.\n&e效果随着技能等级提高.\n&3经验的获取:\n&e手持斧子攻击其他生物或玩家. +Guides.Axes.Section.1=&3什么是斩首者?\n&e这个技能会造成范围打击伤害\n&e伤害等于对主要攻击目标造成伤害的50%\n&e所以很容易清理掉一大片怪物 +Guides.Axes.Section.2=&3什么是致命一击?\n&e这是一个被动技能\n&e一定几率对目标造成额外伤害\n&e默认每2级增加 0.1%\n&e对生物造成2倍伤害\n&e对玩家造成1.5倍伤害 +Guides.Axes.Section.3=&3什么是斧精通?\n&e这是一个被动技能\n&e使用斧子攻击时附加额外伤害\n&e默认每50级额外提高1点伤害\n&e4点额外伤害封顶 +Guides.Axes.Section.4=&3什么是破甲?\n&e用足够的力量击碎护甲!\n&e破甲是一个被动的能力,它有几率会损耗\n&e对手护甲的耐久值. 这个伤害会随着你斧技技能等级提升. +Guides.Axes.Section.5=&3什么是强力冲击?\n&e这是一个被动技能\n&e使用斧子攻击时一定几率给敌人带来巨大的冲击力\n&e默认几率为 25%\n&e效果相当于 击退 II 的附魔效果\n&e此外还会对目标造成额外伤害 +##挖掘 +Guides.Excavation.Section.0=&3关于挖掘:\n&e挖掘是以挖掘泥土以寻找宝藏的行为.\n&e通过挖掘,你将会找到隐藏的宝藏.\n&e你挖的越多你找到的宝藏也就越多.\n\n&3经验来源:\n&e要获得该技能的经验你必须手持铲子挖掘.\n&e只有特定的方块才能获得经验,挖掘到宝藏. +Guides.Excavation.Section.1=&3可以挖掘的方块:\n&e草方块, 泥土, 沙子, 粘土, 砂砾, 菌丝, 灵魂沙, 雪 +Guides.Excavation.Section.2=&3如何使用暴走钻头:\n&e手拿铲子右键单击以进入准备状态.\n&e一旦进入这种状态,你约有4秒的时间让工具\n&e点击与挖掘机能兼容的方块\n&e这样就会激活暴走钻头技能. +Guides.Excavation.Section.3=&3什么是暴走钻头?\n&e暴走钻头是一种与挖掘技能相关且有时间限制的能力\n&e它使你找到宝藏的几率增加三倍\n&e并且能瞬间打破兼容的方块. +Guides.Excavation.Section.4=&3考古学是怎样工作的?\n&e挖掘出来的每一个宝藏的掉落物都有自己的技能等级要求\n&e因此很难说它对你的帮助有多大\n&e请记住,挖掘机能等级越高挖到的宝藏就越多.\n&e还要记得每种兼容挖掘的方块都有自己独特的宝藏清单\n&e换句话说,你在泥土中找到的宝藏.\n&e在砂砾中不一定能找到. +Guides.Excavation.Section.5=&3关于挖掘注意事项:\n&e挖掘掉落物是完全可定制的\n&e因此挖出的结果因服务器而异. +##钓鱼 +Guides.Fishing.Section.0=&3关于钓鱼:\n&e关于钓鱼技能, 钓鱼再次使人振奋!\n&e找到隐藏的宝藏从怪物身上抖落物品.\n\n&3经验来源:\n&e钓鱼. +Guides.Fishing.Section.1=&3淘金者如何工作?\n&e这个能力使你在钓鱼时找到宝藏 \n&e并且物品有小几率带有附魔.\n&e钓鱼技能的每一个级别的宝藏都有概率掉落\n&e.宝藏的概率取决于稀有度的掉落几率\n&e你的钓鱼等级越高,你越有可能找到更好的宝藏.\n&e获得宝藏的几率也越高. +Guides.Fishing.Section.2=&3冰钓如何工作?\n&e这个被动技能可以让你在冰湖中钓鱼!\n&e将你的鱼竿扔在冰湖里这个能力会在冰上\n&e形成一个小孔供你钓鱼. +Guides.Fishing.Section.3=&3钓鱼大师如何工作?\n&e这个被动增加了钓鱼时咬钩的几率.\n&e当你解锁这种能力时\n&e在船上或者在海洋生物群系钓鱼时钓到鱼的几率增加一倍. +Guides.Fishing.Section.4=&3抖动如何工作?\n&e这种主动技能可以让你用鱼竿勾住生物\n&e并从他们身上获取物品. \n&e生物会掉落他们死亡时掉落的物品.\n&e也可能获得怪物的头 \n&e一般情况下这些头无法在生存模式中获得. +Guides.Fishing.Section.5=&3渔夫的食谱如何工作?\n&e这个被动增加了吃鱼时恢复的饱食度. +Guides.Fishing.Section.6=&3关于钓鱼的说明:\n&e钓鱼的掉落物是可以自定义的,\n&e所以掉落物因服务器而异. +##草药学 +Guides.Herbalism.Section.0=&3关于草药学:\n&e草药学是关于采集草药与植物的技能.\n\n&3经验拉远:\n&e采集草药或植物. +Guides.Herbalism.Section.1=&3可作用的草药/植物\n&e小麦, 马铃薯, 胡萝卜, 西瓜, \n&e南瓜, 甘蔗, 可可豆, 花, 仙人掌, 蘑菇,\n&e地狱疣, 莲叶, 与藤蔓. +Guides.Herbalism.Section.2=&3大地祝福如何工作?\n&e大地祝福是一个主动技能, 当你手持锄头时\n&e点击右键可发动技能. 大地祝福提高三倍收获的机率. \n&e同时也让玩家有能力使用身上的种子来转化\n&e方块并赋予生命. +Guides.Herbalism.Section.3=&3园艺大师(作物)如何工作?\n&e这是一个被动技能,让作物在采集时\n&e自动种回去.\n&e概率取决于你的草药学技能等级. +Guides.Herbalism.Section.4=&3园艺大师(圆石/石砖/泥土)如何工作?\n&e这是一个主动技能,让你在手拿着种子时,\n&e对圆石石/石砖/泥土,点击右键,可使它们变成\n&e苔石草方块等,会消耗一颗种子. +Guides.Herbalism.Section.5=&3农夫食谱如何工作?\n&e这是一个被动技能, 可增加下列食物的饱食度恢复 -\n&e面包, 曲奇, 西瓜, 蘑菇汤, 胡萝卜, 马铃薯. +Guides.Herbalism.Section.6=&3海拉尔的祝福如何工作?\n&e这是一个主动技能,有机率在用剑破坏特定\n&e方块时获得稀有道具. +Guides.Herbalism.Section.7=&3双倍掉落如何工作?\n&e这是一个被动技能使玩家能加倍收获. +##挖矿 +Guides.Mining.Section.0=&3关于挖矿:\n&e挖矿包括挖掘石头和矿物. \n&e挖矿技能可以提供多重矿物掉落的奖励.\n\n&3经验来源:\n&e获取此技能的经验值, 你必须拿着矿镐进行挖掘.\n&e只有特定方块才能获取经验. +Guides.Mining.Section.1=&3兼容材料:\n&e石头,煤矿石,铁矿石,金矿石,钻石矿石,红石矿石,\n&e青金石矿石,黑曜石,苔石,末地石,\n&e萤石,地狱岩. +Guides.Mining.Section.2=&3如何使用超级碎石机:\n&e把镐子拿在你的手上,按下右键来准备你的镐子.\n&e你将有4秒钟的时间来激发你的技能.\n&e当你敲下对应的石头以后,超级碎石机将被激活. +Guides.Mining.Section.3=&3什么是超级碎石机?\n&e超级碎石机是一个主动技能\n&e它能使你在挖掉对应矿石的时候增加3倍掉落几率\n&e并且在技能时间内瞬间破坏石头和矿石 +Guides.Mining.Section.4=&3如何使用爆破开采:\n&e把雷管拿在手上,默认的情况下是打火器.\n&e在一定距离内右键点击TNT,这将会使得TNT在瞬间内爆炸. +Guides.Mining.Section.5=&3什么是爆破开采?\n&e爆破开采是一个需要冷却时间的挖矿技能\n&e它能使你在使用TNT炸矿时获得额外奖励\n&e爆破开采总共有3个功能\n&e大号炸弹:使你的TNT爆炸范围扩大\n&e爆破专家:降低你受到TNT的爆炸伤害\n&e爆破开采:使你点燃的TNT炸下范围内一定数量的矿石 +##修理 +Guides.Repair.Section.0=&3关于修理:\n&e修理可以让你使用铁块来修理盔甲和工具.\n\n&3经验来源:\n&e使用mcMMO的铁砧修理工具或装备. \n&emcMMO默认的修理台是铁块\n&e不要与用经验修复的铁砧混淆. +Guides.Repair.Section.1=&3如何使用修理?\n&e放置一个mcMMO铁砧(铁块),手持需要修理的道具 \n&e,右键点击铁块,每次使用消耗一个物品 +Guides.Repair.Section.2=&3修理精通如何工作?\n&e修理精通提升修理时耐久恢复量. \n&e额外修理的耐久值量取决于你的修理技能等级. +Guides.Repair.Section.3=&3超级修理如何工作?\n&e超级修理是一个被动技能. 当修理一个物品时,\n&e会使物品的修理效果翻倍. +Guides.Repair.Section.4=&3秘法锻造如何工作?\n&e这是一个被动技能,允许你修复附魔物品\n&e修理物品时有一定几率保留附魔属性\n&e附魔属性可以保持现有的等级,\n&e降级到一个较低等级或者完全消失. +##打捞 +Guides.Salvage.Section.0=&3关于分解:\n&e分解使你可以使用金块来分解装备和工具.\n\n&3经验来源:\n&e分解时修理和钓鱼的子技能,\n&e技能等级取决于你的钓鱼和修理的等级. +Guides.Salvage.Section.1=&3如何使用分解?\n&e放一个mcMMO分解砧(金块)拿着物品右键金块.\n&e这将拆解物品,并返还物品的制作原料\n&e例如:拆解铁镐你将获得铁锭. +Guides.Salvage.Section.2=&3如何使用进阶分解?\n&e解锁后,此功能使你可以分解损坏的物品.\n&e随着等级的提升分解所得的物品会获得更多的材料\n&e通过进阶分解你始终能获得一个材料.\n&e不用担心不会获得材料,除非你的耐久值太低. +Guides.Salvage.Section.3=&3为了说明这是如何工作的, 这有一个例子:\n&e假设我们分解了一个损坏了20%的金镐,\n&e亦为之你最多获得两个金锭\n&e(因为金镐使用三个金锭制作的,\n&e33,33% 的损耗) 等于 66% 的耐久值. \n&e如果你分解的物品耐久值低于66%则无法获得两个原料.高于此值获得两个. +Guides.Salvage.Section.4=&3如何使用奥术分解?\n&e这个技能可以使你在分解附魔物品时获得附魔书\n&e根据你的分解等级,分为全部提取和部分提取\n&e当分解为部分提取时.\n\n&e附魔书的附魔与物品相比\n&e附魔等级偏低. +##冶炼 +Guides.Smelting.Section.0=马上到来... +##剑术 +Guides.Swords.Section.0=&3关于剑术:\n&e这个技能在使用剑进行战斗时\n&e提供各种加成.\n\n&3经验来源:\n&e经验值是通过用剑对怪物或其他玩家 \n&e造成伤害获得. +Guides.Swords.Section.1=&3如何使用利刃突刺?\n&e利刃突刺是一个主动技能,将剑拿在手中并按下右键激活\n&e这个技能让你发动范围攻击,提供25%的伤害加成 \n&e并伴有撕裂效果. +Guides.Swords.Section.2=&3反击如何工作?\n&e反击是一个主动技能,格挡对手对你的伤害\n&e并有几率反射50%的伤害给对手. +Guides.Swords.Section.3=&3撕裂如何工作?\n&e撕裂是一个被动技能,攻击时有几率出发撕裂. \n&e撕裂会对对少造成持续的流血伤害,直到持续时间结束或对手死亡, \n&e持续时间取决于你的剑术等级. +##驯兽 +Guides.Taming.Section.0=&3驯兽\n&e驯兽技能让玩家能在用狼战斗时\n&e时有加成效果.\n\n&3经验来源:\n&e要获取经验,须训服狼或豹猫,\n&e或与你的狼一同战斗. +Guides.Taming.Section.1=&3什么是野性的召唤?\n&e野性的召唤是一个主动技能让你\n&e可以召唤一只狼或豹猫,\n&e只要手持骨头或生鱼,点左键. +Guides.Taming.Section.2=&3什么是野兽信息?\n&e野兽信息能让你查看宠物的状态,\n&e对宠物点击左键就能使用这项能力. +Guides.Taming.Section.3=&3什么是嗜血?\n&e血腥攻击是一个主动技能,能造成\n&e狼的攻击目标有机率陷入流血状态. +Guides.Taming.Section.4=&3什么是利爪?\n&e利爪使狼的攻击力随着驯兽等级\n&e增加而增加. +Guides.Taming.Section.5=&3什么是环境感知?\n&e这个被动技能能让狼在遇到危险时\n&e迅速回到你身边(如仙人掌或岩浆),\n&e也可以减免摔落伤害. +Guides.Taming.Section.6=&3什么是毛皮强化?\n&e这是一个被动技能能让狼\n&e受到攻击或燃烧时减免伤害. +Guides.Taming.Section.7=&3什么是冲击抗性?\n&e这是一个被动技能,让狼群\n&e减免爆炸伤害. +Guides.Taming.Section.8=&3什么是快餐服务?\n&e这是一个被动技能,让狼群在攻击时\n&e有几率恢复血量. +##格斗 +Guides.Unarmed.Section.0=&3格斗:\n&e格斗使玩家在使用拳头作战时有\n&e各种加成效果.\n\n&3经验获取:\n&e在用手攻击怪物或玩家时可以获取经验. +Guides.Unarmed.Section.1=&3什么是狂暴?\n&e狂暴是主动技能,空手时点击右键发动.\n&e狂暴可以加成50%对方块的伤害,\n&e使你可以轻松破坏脆弱物体,\n&e如泥土与沙子. +Guides.Unarmed.Section.2=&3什么是铁臂式?\n&e铁臂能增加徒手攻击怪物或\n&e玩家的伤害. +Guides.Unarmed.Section.3=&3什么是箭矢偏向?\n&e箭矢偏向是一个被动技能,让你有机率\n&e能改变骷髅获玩家射向你的箭的方向.\n&e箭会落至地面. +Guides.Unarmed.Section.4=&3什么是铁腕?\n&e铁腕有几率防止对手的缴械.\n&e出发的几率却决于你格斗的等级. +Guides.Unarmed.Section.5=&3什么是缴械?\n&e这个被动技能让玩家解除其他玩家的武装,\n&e使目标所装备的物品掉落到地上. +##伐木 +Guides.Woodcutting.Section.0=&3关于伐木:\n&e伐木是关于砍树的.\n\n&3经验来源:\n&e破坏木头类的方块就会获得伐木经验. +Guides.Woodcutting.Section.1=&3伐木工如何工作?\n&e伐木工是一个主动技能\n&e在手持斧头的同时右键并破坏木头以激活伐木工\n&e这将瞬间破坏整棵树. +Guides.Woodcutting.Section.2=&3秋风扫落叶如何工作?\n&e秋风扫落叶是一个被动技能\n&e当斧头击中树叶方块时会导致瞬间消失\n&e默认情况下,100级解锁. +Guides.Woodcutting.Section.3=&3树木丰收如何工作?\n&e这个被动技能使你在砍树时\n&e有几率掉落双倍木头. +#检查 +Inspect.Offline= &c你没有查询不在线玩家信息的权限! +Inspect.OfflineStats=不在线玩家的mcMMO统计信息 &e{0} +Inspect.Stats=&e{0} 的mcMMO统计信息 +Inspect.TooFar=你无法检查那个玩家因为你们距离太远了! +#物品 +Item.ChimaeraWing.Fail=**奇美拉之翼失败了!** +Item.ChimaeraWing.Pass=**奇美拉之翼** +Item.ChimaeraWing.Name=奇美拉之翼 +Item.ChimaeraWing.Lore=&7传送至你的床. +Item.ChimaeraWing.NotEnough=你需要 &e{0}&c 更多 &6{1}&c! +Item.NotEnough=你需要 &e{0}&c 更多 &6{1}&c! +Item.Generic.Wait=你需要等待一段时间才能再次使用! &e({0}s) +Item.Injured.Wait=你最近受伤了所以你必须等一段时间才能使用这个. &e({0}s) +Item.FluxPickaxe.Name=灼热之镐 +Item.FluxPickaxe.Lore.1=&7有几率瞬间熔炼矿物。 +Item.FluxPickaxe.Lore.2=&7需要熔炼等级 {0}+ +#传送 +Teleport.Commencing=&7传送将在 &6({0}) &7 秒后进行, 请保持站立不动... +Teleport.Cancelled=&4传送已取消! +#技能 +Skills.Child=&6(分支技能) +Skills.Disarmed=&4你被缴械了! +Skills.Header=-----[] &a{0}&c []----- +Skills.NeedMore=&4你需要更多 &7{0} +Skills.NeedMore.Extra=&4你需要更多 &7{0}{1} +Skills.Parents=主技能 +Skills.Stats={0}&a{1}&3 XP(&7{2}&3/&7{3}&3) +Skills.ChildStats={0}&a{1} +Skills.MaxXP=最大 +Skills.TooTired=你太累了暂时无法使用该技能.&e({0}s) +Skills.TooTired.Named=&7(&6{0}&e {1}s&7) +Skills.TooTired.Extra=&6{0} &e技能冷却时间 - {1} +Skills.Cancelled=&6{0} &c已取消! +Skills.ConfirmOrCancel=&a再次右键以确定 &6{0}&a. 左键取消. +Skills.AbilityGateRequirementFail=&7你需要 &e{0}&7 级以上的 &3{1}&7 来使用这个能力. +#数据 +Stats.Header.Combat=&6-=格斗技能=- +Stats.Header.Gathering=&6-=采集技能=- +Stats.Header.Misc=&6-=杂项技能=- +Stats.Own.Stats=&a[mcMMO] 统计信息 +#经验加成 +Perks.XP.Name=经验 +Perks.XP.Desc=获得 {0} 倍经验. +Perks.Lucky.Name=幸运 +Perks.Lucky.Desc=给予 {0} 技能和能力33.3%的更高几率触发 +Perks.Lucky.Desc.Login=给予技能和能力33.3%得更高几率触发 +Perks.Lucky.Bonus=&6 ({0} 的好运加成) +Perks.Cooldowns.Name=快速恢复 +Perks.Cooldowns.Desc=减少冷却时间 {0}. +Perks.ActivationTime.Name=耐力 +Perks.ActivationTime.Desc=提高能力激活时间 {0} 秒. +Perks.ActivationTime.Bonus=&6 ({0} 秒额外持续时间) +#硬核 +Hardcore.Mode.Disabled=&6[mcMMO] 硬核模式 {0} 关闭. {1} +Hardcore.Mode.Enabled=&6[mcMMO] 硬核模式 {0} 启用. {1} +Hardcore.DeathStatLoss.Name=技能死亡惩罚 +Hardcore.DeathStatLoss.PlayerDeath=&6[mcMMO] &4死亡,你失去了 &9{0}&4. +Hardcore.DeathStatLoss.PercentageChanged=&6[mcMMO] 状态遗失率变更为 {0}. +Hardcore.Vampirism.Name=吸血模式 +Hardcore.Vampirism.Killer.Failure=&6[mcMMO] &e{0}&7太不熟练授予你获得任何的知识. +Hardcore.Vampirism.Killer.Success=&6[mcMMO] &3你从&e{1}&3那偷取了&9{0}&3个等级. +Hardcore.Vampirism.Victim.Failure=&6[mcMMO] &e{0}&7无法从你这偷取任何的知识! +Hardcore.Vampirism.Victim.Success=&6[mcMMO] &e{0}&4从你这偷取了&9{1}&4个等级! +Hardcore.Vampirism.PercentageChanged=&6[mcMMO] 状态吸收率变更为 {0}. #MOTD -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=[[GOLD]][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 -Smelting.SubSkill.UnderstandingTheArt.Name=\u51b6\u70bc\u7cbe\u901a -Smelting.SubSkill.UnderstandingTheArt.Description=\u4e5f\u8bb8\u4f60\u82b1\u8d39\u4e86\u592a\u591a\u65f6\u95f4\u5728\u6d1e\u7a74\u4e2d\u51b6\u70bc.\n\u63d0\u5347\u51b6\u70bc\u7684\u5404\u79cd\u5c5e\u6027. -Smelting.SubSkill.UnderstandingTheArt.Stat=\u7ecf\u9a8c\u7403\u500d\u6570: [[YELLOW]]{0} \u500d -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 (\u795d\u878d\u4e4b\u9550) -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.FuelEfficiency.Stat=\u71c3\u6599\u6548\u7387\u500d\u6570: [[YELLOW]]{0} \u500d -Smelting.SubSkill.SecondSmelt.Name=\u4e8c\u6b21\u7194\u70bc -Smelting.SubSkill.SecondSmelt.Description=\u901a\u8fc7\u51b6\u70bc\u83b7\u5f97\u53cc\u500d\u8d44\u6e90 -Smelting.SubSkill.SecondSmelt.Stat=\u4e8c\u6b21\u7194\u70bc\u89e6\u53d1\u7684\u51e0\u7387 -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=\u795d\u878d\u4e4b\u9550 -Smelting.SubSkill.FluxMining.Description=\u6316\u77ff\u65f6\u4e00\u5b9a\u51e0\u7387\u4f7f\u77ff\u77f3\u7acb\u5373\u88ab\u7194\u70bc -Smelting.SubSkill.FluxMining.Stat=\u795d\u878d\u4e4b\u9550\u53d1\u52a8\u51e0\u7387 -Smelting.Listener=\u51b6\u70bc: -Smelting.SkillName=\u51b6\u70bc -#COMMAND DESCRIPTIONS -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\u53f3\u952e\u6fc0\u6d3b \u5f00/\u5173 -Commands.Description.mccooldown=\u67e5\u770b\u6240\u6709mcMMO\u6280\u80fd\u51b7\u5374\u65f6\u95f4 -Commands.Description.mcchatspy=\u5207\u6362\u5bf9\u5b8c\u804a\u5929\u76d1\u89c6\u5f00/\u5173 -Commands.Description.mcgod=\u5207\u6362 mcMMO \u4e0a\u5e1d\u6a21\u5f0f \u5f00/\u5173 -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.mcscoreboard=\u7ba1\u7406\u4f60\u7684 mcMMO \u8ba1\u5206\u677f -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=\u7f16\u8f91\u7528\u6237\u7684 mcMMO \u7684\u7b49\u7ea7 -Commands.Description.mmodebug=\u5207\u6362\u8c03\u8bd5\u6a21\u5f0f\u72b6\u6001,\u70b9\u51fb\u65b9\u5757\u8f93\u51fa\u6709\u7528\u7684\u4fe1\u606f -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 (\u65e7\u7248\u672c\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 -#UPDATE CHECKER -UpdateChecker.Outdated=\u4f60\u6b63\u5728\u4f7f\u7528\u8fd9\u4e00\u4e2a\u65e7\u7248\u672c\u7684 mcMMO! -UpdateChecker.NewAvailable=Spigot \u4e0a\u6709\u4e00\u4e2a\u65b0\u7248\u672c. -#SCOREBOARD HEADERS -Scoreboard.Header.PlayerStats=[[YELLOW]]mcMMO \u7edf\u8ba1 -Scoreboard.Header.PlayerCooldowns=[[YELLOW]]mcMMO \u51b7\u5374 -Scoreboard.Header.PlayerRank=[[YELLOW]]mcMMO \u6392\u540d -Scoreboard.Header.PlayerInspect=[[YELLOW]]mcMMO \u7edf\u8ba1: {0} -Scoreboard.Header.PowerLevel=[[RED]]\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=[[YELLOW]]\u5347\u7ea7\u6240\u9700\u7ecf\u9a8c -Scoreboard.Misc.Cooldown=[[LIGHT_PURPLE]]\u51b7\u5374 -Scoreboard.Misc.Overall=[[GOLD]]\u603b\u4f53 -Scoreboard.Misc.Ability=\u80fd\u529b -#DATABASE RECOVERY -Profile.PendingLoad=[[RED]]\u4f60\u7684mcmmo\u73a9\u5bb6\u6570\u636e\u672a\u52a0\u8f7d. -Profile.Loading.Success=[[GREEN]]\u4f60\u7684mcMMO\u6570\u636e\u5df2\u52a0\u8f7d -Profile.Loading.Failure=[[RED]]mcMMO \u65e0\u6cd5\u52a0\u8f7d\u4f60\u7684\u6570\u636e. \u8bf7\u8054\u7cfb [[AQUA]]\u670d\u52a1\u5668\u7ba1\u7406\u5458\u53cd\u9988\u4f60\u7684\u95ee\u9898.\n[[YELLOW]]\u4f60\u53ef\u4ee5\u7ee7\u7eed\u5728\u670d\u52a1\u5668\u6e38\u73a9, \u4f46\u662f\u4f60 [[BOLD]]\u6ca1\u6709mcMMO\u7b49\u7ea7[[YELLOW]] \u5e76\u4e14\u4f60\u83b7\u5f97\u7684\u4efb\u4f55\u7ecf\u9a8c\u90fd [[BOLD]]\u4e0d\u4f1a\u88ab\u4fdd\u5b58[[YELLOW]]. -Profile.Loading.AdminFailureNotice=[[DARK_RED]][A][[RED]] mcMMO \u65e0\u6cd5\u52a0\u8f7d\u73a9\u5bb6 [[YELLOW]]{0}[[RED]] \u7684\u6570\u636e. [[LIGHT_PURPLE]]\u8bf7\u68c0\u67e5\u4f60\u7684\u6570\u636e\u5e93. -#Holiday -Holiday.AprilFools.Levelup=[[GOLD]]{0} \u73b0\u5728 [[GREEN]]{1}[[GOLD]] \u7ea7! -Holiday.Anniversary=[[BLUE]]mcMMO {0} \u5468\u5e74\u5feb\u4e50!\n[[BLUE]]\u4e3a\u4e86\u7eaa\u5ff5 nossr50 \u548c\u6240\u6709\u5f00\u53d1\u8005\u7684\u5de5\u4f5c, \u8fd9\u91cc\u6709\u4e00\u573a\u70df\u706b\u8868\u6f14! -#Reminder Messages -Reminder.Squelched=[[GRAY]]\u63d0\u9192: \u4f60\u73b0\u5728\u4e0d\u63a5\u6536\u6765\u81eamcMMO\u7684\u901a\u77e5\u6d88\u606f, \u5982\u60f3\u542f\u7528\u8bf7\u518d\u6b21\u4f7f\u7528 /mcnotify \u547d\u4ee4. \u8be5\u63d0\u793a\u6bcf\u5c0f\u65f6\u4e00\u6b21. -#Locale -Locale.Reloaded=[[GREEN]]\u8bed\u8a00\u914d\u7f6e\u5df2\u91cd\u65b0\u52a0\u8f7d\uff0c\u4e2d\u6587\u6c49\u5316By: Fu_Meng (\u53d1\u73b0\u9519\u522b\u5b57\u8bf7\u8054\u7cfb\u6211QQ:89009332) -#Player Leveling Stuff -LevelCap.PowerLevel=[[GOLD]]([[GREEN]]mcMMO[[GOLD]]) [[YELLOW]]\u4f60\u5df2\u7ecf\u5230\u8fbe\u4e86\u6218\u6597\u529b\u7684\u7b49\u7ea7\u5c01\u9876 [[RED]]{0}[[YELLOW]] \u7ea7. \u4f60\u5c06\u505c\u6b62\u83b7\u53d6\u6280\u80fd\u7ecf\u9a8c. -LevelCap.Skill=[[GOLD]]([[GREEN]]mcMMO[[GOLD]]) [[YELLOW]]\u4f60\u5df2\u7ecf\u5230\u8fbe\u4e86 [[GOLD]]{1}[[YELLOW]] \u6280\u80fd\u7684\u7b49\u7ea7\u5c01\u9876 [[RED]]{0}[[YELLOW]] . \u4f60\u7684\u8be5\u6280\u80fd\u5c06\u65e0\u6cd5\u518d\u5347\u7ea7. +MOTD.Donate=&3捐赠信息: +MOTD.Hardcore.Enabled=&6[mcMMO] &3硬核模式已启用: &4{0} +MOTD.Hardcore.DeathStatLoss.Stats=&6[mcMMO] &3技能死亡惩罚: &4{0}% +MOTD.Hardcore.Vampirism.Stats=&6[mcMMO] &3Vampirism统计: &4{0}% +MOTD.PerksPrefix=&6[mcMMO 能力] +MOTD.Version=&6[mcMMO] 正在运行版本 &3{0} +MOTD.Website=&6[mcMMO] &a{0}&e - mcMMO 网址 +#冶炼 +Smelting.SubSkill.UnderstandingTheArt.Name=冶炼精通 +Smelting.SubSkill.UnderstandingTheArt.Description=也许你花费了太多时间在洞穴中冶炼.\n提升冶炼的各种属性. +Smelting.SubSkill.UnderstandingTheArt.Stat=经验球倍数: &e{0} 倍 +Smelting.Ability.Locked.0={0}+ 级后解锁 (更多冶炼经验球) +Smelting.Ability.Locked.1={0}+ 级后解锁 (祝融之镐) +Smelting.SubSkill.FuelEfficiency.Name=燃料效率 +Smelting.SubSkill.FuelEfficiency.Description=熔炼时提高熔炉内燃料的燃烧时间 +Smelting.SubSkill.FuelEfficiency.Stat=燃料效率倍数: &e{0} 倍 +Smelting.SubSkill.SecondSmelt.Name=二次熔炼 +Smelting.SubSkill.SecondSmelt.Description=通过冶炼获得双倍资源 +Smelting.SubSkill.SecondSmelt.Stat=二次熔炼触发的几率 +Smelting.Effect.4=更多冶炼经验球 +Smelting.Effect.5=提高冶炼获取的经验球 +Smelting.SubSkill.FluxMining.Name=祝融之镐 +Smelting.SubSkill.FluxMining.Description=挖矿时一定几率使矿石立即被熔炼 +Smelting.SubSkill.FluxMining.Stat=祝融之镐发动几率 +Smelting.Listener=冶炼: +Smelting.SkillName=冶炼 +#指令简介 +Commands.Description.addlevels=给玩家增加 mcMMO 等级 +Commands.Description.adminchat=切换 mcMMO 管理员聊天或发送管理员聊天信息 +Commands.Description.addxp=给玩家增加 mcMMO 经验 +Commands.Description.hardcore=修改 mcMMO hardcore 百分比或切换 hardcore 模式开/关 +Commands.Description.inspect=查看玩家详细的 mcMMO 信息 +Commands.Description.mcability=切换 mcMMO 技能右键激活 开/关 +Commands.Description.mccooldown=查看所有mcMMO技能冷却时间 +Commands.Description.mcchatspy=切换对完聊天监视开/关 +Commands.Description.mcgod=切换 mcMMO 上帝模式 开/关 +Commands.Description.mchud=变更你的 mcMMO HUD 样式 +Commands.Description.mcmmo=显示 mcMMO 的简单描述 +Commands.Description.mcnotify=切换 mcMMO 技能提示开关 +Commands.Description.mcpurge=清除没有 mcMMO 等级的玩家和超过 {0} 个月没有登录的玩家的 mcMMO 数据 +Commands.Description.mcrank=显示玩家的 mcMMO 排名 +Commands.Description.mcrefresh=刷新所有的 mcMMO 冷却时间 +Commands.Description.mcremove=从 mcMMO 数据库中移除一个玩家 +Commands.Description.mcscoreboard=管理你的 mcMMO 计分板 +Commands.Description.mcstats=显示你的 mcMMO 等级和经验 +Commands.Description.mctop=显示 mcMMO 排行榜 +Commands.Description.mmoedit=编辑用户的 mcMMO 的等级 +Commands.Description.mmodebug=切换调试模式状态,点击方块输出有用的信息 +Commands.Description.mmoupdate=从一个旧的 mcMMO 数据库迁移到当前数据库内 +Commands.Description.mcconvert=转换数据库的类型或经验值公式的类型 +Commands.Description.mmoshowdb=显示当前数据库类型名称 (旧版本使用 /mmoupdate) +Commands.Description.party=控制各种 mcMMO 队伍设置 +Commands.Description.partychat=切换 mcMMO 队伍聊天或发送队伍聊天消息 +Commands.Description.ptp=传送至 mcMMO 队伍成员 +Commands.Description.Skill=显示 {0} 详细的mcMMO技能信息 +Commands.Description.skillreset=重置 mcMMO 等级 +Commands.Description.vampirism=更改 mcMMO 榨取百分比 或切换 vampirism 模式开/关 +Commands.Description.xplock=锁定指定 mcMMO 技能的经验条 +Commands.Description.xprate=更改 mcMMO 经验倍率或开启一个 mcMMO 经验翻倍事件 +#更新检查器 +UpdateChecker.Outdated=你正在使用这一个旧版本的 mcMMO! +UpdateChecker.NewAvailable=Spigot 上有一个新版本. +#记分板抬头 +Scoreboard.Header.PlayerStats=&emcMMO 统计 +Scoreboard.Header.PlayerCooldowns=&emcMMO 冷却 +Scoreboard.Header.PlayerRank=&emcMMO 排名 +Scoreboard.Header.PlayerInspect=&emcMMO 统计: {0} +Scoreboard.Header.PowerLevel=&c战斗力 +Scoreboard.Misc.PowerLevel=&6战斗力 +Scoreboard.Misc.Level=&3等级 +Scoreboard.Misc.CurrentXP=&a当前经验 +Scoreboard.Misc.RemainingXP=&e升级所需经验 +Scoreboard.Misc.Cooldown=&d冷却 +Scoreboard.Misc.Overall=&6总体 +Scoreboard.Misc.Ability=能力 +#数据库恢复 +Profile.PendingLoad=&c你的mcMMO玩家数据未加载. +Profile.Loading.Success=&a你的mcMMO数据已加载 +Profile.Loading.Failure=&cmcMMO 无法加载你的数据. 请联系 &b服务器管理员反馈你的问题.\n&e你可以继续在服务器游玩, 但是你 &l没有mcMMO等级&e 并且你获得的任何经验都 &l不会被保存&e. +Profile.Loading.AdminFailureNotice=&4[A]&c mcMMO 无法加载玩家 &e{0}&c 的数据. &d请检查你的数据库. +#节日 +Holiday.AprilFools.Levelup=&6{0} 现在 &a{1}&6 级! +Holiday.Anniversary=&9mcMMO {0} 周年快乐!\n&9为了纪念 nossr50 和所有开发者的工作, 这里有一场烟火表演! +#提醒消息 +Reminder.Squelched=&7提醒: 你现在不接收来自mcMMO的通知消息, 如想启用请再次使用 /mcnotify 命令. 该提示每小时一次. +#本地化 +Locale.Reloaded=&a语言配置已重新加载,中文汉化By: GhostDC 修改自原汉化作者:aFu_Meng发现错别字请联系我QQ:1007199608) +#玩家离开相关 +LevelCap.PowerLevel=&6(&amcMMO&6) &e你已经到达了战斗力的等级封顶 &c{0}&e 级. 你将停止获取技能经验. +LevelCap.Skill=&6(&amcMMO&6) &e你已经到达了 &6{1}&e 技能的等级封顶 &c{0}&e . 你的该技能将无法再升级. +Commands.XPBar.Usage=正确的用法是 /mmoxpbar +Commands.Description.mmoxpbar=mcMMO 经验条的设置 +Commands.Description.mmocompat=有关 mcMMO mcMMO 以及它是否处于兼容模式或功能齐全的信息。. +Compatibility.Layer.Unsupported=&6此版本的 Minecraft 与 &a{0}&6 不兼容. +Compatibility.Layer.PartialSupport=&6此版本的 Minecraft 与 &a{0}&6 不完全兼容, 但是 mcMMO 正在运行一个辅助系统来模拟一些缺失的功能。. +Commands.XPBar.DisableAll=&6 所有的 mcMMO 经验条现在都已经被禁用, 使用 /mmoxpbar reset 来重置默认设置. +#现代聊天设置 +Chat.Style.Admin=&b(A) &r{0} &b→ &r{1} +Chat.Style.Party=&a(P) &r{0} &a→ &r{1} +Chat.Style.Party.Leader=&a(P) &r{0} &6→ &r{1} +Chat.Identity.Console=&6* 控制台 * +Chat.Channel.On=&6(&amcMMO-聊天&6) &e你的聊天消息现在将自动发送到 &a{0}&e 聊天频道. +Chat.Channel.Off=&6(&amcMMO-聊天&6) &7你的聊天消息将不再自动发送到特定的聊天频道. +Chat.Spy.Party=&6[&eSPY&6-&a{2}&6] &r{0} &b→ &r{1} +Broadcasts.LevelUpMilestone=&6(&amcMMO&6) {0}&7 的 &3{2}&7 技能等级提升到了 &a{1}&7! +Broadcasts.PowerLevelUpMilestone=&6(&amcMMO&6) {0}&7 总等级已达到 &a{1}&7! +Scoreboard.Recovery=正在尝试恢复 mcMMO 记分牌... \ No newline at end of file diff --git a/src/main/resources/locale/locale_zh_TW.properties b/src/main/resources/locale/locale_zh_TW.properties index 85b97acea..8bfb2a458 100644 --- a/src/main/resources/locale/locale_zh_TW.properties +++ b/src/main/resources/locale/locale_zh_TW.properties @@ -1,777 +1,1144 @@ -Acrobatics.Ability.Proc=[[GREEN]]**\u5b8c\u7f8e\u8457\u9678** -Acrobatics.Combat.Proc=[[GREEN]]**\u8ff4\u907f** -Acrobatics.DodgeChance=\u8ff4\u907f\u6a5f\u7387: [[YELLOW]]{0} -Acrobatics.SubSkill.Roll.Name=\u7ffb\u6efe -Acrobatics.SubSkill.Roll.Description=\u6e1b\u5c11\u6216\u53d6\u6d88\u6389\u843d\u50b7\u5bb3 -Acrobatics.SubSkill.GracefulRoll.Name=\u6f02\u4eae\u7ffb\u6efe -Acrobatics.SubSkill.GracefulRoll.Description=\u5169\u500d\u7684\u7ffb\u6efe\u6548\u679c -Acrobatics.SubSkill.Dodge.Name=\u8ff4\u907f -Acrobatics.SubSkill.Dodge.Description=\u6e1b\u5c11\u4e00\u534a\u7684\u50b7\u5bb3 -Acrobatics.Listener=\u96dc\u6280: -Acrobatics.SubSkill.Roll.Chance=\u7ffb\u6efe\u6a5f\u7387: [[YELLOW]]{0} -Acrobatics.SubSkill.Roll.GraceChance=\u6f02\u4eae\u7ffb\u6efe\u6a5f\u7387: [[YELLOW]]{0} -Acrobatics.Roll.Text=**\u7ffb\u6efe** -Acrobatics.SkillName=\u96dc\u6280 -Acrobatics.Skillup=\u96dc\u6280\u7b49\u7d1a\u4e0a\u5347\u4e86{0}\u7b49. \u5171({1})\u7b49 -Archery.Combat.DazeChance=\u6688\u7729\u6a5f\u7387: [[YELLOW]]{0} -Archery.Combat.RetrieveChance=\u56de\u6536\u7bad\u77e2\u7684\u6a5f\u7387: [[YELLOW]]{0} -Archery.Combat.SkillshotBonus=\u6280\u8853\u5c04\u64ca\u734e\u52f5\u50b7\u5bb3: [[YELLOW]]{0} -Archery.SubSkill.SkillShot.Name=\u6280\u8853\u5c04\u64ca -Archery.SubSkill.SkillShot.Description=\u589e\u52a0\u5f13\u7bad\u50b7\u5bb3 -Archery.SubSkill.Daze.Name=\u6688\u7729(\u9650\u5b9a\u73a9\u5bb6) -Archery.SubSkill.Daze.Description=\u8ff7\u60d1\u6575\u4eba\u4e26\u9020\u6210 {0}\u9ede\u50b7\u5bb3 -Archery.SubSkill.ArrowRetrieval.Name=\u56de\u6536\u5f13\u7bad -Archery.SubSkill.ArrowRetrieval.Description=\u6709\u6a5f\u7387\u5f9e\u5c4d\u9ad4\u4e0a\u53d6\u5f97\u7bad\u77e2 -Archery.Listener=\u7bad\u8853: -Archery.SkillName=\u7bad\u8853 -Archery.Skillup=\u7bad\u8853\u6280\u80fd\u4e0a\u5347\u4e86 {0}! \u7e3d\u7b49\u7ea7 ({1})! -Axes.Ability.Bonus.0=\u65a7\u982d\u7cbe\u901a -Axes.Ability.Bonus.1=\u734e\u52f5 {0} \u50b7\u5bb3 -Axes.Ability.Bonus.2=\u9632\u5177\u7834\u58de\u8005 -Axes.Ability.Bonus.3=\u5c0d\u6709\u88dd\u7532\u6575\u4eba\u984d\u5916\u9020\u6210 {0} \u50b7\u5bb3 -Axes.Ability.Bonus.4=\u5f37\u529b\u653b\u64ca -Axes.Ability.Bonus.5=\u5c0d\u7121\u88dd\u7532\u6575\u4eba\u984d\u5916\u9020\u6210 {0} \u50b7\u5bb3 -Axes.Ability.Lower=[[GRAY]]**\u4f60\u653e\u4e0b\u4e86\u4f60\u7684\u65a7\u982d** -Axes.Ability.Ready=[[GREEN]]**\u4f60\u63e1\u7dca\u4e86\u4f60\u7684\u65a7\u982d** -Axes.Combat.CritStruck=[[DARK_RED]]\u4f60\u6253\u51fa\u4e86\u6703\u5fc3\u4e00\u64ca! -Axes.Combat.CritChance=\u66b4\u64ca\u6a5f\u7387: [[YELLOW]]{0}% -Axes.Combat.CriticalHit=\u6703\u5fc3\u4e00\u64ca! -Axes.Combat.GI.Proc=[[GREEN]]**\u66b4\u529b\u6253\u64ca** -Axes.Combat.GI.Struck=**\u88ab\u5f37\u529b\u653b\u64ca\u64ca\u4e2d** -Axes.Combat.SS.Struck=[[DARK_RED]]\u88ab\u5288\u9871\u65ac\u64ca\u4e2d! -Axes.Combat.SS.Length=\u5288\u9871\u65ac\u6301\u7e8c\u6642\u9593: [[YELLOW]]{0}s -Axes.SubSkill.SkullSplitter.Name=\u5288\u9871\u65ac (\u4e3b\u52d5\u6280\u80fd) -Axes.SubSkill.SkullSplitter.Description=\u9020\u6210\u7bc4\u570d\u50b7\u5bb3 -Axes.SubSkill.CriticalStrikes.Name=\u6703\u5fc3\u4e00\u64ca -Axes.SubSkill.CriticalStrikes.Description=\u96d9\u500d\u50b7\u5bb3 -Axes.SubSkill.AxeMastery.Name=\u65a7\u982d\u7cbe\u901a -Axes.SubSkill.AxeMastery.Description=\u589e\u52a0\u984d\u5916\u50b7\u5bb3 -Axes.SubSkill.ArmorImpact.Name=\u9632\u5177\u7834\u58de\u8005 -Axes.SubSkill.ArmorImpact.Description=\u7528\u8db3\u5920\u7684\u529b\u91cf\u4f86\u7a81\u7834\u88dd\u7532 -Axes.SubSkill.GreaterImpact.Name=\u5f37\u529b\u653b\u64ca -Axes.SubSkill.GreaterImpact.Description=\u5c0d\u7121\u88dd\u7532\u6575\u4eba\u9020\u6210\u66f4\u591a\u50b7\u5bb3 -Axes.Listener=\u65a7\u6280: -Axes.SkillName=\u65a7\u6280 -Axes.Skills.SS.Off=**\u5288\u9871\u65ac\u5df2\u7d50\u675f** -Axes.Skills.SS.On=[[GREEN]]**\u5288\u9871\u65ac\u5df2\u4f7f\u7528** -Axes.Skills.SS.Refresh=[[GREEN]]\u4f60\u7684 [[YELLOW]]\u5288\u9871\u65ac [[GREEN]]\u80fd\u529b\u5df2\u53ef\u4f7f\u7528\uff01 -Axes.Skills.SS.Other.Off=\u5288\u9871\u65ac[[GREEN]] \u5df2\u7d93\u7ed3\u675f\u4e86 [[YELLOW]]{0} -Axes.Skills.SS.Other.On=[[GREEN]]{0}[[DARK_GREEN]]\u4f7f\u7528\u4e86 [[RED]]\u5288\u9871\u65ac! -Axes.Skillup=\u65a7\u6280\u4e0a\u5347\u4e86 {0}! \u7e3d\u7b49\u7d1a ({1})! -Excavation.Ability.Lower=[[GRAY]]**\u4f60\u653e\u4e0b\u4e86\u4f60\u7684\u93df\u5b50** -Excavation.Ability.Ready=[[GREEN]]**\u4f60\u63e1\u7dca\u4e86\u4f60\u7684\u93df\u5b50** -Excavation.SubSkill.GigaDrillBreaker.Name=\u66b4\u8d70\u947d\u982d (\u4e3b\u52d5\u6280\u80fd) -Excavation.SubSkill.GigaDrillBreaker.Description=3x \u6389\u843d\u7387, 3x \u7d93\u9a57\u503c, +\u901f\u5ea6 -Excavation.SubSkill.TreasureHunter.Name=\u5bf6\u7269\u7375\u4eba -Excavation.SubSkill.TreasureHunter.Description=\u6316\u51fa\u5bf6\u85cf\u7684\u80fd\u529b -Excavation.Effect.Length=\u66b4\u8d70\u947d\u982d\u6301\u7e8c\u6642\u9593: [[YELLOW]]{0}s -Excavation.Listener=\u6316\u6398: -Excavation.SkillName=\u6316\u6398 -Excavation.Skills.GigaDrillBreaker.Off=**\u66b4\u8d70\u947d\u982d\u5df2\u7ed3\u675f** -Excavation.Skills.GigaDrillBreaker.On=[[GREEN]]**\u66b4\u8d70\u947d\u982d\u6280\u80fd\u4f7f\u7528** -Excavation.Skills.GigaDrillBreaker.Refresh=[[GREEN]]\u4f60\u7684 [[YELLOW]]\u66b4\u8d70\u947d\u982d [[GREEN]]\u6280\u80fd\u5df2\u7d93\u53ef\u4ee5\u4f7f\u7528\u4e86! -Excavation.Skills.GigaDrillBreaker.Other.Off=\u66b4\u8d70\u947d\u982d[[GREEN]] \u5df2\u7d93\u7ed3\u675f\u4e86 [[YELLOW]]{0} -Excavation.Skills.GigaDrillBreaker.Other.On=[[GREEN]]{0}[[DARK_GREEN]] \u4f7f\u7528\u4e86 [[RED]]\u66b4\u8d70\u947d\u982d! -Excavation.Skillup=\u6316\u6398\u6280\u80fd\u4e0a\u5347\u4e86 {0}! \u7e3d\u7b49\u7d1a ({1})! -Fishing.Ability.Chance=\u54ac\u788e\u6a5f\u7387: [[YELLOW]]{0} -Fishing.Ability.Info=\u9b54\u6cd5\u7375\u4eba: [[GRAY]] ** \u96a8\u8457\u5bf6\u85cf\u7375\u4eba\u7b49\u7d1a\u63d0\u9ad8 ** -Fishing.Ability.Locked.0=\u9396\u5b9a\u76f4\u5230\u6280\u80fd {0}+ \uff08\u6416\u6643\uff09 -Fishing.Ability.Locked.1=\u9396\u5b9a\u76f4\u5230\u6280\u80fd {0}+ (\u51b0\u91e3) -Fishing.Ability.Locked.2=\u9396\u5b9a\u76f4\u5230\u6280\u80fd {0}+ (\u5782\u91e3\u5927\u5e2b) -Fishing.Ability.Rank=\u5bf6\u7269\u7375\u4eba\u7b49\u7d1a: [[YELLOW]]{0}/5 -Fishing.Ability.TH.DropRate=\u6389\u5bf6\u7387: [[DARK_RED]]\u9677\u9631: [[YELLOW]]{0} [[GRAY]]\u5e38\u898b: [[YELLOW]]{1} [[GREEN]]\u7f55\u898b: [[YELLOW]]{2}\n[[BLUE]]\u7a00\u6709: [[YELLOW]]{3} [[LIGHT_PURPLE]]\u53f2\u8a69: [[YELLOW]]{4} [[GOLD]]\u50b3\u8aaa: [[YELLOW]]{5} [[AQUA]]\u5275\u7d00\u9304: [[YELLOW]]{6} -Fishing.Ability.TH.MagicRate=\u9b54\u6cd5\u7375\u4eba\u6a5f\u7387: [[YELLOW]]{0} -Fishing.Ability.Shake=\u6416\u6643\u6a5f\u7387: [[YELLOW]]{0} -Fishing.Ability.IceFishing=\u51b0\u91e3: \u5728\u51b0\u4e0a\u91e3\u9b5a -Fishing.Ability.FD=\u6f01\u4eba\u4fbf\u7576: [[YELLOW]]\u7b49\u7d1a {0} -Fishing.SubSkill.TreasureHunter.Name=\u5bf6\u7269\u7375\u4eba (\u88ab\u52d5\u6280\u80fd) -Fishing.SubSkill.TreasureHunter.Description=\u6389\u5230\u96dc\u7269 -Fishing.SubSkill.MagicHunter.Name=\u9b54\u6cd5\u7375\u4eba -Fishing.SubSkill.MagicHunter.Description=\u627e\u5230\u9644\u9b54\u7269\u54c1 -Fishing.SubSkill.Shake.Name=\u6416\u6643 (\u5c0d\u602a\u7269\u4f7f\u7528) -Fishing.SubSkill.Shake.Description=\u7528\u91e3\u7aff\u628a\u602a\u7269\u7684\u7269\u54c1\u53d6\u4e0b\u4f86 -Fishing.SubSkill.FishermansDiet.Name=\u6f01\u4eba\u4fbf\u7576 -Fishing.SubSkill.FishermansDiet.Description=\u98df\u7528\u9b5a\u98df\u54c1\u6642\u984d\u5916\u6062\u5fa9\u98fd\u98df\u5ea6 -Fishing.SubSkill.MasterAngler.Name=\u5782\u91e3\u5927\u5e2b -Fishing.SubSkill.MasterAngler.Description=\u589e\u52a0\u5728\u91e3\u9b5a\u6642\u4e0a\u9264\u7684\u6a5f\u7387 -Fishing.SubSkill.IceFishing.Name=\u51b0\u91e3 -Fishing.SubSkill.IceFishing.Description=\u5141\u8a31\u4f60\u5728\u51b0\u5929\u96ea\u5730\u88e1\u91e3\u9b5a -Fishing.Chance.Raining=[[BLUE]] \u5927\u91cf\u734e\u52f5 -Fishing.Listener=\u91e3\u9b5a: -Fishing.Ability.TH.MagicFound=[[GRAY]]\u4f60\u611f\u53d7\u5230\u9b54\u529b\u7684\u6ce2\u52d5... -Fishing.Ability.TH.Boom=[[GRAY]]\u6536\u7a6b\u6642\u9593!!! -Fishing.Ability.TH.Poison=[[GRAY]]\u4ec0\u9ebc\u6771\u897f,\u805e\u8d77\u4f86\u597d\u81ed\u554a... -Fishing.SkillName=\u91e3\u9b5a -Fishing.Skillup=\u91e3\u9b5a\u6280\u80fd\u4e0a\u5347\u4e86 {0}! \u7e3d\u7b49\u7d1a ({1})! -Herbalism.Ability.DoubleDropChance=\u96d9\u500d\u6389\u843d\u6a5f\u7387: [[YELLOW]]{0} -Herbalism.Ability.FD=\u8fb2\u592b\u79c1\u623f\u83dc: [[YELLOW]]\u7b49\u7d1a {0} -Herbalism.Ability.GTe.Length=\u7da0\u5316\u6301\u7e8c\u6642\u9593: [[YELLOW]]{0}s -Herbalism.Ability.GTe.NeedMore=\u4f60\u9700\u8981\u66f4\u591a\u7a2e\u5b50\u624d\u53ef\u7da0\u5316. -Herbalism.Ability.GTh.Chance=\u7da0\u624b\u6307\u6a5f\u7387: [[YELLOW]]{0} -Herbalism.Ability.GTh.Fail=**\u7da0\u624b\u6307\u5931\u6557** -Herbalism.Ability.GTh.Stage=\u7da0\u624b\u6307\u968e\u6bb5: [[YELLOW]]\u4f5c\u7269\u6210\u9577\u81f3\u968e\u6bb5 {0} -Herbalism.Ability.GTh=[[GREEN]]**\u7da0\u624b\u6307** -Herbalism.Ability.HylianLuck=\u6d77\u502b\u7684\u795d\u798f\u6a5f\u7387: [[YELLOW]]{0} -Herbalism.Ability.Lower=[[GRAY]]**\u4f60\u653e\u4e0b\u4e86\u4f60\u7684\u92e4\u982d** -Herbalism.Ability.Ready=[[GREEN]]**\u4f60\u8209\u9ad8\u4e86\u4f60\u7684\u92e4\u982d** -Herbalism.Ability.ShroomThumb.Chance=\u8611\u83c7\u624b\u89f8\u767c\u6a5f\u7387: [[YELLOW]]{0} -Herbalism.Ability.ShroomThumb.Fail=**\u78e8\u83c7\u624b\u4f7f\u7528\u5931\u6557** -Herbalism.SubSkill.GreenTerra.Name=\u7da0\u5316 (\u4e3b\u52d5\u6280\u80fd) -Herbalism.SubSkill.GreenTerra.Description=\u6563\u64ad\u4e0a\u5e1d\u7684\u6069\u60e0,3\u500d\u6389\u843d\u7269 -Herbalism.SubSkill.GreenThumb.Name=\u7da0\u624b\u6307 (\u5c0f\u9ea5) -Herbalism.SubSkill.GreenThumb.Description=\u6536\u6210\u6642\u81ea\u52d5\u7a2e\u690d\u5c0f\u9ea5 -Herbalism.Effect.4=\u7da0\u624b\u6307 (\u5927\u91cf) -Herbalism.SubSkill.GreenThumb.Description.2=\u4f7f\u7528\u7a2e\u5b50\u8b93\u9d5d\u5375\u77f3\u8b8a\u9752\u82d4\u77f3,\u6216\u8b93\u6ce5\u571f\u8b8a\u8349\u5730 -Herbalism.SubSkill.FarmersDiet.Name=\u8fb2\u592b\u79c1\u623f\u83dc -Herbalism.SubSkill.FarmersDiet.Description=\u98df\u7528\u8fb2\u98df\u54c1\u6642\u984d\u5916\u6062\u5fa9\u98fd\u98df\u5ea6 -Herbalism.SubSkill.DoubleDrops.Name=\u96d9\u500d\u6389\u843d (\u6240\u6709\u7684\u690d\u7269) -Herbalism.SubSkill.DoubleDrops.Description=\u96d9\u500d\u6389\u843d\u7269\u54c1 -Herbalism.SubSkill.HylianLuck.Name=\u6d77\u502b\u7684\u795d\u798f -Herbalism.SubSkill.HylianLuck.Description=\u4f7f\u4f60\u64c1\u6709\u5fae\u5c0f\u6a5f\u7387\u767c\u73fe\u7a00\u6709\u7269\u54c1 -Herbalism.SubSkill.ShroomThumb.Name=\u8611\u83c7\u624b -Herbalism.SubSkill.ShroomThumb.Description=\u6563\u64ad\u83cc\u7d72\u9ad4\u81f3\u571f\u548c\u8349 -Herbalism.HylianLuck=[[GREEN]]\u8c50\u6536\u5973\u795e\u4eca\u65e5\u8207\u4f60\u540c\u5728! -Herbalism.Listener=\u8349\u85e5\u5b78: -Herbalism.SkillName=\u8349\u85e5\u5b78 -Herbalism.Skills.GTe.On=[[GREEN]]**\u767c\u52d5\u7da0\u5316** -Herbalism.Skills.GTe.Refresh=[[GREEN]]\u4f60\u7684 [[YELLOW]]\u7da0\u5316 [[GREEN]]\u80fd\u529b\u5df2\u53ef\u4f7f\u7528! -Herbalism.Skills.GTe.Other.Off=\u7da0\u5316[[GREEN]] \u5373\u5c07\u7ed3\u675f [[YELLOW]]{0} -Herbalism.Skills.GTe.Other.On=[[GREEN]]{0}[[DARK_GREEN]] \u4f7f\u7528\u4e86 [[RED]]\u7da0\u5316! -Herbalism.Skillup=\u8349\u85e5\u5b78\u4e0a\u5347\u4e86 {0}! \u7e3d\u7b49\u7d1a ({1})! -Mining.Ability.Length=\u8d85\u7d1a\u788e\u77f3\u6a5f\u6301\u7e8c\u6642\u9593: [[YELLOW]]{0}s -Mining.Ability.Locked.0=\u9396\u5b9a\u76f4\u5230\u6280\u80fd {0}+ (\u6316\u7926\u7206\u767c) -Mining.Ability.Locked.1=\u9396\u5b9a\u76f4\u5230\u6280\u80fd {0}+ (\u5de8\u5927\u7206\u7834) -Mining.Ability.Locked.2=\u9396\u5b9a\u76f4\u5230\u6280\u80fd {0}+ (\u7206\u7834\u5c08\u5bb6) -Mining.Ability.Lower=[[GRAY]]**\u4f60\u653e\u4e0b\u4e86\u4f60\u7684\u93ac\u5b50** -Mining.Ability.Ready=[[GREEN]]**\u4f60\u63e1\u7dca\u8457\u4f60\u7684\u93ac\u5b50** -Mining.SubSkill.SuperBreaker.Name=\u8d85\u7d1a\u788e\u77f3\u6a5f (\u4e3b\u52d5\u6280\u80fd) -Mining.SubSkill.SuperBreaker.Description=\u901f\u5ea6+, 3\u500d\u6389\u843d\u7387 -Mining.SubSkill.DoubleDrops.Name=\u96d9\u500d\u6389\u843d -Mining.SubSkill.DoubleDrops.Description=\u96d9\u500d\u6389\u843d\u7269\u54c1 -Mining.SubSkill.BlastMining.Name=\u6316\u7926\u7206\u767c -Mining.SubSkill.BlastMining.Description=\u4f7f\u7528TNT\u6316\u7926\u6703\u7372\u5f97\u984d\u5916\u734e\u52f5 -Mining.SubSkill.BiggerBombs.Name=\u5de8\u5927\u7206\u7834 -Mining.SubSkill.BiggerBombs.Description=\u589e\u52a0TNT\u7206\u70b8\u7bc4\u570d -Mining.SubSkill.DemolitionsExpertise.Name=\u7206\u7834\u5c08\u5bb6 -Mining.SubSkill.DemolitionsExpertise.Description=\u6e1b\u5c11\u4f86\u81eaTNT\u7684\u50b7\u5bb3 -Mining.Effect.Decrease=\u7206\u7834\u5c08\u5bb6\u50b7\u5bb3\u6e1b\u5c11: [[YELLOW]]{0} -Mining.Effect.DropChance=\u96d9\u500d\u6389\u843d\u6a5f\u7387: [[YELLOW]]{0} -Mining.Listener=\u6316\u7926: -Mining.SkillName=\u6316\u7926 -Mining.Skills.SuperBreaker.Off=**\u8d85\u7d1a\u788e\u77f3\u6a5f\u5df2\u7ed3\u675f** -Mining.Skills.SuperBreaker.On=[[GREEN]]**\u8d85\u7d1a\u788e\u77f3\u6a5f\u5df2\u4f7f\u7528** -Mining.Skills.SuperBreaker.Other.Off=\u8d85\u7d1a\u788e\u77f3\u6a5f[[GREEN]] \u5df2\u7d93\u7ed3\u675f\u4e86 [[YELLOW]]{0} -Mining.Skills.SuperBreaker.Other.On=[[GREEN]]{0}[[DARK_GREEN]] \u4f7f\u7528\u4e86 [[RED]]\u8d85\u7d1a\u788e\u77f3\u6a5f! -Mining.Skills.SuperBreaker.Refresh=[[GREEN]]\u4f60\u7684[[YELLOW]] \u8d85\u7d1a\u788e\u77f3\u6a5f [[GREEN]]\u80fd\u529b\u5df2\u53ef\u518d\u6b21\u4f7f\u7528\uff01 -Mining.Skillup=\u6316\u7926\u6280\u80fd\u4e0a\u5347\u4e86 {0}! \u7e3d\u7b49\u7d1a ({1})! -Mining.Blast.Boom=[[GRAY]]**\u78b0!** -Mining.Blast.Effect=+{0} \u7926\u7269\u7522\u91cf, {1}x \u6389\u843d\u91cf -Mining.Blast.Radius.Increase=\u7206\u70b8\u534a\u5f91\u63d0\u5347: [[YELLOW]]+{0} -Mining.Blast.Rank=\u6316\u7926\u7206\u767c: [[YELLOW]] \u6392\u540d {0}/8 [[GRAY]]({1}) -Mining.Blast.Other.On=[[GREEN]]{0}[[DARK_GREEN]] \u4f7f\u7528\u4e86 [[RED]]\u6316\u7926\u7206\u767c! -Mining.Blast.Refresh=[[GREEN]]\u4f60\u7684 [[YELLOW]]\u6316\u7926\u7206\u767c [[GREEN]]\u51b7\u537b\u6642\u9593\u5df2\u7d50\u675f! -Repair.SubSkill.Repair.Name=\u4fee\u7406 -Repair.SubSkill.Repair.Description=\u4fee\u7406\u5de5\u5177\u548c\u88dd\u5099 -Repair.SubSkill.GoldRepair.Name=\u4fee\u7406\u9ec3\u91d1 ({0}+ SKILL) -Repair.SubSkill.GoldRepair.Description=\u4fee\u7406\u91d1\u88fd\u5de5\u5177\u548c\u88dd\u5099 -Repair.SubSkill.IronRepair.Name=\u4fee\u7406\u9435 ({0}+ SKILL) -Repair.SubSkill.IronRepair.Description=\u4fee\u7406\u9435\u88fd\u5de5\u5177\u548c\u88dd\u5099 -Repair.SubSkill.StoneRepair.Name=\u4fee\u7406\u77f3\u982d ({0}+ SKILL) -Repair.SubSkill.StoneRepair.Description=\u4fee\u7406\u77f3\u88fd\u5de5\u5177 -Repair.SubSkill.RepairMastery.Name=\u4fee\u7406\u7cbe\u901a -Repair.SubSkill.RepairMastery.Description=\u5df2\u589e\u52a0\u4fee\u7406\u6578\u91cf -Repair.SubSkill.SuperRepair.Name=\u8d85\u7d1a\u4fee\u7406 -Repair.SubSkill.SuperRepair.Description=\u96d9\u500d\u6548\u679c -Repair.SubSkill.DiamondRepair.Name=\u947d\u77f3\u4fee\u7406 ({0}+ SKILL) -Repair.SubSkill.DiamondRepair.Description=\u4fee\u7406\u947d\u77f3\u5de5\u5177\u548c\u88dd\u5099 -Repair.SubSkill.ArcaneForging.Name=\u79d8\u6cd5\u935b\u9020 -Repair.SubSkill.ArcaneForging.Description=\u4fee\u7406\u9644\u9b54\u7269\u54c1 -Repair.SubSkill.Salvage.Name=\u56de\u6536 ({0}+ SKILL) -Repair.SubSkill.Salvage.Description=\u56de\u6536\u5de5\u5177\u548c\u88dd\u7532 -Repair.Error=[[DARK_RED]]mcMMO \u5728\u4fee\u6b63\u6642\u767c\u751f\u4e86\u932f\u8aa4! -Repair.Listener.Anvil=[[DARK_RED]]\u4f60\u5df2\u7d93\u653e\u7f6e\u4e86\u4e00\u500b\u9435\u7827,\u4f60\u53ef\u4ee5\u5728\u9435\u7827\u4e0a\u4fee\u7406\u5de5\u5177\u548c\u88dd\u7532 -Repair.Listener.Anvil2=[[DARK_RED]]\u4f60\u653e\u7f6e\u4e86\u4e00\u500b\u56de\u6536\u53f0,\u4f7f\u7528\u5b83\u4f86\u56de\u6536\u5de5\u5177\u548c\u88dd\u7532 -Repair.Listener=\u4fee\u7406\uff1a -Repair.SkillName=\u4fee\u7406 -Repair.Skills.AdeptSalvage=[[DARK_RED]]\u56e0\u70ba\u719f\u7df4\u5ea6\u4e0d\u5920\u6240\u4ee5\u4f60\u4e0d\u80fd\u56de\u6536\u5b83\u5011 -Repair.Skills.AdeptDiamond=[[DARK_RED]]\u4f60\u7684\u6280\u80fd\u7b49\u7d1a\u4e0d\u8db3\u4ee5\u4fee\u7406\u947d\u77f3\u88dd\u5099! -Repair.Skills.AdeptGold=[[DARK_RED]]\u4f60\u7684\u6280\u80fd\u7b49\u7d1a\u4e0d\u8db3\u4ee5\u4fee\u7406\u9ec4\u91d1\u88dd\u5099! -Repair.Skills.AdeptIron=[[DARK_RED]]\u4f60\u7684\u6280\u80fd\u7b49\u7d1a\u4e0d\u8db3\u4ee5\u4fee\u7406\u9435\u88fd\u88dd\u5099! -Repair.Skills.AdeptStone=[[DARK_RED]]\u4f60\u7684\u6280\u80fd\u7b49\u7d1a\u4e0d\u8db3\u4ee5\u4fee\u7406\u77f3\u982d\u88dd\u5099! -Repair.Skills.Adept=\u4f60\u5fc5\u9808\u9054\u5230\u7b49\u7d1a [[YELLOW]]{0}[[RED]] \u624d\u53ef\u4fee\u7406[[YELLOW]]{1} -Repair.Skills.FeltEasy=[[GRAY]]\u90a3\u770b\u8d77\u4f86\u5f88\u7c21\u55ae. -Repair.Skills.FullDurability=[[GRAY]]\u4f60\u7684\u88dd\u5099\u8010\u4e45\u5ea6\u5df2\u6eff! -Repair.Skills.SalvageSuccess=[[GRAY]]\u7269\u54c1\u5df2\u56de\u6536! -Repair.Skills.NotFullDurability=[[DARK_RED]]\u4f60\u7121\u6cd5\u56de\u6536\u5df2\u53d7\u640d\u7684\u7269\u54c1 -Repair.Skills.Mastery=\u4fee\u7406\u7cbe\u901a: [[YELLOW]]\u984d\u5916\u56de\u5fa9 {0}% \u8010\u4e45\u5ea6 -Repair.Skills.StackedItems=[[DARK_RED]]\u4f60\u7121\u6cd5\u4fee\u7406\u758a\u52a0\u7684\u7269\u54c1 -Repair.Skills.Super.Chance=\u8d85\u7d1a\u4fee\u7406\u6a5f\u7387: [[YELLOW]]{0} -Repair.Skillup=\u4fee\u7406\u6280\u80fd\u4e0a\u5347\u4e86 {0}! \u7e3d\u7b49\u7d1a ({1})! -Repair.Pretty.Name=\u4fee\u7406 -Salvage.Pretty.Name=\u56de\u6536 -Repair.Arcane.Chance.Downgrade=[[GRAY]]\u9644\u9b54\u964d\u7d1a\u6a5f\u7387: [[YELLOW]]{0}% -Repair.Arcane.Chance.Success=[[GRAY]]\u81ea\u52d5\u7784\u6e96\u7684\u6210\u529f\u7387: [[YELLOW]]{0}% -Repair.Arcane.Downgrade=\u9019\u4ef6\u7269\u54c1\u7684\u9644\u9b54\u7b49\u7d1a\u5df2\u4e0b\u964d -Repair.Arcane.Fail=\u9019\u4ef6\u7269\u54c1\u7684\u9644\u9b54\u5df2\u6d88\u5931! -Repair.Arcane.Lost=\u4f60\u7684\u6280\u80fd\u7b49\u7d1a\u4e0d\u8db3\u4ee5\u4fdd\u7559\u9644\u9b54\u5c6c\u6027. -Repair.Arcane.Perfect=[[GREEN]]\u4f60\u6210\u529f\u5730\u4fdd\u7559\u4e86\u9019\u4ef6\u7269\u54c1\u7684\u9644\u9b54. -Repair.Arcane.Rank=\u79d8\u6cd5\u935b\u9020: [[YELLOW]]\u7b49\u7ea7 {0}/4 -Swords.Ability.Lower=[[GRAY]]**\u4f60\u653e\u4e0b\u4e86\u4f60\u7684\u528d** -Swords.Ability.Ready=[[GREEN]]**\u4f60\u63e1\u7dca\u8457\u4f60\u7684\u528d** -Swords.Combat.Bleed.Chance=\u653e\u8840\u6a5f\u7387: [[YELLOW]]{0} -Swords.Combat.Bleed.Length=\u653e\u8840\u6301\u7e8c\u6642\u9593: [[YELLOW]]{0} \u9031\u671f -Swords.Combat.Bleed.Note=[[GRAY]]\u6ce8\u610f: [[YELLOW]]\u6bcf\u5169\u79d2\u6e1b\u4e00\u6ef4\u8840 -Swords.Combat.Bleeding.Started=[[DARK_RED]] \u4f60\u6b63\u5728\u6d41\u8840! -Swords.Combat.Bleeding.Stopped=[[GRAY]]\u653e\u8840\u5df2[[GREEN]]\u505c\u6b62[[GRAY]]! -Swords.Combat.Bleeding=[[GREEN]]**\u6575\u4eba\u6b63\u5728\u4e0d\u65b7\u6d41\u8840** -Swords.Combat.Counter.Chance=\u53cd\u64ca\u6a5f\u7387: [[YELLOW]]{0} -Swords.Combat.Counter.Hit=[[DARK_RED]]\u4f60\u53cd\u64ca\u4e86\u5c0d\u624b! -Swords.Combat.Countered=[[GREEN]]**\u53cd\u5c04\u4e86\u6575\u4eba\u7684\u653b\u64ca** -Swords.Combat.SS.Struck=[[DARK_RED]]\u88ab\u5272\u88c2\u65ac\u653b\u64ca\uff01 -Swords.SubSkill.CounterAttack.Name=\u53cd\u64ca -Swords.SubSkill.CounterAttack.Description=\u683c\u6a94\u6642\u53cd\u5f48{0}\u50b7\u5bb3\u503c -Swords.SubSkill.SerratedStrikes.Name=\u5272\u88c2\u65ac (\u4e3b\u52d5\u6280\u80fd) -Swords.SubSkill.SerratedStrikes.Description={0} \u50b7\u5bb3\u7bc4\u570d, \u653e\u8840\u7bc4\u570d -Swords.Effect.4=\u5272\u88c2\u65ac\u6d41\u8840\u50b7\u5bb3\u589e\u52a0 -Swords.Effect.5={0} \u6d41\u8840\u9031\u671f -Swords.SubSkill.Bleed.Name=\u653e\u8840 -Swords.SubSkill.Bleed.Description=\u7522\u751f\u653e\u8840\u7684\u6301\u7e8c\u50b7\u5bb3 -Swords.Listener=\u528d\u8853: -Swords.SkillName=\u528d\u8853 -Swords.Skills.SS.Off=[[DARK_RED]]\u5272\u88c2\u65ac\u7d50\u675f\u4e86\uff01 -Swords.Skills.SS.On=[[GREEN]]**\u767c\u52d5\u5272\u88c2\u65ac** -Swords.Skills.SS.Refresh=[[GREEN]]\u4f60\u7684 [[YELLOW]]\u5272\u88c2\u65ac [[GREEN]]\u6280\u80fd\u5df2\u53ef\u4f7f\u7528! -Swords.Skills.SS.Other.Off=\u5272\u88c2\u65ac[[GREEN]] \u5373\u5c07\u7d50\u675f [[YELLOW]]{0} -Swords.Skills.SS.Other.On=[[GREEN]]{0}[[DARK_GREEN]] \u4f7f\u7528\u4e86 [[RED]]\u5272\u88c2\u65ac! -Swords.Skillup=\u528d\u8853\u6280\u80fd\u4e0a\u5347\u4e86 {0}! \u7e3d\u7b49\u7d1a ({1})! -Swords.SS.Length=\u5272\u88c2\u65ac\u6301\u7e8c\u6642\u9593: [[YELLOW]]{0}s -Taming.Ability.Bonus.0=\u5371\u6a5f\u610f\u8b58 -Taming.Ability.Bonus.1=\u72fc\u6703\u907f\u958b\u5371\u96aa -Taming.Ability.Bonus.2=\u6bdb\u76ae\u5f37\u5316 -Taming.Ability.Bonus.3=1/{0} \u50b7\u5bb3/\u706b\u7130\u50b7\u5bb3 -Taming.Ability.Bonus.4=\u885d\u64ca\u683c\u64cb -Taming.Ability.Bonus.5=\u7206\u70b8\u50b7\u5bb3\u6e1b\u514d\u70ba 1/{0} -Taming.Ability.Bonus.6=\u5229\u722a -Taming.Ability.Bonus.7=+{0} \u50b7\u5bb3 -Taming.Ability.Bonus.8=\u5feb\u9910\u670d\u52d9 -Taming.Ability.Bonus.9={0} \u4e00\u5b9a\u6a5f\u7387\u5728\u653b\u64ca\u6642\u6062\u5fa9\u8840\u91cf -Taming.Ability.Bonus.10=\u795e\u72ac -Taming.Ability.Bonus.11=\u7576\u88ab\u6cd5\u8853\u653b\u64ca\u6216\u4e2d\u6bd2\u6642\u6062\u5fa9\u751f\u547d\u503c -Taming.Ability.Locked.0=\u9396\u5b9a\u76f4\u5230\u6280\u80fd {0}+ (\u5371\u6a5f\u610f\u8b58) -Taming.Ability.Locked.1=\u9396\u5b9a\u76f4\u5230\u6280\u80fd {0}+ (\u6bdb\u76ae\u5f37\u5316) -Taming.Ability.Locked.2=\u9396\u5b9a\u76f4\u5230\u6280\u80fd {0}+ (\u885d\u64ca\u683c\u64cb) -Taming.Ability.Locked.3=\u9396\u5b9a\u76f4\u5230\u6280\u80fd {0}+ (\u5229\u722a) -Taming.Ability.Locked.4=\u9396\u5b9a\u76f4\u5230\u6280\u80fd {0}+ (\u5feb\u9910\u670d\u52d9) -Taming.Ability.Locked.5=\u9396\u5b9a\u76f4\u5230\u6280\u80fd {0}+ (\u795e\u72ac) -Taming.Combat.Chance.Gore=\u6d41\u8840\u6a5f\u7387: [[YELLOW]]{0} -Taming.SubSkill.BeastLore.Name=\u99b4\u7378\u4e4b\u80fd -Taming.SubSkill.BeastLore.Description=\u62ff\u8457\u9aa8\u982d\u4e26\u4f7f\u7528\u6ed1\u9f20\u53f3\u9375\u4f86\u78ba\u8a8d\u72fc\u8207\u5c71\u8c93\u7684\u72c0\u6cc1 -Taming.SubSkill.ShockProof.Name=\u885d\u64ca\u683c\u64cb -Taming.SubSkill.ShockProof.Description=\u7206\u70b8\u50b7\u5bb3\u6e1b\u514d -Taming.SubSkill.CallOfTheWild.Name=\u91ce\u6027\u547c\u558a -Taming.SubSkill.CallOfTheWild.Description=\u70ba\u4f60\u81ea\u5df1\u53ec\u559a\u4e00\u96bb\u52d5\u7269 -Taming.SubSkill.CallOfTheWild.Description.2=[[GRAY]]\u53ec\u559a (\u5c71\u8c93): \u6309\u4f4fshift\u540c\u6642\u4e26\u6309\u4f4f\u5de6\u9375 \u9084\u9700\u8981\u62ff {0} \u689d\u9b5a\u5728\u624b\u88e1 -Taming.Effect.15=[[GRAY]]\u53ec\u559a (\u72fc): \u6309\u4f4fshift\u540c\u6642\u4e26\u6309\u4f4f\u5de6\u9375 \u9084\u9700\u8981\u62ff {0} \u6839\u9aa8\u982d\u5728\u624b\u88e1 -Taming.SubSkill.Gore.Name0=[[GRAY]]\u53ec\u559a (\u99ac): \u6309\u4f4fshift\u540c\u6642\u4e26\u6309\u4f4f\u5de6\u9375 \u9084\u9700\u8981\u62ff {0} \u500b\u860b\u679c\u5728\u624b\u88e1 -Taming.SubSkill.FastFoodService.Name=\u5feb\u9910\u670d\u52d9 -Taming.SubSkill.FastFoodService.Description=\u4e00\u5b9a\u6a5f\u7387\u4f7f\u72fc\u5728\u653b\u64ca\u6642\u6062\u5fa9\u8840\u91cf -Taming.SubSkill.HolyHound.Name=\u795e\u72ac -Taming.SubSkill.HolyHound.Description=\u6cd5\u8853&\u4e2d\u6bd2\u5c07\u6703\u89f8\u767c\u6cbb\u7642. -Taming.SubSkill.Gore.Name=\u6d41\u8840 -Taming.SubSkill.Gore.Description=\u6703\u5fc3\u4e00\u64ca\u4f7f\u76ee\u6a19\u6d41\u8840 -Taming.SubSkill.SharpenedClaws.Name=\u5229\u722a -Taming.SubSkill.SharpenedClaws.Description=\u50b7\u5bb3\u734e\u52f5 -Taming.SubSkill.EnvironmentallyAware.Name=\u5371\u6a5f\u610f\u8b58 -Taming.SubSkill.EnvironmentallyAware.Description=\u4ed9\u4eba\u638c/\u5ca9\u6f3f \u6050\u61fc\u75c7, \u514d\u75ab\u6389\u5165\u50b7\u5bb3 -Taming.SubSkill.ThickFur.Name=\u6bdb\u76ae\u5f37\u5316 -Taming.SubSkill.ThickFur.Description=\u524a\u6e1b\u706b\u7130\u50b7\u5bb3 -Taming.Listener.Wolf=[[DARK_GRAY]]\u4f60\u7684\u72fc\u8fc5\u901f\u5730\u56de\u5230\u4e86\u4f60\u7684\u8eab\u908a... -Taming.Listener=\u99b4\u7378: -Taming.SkillName=\u99b4\u7378 -Taming.Skillup=\u99b4\u7378\u6280\u80fd\u4e0a\u5347\u4e86 {0}! \u7e3d\u7b49\u7d1a ({1})! -Taming.Summon.Complete=[[GREEN]]\u53ec\u63db\u5b8c\u7562 -Taming.Summon.Fail.Ocelot=\u4f60\u4e0d\u80fd\u53ec\u63db\u5c71\u8c93\u56e0\u70ba\u4f60\u5df2\u7d93\u53ec\u559a\u592a\u591a\u4e86. -Taming.Summon.Fail.Wolf=\u4f60\u4e0d\u80fd\u53ec\u63db\u72fc\u56e0\u70ba\u4f60\u5df2\u7d93\u53ec\u559a\u592a\u591a\u4e86. -Taming.Summon.Fail.Horse=\u4f60\u4e0d\u80fd\u53ec\u63db\u99ac\u56e0\u70ba\u4f60\u5df2\u7d93\u53ec\u559a\u592a\u591a\u4e86. -Taming.Summon.Name.Format={0}s {1} -Unarmed.Ability.Berserk.Length=\u72c2\u66b4\u6301\u7e8c\u6642\u9593: [[YELLOW]]{0}s -Unarmed.Ability.Bonus.0=\u9435\u81c2\u98a8\u683c -Unarmed.Ability.Bonus.1=\u589e\u52a0{0}\u50b7\u5bb3 -Unarmed.Ability.Chance.ArrowDeflect=\u64ca\u843d\u5f13\u7bad\u6a5f\u7387: [[YELLOW]]{0} -Unarmed.Ability.Chance.Disarm=\u64ca\u843d\u6b66\u5668\u6a5f\u7387: [[YELLOW]]{0} -Unarmed.Ability.Chance.IronGrip=\u9435\u722a\u6a5f\u7387: [[YELLOW]]{0} -Unarmed.Ability.IronGrip.Attacker=\u4f60\u7684\u5c0d\u624b\u6709\u9435\u722a! -Unarmed.Ability.IronGrip.Defender=[[GREEN]]\u4f60\u7684\u9435\u722a\u4f7f\u4f60\u7684\u6b66\u5668\u514d\u65bc\u88ab\u64ca\u843d! -Unarmed.Ability.Lower=[[GRAY]]**\u4f60\u653e\u9b06\u4e86\u4f60\u7684\u62f3\u982d** -Unarmed.Ability.Ready=[[GREEN]]**\u4f60\u7dca\u63e1\u8457\u4f60\u7684\u62f3\u982d** -Unarmed.SubSkill.Berserk.Name=\u72c2\u66b4 (\u4e3b\u52d5\u6280\u80fd) -Unarmed.SubSkill.Berserk.Description=+50%\u50b7\u5bb3 \u80fd\u7834\u58de\u786c\u5ea6\u4f4e\u7684\u65b9\u584a -Unarmed.SubSkill.Disarm.Name=\u64ca\u843d\u6b66\u5668 (\u50c5\u9650\u65bc\u73a9\u5bb6) -Unarmed.SubSkill.Disarm.Description=\u4f7f\u6575\u4eba\u624b\u4e2d\u6b66\u5668\u6389\u843d -Unarmed.SubSkill.IronArmStyle.Name=\u9435\u81c2\u98a8\u683c -Unarmed.SubSkill.IronArmStyle.Description=\u4f7f\u4f60\u7684\u88dd\u7532\u96a8\u6642\u9593\u589e\u52a0\u800c\u589e\u5f37 -Unarmed.SubSkill.ArrowDeflect.Name=\u64ca\u843d\u5f13\u7bad -Unarmed.SubSkill.ArrowDeflect.Description=\u8b93\u5f13\u7bad\u504f\u5411 -Unarmed.SubSkill.IronGrip.Name=\u9435\u722a -Unarmed.SubSkill.IronGrip.Description=\u9632\u6b62\u4f60\u7684\u6b66\u5668\u88ab\u64ca\u843d -Unarmed.Listener=\u640f\u64ca: -Unarmed.SkillName=\u640f\u64ca -Unarmed.Skills.Berserk.Off=**\u72c2\u66b4\u5df2\u7ed3\u675f** -Unarmed.Skills.Berserk.On=[[GREEN]]**\u767c\u52d5\u72c2\u66b4** -Unarmed.Skills.Berserk.Other.Off=\u72c2\u66b4[[GREEN]] \u5373\u5c07\u7ed3\u675f [[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\u53ef\u4f7f\u7528! -Unarmed.Skillup=\u640f\u64ca\u6280\u80fd\u4e0a\u5347\u4e86 {0}! \u7e3d\u7b49\u7d1a ({1})! -Woodcutting.Ability.0=\u79cb\u98a8\u6383\u843d\u8449 -Woodcutting.Ability.1=\u6383\u9664\u8449\u5b50 -Woodcutting.Ability.Chance.DDrop=\u96d9\u500d\u6389\u843d\u6a5f\u7387: [[YELLOW]]{0} -Woodcutting.Ability.Length=\u4f10\u6728\u5de5\u6301\u7e8c\u6642\u9593: [[YELLOW]]{0}s -Woodcutting.Ability.Locked.0=\u9396\u5b9a\u76f4\u5230\u6280\u80fd {0}+ (\u79cb\u98a8\u6383\u843d\u8449) -Woodcutting.SubSkill.TreeFeller.Name=\u4f10\u6728\u5de5(\u6280\u80fd) -Woodcutting.SubSkill.TreeFeller.Description=\u7206\u767c\u780d\u6a39 -Woodcutting.SubSkill.LeafBlower.Name=\u79cb\u98a8\u6383\u843d\u8449 -Woodcutting.SubSkill.LeafBlower.Description=\u6383\u9664\u8449\u5b50 -Woodcutting.SubSkill.HarvestLumber.Name=\u96d9\u500d\u6389\u843d -Woodcutting.SubSkill.HarvestLumber.Description=\u96d9\u500d\u6389\u843d\u7269\u54c1 -Woodcutting.Listener=\u4f10\u6728: -Woodcutting.SkillName=\u4f10\u6728 -Woodcutting.Skills.TreeFeller.Off=**\u4f10\u6728\u5de5\u5df2\u7ed3\u675f** -Woodcutting.Skills.TreeFeller.On=[[GREEN]]**\u555f\u52d5\u4f10\u6728\u5de5** -Woodcutting.Skills.TreeFeller.Refresh=[[GREEN]]\u4f60\u7684 [[YELLOW]]\u4f10\u6728\u5de5 [[GREEN]]\u5df2\u53ef\u4f7f\u7528\uff01 -Woodcutting.Skills.TreeFeller.Other.Off=\u4f10\u6728\u5de5[[GREEN]] \u5373\u5c07\u7ed3\u675f [[YELLOW]]{0} -Woodcutting.Skills.TreeFeller.Other.On=[[GREEN]]{0}[[DARK_GREEN]] \u4f7f\u7528\u4e86 [[RED]]\u4f10\u6728\u5de5! -Woodcutting.Skills.TreeFeller.Splinter=\u4f60\u7684\u65a7\u982d\u8b8a\u6210\u4e86\u4e00\u5806\u788e\u7247\uff01 -Woodcutting.Skills.TreeFeller.Threshold=\u9019\u68f5\u6a39\u592a\u5927\u4e86! -Woodcutting.Skillup=\u4f10\u6728\u6280\u80fd\u4e0a\u5347\u4e86 {0}! \u7e3d\u7b49\u7d1a ({1})! -Ability.Generic.Refresh=[[GREEN]]**\u6280\u80fd\u51b7\u537b\u5b8c\u7562!** -Ability.Generic.Template.Lock=[[GRAY]]{0} -Ability.Generic.Template=[[GOLD]]{0}: [[DARK_AQUA]]{1} -Combat.ArrowDeflect=[[WHITE]]**\u64ca\u843d\u5f13\u7bad** -Combat.BeastLore=[[GREEN]]**\u99b4\u7378\u4e4b\u80fd** -Combat.BeastLoreHealth=[[DARK_AQUA]]\u751f\u547d\u503c ([[GREEN]]{0}[[DARK_AQUA]]/{1}) -Combat.BeastLoreOwner=[[DARK_AQUA]]\u64c1\u6709\u8005 ([[RED]]{0}[[DARK_AQUA]]) -Combat.Gore=[[GREEN]]**\u6d41\u8840** -Combat.StruckByGore=**\u4f60\u958b\u59cb\u6d41\u8840\u4e86** -Combat.TargetDazed=\u76ee\u6a19\u5df2\u88ab [[DARK_RED]] \u64ca\u6688 -Combat.TouchedFuzzy=[[DARK_RED]]\u982d\u6688\u76ee\u7729... -mcMMO.Description=[[DARK_AQUA]]\u95dc\u65bc [[YELLOW]]mcMMO[[DARK_AQUA]] \u5c08\u6848:,[[GOLD]]mcMMO\u662f\u4e00\u500b[[RED]]\u958b\u653e\u539f\u59cb\u78bc\u7684[[GOLD]] RPG \u6a21\u7d44\u59cb\u65bc2011\u5e74\u4e8c\u6708,[[GOLD]]\u5efa\u7acb\u8005 [[BLUE]]nossr50[[GOLD]]. \u65e8\u5728\u63d0\u4f9b\u4e00\u500b\u9ad8\u54c1\u8ceaRPG\u9ad4\u9a57.,[[DARK_AQUA]]\u5c0f\u6280\u5de7:,[[GOLD]] - [[GREEN]]\u8f38\u5165 [[RED]]/mcmmo help[[GREEN]] \u4ee5\u4e86\u89e3\u6240\u6709\u6307\u4ee4,[[GOLD]] - [[GREEN]]\u8f38\u5165 [[RED]]/\u6280\u80fd\u540d\u7a31 [[GREEN]]\u4ee5\u4e86\u89e3\u6280\u80fd\u7d30\u7bc0,[[DARK_AQUA]]\u958b\u767c\u8005:,[[GOLD]] - [[GREEN]]nossr50 [[BLUE]](\u8d0a\u52a9\u8005),[[GOLD]] - [[GREEN]]GJ [[BLUE]](\u5c08\u6848\u9818\u5c0e\u4eba),[[GOLD]] - [[GREEN]]NuclearW [[BLUE]](\u958b\u767c\u8005),[[GOLD]] - [[GREEN]]bm01 [[BLUE]](\u958b\u767c\u8005),[[GOLD]] - [[GREEN]]TfT_02 [[BLUE]](\u958b\u767c\u8005),[[GOLD]] - [[GREEN]]Glitchfinder [[BLUE]](\u958b\u767c\u8005),[[GOLD]] - [[GREEN]]t00thpick1 [[BLUE]](\u958b\u767c\u8005),[[DARK_AQUA]]\u5be6\u7528\u9023\u7d50:,[[GOLD]] - [[GREEN]]https://github.com/mcMMO-Dev/mcMMO/issues[[GOLD]] \u932f\u8aa4\u56de\u5831,[[GOLD]] - [[GREEN]]#mcmmo @ irc.esper.net[[GOLD]] IRC \u983b\u9053, -Commands.addlevels.AwardAll.1=[[GREEN]]\u5728\u5168\u90e8\u7684\u6280\u80fd\u88e1\u4f60\u9084\u5dee {0} \u7b49\u7d1a! -Commands.addlevels.AwardAll.2=\u6240\u6709\u6280\u80fd\u7b49\u7d1a\u5df2\u88ab\u8a2d\u5b9a\u70ba {0}. -Commands.addlevels.AwardSkill.1=[[GREEN]]{1}\u6280\u80fd\u5df2\u589e\u52a0{0}\u7b49! -Commands.addlevels.AwardSkill.2={0} \u56e0\u70ba {1} \u800c\u4fee\u6539. -Commands.addxp.AwardAll=[[GREEN]]\u5728\u5168\u90e8\u7684\u6280\u80fd\u88e1\u4f60\u9084\u5dee {0} \u7d93\u9a57\u503c! -Commands.addxp.AwardSkill=[[GREEN]]\u4f60\u5728 {1} \u4e2d\u88ab\u734e\u52f5\u4e86 {0} \u7d93\u9a57\u503c! -Commands.Ability.Off=\u6280\u80fd\u4f7f\u7528 [[RED]]\u95dc\u9589 -Commands.Ability.On=\u6280\u80fd\u4f7f\u7528 [[GREEN]]\u555f\u52d5 -Commands.Ability.Toggle=\u6280\u80fd\u4f7f\u7528\u5df2\u88ab\u5207\u63db\u70ba [[YELLOW]]{0} -Commands.AdminChat.Off=\u7ba1\u7406\u54e1\u804a\u5929\u6a21\u5f0f [[RED]]\u95dc\u9589 -Commands.AdminChat.On=\u7ba1\u7406\u54e1\u804a\u5929\u6a21\u5f0f [[GREEN]]\u958b\u555f -Commands.AdminToggle=- \u5207\u63db\u7ba1\u7406\u54e1\u804a\u5929\u6a21\u5f0f -Commands.Chat.Console=*\u63a7\u5236\u53f0* -Commands.Cooldowns.Header=[[GOLD]]--= [[GREEN]]mcMMO \u80fd\u529b\u51b7\u537b\u6642\u9593[[GOLD]] =-- -Commands.Cooldowns.Row.N=\\ [[RED]]{0}[[WHITE]] - [[GOLD]]\u5c1a\u9918 {1} \u79d2 -Commands.Cooldowns.Row.Y=\\ [[AQUA]]{0}[[WHITE]] - [[DARK_GREEN]] \u5df2\u53ef\u4f7f\u7528! -Commands.Database.Cooldown=\u518d\u6b21\u4f7f\u7528\u6b64\u547d\u4ee4\u4e4b\u524d,\u4f60\u5fc5\u9808\u7b49\u4e0a1\u79d2. -Commands.Disabled=\u9019\u500b\u6307\u4ee4\u88ab\u7981\u7528\u4e86. -Commands.DoesNotExist=\u6b64\u73a9\u5bb6\u4e0d\u5b58\u5728\uff01 -Commands.GodMode.Disabled=mcMMO \u795e\u4e4b\u6a21\u5f0f\u53d6\u6d88 -Commands.GodMode.Enabled=mcMMO \u795e\u4e4b\u6a21\u5f0f\u958b\u555f -Commands.GodMode.Forbidden=[mcMMO] \u795e\u4e4b\u6a21\u5f0f\u4e0d\u5141\u8a31\u5728\u9019\u4e16\u754c\u958b\u555f (\u8acb\u89c0\u770b\u6b0a\u9650\u8a2d\u5b9a) -Commands.GodMode.Toggle=\u795e\u4e4b\u6a21\u5f0f\u5df2\u88ab\u5207\u63db\u70ba [[YELLOW]]{0} -Commands.Healthbars.Changed.HEARTS=[mcMMO] \u4f60\u7684\u8840\u689d\u986f\u793a\u6a21\u5f0f\u5df2\u66f4\u6539\u70ba [[RED]]\u611b\u5fc3[[WHITE]]. -Commands.Healthbars.Changed.BAR=[mcMMO] \u4f60\u7684\u8840\u689d\u986f\u793a\u6a21\u5f0f\u5df2\u66f4\u6539\u70ba [[YELLOW]]\u65b9\u584a[[WHITE]]. -Commands.Healthbars.Changed.DISABLED=[mcMMO] \u4f60\u7684\u602a\u7269\u8840\u689d\u5df2 [[GRAY]]\u505c\u7528[[WHITE]]. -Commands.Healthbars.Invalid=\u4e0d\u6b63\u78ba\u7684\u8840\u689d\u985e\u578b! -Commands.Inspect= [[RED]]-\u67e5\u770b\u73a9\u5bb6\u8a73\u7d30\u8a0a\u606f -Commands.Party.Invite.Accepted=[[GREEN]]\u63a5\u53d7\u9080\u8acb\uff0c\u4f60\u52a0\u5165\u4e86\u968a\u4f0d {0} -Commands.Invite.Success=[[GREEN]]\u9080\u8acb\u8a0a\u606f\u767c\u9001\u6210\u529f -Commands.Leaderboards= [[RED]]- \u6392\u884c\u699c -Commands.mcc.Header=---[][[YELLOW]]mcMMO \u6307\u4ee4[[RED]][]--- -Commands.mcgod=- \u5207\u63db\u70ba\u795e\u4e4b\u6a21\u5f0f -Commands.mchud.Invalid=\u90a3\u4e0d\u662f\u4e00\u500b\u53ef\u7528\u7684HUD\u985e\u578b. -Commands.mcpurge.Success=[[GREEN]]\u6578\u64da\u5df2\u91cd\u7f6e! -Commands.mcrank.Heading=[[GOLD]]-=\u500b\u4eba\u6392\u884c=- -Commands.mcrank.Overall=\u6574\u9ad4[[GREEN]] - [[GOLD]]\u6392\u884c [[WHITE]]#[[GREEN]]{0} -Commands.mcrank.Player=\u76ee\u6a19: [[WHITE]]{0} -Commands.mcrank.Skill={0}[[GREEN]] - [[GOLD]]\u6392\u540d [[WHITE]]#[[GREEN]]{1} -Commands.mcrank.Unranked=[[WHITE]]\u6392\u884c\u699c\u5916 -Commands.mcrefresh.Success={0} \u79d2\u5f8c\u51b7\u537b\u6642\u9593\u5b8c\u7562. -Commands.mcremove.Success=[[GREEN]]{0} \u5df2\u6210\u529f\u5f9e\u6578\u64da\u88e1\u79fb\u9664! -Commands.mctop.Tip=[[GOLD]]\u5c0f\u6487\u6b65: \u6253 [[RED]]/mcrank[[GOLD]] \u53ef\u4ee5\u89c0\u770b\u4f60\u7684\u6392\u540d! -Commands.mmoedit=[player] [[RED]] - \u7de8\u8f2f\u76ee\u6a19 -Commands.mmoedit.AllSkills.1=[\u7da0\u8272]\u60a8\u6240\u6709\u7684\u6280\u80fd\u7b49\u7d1a\u88ab\u8a2d\u5b9a\u70ba{0}\uff01 -Commands.mmoedit.Modified.1=[[GREEN]]\u4f60\u7684 {0} \u7b49\u7d1a\u88ab\u8a2d\u5b9a\u70ba {1}! -Commands.mmoedit.Modified.2={0} \u56e0\u70ba {1} \u800c\u4fee\u6539. -Commands.mcconvert.Database.Same=\u4f60\u6b63\u5728\u4f7f\u7528{0}\u8cc7\u6599\u5eab! -Commands.mcconvert.Database.InvalidType={0}\u4e0d\u662f\u4e00\u500b\u6b63\u78ba\u7684\u8cc7\u6599\u5eab\u7a2e\u985e. -Commands.mcconvert.Database.Start=[[GRAY]]\u958b\u59cb\u5f9e{0}\u8f49\u63db\u81f3{1}... -Commands.mcconvert.Database.Finish=[[GRAY]]\u8cc7\u6599\u5eab\u9077\u79fb\u5b8c\u6210; {1}\u8cc7\u6599\u5eab\u73fe\u5728\u64c1\u6709{0}\u8cc7\u6599\u5eab\u7684\u6240\u6709\u8cc7\u6599. -Commands.mmoshowdb=\u76ee\u524d\u4f7f\u7528\u7684\u8cc7\u6599\u5eab\u662f [[GREEN]]{0} -Commands.mcconvert.Experience.Invalid=\u4e0d\u660e\u7684\u516c\u5f0f\u7a2e\u985e! \u6b63\u78ba\u7684\u7a2e\u985e\u70ba: [[GREEN]]LINEAR [[RED]]\u548c [[GREEN]]EXPONENTIAL. -Commands.mcconvert.Experience.Same=\u6b63\u5728\u4f7f\u7528{0}\u516c\u5f0f -Commands.mcconvert.Experience.Start=[[GRAY]]\u958b\u59cb\u5f9e{0}\u8f49\u63db\u5230{1}\u66f2\u7dda -Commands.mcconvert.Experience.Finish=[[GRAY]]\u516c\u5f0f\u8f49\u63db\u5b8c\u6210; \u73fe\u5728\u958b\u59cb\u4f7f\u7528{0} XP\u66f2\u7dda. -Commands.ModDescription=- \u8acb\u95b1\u8b80\u63d2\u4ef6\u63cf\u8ff0 -Commands.NoConsole=\u9019\u500b\u6307\u4ee4\u4e0d\u53ef\u4f7f\u7528 -Commands.Notifications.Off=\u5207\u63db\u80fd\u529b\u901a\u77e5\u70ba [[RED]]\u95dc\u9589 -Commands.Notifications.On=\u5207\u63db\u80fd\u529b\u901a\u77e5\u70ba [[GREEN]]\u958b\u555f -Commands.Offline=[RED]]\u9019\u500b\u6307\u4ee4\u4e26\u4e0d\u9069\u7528\u65bc\u96e2\u7dda\u73a9\u5bb6. -Commands.Other=[[GREEN]]--\u5176\u4ed6\u6307\u4ee4-- -Commands.Party.Header=-----[][[GREEN]]\u968a\u4f0d[[RED]][]----- -Commands.Party.Status=[[DARK_GRAY]]\u540d\u5b57: [[WHITE]]{0} {1} -Commands.Party.ShareMode=[[DARK_GRAY]]\u5206\u4eab\u6a21\u5f0f: -Commands.Party.ItemShare=[[GRAY]]\u7269\u54c1 [[DARK_AQUA]]({0}) -Commands.Party.ExpShare=[[GRAY]]\u7d93\u9a57\u503c [[DARK_AQUA]]({0}) -Commands.Party.ItemShareCategories=[[DARK_GRAY]]\u5171\u4eab\u7269\u54c1: [[GRAY]][[ITALIC]]{0} -Commands.Party.MembersNear=[[DARK_GRAY]]\u63a5\u8fd1\u4f60 [[DARK_AQUA]]{0}[[DARK_GRAY]]/[[DARK_AQUA]]{1} -Commands.Party.Accept=- \u63a5\u53d7\u968a\u4f0d\u9080\u8acb -Commands.Party.Chat.Off=\u968a\u4f0d\u804a\u5929\u6a21\u5f0f[[RED]]\u53d6\u6d88 -Commands.Party.Chat.On=\u968a\u4f0d\u804a\u5929\u6a21\u5f0f [[GREEN]]\u958b\u555f -Commands.Party.Commands=[[GREEN]]--\u7d44\u968a\u6307\u4ee4-- -Commands.Party.Invite.0=\u6ce8\u610f: [[GREEN]]\u4f60\u6536\u5230\u4e86\u4f86\u81ea {1} \u7684\u968a\u4f0d\u9080\u8acb {0} -Commands.Party.Invite.1=\u8f38\u5165 [[GREEN]]/party accept[[YELLOW]] \u4f86\u63a5\u53d7\u9080\u8acb -Commands.Party.Invite=- \u5df2\u767c\u9001\u968a\u4f0d\u9080\u8acb -Commands.Party.Join=[[GRAY]]\u52a0\u5165\u7684\u968a\u4f0d: {0} -Commands.Party.Create=[[GRAY]]\u5275\u5efa\u7684\u968a\u4f0d\u540d\u7a31: {0} -Commands.Party.Rename=[[GRAY]]\u968a\u4f0d\u540d\u7a31\u5df2\u66f4\u6539\u70ba: [[WHITE]]{0} -Commands.Party.SetSharing=[[GRAY]]\u968a\u4f0d {0} \u5206\u4eab\u8a2d\u5b9a\u70ba: [[DARK_AQUA]]{1} -Commands.Party.ToggleShareCategory=[[GRAY]]\u968a\u4f0d\u5171\u4eab\u7684\u7269\u54c1[[GOLD]]{0} [[GRAY]] \u5df2\u7d93 [[DARK_AQUA]]{1} -Commands.Party.AlreadyExists=[[DARK_RED]]\u5c0d\u4f0d{0} \u5df2\u5b58\u5728! -Commands.Party.Kick=\u4f60\u5df2\u88ab {0} \u8e22\u51fa\u968a\u4f0d! -Commands.Party.Leave=\u4f60\u96e2\u958b\u4e86\u9019\u652f\u968a\u4f0d -Commands.Party.Members.Header=[RED]] ----- [] [GREEN]\u6210\u54e1[RED] [] ----- -Commands.Party.None=\u4f60\u4e0d\u5728\u968a\u4f0d\u4e2d. -Commands.Party.Quit=- \u96e2\u958b\u4f60\u73fe\u5728\u7684\u968a\u4f0d -Commands.Party.Teleport= [[RED]]- \u50b3\u9001\u5230\u968a\u4f0d\u6210\u54e1\u65c1 -Commands.Party.Toggle=- \u5207\u63db\u968a\u4f0d\u804a\u5929 -Commands.Party.1=- \u5275\u5efa\u65b0\u7684\u968a\u4f0d -Commands.Party.2=- \u52a0\u5165\u73a9\u5bb6\u7684\u968a\u4f0d\u88e1 -Commands.ptp.Enabled=\u968a\u4f0d\u50b3\u9001 [[GREEN]]\u5141\u8a31 -Commands.ptp.Disabled=\u968a\u4f0d\u50b3\u9001 [[RED]]\u4e0d\u5141\u8a31 -Commands.ptp.NoRequests=\u4f60\u73fe\u5728\u4e0d\u53ef\u4ee5\u50b3\u9001 -Commands.ptp.NoWorldPermissions= [mcMMO]\u60a8\u6c92\u6709\u6b0a\u9650\u50b3\u9001\u5230\u4e16\u754c{0}. -Commands.ptp.Request1={0} [[GREEN]]\u5df2\u50b3\u9001\u81f3\u4f60\u65c1\u908a. -Commands.ptp.Request2=[[GREEN]]\u4f60\u50b3\u9001\u7684\u8a71\u8acb\u8f38\u5165[[YELLOW]]/ptp accept. [[GREEN]]\u5728[[RED]]{0} [[GREEN]]\u79d2\u5167\u5fc5\u9808\u5b8c\u6210 -Commands.ptp.AcceptAny.Enabled=\u968a\u4f0d\u50b3\u9001\u8acb\u6c42\u78ba\u8a8d [[GREEN]]\u555f\u7528 -Commands.ptp.AcceptAny.Disabled=\u968a\u4f0d\u50b3\u9001\u8acb\u6c42\u78ba\u8a8d[[RED]]\u7981\u7528 -Commands.ptp.RequestExpired=\u968a\u4f0d\u50b3\u9001\u5df2\u6210\u529f! -Commands.PowerLevel.Leaderboard=--mcMMO[[BLUE]] \u6230\u9b25\u529b [[YELLOW]]\u6392\u884c\u699c-- -Commands.PowerLevel.Capped=[[DARK_RED]]\u6230\u9b25\u529b: [[GREEN]]{0} [[DARK_RED]]\u6700\u9ad8\u7b49\u7d1a: [[YELLOW]]{1} -Commands.PowerLevel=[[DARK_RED]]\u6230\u9b25\u529b: [[GREEN]]{0} -Commands.Reset.All=[[GREEN]]\u4f60\u5168\u90e8\u7684\u6280\u80fd\u7b49\u7d1a\u4ee5\u91cd\u7f6e\u6210\u529f. -Commands.Reset.Single=[[GREEN]]\u4f60\u7684 {0} \u6280\u80fd\u7b49\u7d1a\u4ee5\u91cd\u7f6e\u6210\u529f. -Commands.Reset=\u8a2d\u5b9a\u6280\u80fd\u7b49\u7d1a\u70ba0 -Commands.Scoreboard.Clear=[[DARK_AQUA]]\u5df2\u6e05\u9664 mcMMO \u5f97\u5206\u699c. -Commands.Scoreboard.NoBoard=mcMMO \u5f97\u5206\u699c\u4e26\u672a\u555f\u7528. -Commands.Scoreboard.Keep=[[DARK_AQUA]]mcMMO \u5f97\u5206\u699c\u6703\u6301\u7e8c\u986f\u793a\u76f4\u5230\u4f60\u8f38\u5165 [[GREEN]]/mcscoreboard clear[[DARK_AQUA]]. -Commands.Scoreboard.Timer=[[DARK_AQUA]]mcMMO \u5f97\u5206\u699c\u5c07\u5728 [[GOLD]]{0}[[DARK_AQUA]] \u79d2\u540e\u6e05\u9664. -Commands.Scoreboard.Help.0=[[GOLD]] == [[RED]]/mcscoreboard [[GREEN]]\u8aaa\u660e [[GOLD]]== -Commands.Scoreboard.Help.1=[[DARK_AQUA]]/mcscoreboard[[AQUA]] clear [[WHITE]] - \u6e05\u9664 McMMO \u5f97\u5206\u699c -Commands.Scoreboard.Help.2=[[DARK_AQUA]]/mcscoreboard[[AQUA]] keep [[WHITE]] - \u6301\u7e8c\u986f\u793a mcMMO \u5f97\u5206\u699c -Commands.Scoreboard.Help.3=[[DARK_AQUA]]/mcscoreboard[[AQUA]] \u6642\u9593 [n] [[WHITE]] - \u5728 [[LIGHT_PURPLE]]n[[WHITE]] \u79d2\u4e4b\u5f8c\u6e05\u9664 McMMO \u5f97\u5206\u699c -Commands.Scoreboard.Tip.Keep=[[GOLD]]\u5c0f\u6280\u5de7: \u7576\u5f97\u5206\u699c\u51fa\u73fe\u6642\u8f38\u5165 [[RED]]/mcscoreboard keep[[GOLD]] \u4f86\u907f\u514d\u5b83\u6d88\u5931. -Commands.Scoreboard.Tip.Clear=[[GOLD]]\u5c0f\u6280\u5de7: \u8f38\u5165 [[RED]]/mcscoreboard clear[[GOLD]] \u4f86\u6e05\u9664\u5f97\u5206\u699c. -Commands.Skill.Invalid=\u9019\u4e0d\u662f\u4e00\u500b\u6709\u6548\u7684\u6280\u80fd\u540d\u5b57! -Commands.Skill.Leaderboard=--mcMMO [[BLUE]]{0}[[YELLOW]] \u6392\u884c\u699c-- -Commands.SkillInfo=- \u67e5\u770b\u6280\u80fd\u7684\u8a73\u7d30\u8cc7\u8a0a -Commands.Stats.Self=\u4f60\u7684\u8a0a\u606f -Commands.Stats=- \u67e5\u770b\u4f60\u7684mcMMO\u7d71\u8a08\u8a0a\u606f -Commands.ToggleAbility=- \u7528\u6ed1\u9f20\u53f3\u9375\u5207\u63db\u6280\u80fd\u4f7f\u7528\u6a21\u5f0f -Commands.Usage.0=\u6b63\u78ba\u7528\u6cd5\u70ba/{0} -Commands.Usage.1=\u8acb\u8f38\u5165 /{0} {1} -Commands.Usage.2=\u8acb\u8f38\u5165 /{0} {1} {2} -Commands.Usage.3=\u8acb\u8f38\u5165 /{0} {1} {2} {3} -Commands.Usage.FullClassName=\u985e\u5225\u540d\u7a31 -Commands.Usage.Level=\u7b49\u7d1a -Commands.Usage.Message=\u8a0a\u606f -Commands.Usage.Page=\u9801\u6578 -Commands.Usage.PartyName=\u540d\u7a31 -Commands.Usage.Password=\u5bc6\u78bc -Commands.Usage.Player=\u73a9\u5bb6 -Commands.Usage.Rate=\u6a5f\u7387 -Commands.Usage.Skill=\u6280\u80fd -Commands.Usage.XP=\u7d93\u9a57\u503c -mcMMO.NoInvites=\u4f60\u6c92\u6709\u6536\u5230\u4efb\u4f55\u968a\u4f0d\u9080\u8acb -mcMMO.NoPermission=[[DARK_RED]]\u6b0a\u9650\u4e0d\u8db3 -mcMMO.NoSkillNote=[[DARK_GRAY]]\u5982\u679c\u4f60\u7121\u6cd5\u4f7f\u7528\u90a3\u4e9b\u6280\u80fd\u5c31\u4e0d\u6703\u51fa\u73fe\u5728\u9019\u88e1 -Party.Forbidden=[mcMMO] \u968a\u4f0d\u529f\u80fd\u4e0d\u5141\u8a31\u5728\u9019\u4e16\u754c\u958b\u555f (\u8acb\u89c0\u770b\u6b0a\u9650\u8a2d\u5b9a) -Party.Help.0=\u6b63\u78ba\u7528\u6cd5\u70ba[[DARK_AQUA]]{0} [password]. -Party.Help.1=\u8981\u5275\u5efa\u4e00\u500b\u968a\u4f0d\uff0c\u8acb\u4f7f\u7528[[DARK_AQUA]] {0} [password]. -Party.Help.2=\u66f4\u591a\u8cc7\u8a0a\u8acb\u8aee\u8a62[[DARK_AQUA]]{0} -Party.Help.3=\u4f7f\u7528 [[DARK_AQUA]]{0} [password] [[RED]]\u4f86\u52a0\u5165\u6216\u4f7f\u7528 [[DARK_AQUA]]{1} [[RED]]\u4f86\u96e2\u958b -Party.Help.4=\u6b32\u9396\u5b9a\u6216\u89e3\u9396\u4f60\u7684\u968a\u4f0d\uff0c\u4f7f\u7528[[DARK_AQUA]] {0} -Party.Help.5=\u6b32\u4f7f\u7528\u5bc6\u78bc\u4fdd\u8b77\u4f60\u7684\u968a\u4f0d\uff0c\u8acb\u4f7f\u7528[[DARK_AQUA]] {0} -Party.Help.6=\u8981\u5f9e\u968a\u4f0d\u4e2d\u8e22\u6389\u6210\u54e1\uff0c\u4f7f\u7528[[DARK_AQUA]] {0} -Party.Help.7=\u8981\u8f49\u79fb\u4f60\u7684\u968a\u4f0d\u6240\u6709\u6b0a\uff0c\u4f7f\u7528[[DARK_AQUA]] {0} -Party.Help.8=\u8981\u89e3\u6563\u968a\u4f0d\uff0c\u4f7f\u7528[[DARK_AQUA]] {0} -Party.Help.9=\u4f7f\u7528 [[DARK_AQUA]]{0} [[RED]]\u4f86\u548c\u968a\u54e1\u5206\u4eab\u7269\u54c1 -Party.Help.10=\u4f7f\u7528 [[DARK_AQUA]]{0} [[RED]]\u4f86\u555f\u7528\u548c\u968a\u54e1\u5206\u4eab\u7d93\u9a57 -Party.InformedOnJoin={0} [[GREEN]]\u52a0\u5165\u4e86\u4f60\u7684\u968a\u4f0d -Party.InformedOnQuit={0} [[GREEN]]\u96e2\u958b\u4e86\u4f60\u7684\u968a\u4f0d -Party.InformedOnNameChange=[[GOLD]]{0} [[GREEN]]\u5c07\u968a\u4f0d\u540d\u7a31\u8a2d\u5b9a\u70ba [[WHITE]]{1} -Party.InvalidName=[[DARK_RED]]\u90a3\u4e0d\u662f\u4e00\u500b\u6709\u6548\u7684\u968a\u4f0d\u540d\u7a31. -Party.Invite.Self=\u4f60\u4e0d\u80fd\u9080\u8acb\u81ea\u5df1\uff01 -Party.IsLocked=\u9019\u500b\u968a\u4f0d\u5df2\u7d93\u9396\u5b9a\u4e86! -Party.IsntLocked=\u9019\u500b\u968a\u4f0d\u4e26\u6c92\u6709\u9396\u5b9a! -Party.Locked=\u9019\u500b\u968a\u4f0d\u5df2\u9396\u5b9a!\u53ea\u6709\u968a\u9577\u53ef\u4ee5\u9080\u8acb! -Party.NotInYourParty=[[DARK_RED]]{0} \u4f60\u4e0d\u5728\u4f60\u7684\u5718\u968a -Party.NotOwner=[[DARK_RED]]\u4f60\u4e26\u975e\u968a\u9577. -Party.Owner.New=[[GREEN]]{0} \u6210\u70ba\u65b0\u968a\u9577. -Party.Owner.NotLeader=[[DARK_RED]]\u56e0\u9592\u7f6e\u904e\u4e45,\u968a\u9577\u81ea\u52d5\u8f49\u8b93. -Party.Owner.Player=[[GREEN]]\u4f60\u6210\u70ba\u4e86\u968a\u9577. -Party.Password.None=\u9019\u500b\u968a\u4f0d\u6709\u5bc6\u78bc\u4fdd\u8b77. \u8acb\u63d0\u4f9b\u5bc6\u78bc\u4f86\u52a0\u5165. -Party.Password.Incorrect=\u968a\u4f0d\u5bc6\u78bc\u932f\u8aa4. -Party.Password.Set=[[GREEN]]\u968a\u4f0d\u5bc6\u78bc\u8a2d\u5b9a\u70ba {0} -Party.Password.Removed=[[GREEN]]\u968a\u4f0d\u5bc6\u78bc\u5df2\u522a\u9664. -Party.Player.Invalid=\u6b64\u73a9\u5bb6\u4e0d\u5b58\u5728 -Party.NotOnline=[[DARK_RED]]{0} \u4e26\u4e0d\u5728\u7dda\u4e0a! -Party.Player.InSameParty={0} \u5df2\u7d93\u5728\u4f60\u968a\u4f0d\u88e1\u4e86! -Party.PlayerNotInParty=[[DARK_RED]]{0} \u5df2\u4e0d\u5728\u4f60\u7684\u5718\u968a -Party.Specify=\u4f60\u5fc5\u9808\u6307\u5b9a\u4e00\u500b\u968a\u4f0d. -Party.Teleport.Dead=\u4f60\u4e0d\u80fd\u50b3\u9001\u81f3\u6b7b\u4ea1\u7684\u73a9\u5bb6\u65c1 -Party.Teleport.Hurt=\u4f60\u5728{0}\u79d2\u524d\u88ab\u653b\u64ca\u6240\u4ee5\u7121\u6cd5\u50b3\u9001. -Party.Teleport.Player=[[GREEN]]\u4f60\u5df2\u7d93\u50b3\u9001\u5230 {0}. -Party.Teleport.Self=\u4f60\u7121\u6cd5\u50b3\u9001\u5230\u4f60\u81ea\u5df1\u8eab\u65c1! -Party.Teleport.Target=[[GREEN]]{0} \u5df2\u7d93\u50b3\u9001\u5230\u4f60\u8eab\u908a. -Party.Teleport.Disabled={0} \u4e0d\u5141\u8a31\u968a\u4f0d\u50b3\u9001. -Party.Rename.Same= {0}\u4f60\u7684\u968a\u4f0d\u5df2\u7d93\u662f\u9019\u500b\u540d\u5b57\u4e86! -Party.Join.Self=\u4f60\u7121\u6cd5\u52a0\u5165\u81ea\u5df1! -Party.Unlocked=[[GRAY]]\u968a\u4f0d\u5df2\u89e3\u9396! -Party.Disband=[[GRAY]]\u968a\u4f0d\u5df2\u89e3\u6563 -Party.Status.Locked=[[DARK_RED]](\u53ea\u53ef\u9080\u8acb) -Party.Status.Unlocked=[[DARK_GREEN]](\u958b\u555f) -Party.ShareType.Xp=\u7d93\u9a57\u503c -Party.ShareType.Item=\u7269\u54c1 -Party.ShareMode.None=\u7121 -Party.ShareMode.Equal=\u5e73\u5206 -Party.ShareMode.Random=\u96a8\u6a5f -Party.XpShare.Disabled=\u968a\u4f0d\u7d93\u9a57\u5171\u4eab\u5df2\u505c\u7528. -Party.ItemShare.Disabled=\u968a\u4f0d\u7684\u7269\u54c1\u5206\u4eab\u95dc\u9589. -Party.ItemShare.Category.Loot=\u62fe\u53d6 -Party.ItemShare.Category.Mining=\u6316\u7926 -Party.ItemShare.Category.Herbalism=\u8349\u85e5\u5b78 -Party.ItemShare.Category.Woodcutting=\u4f10\u6728 -Party.ItemShare.Category.Misc=\u96dc\u9805 -Commands.XPGain.Acrobatics=\u6389\u843d -Commands.XPGain.Archery=\u653b\u64ca\u602a\u7269 -Commands.XPGain.Axes=\u653b\u64ca\u602a\u7269 -Commands.XPGain.Child=\u5f9e\u524d\u7f6e\u6280\u80fd\u7372\u53d6\u7b49\u7d1a -Commands.XPGain.Excavation=\u6316\u5230\u5bf6\u7269 -Commands.XPGain.Fishing=\u91e3\u9b5a!(\u53bb\u60f3\u60f3\u5427!) -Commands.XPGain.Herbalism=\u6536\u7a6b\u8fb2\u4f5c\u7269 -Commands.XPGain.Mining=\u6316\u6398\u77f3\u982d\u548c\u7926\u7269 -Commands.XPGain.Repair=\u4fee\u7406 -Commands.XPGain.Swords=\u653b\u64ca\u602a\u7269 -Commands.XPGain.Taming=\u99b4\u7378, \u6216\u548c\u4f60\u7684\u72fc\u4e00\u8d77\u6230\u9b25 -Commands.XPGain.Unarmed=\u653b\u64ca\u602a\u7269 -Commands.XPGain.Woodcutting=\u780d\u6a39 -Commands.XPGain=[[DARK_GRAY]]\u7372\u5f97\u7d93\u9a57\u503c:[[WHITE]]{0} -Commands.xplock.locked=[[GOLD]]\u4f60\u7684\u7d93\u9a57\u503c\u9396\u5b9a\u5728 {0}! -Commands.xplock.unlocked=[[GOLD]]\u4f60\u7684\u7d93\u9a57\u503c\u73fe\u5728 [[GREEN]]\u89e3\u9664\u9396\u5b9a\u4e86[[GOLD]]! -Commands.xprate.modified=\u7d93\u9a57\u503c\u500d\u6578\u5df2\u88ab\u8a2d\u5b9a\u70ba {0} -Commands.xprate.over=mcMMO \u7d93\u9a57\u52a0\u500d\u7ed3\u675f!! -Commands.xprate.proper.0=\u60f3\u4fee\u6539\u7d93\u9a57\u503c\u7372\u5f97\u7387\u8acb\u8f38\u5165 /xprate -Commands.xprate.proper.1=\u60f3\u628a\u7d93\u9a57\u503c\u7372\u5f97\u7387\u8abf\u70ba\u9810\u8a2d\u503c\u8acb\u8f38\u5165 /xprate reset -Commands.xprate.proper.2=\u8acb\u8f38\u5165 true \u6216 false \u4f86\u8868\u793a\u9019\u662f\u4e00\u500b\u7d93\u9a57\u4e8b\u4ef6 -Commands.xprate.started.0=[[GOLD]] mcMMO \u7d93\u9a57\u52a0\u500d\u6642\u6bb5\u958b\u59cb! -Commands.xprate.started.1=[[GOLD]]mcMMO \u7d93\u9a57\u503c\u73fe\u5728\u52a0\u500d {0}x! -XPRate.Event=[[GOLD]]mcMMO\u73fe\u6b63\u8655\u65bc\u7d93\u9a57\u503c\u52a0\u500d\u968e\u6bb5!\u7d93\u9a57\u503c\u6bd4\u4f8b\u70ba{0}! -Effects.Effects=\u6548\u679c -Effects.Child=[[DARK_GRAY]]\u7b49\u7d1a: [[GREEN]]{0} -Effects.Level=[[DARK_GRAY]]\u7b49\u7d1a: [[GREEN]]{0} [[DARK_AQUA]]\u7d93\u9a57\u503c[[YELLOW]]([[GOLD]]{1}[[YELLOW]]/[[GOLD]]{2}[[YELLOW]]) -Effects.Parent=[[GOLD]]{0} - -Effects.Template=[[DARK_AQUA]]{0}: [[GREEN]]{1} -Guides.Available=[[GRAY]] \u95dc\u65bc{0}\u7684\u8aaa\u660e - \u8f38\u5165 /{1} ? [\u9801\u6578] -Guides.Header=[[GOLD]]-=[[GREEN]]{0} \u6307\u5357[[GOLD]]=- -Guides.Page.Invalid=\u4e0d\u5b58\u5728\u7684\u9801\u6578 -Guides.Page.OutOfRange=\u9019\u9801\u78bc\u4e0d\u5b58\u5728,\u7e3d\u5171\u53ea\u6709{0} \u9801. -Guides.Usage=\u8acb\u8f38\u5165 /{0} -Guides.Acrobatics.Section.0=[DARK_AQUA]]\u95dc\u65bc\u96dc\u6280:\n[[YELLOW]]\u96dc\u6280\u53ef\u4ee5\u8b93\u4f60\u5728MMO\u88e1\u73a9\u5f97\u5f88\u512a\u96c5.\n[[YELLOW]]\u5b83\u53ef\u4ee5\u8b93\u4f60\u5728\u6230\u9b25\u4e2d\u53ca\u74b0\u5883\u4e2d\u53d6\u5f97\u512a\u52e2.\n\n[[DARK_AQUA]]\u7d93\u9a57\u5982\u4f55\u7372\u53d6:\n[[YELLOW]]\u5728\u6230\u9b25\u4e2d\u9583\u8eb2\u653b\u64ca\u6216\u5f9e\u9ad8\u8655\u589c\u843d\u5c07\n[[YELLOW]]\u53ef\u7372\u5f97\u7d93\u9a57. -Guides.Acrobatics.Section.1=[[DARK_AQUA]]\u4ec0\u9ebc\u662f\u7ffb\u6efe?\n[[YELLOW]]\u4f60\u6709\u4e00\u5b9a\u7684\u6a5f\u7387\u53ef\u4ee5\u6e1b\u514d\u5f9e\u9ad8\u8655\u589c\u843d\n[[YELLOW]]\u7684\u50b7\u5bb3. \u4f60\u53ef\u4ee5\u6309\u4f4f\u6f5b\u884c\u9375(\u9810\u8a2dshift)\n[[YELLOW]]\u4f86\u5f97\u5230\u96d9\u500d\u7684\u7ffb\u6efe\u6a5f\u7387.\n[[YELLOW]]\u9019\u5c07\u89f8\u767c\u5b8c\u7f8e\u8457\u9678\u800c\u4e0d\u53ea\u662f\u55ae\u7d14\u7684\u7ffb\u6efe.\n[[YELLOW]]\u5b8c\u7f8e\u8457\u9678\u6548\u679c\u8207\u7ffb\u6efe\u985e\u4f3c,\u4f46\u6709\u5169\u500d\n[[YELLOW]]\u7684\u89f8\u767c\u6a5f\u7387\u4e14\u53ef\u6e1b\u514d\u66f4\u591a\u50b7\u5bb3.\n[[YELLOW]]\u7ffb\u6efe\u6a5f\u7387\u95dc\u4fc2\u5230\u4f60\u7684\u96dc\u6280\u7b49\u7d1a. -Guides.Acrobatics.Section.2=[[DARK_AQUA]]\u4ec0\u9ebc\u662f\u8ff4\u907f?\n[YELLOW]]\u8ff4\u907f\u662f\u6709\u6a5f\u7387\u6e1b \u514d\u5728\u6230\u9b25\u4e2d\n[[YELLOW]]\u6575\u4eba\u5c0d\u4f60\u7684\u50b7\u5bb3.\n[[YELLOW]]\u9019\u6a5f\u7387\u95dc\u4fc2\u5230\u4f60\u7684\u96dc\u6280\u7b49\u7d1a. -Guides.Archery.Section.0=[[DARK_AQUA]]\u7bad\u8853:\n[[YELLOW]]\u7bad\u8853\u662f\u7528\u5f13\u5c04\u7bad\u7684\u6280\u80fd.\n[[YELLOW]]\u7bad\u8853\u6709\u5404\u7a2e\u52a0\u4e58\u6548\u679c,\u5982\u52a0\u4e58\u653b\u64ca\n[[YELLOW]]\u6688\u7729\u5c0d\u624b\u7b49\u6548\u679c.\n[[YELLOW]]\u6b64\u5916\u4f60\u4e5f\u6709\u6a5f\u7387\u56de\u6536\u5df2\u7d93\u5c04\u4e2d\u6575\u4eba\u7684\u7bad\n[[YELLOW]] \u4ee5\u4e0a\u6a5f\u7387\u95dc\u4fc2\u5230\u7b49\u7d1a.\n\n[[DARK_AQUA]]\u7372\u53d6\u7d93\u9a57:\n[[YELLOW]]\u8981\u7372\u5f97\u7d93\u9a57\u5fc5\u9808\u7528\u5f13\u5c04\u4e2d\u602a\u7269\u6216\u73a9\u5bb6. -Guides.Archery.Section.1=[[DARK_AQUA]]\u4ec0\u9ebc\u662f\u6280\u8853\u5c04\u64ca?\n[[YELLOW]]\u6280\u8853\u5c04\u64ca\u5c07\u52a0\u4e58\u4f60\u7684\u5c04\u7bad\u57fa\u672c\u653b\u64ca\u529b.\n[[YELLOW]]\u52a0\u4e58\u7684\u7a0b\u5ea6\u95dc\u4fc2\u5230\u4f60\u7684\u7bad\u8853\u7b49\u7d1a.\n[[YELLOW]]\u9810\u8a2d\u72c0\u614b\u4e0b, \u6bcf\u534750\u7d1a\u52a0\u4e5810%\u653b\u64ca\u529b, \n[[YELLOW]]\u6700\u9ad8\u5230200%\u52a0\u4e58. -Guides.Archery.Section.2=[[DARK_AQUA]]\u4ec0\u9ebc\u662f\u6688\u7729\u6548\u679c?\n[[YELLOW]]\u7576\u4f60\u64ca\u4e2d\u76ee\u6a19\u6642\u6709\u88ab\u52d5\u6a5f\u7387\u4f7f\u76ee\u6a19\u6688\u7729.\n[[YELLOW]]\u6688\u7dda\u89f8\u767c\u6642\u5c07\u5f37\u5236\u4f60\u7684\u76ee\u6a19\u5446\u6eef\u4e00\u5c0f\u6bb5\u6642\u9593.\n[[YELLOW]]\u6688\u7729\u6548\u679c\u6709\u52a0\u4e584\u9ede\u50b7\u5bb3(2\u5fc3). -Guides.Archery.Section.3=[[DARK_AQUA]]\u4ec0\u9ebc\u662f\u56de\u6536\u5f13\u7bad?\n[[YELLOW]]\u4f60\u6709\u6a5f\u7387\u5728\u6bba\u6b7b\u602a\u7269\u5f8c\u56de\u6536\u5c04\u51fa\u53bb\u7684\u7bad.\n[[YELLOW]]\u6a5f\u7387\u95dc\u4fc2\u5230\u4f60\u7684\u7bad\u8853\u7b49\u7d1a.\n[[YELLOW]]\u9810\u8a2d\u72c0\u614b\u4e0b,\u6bcf\u5347\u4e00\u7b49\u589e\u52a00.1%\u6a5f\u7387,\n[[YELLOW]]\u7b49\u7d1a\u5230\u90541000\u6642\u5c07\u6709100%\u56de\u6536\u7387. -Guides.Axes.Section.0=[[DARK_AQUA]]\u95dc\u65bc\u65a7\u6280:\n[[YELLOW]]\u6709\u4e86\u65a7\u6280, \u4f60\u5c31\u53ef\u4ee5\u4e0d\u5fc5\u53ea\u662f\u4e82\u63ee\u4e82\u780d\n[[YELLOW]]\u4f60\u53ef\u4ee5\u66f4\u6709\u6548\u5730\u64ca\u6bba\u53ef\u60e1\u7684\u602a\u7269\u5011!\n[[YELLOW]]\u800c\u4e14\u53ef\u4ee5\u5728\u63ee\u64ca\u6642\u70b8\u98db\u6216\u767c\u51fa\u81f4\u547d\u7684\u66b4\u64ca\n[[YELLOW]]\u4ee5\u91cd\u5275 \u5c0d\u624b.\n[[YELLOW]]\u4f60\u7684\u65a7\u982d\u4e5f\u53ef\u4ee5\u6210\u70ba\u4e00\u53f0\u524a\u6728\u6a5f,\n[[YELLOW]]\u91cd\u5275\u5c0d\u624b\u7684\u88dd\u7532,\u96a8\u8457\u64cd\u65a7\u6280\u80fd\u5347\u9ad8\u800c\n[[YELLOW]]\u63d0\u5347\u6548\u679c.\n[[DARK_AQUA]]\u5982\u4f55\u7372\u53d6\u7d93\u9a57:\n[[YELLOW]]\u8981\u7372\u53d6\u7d93\u9a57\u4f60\u5fc5\u9808\u7528\u65a7\u982d\u653b\u64ca\u73a9\u5bb6\u6216\u602a\u7269 -Guides.Axes.Section.1=[[DARK_AQUA]]\u4ec0\u9ebc\u662f\u5288\u9871\u65ac?\n[[YELLOW]]\u9019\u662f\u4e00\u500b\u4e3b\u52d5\u6280\u80fd(\u7bc4\u570d\u6280).\n[[YELLOW]]\u9031\u906d\u88ab\u6ce2\u53ca\u7684\u50b7\u5bb3\u70ba\u4e3b\u8981\u76ee\u6a19\u7684\u4e00\u534a\n[[YELLOW]]\u662f\u7528\u4f86\u6e05\u9664\u4e00\u5768\u602a\u7269\u7684\u5fc5\u5099\u7d55\u62db. -Guides.Axes.Section.2=[[DARK_AQUA]]\u4ec0\u9ebc\u662f\u6703\u5fc3\u4e00\u64ca?\n[[YELLOW]]\u6703\u5fc3\u4e00\u64ca\u662f\u4e00\u500b\u53ef\u4ee5\u9020\u6210\u52a0\u4e58\u50b7\u5bb3\u7684\u88ab\u52d5\u6280\u80fd.\n[[YELLOW]]\u9810\u8a2d\u65a7\u6280\u6bcf\u5347\u5169\u7b49,\u53ef\u589e\u52a00.1%\u66b4\u64ca\u7387\n[[YELLOW]]\u5c0d\u602a\u7269\u67092\u500d\u653b\u64ca\u529b\u5c0d\u73a9\u5bb6\u67091.5\u500d. -Guides.Axes.Section.3=[[DARK_AQUA]]\u4ec0\u9ebc\u662f\u65a7\u982d\u7cbe\u901a?\n[[YELLOW]]\u65a7\u982d\u7cbe\u901a\u53ef\u4ee5\u52a0\u4e58\u65a7\u982d\u7684\u57fa\u672c\u653b\u64ca \u529b\n[[YELLOW]]\u9810\u8a2d\u4e2d\u6bcf50\u7b49\u589e\u52a01\u9ede\u50b7\u5bb3(\u534a\u5fc3)\n[[YELLOW]]200\u7b49\u9054\u5230\u6975\u96504\u9ede\u50b7\u5bb3. -Guides.Axes.Section.4=[[DARK_AQUA]]\u4ec0\u9ebc\u662f\u9632\u5177\u7834\u58de\u8005?\n[[YELLOW]]\u66b4\u529b\u7684\u6253\u64ca\u4f7f\u9632\u5177\u7c89\u788e!\n[[YELLOW]]\u9632\u5177\u7834\u58de\u8005\u6709\u88ab\u52d5\u6a5f\u7387\u9020\u6210\u5c0d\u624b\u9632\u5177\u88ab\u7834\u58de!\n[[YELLOW]]\u7834\u58de\u7a0b\u5ea6\u95dc\u4fc2\u5230\u4f60\u7684\u65a7\u982d\u6280\u80fd\u7b49\u7d1a. -Guides.Axes.Section.5=[[DARK_AQUA]]\u4ec0\u9ebc\u662f\u5f37\u529b\u653b\u64ca?\n[[YELLOW]]\u5728\u653b\u64ca\u73a9\u5bb6\u6216\u602a\u7269\u6642\u6709\u88ab\u52d5\u6a5f\u7387\u70b8\u98db\u5c0d\u624b\n[[YELLOW]]\u9810\u8a2d\u6a5f\u7387\u70ba25%. \u70b8\u98db\u6548\u679c\u76f8\u7576\u65bc\u64ca\u9000II\u7684\u9644\u9b54\n[[YELLOW]]\u5916\u52a0\u5c0d\u76ee\u6a19\u7684\u52a0\u4e58\u653b\u64ca. -Guides.Excavation.Section.0=[[DARK_AQUA]]\u95dc\u65bc\u6316\u6398:\n[[YELLOW]]\u6316\u6398\u662f\u4e00\u500b\u95dc\u65bc\u6316\u571f\u8207\u6316\u5bf6\u7684\u6280\u80fd.\n[[YELLOW]]\u6316\u6398\u5730\u9762\u53ef\u4ee5\u627e\u5230\u5bf6\u7269.\n[[YELLOW]]\u6316\u6108\u591a\u5bf6\u7269\u6108\u591a.\n\n[[DARK_AQUA]]\u7372\u53d6\u7d93\u9a57:\n[[YELLOW]]\u8981\u7372\u53d6\u7d93\u9a57\u5fc5\u9808\u6301 \u6709\u93df\u5b50.\n[[YELLOW]]\u53ea\u6709\u7279\u5b9a\u7269\u8cea\u624d\u80fd\u6316\u5230\u5bf6\u7269\u6216\u7d93\u9a57. -Guides.Excavation.Section.1=[[DARK_AQUA]]\u76f8\u5bb9\u7684\u7269\u8cea:\n[[YELLOW]]\u8349\u76ae, \u571f, \u6c99, \u9ecf\u571f, \u792b\u77f3, \u83cc\u7d72\u9ad4, \u9748\u9b42\u6c99 -Guides.Excavation.Section.2=[[DARK_AQUA]]\u5982\u4f55\u7528\u66b4\u8d70\u947d\u982d:\n[[YELLOW]]\u624b\u6301\u93df\u5b50\u4e26\u9ede\u53f3\u9375.\n[[YELLOW]]\u9032\u5165\u6b64\u72c0\u614b\u7d04\u80fd\u7dad\u63014\u79d2\n[[YELLOW]]\u4e00\u65e6\u63a5\u89f8\u5230\u76f8\u5bb9\u7684\u7269\u8cea\u4fbf\u80fd\n[[YELLOW]]\u89f8\u767c\u66b4\u8d70\u947d\u982d. -Guides.Excavation.Section.3=[[DARK_AQUA]]\u4ec0\u9ebc\u662f\u66b4\u8d70\u947d\u982d?\n[[YELLOW]]\u66b4\u8d70\u947d\u982d\u662f\u4e3b\u52d5\u6280\u80fd,\u6301\u7e8c\u6642\u9593\u95dc\u4fc2\u5230\n[[YELLOW]]\u6316\u6398\u6280\u80fd\u7b49\u7d1a,\u5b83\u53ef \u4ee5\u8b93\u4f60\u6709\u6a5f\u7387\u7372\u5f97\u5bf6\u7269\n[[YELLOW]]\u9084\u6709\u76f4\u63a5\u6467\u6bc0\u6307\u5b9a\u65b9\u584a. -Guides.Excavation.Section.4=[[DARK_AQUA]]\u4ec0\u9ebc\u662f\u5bf6\u7269\u7375\u4eba?\n[[YELLOW]]\u6240\u6709\u5bf6\u7269\u90fd\u6709\u81ea\u5df1\u7684\u6700\u4f4e\u6389\u843d\u7b49\u7d1a\n[[YELLOW]]\u6240\u4ee5\u5bf6\u7269\u5c0d\u4f60\u4e0d\u898b\u5f97\u6709\u7528.\n[[YELLOW]]\u53ea\u9700\u8981 \u8a18\u5f97\u6108\u6316\u6398\u7b49\u7d1a\u6108\u9ad8,\n[[YELLOW]]\u5c31\u80fd\u6316\u9053\u6108\u591a\u5bf6.\n[[YELLOW]]\u9084\u6709\u6bcf\u4e00\u7a2e\u4e0d\u540c\u7684\u6750\u8cea,\n[[YELLOW]]\u53ef\u80fd\u6389\u51fa\u4f86\u7684\u5bf6\u7269\u90fd\u4e0d\u540c.\n[[YELLOW]]\u63db\u53e5\u8a71\u8aaa\u4f60\u80fd\u5f9e\u571f\u88e1\u6316\u51fa\u6bd4\u792b\u77f3\n[[YELLOW]]\u66f4\u591a\u7a2e\u985e\u7684\u5bf6\u7269. -Guides.Excavation.Section.5=[[DARK_AQUA]]\u6316\u6398\u7684\u6ce8\u610f\u4e8b\u9805:\n[[YELLOW]]\u6316\u6398\u7684\u6389\u843d\u7269\u662f\u53ef\u96a8\u610f\u8abf\u6574\u7684,\n[[YELLOW]]\u4e0d\u540c\u4f3a\u670d\u5668\u5c07\u6709\u6240\u5dee\u7570. -Guides.Fishing.Section.0=[[DARK_AQUA]]\u95dc\u65bc\u91e3\u9b5a:\n[[YELLOW]]\u6709\u4e86\u91e3\u9b5a\u6280\u80fd,\u91e3\u9b5a\u66f4\u6709\u8da3\u4e86!\n[[YELLOW]]\u53ef\u4ee5\u6389\u5bf6\u7269,\u5f9e\u602a\u7269\u8eab\u4e0a\u76dc\u5bf6.\n\n[[DARK_AQUA]]\u7372\u53d6\u7d93\u9a57:\n[[YELLOW]]\u6293\u5230\u9b5a. -Guides.Fishing.Section.1=[[DARK_AQUA]]\u4ec0\u9ebc\u662f\u5bf6\u7269\u7375\u4eba?\n[[YELLOW]]\u9019\u500b\u6280\u80fd\u8b93\u4f60\u5728\u91e3\u9b5a\u6642\u91e3\u5230\u5bf6\u7269\n[[YELLOW]]\u6709\u5c0f\u6a5f\u7387\u91e3\u5230\u9644\u9b54\u9053\u5177.\n[[YELLOW]]\u6bcf\u7a2e\u5bf6\u7269\u7684\u51fa\u73fe\u95dc\u4fc2\u5230\n[[YELLOW]]\u4f60\u7684\u91e3\u9b5a\u7b49\u7d1a. \u91e3\u9b5a\u7b49\u7d1a\u6108\u9ad8,\n[[YELLOW]]\u5c31\u80fd\u91e3\u5230\u6108\u591a\u6108\u597d\u7684\u5bf6\u7269. -Guides.Fishing.Section.2=[[DARK_AQUA]]\u4ec0\u9ebc\u662f\u51b0\u91e3?\n[[YELLOW]]\u9019\u500b\u88ab\u52d5\u6280\u80fd\u8b93\u4f60\u5728\u51b0\u6e56\u4e0a\u6355\u9b5a!\n[[YELLOW]]\u5728\u51b0\u6e56\u4e0a\u7529\u52d5\u4f60\u7684\u91e3\u7aff\n[[YELLOW]]\u5c07\u6703\u5728\u51b0\u4e0a\u88fd\u9020\u51fa\u53ef\u4f9b\u91e3\u9b5a\u7684\u5c0f\u6d1e. -Guides.Fishing.Section.3=[[DARK_AQUA]]\u4ec0\u9ebc\u662f\u5782\u91e3\u5927\u5e2b?\n[[YELLOW]]\u9019\u500b\u88ab\u52d5\u6280\u80fd\u5c07\u589e\u52a0\u4e0a\u9264\u7684\u6a5f\u7387.\n[[YELLOW]]\u7576\u4f60\u7372\u5f97\u9019\u500b\u80fd\u529b, \u5728\u8239\u4e0a\u6216\u6d77\u6d0b\u751f\u614b\n[[YELLOW]]\u91e3\u9b5a\u5c07\u6703\u7372\u5f97\u96d9\u500d\u4e0a\u9264\u6a5f\u7387. -Guides.Fishing.Section.4=[[DARK_AQUA]]\u4ec0\u9ebc\u662f\u6416\u6643?\n[[YELLOW]]\u9019\u500b\u6280\u80fd\u8b93\u4f60\u53ef\u4ee5\u5f9e\u602a\u7269\u8eab\u4e0a\u626f\u4e0b\u5bf6\u7269.\n[[YELLOW]]\u53ea\u8981\u4f7f\u7528\u91e3\u7aff\u91e3\u602a\u7269,\n[[YELLOW]]\u80fd\u91e3\u51fa\u602a\u7269\u6b7b\u4ea1\u6642\u6703\u6389\u7684\u5bf6\u7269.\n[[YELLOW]]\u9019\u6280\u80fd\u751a\u81f3\u80fd\u91e3\u51fa\u8eab\u5b58\u6a21\u5f0f\u7121\u6cd5\u7372\u5f97\u7684\n[[YELLOW]]\u602a\u7269\u982d\u9871. -Guides.Fishing.Section.5=[[DARK_AQUA]]\u4ec0\u9ebc\u662f\u6f01\u4eba\u4fbf\u7576?\n[[YELLOW]]\u9019\u662f\u4e00\u500b\u88ab\u52d5\u6280\u80fd\u8b93\u4f60\u80fd\u5728\u5403\u9b5a\u6642\u6709\n[[YELLOW]]\u66f4\u591a\u7684\u98fd\u98df\u5ea6. -Guides.Fishing.Section.6=[[DARK_AQUA]]\u91e3\u9b5a\u7684\u6ce8\u610f\u4e8b\u9805:\n[[YELLOW]]\u6389\u843d\u8a2d\u5b9a\u662f\u53ef\u8abf\u6574\u7684,\n[[YELLOW]]\u5404\u4f3a\u670d\u5668\u53ef\u80fd\u6709\u6240\u4e0d\u540c. -Guides.Herbalism.Section.0=[[DARK_AQUA]]\u95dc\u65bc\u8349\u85e5\u5b78:\n[[YELLOW]]\u8349\u85e5\u5b78\u662f\u95dc\u65bc\u63a1\u6536\u8349\u85e5\u8207\u690d\u7269\u7684\u6280\u80fd.\n\n[[DARK_AQUA]]\u7372\u53d6\u7d93\u9a57:\n[[YELLOW]]\u63a1\u6536\u8349\u85e5\u6216\u690d\u7269. -Guides.Herbalism.Section.1=[[DARK_AQUA]]\u53ef\u4f5c\u7528\u7684\u8349\u85e5/\u690d\u7269\n[[YELLOW]]\u5c0f\u9ea5, \u99ac\u9234\u85af, \u80e1\u863f\u8514, \u897f\u74dc, \n[[YELLOW]]\u5357\u74dc, \u7518\u8517, \u53ef\u53ef\u8c46, \u82b1, \u4ed9\u4eba\u638c, \u9999\u83c7,\n[[YELLOW]]\u5730\u7344\u7599\u7629, \u84ee\u8449, \u8207\u85e4. -Guides.Herbalism.Section.2=[[DARK_AQUA]]\u4ec0\u9ebc\u662f\u7da0\u5316?\n[[YELLOW]]\u7da0\u5316\u662f\u4e00\u500b\u4e3b\u52d5\u6280\u80fd, \u7576\u4f60\u624b\u6301\u92e4\u982d\u6642\n[[YELLOW]]\u9ede\u64ca\u53f3\u9375\u53ef\u767c\u52d5\u6280\u80fd. \u7da0\u5316\u63d0\u9ad8\u4e09\u88ab\u6536\u7a6b\u7684\u6a5f\u7387. \n[[YELLOW]]\u540c\u6642\u4e5f\u8b93\u73a9\u5bb6\u6709\u80fd\u529b\u4f7f\u7528\u8eab\u4e0a\u7684\u7a2e\u5b50\u4f86\u8f49\u5316\n[[YELLOW]]\u65b9\u584a\u4e26\u8ce6\u4e88\u751f\u547d. -Guides.Herbalism.Section.3=[[DARK_AQUA]]\u4ec0\u9ebc\u662f\u7da0\u624b\u6307(\u4f5c\u7269)?\n[[YELLOW]]\u9019\u662f\u4e00\u500b\u88ab\u52d5\u6280\u80fd,\u8b93\u4f5c\u7269\u5728\u63a1\u6536\u6642\n[[YELLOW]]\u81ea\u52d5\u7a2e\u56de\u53bb.\n[[YELLOW]]\u6210\u529f\u7387\u95dc\u4fc2\u5230\u4f60\u7684\u8349\u85e5\u5b78\u6280\u80fd\u7b49\u7d1a. -Guides.Herbalism.Section.4=\u4ec0\u9ebc\u662f\u7da0\u624b\u6307(\u5375\u77f3/\u77f3\u78da/\u571f)?\n[[YELLOW]]\u9019\u662f\u4e00\u500b\u4e3b\u52d5\u6280\u80fd,\u8b93\u4f60\u5728\u624b\u62ff\u8457\u7a2e\u5b50\u6642,\n[[YELLOW]]\u5c0d\u5375\u77f3/\u77f3\u78da/\u571f,\u9ede\u64ca\u53f3\u9375,\u53ef\u4f7f\u5b83\u5011\u8b8a\u6210\n[[YELLOW]]\u690d\u7269\u5f62\u614b,\u6703\u6d88\u8017\u4e00\u9846\u7a2e\u5b50. -Guides.Herbalism.Section.5=[[DARK_AQUA]]\u4ec0\u9ebc\u662f\u8fb2\u592b\u79c1\u623f\u83dc?\n[[YELLOW]]\u9019\u662f\u4e00\u500b\u88ab\u52d5\u6280\u80fd, \u53ef\u589e\u52a0\u4e0b\u5217\u98df\u7269\u7684\u98fd\u98df\u5ea6\u56de\u5fa9 -\n[[YELLOW]]\u9eb5\u5305, \u9905\u4e7e, \u897f\u74dc, \u8611\u83c7\u6e6f, \u80e1\u863f\u8514, \u99ac\u9234\u85af. -Guides.Herbalism.Section.6=[[DARK_AQUA]]\u4ec0\u9ebc\u662f\u6d77\u502b\u7684\u795d\u798f?\n[[YELLOW]]\u9019\u662f\u4e00\u500b\u4e3b\u52d5\u6280\u80fd,\u6709\u6a5f\u7387\u5728\u7528\u528d\u7834\u58de\u7279\u5b9a\n[[YELLOW]]\u65b9\u584a\u6642\u7372\u5f97\u7a00\u6709\u9053\u5177. -Guides.Herbalism.Section.7=[[DARK_AQUA]]\u4ec0\u9ebc\u662f\u96d9\u500d\u6389\u843d?\n[[YELLOW]]\u9019\u662f\u4e00\u500b\u88ab\u52d5\u6280\u80fd\u4f7f\u73a9\u5bb6\u80fd\u52a0\u500d\u6536\u7372. -Guides.Mining.Section.0=[[DARK_AQUA]]\u95dc\u65bc\u6316\u7926:\n[[YELLOW]]\u6316\u7926\u7531\u63a1\u77f3\u8207\u63a1\u7926\u6240\u7d44\u6210. \u5b83\u63d0\u4f9b\u6316\u7926\u6642\n[[YELLOW]\u7684\u984d\u5916\u7926\u7269\u6389\u843d\u91cf.\n\n[[DARK_AQUA]]\u5982\u4f55\u7372\u53d6\u7d93\u9a57:\n[[YELLOW]]\u8981\u589e\u9032\u6316\u7926\u6280\u80fd,\u4f60\u5fc5\u9808\u7528\u93ac\u5b50\u6316\u7926.\n[[YELLOW]]\u53ea\u6709\u6316\u6398\u6307\u5b9a\u7926\u7269\u80fd\u589e\u52a0\u7d93\u9a57. -Guides.Mining.Section.1=[[DARK_AQUA]]\u76f8\u5bb9\u7684\u7926\u7269:\n[[YELLOW]]\u77f3\u982d, \u70ad\u7926\u8108, \u9435\u7926\u8108, \u91d1\u7926\u8108, \u947d\u77f3\u7926\u8108, \u7d05\u77f3\u7926\u8108,\n[[YELLOW]]\u9752\u91d1\u77f3\u7926\u8108, \u9ed1\u66dc\u77f3, \u9752\u82d4\u77f3, \u7d42\u754c\u77f3,\n[[YELLOW]]\u87a2\u5149\u77f3, \u9084\u6709\u5730\u7344\u77f3. -Guides.Mining.Section.2=[[DARK_AQUA]]\u5982\u4f55\u4f7f\u7528\u8d85\u7d1a\u788e\u77f3\u6a5f:\n[[YELLOW]]\u624b\u62ff\u8457\u93ac\u5b50\u9ede\u6ed1\u9f20\u53f3\u9375\u4ee5\u6e96\u5099\u597d\u958b\u555f\u6280\u80fd.\n[[YELLOW]]\u4e00\u65e6\u958b\u555f\u6280\u80fd\u5c07\u6709\u6578\u79d2\u7684\u6642\u9593\u53ef\u4ee5\u8b93\u4f60\n[[YELLOW]]\u5feb\u901f\u7834\u58de\u6307\u5b9a\u7926\u7269,\u53ea\u6709\u76f8\u5bb9\u7684\u7926\u7269\u53ef\u4ee5\n[[YELLOW]]\u89f8\u767c\u6280\u80fd. -Guides.Mining.Section.3=[[DARK_AQUA]]\u4ec0\u9ebc\u662f\u8d85\u7d1a\u788e\u77f3\u6a5f?\n[[YELLOW]]\u8d85\u7d1a\u788e\u77f3\u6a5f\u662f\u4e00\u500b\u9700\u8981\u51b7\u537b\u6642\u9593\u7684\u6316\u7926\u6280\u80fd.\n[[YELLOW]]\u5b83\u80fd\u4f7f\u4f60\u5728\u6316\u6389\u5c0d\u61c9\u7926\u77f3\u7684\u6642\u5019\u589e\u52a03\u500d\u6389\u843d\u6a5f\u7387.\n[[YELLOW]]\u4e26\u4e14\u5728\u6280\u80fd\u6642\u9593\u5167\u77ac\u9593\u7834\u58de\u77f3\u982d\u548c\u7926\u77f3. -Guides.Mining.Section.4=[[DARK_AQUA]]\u5982\u4f55\u4f7f\u7528\u7206\u7834\u6316\u6398:\n[[YELLOW]]\u624b\u6301\u6253\u706b\u77f3, \u9810\u8a2d\u7531\u71e7\u77f3\u53ca\u9435\u9320\u7d44\u6210,\n[[YELLOW]]\u8e72\u4e0b\u4e26\u7528\u53f3\u9375\u9ede\u53caTNT. \u9019\u6703\u4f7fTNT\n[[YELLOW]]\u76f4\u63a5\u7206\u70b8, \u6700\u597d\u7ad9\u9060\u4e00\u9ede. -Guides.Mining.Section.5=[[DARK_AQUA]]\u4ec0\u9ebc\u662f\u7206\u7834\u6316\u6398?\n[[YELLOW]]\u7206\u7834\u6316\u6398\u662f\u4e00\u500b\u4e3b\u52d5\u6280\u80fd, \u51b7\u537b\u6642\u9593\u95dc\u4fc2\u5230\u4f60\u7684\u6316\u7926\n[[YELLOW]]\u6280\u80fd\u7b49\u7d1a. \u5b83\u53ef\u4ee5\u8b93\u4f60\u5728\u4f7f\u7528TNT\u6316\u7926\u77f3\u6709\u66f4\u591a\u798f\u5229\n[[YELLOW]]\u4e14\u53ef\u4ee5\u9059\u63a7\u5f15\u7206TNT. \u7206\u7834\u6316\u6398\u5206\u6210\u4e09\u90e8\u5206.\n[[YELLOW]]\u7b2c\u4e00\u90e8\u5206\u7a31\u70ba\u5de8\u5927\u7206\u7834, \u53ef \u4ee5\u64f4\u5927\u4f60\u7684\u7206\u7834\u7bc4\u570d.\n[[YELLOW]]\u7b2c\u4e8c\u90e8\u5206\u7a31\u70ba\u7206\u7834\u5c08\u5bb6, \u53ef\u4ee5\u6e1b\u514dTNT\u5c0d\u4f60\u7684\u50b7\u5bb3\n[[YELLOW]]\u7b2c\u4e09\u90e8\u5206\u7a31\u70ba\u7cbe\u6e96\u7206\u7834, \u589e\u52a0\u6389\u843d\u7269\u6578\u91cf, \u6e1b\u5c11\u5783\u573e\u6389\n[[YELLOW]]\u843d\u7269\u6578\u91cf, \u5f88\u68d2\u5427. -Guides.Repair.Section.0=[[DARK_AQUA]]\u4fee\u5fa9:\n[[YELLOW]]\u4fee\u5fa9\u6280\u80fd\u8b93\u4f60\u53ef\u4ee5\u4f7f\u7528\u9435\u78da(MMO\u9435\u7827)\n[[YELLOW]]\u4fee\u5fa9\u5de5\u5177,\u6216\u4f7f\u7528\u91d1\u78da\u56de\u6536\u5de5\u5177.\n\n[[DARK_AQUA]]\u7d93\u9a57\u7372\u53d6:\n[[YELLOW]]\u7528MMO\u9435\u7827\u4fee\u5fa9\u5de5\u5177.\n[[YELLOW]]\u9810\u8a2d\u662f\u9435\u78da,\u4e0d\u8981\u548c\u4e00\u822c\u7684\u9435\u7827\u641e\u6df7. -Guides.Repair.Section.1=[[DARK_AQUA]]\u5982\u4f55\u4fee\u5fa9?\n[[YELLOW]]\u624b\u6301\u8981\u4fee\u5fa9\u7684\u5de5\u5177\u5c0d\u9435\u78da\u9ede\u64ca\u53f3\u9375\n[[YELLOW]]\u6703\u6d88\u80171\u500b\u4e3b\u539f\u6599. -Guides.Repair.Section.2=[[DARK_AQUA]]\u4ec0\u9ebc\u662f\u4fee\u7406\u7cbe\u901a?\n[[YELLOW]]\u55ae\u6b21\u4fee\u5fa9\u7684\u8010\u4e45\u5ea6\u52a0\u4e58.\n[[YELLOW]]\u9019\u95dc\u4fc2\u5230\u4f60\u7684\u4fee\u5fa9\u7b49\u7d1a. -Guides.Repair.Section.3=[[DARK_AQUA]]\u4ec0\u9ebc\u662f\u8d85\u7d1a\u4fee\u7406?\n[[YELLOW]]\u8d85\u7d1a\u4fee\u7406\u662f\u88ab\u52d5\u6280\u80fd. \u7576\u4fee\u7406\u4e00\u500b\u7269\u54c1\u6642,\n[[YELLOW]]\u73a9\u5bb6\u6709\u6a5f\u7387\u4fee\u5fa9\u5169\u500d\u8010\u4e45\u5ea6. -Guides.Repair.Section.4=[[DARK_AQUA]]\u4ec0\u9ebc\u662f\u79d8\u6cd5\u935b\u9020?\n[[YELLOW]]\u79d8\u6cd5\u935b\u9020\u8b93\u4f60\u6709\u6a5f\u7387\u7559\u4f4f\u5de5\u5177\u7684\u9644\u9b54.\n[[YELLOW]]\u9644\u9b54\u53ef\u80fd\u5728\u4fee\u5fa9\u6642\u964d\u7d1a\u6216\u6d88\u5931. -Guides.Repair.Section.5=[[DARK_AQUA]]\u4ec0\u9ebc\u662f\u56de\u6536?\n[[YELLOW]]\u5c07\u624b\u4e2d\u7684\u7269\u54c1\u5c0dmcMMO\u56de\u6536\u7827(\u9810\u8a2d\u91d1\u78da)\n[[YELLOW]]\u9ede\u64ca\u53f3\u9375. \u6703\u5c07\u7269\u54c1\u62c6\u89e3\u56de\u6240\u4f7f\u7528\u7684\u539f\u6599.\n[[YELLOW]]\u6ce8\u610f: \u4f60\u53ea\u80fd\u56de\u6536\u7121\u8017\u640d\u7684\u5de5\u5177\u6216\u88dd\u5099 -Guides.Swords.Section.0=[[DARK_AQUA]]\u528d\u8853:\n[[YELLOW]]\u528d\u8853\u8b93\u73a9\u5bb6\u5728\u4f7f\u7528\u528d\u6230\u9b25\u6642\u7372\u5f97\u5404\u7a2e\u52a0\u4e58\u6548\u679c.\n\n[[DARK_AQUA]]\u5982\u4f55\u7372\u53d6\u7d93\u9a57:\n[[YELLOW]]\u8981\u7372\u53d6\u7d93\u9a57\u4f60\u5fc5\u9808\u7528\u528d\u653b\u64ca\u73a9\u5bb6\u6216\u602a\u7269. -Guides.Swords.Section.1=[[DARK_AQUA]]\u4ec0\u9ebc\u662f\u5272\u88c2\u65ac?\n[[YELLOW]]\u5272\u88c2\u65ac\u662f\u4e00\u500b\u4e3b\u52d5\u6280\u80fd, \u4f60\u53ef\u4ee5\u5c07\u528d\u62ff\u518d\u624b\u4e0a\u4e26\u6309\u4e0b\u53f3\u9375\u555f\u52d5\u5b83.\n[[YELLOW]]\u9019\u500b\u6280\u80fd\u8b93\u4f60\u767c\u52d5\u7bc4\u570d\u653b\u64ca. \u9019\u500b\u7bc4\u570d\u6280\u80fd\u5c07\u9020\u621025%\u7684\u984d\u5916\u50b7\u5bb3,\n[[YELLOW]]\u4e26\u4e14\u9644\u5e36\u81f3\u5c115\u500bticks\u7684\u653e\u8840\u6548\u679c. -Guides.Swords.Section.2=[[DARK_AQUA]]\u4ec0\u9ebc\u662f\u53cd\u64ca?\n[[YELLOW]]\u53cd\u64ca\u662f\u4e00\u500b\u4e3b\u52d5\u6280\u80fd. \u7576\u683c\u6a94\u602a\u7269\u6240\u9020\u6210\u7684\u50b7\u5bb3\u6642, \u4f60\u6709\u6a5f\u6703\u53cd\u5c04\n[[YELLOW]]50%\u6240\u53d7\u5230\u7684\u50b7\u5bb3. -Guides.Swords.Section.3=[[DARK_AQUA]]\u4ec0\u9ebc\u662f\u653e\u8840?\n[[YELLOW]]\u653e\u8840\u5c07\u9020\u6210\u6575\u4eba\u6bcf\u5169\u79d2\u9418\u53d7\u5230\u50b7\u5bb3. \u76ee\u6a19\u5c07\u6703\u4e0d \u505c\u7684\u6d41\u8840\u76f4\u5230\u6548\u679c\n[[YELLOW]]\u7d50\u675f, \u6216\u662f\u6b7b\u4ea1. \u653e\u8840\u7684\u6642\u9593\u96a8\u8457\u4f60\u7684\u528d\u8853\u7684\u63d0\u6607\u800c\u589e\u52a0. -Guides.Smelting.Section.0=\u4e0b\u6b21\u9084\u6709... -Guides.Taming.Section.0=[[DARK_AQUA]]\u99b4\u7378\n[[YELLOW]]\u99b4\u7378\u6280\u80fd\u8b93\u73a9\u5bb6\u80fd\u5728\u7528\u72fc\u6230\u9b25\u6642\n[[YELLOW]]\u6642\u6709\u52a0\u4e58\u6548\u679c.\n\n[[DARK_AQUA]]\u7d93\u9a57\u7372\u53d6:\n[[YELLOW]]\u8981\u7372\u53d6\u7d93\u9a57,\u9808\u8a13\u670d\u72fc\u6216\u8c79\u8c93,\n[[YELLOW]]\u6216\u8207\u4f60\u7684\u72fc\u4e00\u540c\u6230\u9b25. -Guides.Taming.Section.1=[[DARK_AQUA]]\u4ec0\u9ebc\u662f\u91ce\u6027\u547c\u558a?\n[[YELLOW]]\u91ce\u6027\u547c\u558a\u662f\u4e00\u500b\u4e3b\u52d5\u6280\u80fd\u8b93\u4f60\n[[YELLOW]]\u53ef\u4ee5\u53ec\u559a\u4e00\u96bb\u72fc\u6216\u8c79\u8c93,\n[[YELLOW]]\u53ea\u8981\u624b\u630110\u8ddf\u9aa8\u982d\u6216\u751f\u9b5a,\u9ede\u5de6\u9375. -Guides.Taming.Section.2=[[DARK_AQUA]]\u4ec0\u9ebc\u662f\u99b4\u7378\u4e4b\u80fd?\n[[YELLOW]]\u99b4\u7378\u4e4b\u80fd\u8b93\u4f60\u5bdf\u89ba\u5bf5\u7269\u7684\u72c0\u614b,\n[[YELLOW]]\u5c0d\u5bf5\u7269\u9ede\u64ca\u5de6\u9375\u5c31\u80fd\u4f7f\u7528\u9019\u9805\u80fd\u529b. -Guides.Taming.Section.3=[[DARK_AQUA]]\u4ec0\u9ebc\u662f\u8840\u8165\u653b\u64ca?\n[[YELLOW]]\u8840\u8165\u653b\u64ca\u662f\u4e00\u500b\u4e3b\u52d5\u6280\u80fd,\u80fd\u9020\u6210\n[[YELLOW]]\u72fc\u7684\u653b\u64ca\u76ee\u6a19\u6709\u6a5f\u7387\u9677\u5165\u6d41\u8840\u72c0\u614b. -Guides.Taming.Section.4=[[DARK_AQUA]]\u4ec0\u9ebc\u662f\u5229\u722a?\n[[YELLOW]]\u5229\u722a\u4f7f\u72fc\u7684\u653b\u64ca\u529b\u96a8\u8457\u99b4\u7378\u7b49\u7d1a\n[[YELLOW]]\u589e\u52a0\u800c\u589e\u52a0. -Guides.Taming.Section.5=[[DARK_AQUA]]\u4ec0\u9ebc\u662f\u5371\u6a5f\u610f\u8b58?\n[[YELLOW]]\u9019\u500b\u88ab\u52d5\u6280\u80fd\u80fd\u8b93\u72fc\u5728\u9047\u5230\u5371\u96aa\u6642\n[[YELLOW]]\u8fc5\u901f\u56de\u5230\u4f60\u8eab\u908a(\u5982\u4ed9\u4eba\u638c\u6216\u5ca9\u6f3f),\n[[YELLOW]]\u4e5f\u53ef\u4ee5\u6e1b\u514d\u6454\u843d\u50b7\u5bb3. -Guides.Taming.Section.6=[[DARK_AQUA]]\u4ec0\u9ebc\u662f\u6bdb\u76ae\u5f37\u5316?\n[[YELLOW]]\u9019\u662f\u4e00\u500b\u88ab\u52d5\u6280\u80fd\u80fd\u8b93\u72fc\n[[YELLOW]]\u53d7\u5230\u653b\u64ca\u6216\u71c3\u71d2\u6642\u6e1b\u514d\u50b7\u5bb3. -Guides.Taming.Section.7=[[DARK_AQUA]]\u4ec0\u9ebc\u662f\u885d\u64ca\u683c\u64cb?\n[[YELLOW]]\u9019\u662f\u4e00\u500b\u88ab\u52d5\u6280\u80fd,\u8b93\u72fc\u7fa4\n[[YELLOW]]\u6e1b\u514d\u7206\u70b8\u50b7\u5bb3. -Guides.Taming.Section.8=[[DARK_AQUA]]\u4ec0\u9ebc\u662f\u5feb\u9910\u670d\u52d9?\n[[YELLOW]]\u9019\u662f\u4e00\u500b\u88ab\u52d5\u6280\u80fd,\u8b93\u72fc\u7fa4\u5728\u653b\u64ca\u6642\n[[YELLOW]]\u6709\u6a5f\u7387\u56de\u5fa9\u8840\u91cf. -Guides.Unarmed.Section.0=[[DARK_AQUA]]\u640f\u64ca:\n[[YELLOW]]\u640f\u64ca\u8b93\u73a9\u5bb6\u5728\u4f7f\u7528\u62f3\u982d\u4f5c\u6230\u6642\u6709\n[[YELLOW]]\u5404\u7a2e\u52a0\u4e58\u6548\u679c.\n\n[[DARK_AQUA]]\u7d93\u9a57\u7372\u53d6:\n[[YELLOW]]\u5728\u7528\u624b\u653b\u64ca\u602a\u7269\u6216\u73a9\u5bb6\u6642\u53ef\u4ee5\u7372\u53d6\u7d93\u9a57. -Guides.Unarmed.Section.1=[[DARK_AQUA]]\u4ec0\u9ebc\u662f\u72c2\u66b4?\n[[YELLOW]]\u72c2\u66b4\u662f\u4e3b\u52d5\u6280\u80fd,\u7a7a\u624b\u6642\u9ede\u64ca\u53f3\u9375\u767c\u52d5.\n[[YELLOW]]\u72c2\u66b4\u53ef\u4ee5\u52a0\u4e5850%\u5c0d\u65b9\u584a\u7684\u50b7\u5bb3,\n[[YELLOW]]\u4f7f\u4f60\u53ef\u4ee5\u8f15\u9b06\u7834\u58de\u8106\u5f31\u7269\u9ad4,\n[[YELLOW]]\u5982\u571f\u8207\u7802. -Guides.Unarmed.Section.2=[[DARK_AQUA]]\u4ec0\u9ebc\u662f\u9435\u81c2?\n[[YELLOW]]\u9435\u81c2\u80fd\u589e\u52a0\u5f92\u624b\u653b\u64ca\u602a\u7269\u6216\n[[YELLOW]]\u73a9\u5bb6\u7684\u5a01\u529b. -Guides.Unarmed.Section.3=[[DARK_AQUA]]\u4ec0\u9ebc\u662f\u64ca\u843d\u5f13\u7bad?\n[[YELLOW]]\u64ca\u843d\u5f13\u7bad\u662f\u4e00\u500b\u88ab\u52d5\u6280\u80fd,\u8b93\u4f60\u6709\u6a5f\u7387\n[[YELLOW]]\u80fd\u64ca\u843d\u9ab7\u9acf\u7372\u73a9\u5bb6\u5c04\u5411\u4f60\u7684\u7bad.\n[[YELLOW]]\u7bad\u6703\u88ab\u64ca\u843d\u81f3\u5730\u9762. -Guides.Unarmed.Section.4=[[DARK_AQUA]]\u4ec0\u9ebc\u662f\u9435\u722a?\n[[YELLOW]]\u9435\u722a\u53ef\u4ee5\u6709\u6a5f\u7387\u4f7f\u64ca\u843d\u6b66\u5668\u7121\u6548\u5316.\n[[YELLOW]]\u6a5f\u7387\u95dc\u4fc2\u5230\u640f\u64ca\u6280\u80fd\u7b49\u7d1a. -Guides.Unarmed.Section.5=[[DARK_AQUA]]\u4ec0\u9ebc\u662f\u64ca\u843d\u6b66\u5668?\n[[YELLOW]]\u9019\u500b\u88ab\u52d5\u6280\u80fd\u8b93\u73a9\u5bb6\u89e3\u9664\u5176\u4ed6\u73a9\u5bb6\u7684\u6b66\u88dd,\n[[YELLOW]]\u4f7f\u76ee\u6a19\u6240\u88dd\u5099\u7684\u7269\u54c1\u6389\u843d\u5230\u5730\u4e0a. -Guides.Woodcutting.Section.0=[[DARK_AQUA]]\u95dc\u65bc\u4f10\u6728:\n[[YELLOW]] \u4f10\u6728\u5c31\u662f\u628a\u6a39\u780d\u5012.\n\n[[DARK_AQUA]]\u7372\u53d6\u7d93\u9a57:\n[[YELLOW]]\u7834\u58de\u6a39\u5e79\u53ef\u7372\u53d6\u7d93\u9a57. -Guides.Woodcutting.Section.1=[[DARK_AQUA]]\u4ec0\u9ebc\u662f\u4f10\u6728\u5de5?\n[[YELLOW]]\u4f10\u6728\u5de5\u662f\u4e3b\u52d5\u6280\u80fd,\u6301\u6709\u65a7\u982d\u6642\u9ede\u53f3\u9375\n[[YELLOW]]\u53ef\u4ee5\u767c\u52d5.\u5c07\u5c0e\u81f4\u6574\u68f5\u6a39\u6728\u76f4\u63a5\u7834\u58de,\n[[YELLOW]]\u6240\u6709\u679d\u8449\u90fd\u5c07\u6389\u843d. -Guides.Woodcutting.Section.2=[[DARK_AQUA]]\u4ec0\u9ebc\u662f\u79cb\u98a8\u6383\u843d\u8449?\n[[YELLOW]]\u79cb\u98a8\u6383\u843d\u8449\u662f\u4e00\u500b\u88ab\u52d5\u6280\u80fd,\n[[YELLOW]]\u7576\u4f60\u7528\u65a7\u982d\u7834\u58de\u6a39\u8449\u6642,\u6a39\u8449\u5c07\u76f4\u63a5\u6467\u6bc0.\n[[YELLOW]]\u9019\u500b\u6280\u80fd\u9810\u8a2d\u5728100\u7b49\u958b\u653e. -Guides.Woodcutting.Section.3=[[DARK_AQUA]]\u4ec0\u9ebc\u662f\u96d9\u500d\u6389\u843d?\n[[YELLOW]]\u9019\u500b\u88ab\u52d5\u6280\u80fd\u53ef\u4ee5\u8b93\u4f60\u6709\u6a5f\u7387\u5728\u4f10\u6728\n[[YELLOW]]\u6642\u6a39\u6728\u6389\u843d\u66f4\u591a\u539f\u6728. -Inspect.Offline=\u4f60\u6c92\u6709\u67e5\u8a62\u96e2\u7dda\u73a9\u5bb6\u8a0a\u606f\u7684\u6b0a\u9650! -Inspect.OfflineStats=\u96e2\u7dda\u73a9\u5bb6\u7684 [mcMMO] \u7d71\u8a08\u8a0a\u606f [[YELLOW]]{0} -Inspect.Stats=[[GREEN]][mcMMO] \u7684\u7d71\u8a08\u8a0a\u606f [[YELLOW]]{0} -Inspect.TooFar=\u56e0\u8ddd\u96e2\u592a\u9060\u7121\u6cd5\u67e5\u770b\u90a3\u4f4d\u73a9\u5bb6! -Item.ChimaeraWing.Fail=**\u5947\u7f8e\u62c9\u4e4b\u7ffc\u4f7f\u7528\u5931\u6557\u4e86!** -Item.ChimaeraWing.Pass=**\u5947\u7f8e\u62c9\u4e4b\u7ffc** -Item.ChimaeraWing.Name=\u5947\u7f8e\u62c9\u4e4b\u7ffc -Item.ChimaeraWing.Lore=[[GRAY]]\u50b3\u9001\u4f60\u5230\u4f60\u7684\u5e8a\u908a. -Item.Generic.Wait=\u4f60\u5fc5\u9808\u7b49\u5f85\u76f4\u5230\u53ef\u4ee5\u518d\u6b21\u4f7f\u7528! [[YELLOW]]({0}s) -Item.Injured.Wait=\u4f60\u904e\u5ea6\u75b2\u52de\u5fc5\u9808\u7b49\u5f85\u4e00\u6bb5\u6642\u9593\u5f8c\u624d\u53ef\u4f7f\u7528. [[YELLOW]]({0}s) -Teleport.Commencing=[[GRAY]]\u5373\u5c07\u5728 [[GOLD]]({0}) [[GRAY]]\u79d2\u5f8c\u50b3\u9001, \u8acb\u4e0d\u8981\u4e82\u52d5... -Teleport.Cancelled=[[DARK_RED]]\u53d6\u6d88\u50b3\u9001! -Skills.Child=[[GOLD]](\u5b50\u6280\u80fd) -Skills.Disarmed=[[DARK_RED]]\u4f60\u7684\u6b66\u5668\u88ab\u64ca\u843d! -Skills.Header=-----[][[GREEN]]{0}[[RED]][]----- -Skills.NeedMore=[[DARK_RED]]\u4f60\u9700\u8981\u66f4\u591a[[GRAY]]{0} -Skills.Parents=\u524d\u7f6e -Skills.Stats={0}[[GREEN]]{1}[[DARK_AQUA]] XP([[GRAY]]{2}[[DARK_AQUA]]/[[GRAY]]{3}[[DARK_AQUA]]) -Skills.ChildStats={0}[[GREEN]]{1} -Skills.TooTired=\u6b64\u6280\u80fd\u6b63\u8655\u65bc\u51b7\u537b\u6642\u9593. [[YELLOW]]({0}s) -Skills.Cancelled={0} \u53d6\u6d88! -Skills.ConfirmOrCancel=[[GREEN]]\u518d\u6b21\u6309\u4e0b\u6ed1\u9f20\u53f3\u9375\u4f86\u78ba\u8a8d [[GOLD]]{0}[[GREEN]]. \u6ed1\u9f20\u5de6\u9375\u53d6\u6d88. -Stats.Header.Combat=[[GOLD]]-=\u683c\u9b25\u6280\u80fd=- -Stats.Header.Gathering=[[GOLD]]-=\u63a1\u96c6\u6280\u80fd=- -Stats.Header.Misc=[[GOLD]]-=\u96dc\u985e\u6280\u80fd=- -Stats.Own.Stats=[[GREEN]][mcMMO] \u72c0\u614b -Perks.XP.Name=\u7d93\u9a57\u503c -Perks.XP.Desc=\u67d0\u6a23\u6280\u80fd\u7372\u5f97\u5927\u91cf\u7d93\u9a57\u503c. -Perks.Lucky.Name=\u5e78\u904b -Perks.Lucky.Desc=\u7d66\u4e88 {0} \u6280\u80fd\u9ad8\u65bc33.3%\u4ee5\u4e0a\u7684\u6a5f\u7387\u89f8\u767c -Perks.Lucky.Desc.Login=\u7d66\u4e88\u6280\u80fd\u9ad8\u65bc33.3%\u4ee5\u4e0a\u7684\u6a5f\u7387\u89f8\u767c -Perks.Lucky.Bonus=[[GOLD]] ({0}\u5f88\u8d70\u904b) -Perks.Cooldowns.Name=\u5feb\u901f\u56de\u5fa9 -Perks.Cooldowns.Desc=\u6e1b\u5c11\u51b7\u537b\u6642\u9593 {0} -Perks.ActivationTime.Name=\u8010\u529b -Perks.ActivationTime.Desc=\u63d0\u9ad8\u80fd\u529b \u6301\u7e8c\u6642\u9593: {0} \u79d2 -Perks.ActivationTime.Bonus=[[GOLD]] ({0}\u8010\u4e45\u52a0\u4e58) -Hardcore.Mode.Disabled=[[GOLD]][mcMMO] \u786c\u6d3e\u6a21\u5f0f {0} \u95dc\u9589. {1} -Hardcore.Mode.Enabled=[[GOLD]][mcMMO] \u786c\u6d3e\u6a21\u5f0f {0} \u958b\u555f. {1} -Hardcore.DeathStatLoss.Name=\u6b7b\u4ea1\u6280\u80fd\u61f2\u7f70 -Hardcore.DeathStatLoss.PlayerDeath=[[GOLD]][mcMMO] [[DARK_RED]]\u56e0\u70ba\u6b7b\u4ea1\u4f60\u5931\u53bb\u4e86[[BLUE]]{0}[[DARK_RED]]. -Hardcore.DeathStatLoss.PercentageChanged=[[GOLD]][mcMMO] \u72c0\u614b\u907a\u5931\u7387\u8b8a\u66f4\u70ba {0}. -Hardcore.Vampirism.Name=\u5438\u8840\u6a21\u5f0f -Hardcore.Vampirism.Killer.Failure=[[GOLD]][mcMMO] [[YELLOW]]{0}[[GRAY]]\u592a\u4e0d\u7d14\u719f\u4ee5\u81f3\u65bc\u7121\u6cd5\u8b93\u4f60\u7372\u5f97\u4efb\u4f55\u7684\u77e5\u8b58. -Hardcore.Vampirism.Killer.Success=[[GOLD]][mcMMO] [[DARK_AQUA]]\u4f60\u5f9e[[YELLOW]]{1}[[DARK_AQUA]]\u90a3\u5077\u53d6\u4e86[[BLUE]]{0}[[DARK_AQUA]]\u500b\u7b49\u7d1a . -Hardcore.Vampirism.Victim.Failure=[[GOLD]][mcMMO] [[YELLOW]]{0}[[GRAY]]\u7121\u6cd5\u5f9e\u4f60\u9019\u5077\u53d6\u4efb\u4f55\u7684\u77e5\u8b58! -Hardcore.Vampirism.Victim.Success=[[GOLD]][mcMMO] [[YELLOW]]{0}[[DARK_RED]]\u5f9e\u4f60\u9019\u5077\u53d6\u4e86[[BLUE]]{1}[[DARK_RED]]\u500b\u7b49\u7d1a! -Hardcore.Vampirism.PercentageChanged=[[GOLD]][mcMMO] \u72c0\u614b\u5438\u6536\u7387\u8b8a\u66f4\u70ba {0}. -MOTD.Donate=[[DARK_AQUA]]\u8d0a\u52a9\u8cc7\u8a0a: -MOTD.Hardcore.Enabled=[[GOLD]][mcMMO] [[DARK_AQUA]]\u786c\u6d3e\u6a21\u5f0f\u5df2\u555f\u7528: [[DARK_RED]]{0} -MOTD.Hardcore.DeathStatLoss.Stats=[[GOLD]][mcMMO] [[DARK_AQUA]]\u6b7b\u4ea1\u6280\u80fd\u61f2\u7f70: [[DARK_RED]]{0}% -MOTD.Hardcore.Vampirism.Stats=[[GOLD]][mcMMO] [[DARK_AQUA]]\u5438\u8840\u7372\u5f97\u72c0\u614b: [[DARK_RED]]{0}% -MOTD.PerksPrefix=[mcMMO \u984d\u5916\u734e\u52f5] -MOTD.Version=[[GOLD]][mcMMO] \u6b63\u904b\u4f5c\u7684\u7248\u672c [[DARK_AQUA]]{0} -MOTD.Website=[[GOLD]][mcMMO] [[GREEN]]{0}[[YELLOW]] - mcMMO \u9996\u9801 -Smelting.Ability.FluxMining=\u6d41\u80fd\u6316\u7926\u6a5f\u7387: [[YELLOW]]{0} -Smelting.Ability.FuelEfficiency=\u71c3\u71d2\u6548\u7387\u52a0\u4e58: [[YELLOW]]{0}x -Smelting.Ability.Locked.0=\u9396\u5b9a\u76f4\u5230\u6280\u80fd {0}+ (\u4e00\u822c\u7d93\u9a57\u52a0\u6210) -Smelting.Ability.Locked.1=\u9396\u5b9a\u76f4\u5230\u6280\u80fd {0}+ (\u6d41\u80fd\u6316\u7926) -Smelting.Ability.SecondSmelt=\u518d\u51b6\u7149\u6a5f\u7387: [[YELLOW]]{0} -Smelting.Ability.VanillaXPBoost=\u4e00\u822c\u7d93\u9a57\u52a0\u4e58: [[YELLOW]]{0}x -Smelting.SubSkill.FuelEfficiency.Name=\u71c3\u6599\u6548\u7387 -Smelting.SubSkill.FuelEfficiency.Description=\u589e\u52a0\u71c3\u6599\u5728\u7194\u7210\u88e1\u71c3\u71d2\u7684\u6642\u9593 -Smelting.SubSkill.SecondSmelt.Name=\u518d\u51b6\u7149 -Smelting.SubSkill.SecondSmelt.Description=\u51b6\u7149\u7926\u7269\u52a0\u500d -Smelting.Effect.4=\u4e00\u822c\u7d93\u9a57\u52a0\u4e58 -Smelting.Effect.5=\u589e\u52a0\u51b6\u7149\u6642\u7684\u4e00\u822c\u7d93\u9a57 -Smelting.SubSkill.FluxMining.Name=\u6d41\u80fd\u6316\u7926 -Smelting.SubSkill.FluxMining.Description=\u6316\u539f\u7926\u6642\u6709\u6a5f\u7387\u76f4\u63a5\u6389\u51fa\u51b6\u7149\u597d\u7684\u7926\u7269 -Smelting.FluxMining.Success=[[GREEN]]\u7926\u7269\u81ea\u52d5\u51b6\u7149! -Smelting.Listener=\u51b6\u7149: -Smelting.SkillName=\u51b6\u7149 -Commands.Description.addlevels=\u7d66\u4e88\u73a9\u5bb6McMMO\u7b49\u7d1a -Commands.Description.adminchat=\u5207\u63dbmcMMO\u7ba1\u7406\u54e1\u804a\u5929\u958b/\u95dc\u6216\u767c\u9001\u7d66\u7ba1\u7406\u54e1\u7684\u804a\u5929\u6d88\u606f -Commands.Description.addxp=\u7d66\u4e88\u73a9\u5bb6mcMMO\u7d93\u9a57\u503c -Commands.Description.hardcore=\u8abf\u6574mcMMO\u786c\u6d3e\u6bd4\u4f8b\u6216\u5207\u63db\u786c\u6d3e\u6a21\u5f0f (\u958b/\u95dc) -Commands.Description.inspect=\u89c0\u770b\u5176\u5b83\u4f7f\u7528\u8005\u7684\u8a73\u7d30mcMMO\u8cc7\u8a0a -Commands.Description.mcability=\u4f7f\u7528\u53f3\u9375\u767c\u52d5mcMMO\u6280\u80fd(\u958b/\u95dc) -Commands.Description.mccooldown=\u67e5\u770b\u6240\u6709 mcMMO \u80fd\u529b\u7684\u51b7\u537b\u6642\u9593 -Commands.Description.mcgod=\u5207\u63dbmcMMo\u795e\u4e4b\u6a21\u5f0f(\u958b/\u95dc) -Commands.Description.mchud=\u66f4\u63db\u4f60\u7684McMMO HUD\u98a8\u683c -Commands.Description.mcmmo=\u986f\u793amcMMO\u7684\u7c21\u8981\u8aaa\u660e -Commands.Description.mcnotify=\u5207\u63dbmcMMO\u7684\u804a\u5929\u986f\u793a\u901a\u77e5 (\u958b/\u95dc) -Commands.Description.mcpurge= \u6e05\u9664mcMMO\u6280\u80fd\u7b49\u7d1a\u70ba0\u6216\u8d85\u904e{0}\u500b\u6708\u672a\u767b\u5165\u7684\u7528\u6236\u8cc7\u6599. -Commands.Description.mcrank=\u986f\u793a\u6240\u6709mcMMO\u7684\u6392\u540d -Commands.Description.mcrefresh=\u66f4\u65b0\u6240\u6709McMMO\u6280\u80fd\u51b7\u537b\u6642\u9593 -Commands.Description.mcremove=\u5f9emcMMO\u8cc7\u6599\u5eab\u4e2d\u522a\u9664\u4f7f\u7528\u8005 -Commands.Description.mcscoreboard=\u7ba1\u7406\u4f60\u7684 mcMMO \u5f97\u5206\u699c -Commands.Description.mcstats=\u986f\u793a\u4f60\u7684MMO\u7b49\u7d1a\u8207\u7d93\u9a57 -Commands.Description.mctop=\u986f\u793amcMMO\u6392\u884c\u699c -Commands.Description.mmoedit=\u4fee\u6539\u73a9\u5bb6McMMO\u7b49\u7d1a -Commands.Description.mmoupdate=\u5f9e\u820a\u7684 mcMMO \u8cc7\u6599\u5eab\u9077\u79fb\u5230\u76ee\u524d\u4f7f\u7528\u7684\u8cc7\u6599\u5eab -Commands.Description.mcconvert=\u8f49\u63db\u8cc7\u6599\u5eab\u7684\u7a2e\u985e\u6216\u7d93\u9a57\u503c\u516c\u5f0f\u7684\u7a2e\u985e -Commands.Description.mmoshowdb=\u986f\u793a\u76ee\u524d\u7684\u8cc7\u6599\u5eab\u985e\u5225 (\u70ba\u4e86\u4e4b\u5f8c\u5728 /mmoupdate \u4e2d\u4f7f\u7528) -Commands.Description.party=\u63a7\u5236\u5404\u7a2emcMMO\u968a\u4f0d\u8a2d\u7f6e -Commands.Description.partychat=\u5207\u63dbmcMMO\u968a\u4f0d\u804a\u5929(\u958b/\u95dc)\u6216\u767c\u9001\u968a\u4f0d\u804a\u5929\u8a0a\u606f -Commands.Description.ptp=\u50b3\u9001\u5230\u4e00\u500bmcMMO\u968a\u4f0d\u6210\u54e1\u65c1 -Commands.Description.Skill=\u986f\u793a\u8a73\u7d30\u7684{0}mcMMO\u6280\u80fd\u8cc7\u8a0a -Commands.Description.skillreset=\u91cd\u7f6e\u73a9\u5bb6McMMO\u7b49\u7d1a -Commands.Description.vampirism=\u8abf\u6574mcMMO\u5438\u8840\u6bd4\u4f8b\u6216\u5207\u63db\u5438\u8840\u6a21\u5f0f (\u958b/\u95dc) -Commands.Description.xplock=\u9396\u4f4f\u4f60\u4e00\u500b\u7279\u5b9amcMMO\u6280\u80fd\u7684\u7d93\u9a57\u6b04 -Commands.Description.xprate=\u8abf\u6574mcMMO\u7d93\u9a57\u503c\u6bd4\u4f8b\u6216\u8209\u8fa6mcMMO\u7d93\u9a57\u503c\u52a0\u500d\u6d3b\u52d5 -UpdateChecker.Outdated=\u60a8\u4f7f\u7528\u7684\u662f\u904e\u6642\u7684\u7248\u672cmcMMO\uff01 -UpdateChecker.NewAvailable=\u6709\u65b0\u7684\u7248\u672cBukkitDev\u3002 -Scoreboard.Header.PlayerStats=mcMMO \u72c0\u614b -Scoreboard.Header.PlayerCooldowns=mcMMO \u51b7\u537b\u6642\u9593 -Scoreboard.Header.PlayerRank=mcMMO \u6392\u540d -Scoreboard.Header.PlayerInspect=mcMMO \u72c0\u614b: -Scoreboard.Header.PowerLevel=\u6230\u9b25\u529b -Scoreboard.Misc.PowerLevel=\u6230\u9b25\u529b -Scoreboard.Misc.Level=\u7b49\u7d1a -Scoreboard.Misc.CurrentXP=\u76ee\u524d\u7d93\u9a57\u503c -Scoreboard.Misc.RemainingXP=\u5269\u9918\u7d93\u9a57\u503c -Scoreboard.Misc.Cooldown=[[LIGHT_PURPLE]]\u51b7\u537b\u6642\u9593 -Scoreboard.Misc.Overall=\u6574\u9ad4 -Recovery.Notice=\u6ce8\u610f: mcMMO[[DARK_RED]]\u7121\u6cd5\u8f09\u5165\u4f60\u7684\u8cc7\u6599.[[RED]] \u91cd\u8a665\u6b21... -Recovery.Success=[[GREEN]]\u6210\u529f!\u4f60\u7684mcMMO\u8cc7\u6599\u5df2\u8f09\u5165. -Recovery.Failure=mcMMO\u7121\u6cd5\u8f09\u5165\u4f60\u7684\u8cc7\u6599,\u4f60\u53ef\u80fd\u9700\u8981\u806f\u7e6b[[AQUA]]\u904a\u6232\u7ba1\u7406\u54e1\n[[YELLOW]]\u4f60\u53ef\u4ee5\u7e7c\u7e8c\u904a\u6232,\u4f46\u4f60[[BOLD]]\u7121\u6cd5\u5f97\u5230mcMMO\u7b49\u7d1a[[YELLOW]]\u548c\u4efb\u4f55\u7d93\u9a57[[BOLD]]\u6240\u6709\u8cc7\u6599\u4e0d\u6703\u88ab\u5132\u5b58[[YELLOW]]. -Recovery.AdminFailureNotice=[[DARK_RED]][A][[RED]]mcMMO\u7121\u6cd5\u8f09\u5165\u73a9\u5bb6[[YELLOW]]{0}[[RED]]\u7684\u8cc7\u6599. [[LIGHT_PURPLE]]\u8acb\u6aa2\u67e5\u4f60\u7684\u8cc7\u6599\u5eab\u6216\u8a2d\u5b9a. +#I'm going to try to normalize our locale file,forgive the mess for now. + +#DO NOT USE COLOR CODES IN THE JSON KEYS +#COLORS ARE DEFINED IN advanced.yml IF YOU WISH TO CHANGE THEM +JSON.Rank=等級 +JSON.DescriptionHeader=描述 +JSON.JWrapper.Header=細節 +JSON.Type.Passive=被動 +JSON.Type.Active=Active +JSON.Type.SuperAbility=超能力 +JSON.Locked=-=[鎖定]=- +JSON.LevelRequirement=等級需求 +JSON.JWrapper.Target.Type=目標類型 : +JSON.JWrapper.Target.Block=方塊 +JSON.JWrapper.Target.Player=玩家 +JSON.JWrapper.Perks.Header=&6幸運津貼 +JSON.JWrapper.Perks.Lucky={0}% 更好的賠率 +JSON.Hover.Tips=小提醒 +JSON.Acrobatics=雜技 +JSON.Alchemy=煉金術 +JSON.Archery=箭術 +JSON.Axes=斧技 +JSON.Excavation=挖掘 +JSON.Fishing=釣魚 +JSON.Herbalism=草藥學 +JSON.Mining=挖礦 +JSON.Repair=修理 +JSON.Salvage=分解 +JSON.Swords=劍術 +JSON.Taming=馴獸 +JSON.Unarmed=格鬥 +JSON.Woodcutting=伐木 +JSON.URL.Website=mcMMO 官方網站 ! +JSON.URL.Discord=mcMMO 官方 Discord 伺服器 ! +JSON.URL.Patreon=支援 nossr50 和他在 Patreon 上為 mcMMO 所做的工作 ! +JSON.URL.Spigot=官方 mcMMO 在 Spigot 上的資源頁面 ! +JSON.URL.Translation=將 mcMMO 翻譯成其他語言 ! +JSON.URL.Wiki=官方 mcMMO 維基百科 ! +JSON.SkillUnlockMessage=&6[mcMMO &e@&3{0} &6解鎖等級 &3{1}&6 級!] +JSON.Hover.Rank=&e&l等級 : &r&f{0} +JSON.Hover.NextRank=&7&o下次升級等級 {0} +# for JSON.Hover.Mystery you can add {0} to insert the level required into the name,I don't like how that looks so I'm not doing that atm +JSON.Hover.Mystery=&7??? +JSON.Hover.Mystery2=&e[&8{0}&e]&8???&r +JSON.Hover.SkillName=&3{0}&r +JSON.Hover.SuperAbility=&5{0}&r +JSON.Hover.MaxRankSkillName=&6{0}&r +JSON.Hover.AtSymbolSkills=&e@ +JSON.Hover.AtSymbolURL=&e@ + +#This is the message sent to players when an ability is activated +JSON.Notification.SuperAbility={0} + +#These are the JSON Strings used for SubSkills +JSON.Acrobatics.Roll.Interaction.Activated=測試 &c翻滾測試 +JSON.Acrobatics.SubSkill.Roll.Details.Tips=如果你在摔落時按下蹲下鍵,你將觸發雙倍翻滾效果 +Anvil.SingleItemStack=&c你不能分解或修理有多個物品的物品堆,請拆分後再使用。 + +#DO NOT USE COLOR CODES IN THE JSON KEYS +#COLORS ARE DEFINED IN advanced.yml IF YOU WISH TO CHANGE THEM + +mcMMO.Template.Prefix=&6(&amcMMO&6) +# BEGIN STYLING +Ability.Generic.Refresh=&a**技能冷卻完畢 !** +Ability.Generic.Template.Lock=&7{0} +# Skill Command Styling +Ability.Generic.Template=&3{0} : &a{1} +Ability.Generic.Template.Custom=&3{0} +Skills.Overhaul.Header=&c[]=====[]&a {0} &c[]=====[] +Effects.Effects=效果 +Effects.SubSkills.Overhaul=子技能 +Effects.Child.Overhaul=&3子等級 Lv.& {0}&3 : {1} +Effects.Child.ParentList=&a{0}&6(&3Lv.&{1}&6) +Effects.Level.Overhaul=&6等級 : &e{0} &3XP&e(&6{1}&e/&6{2}&e) +Effects.Parent=&6{0} - +Effects.Template=&3{0} : &a{1} +Commands.Stats.Self.Overhaul=統計 +Commands.XPGain.Overhaul=&6經驗來源 : &3{0} +MOTD.Version.Overhaul=&6[mcMMO] &3大改版本&6 - &3{0} +Overhaul.mcMMO.Header=&c[]=====[]&a mcMMO - 大改版本 &c[]=====[] +Overhaul.mcMMO.Url.Wrap.Prefix=&c[| +Overhaul.mcMMO.Url.Wrap.Suffix=&c|] +Overhaul.mcMMO.MmoInfo.Wiki=&e[&f在維基百科上查看此技能 !&e] +# Overhaul.Levelup can take {0} - Skill Name defined in Overhaul.Name {1} - Amount of levels gained {2} - Level in skill +Overhaul.Levelup=&l{0}提升到&r&a&l{2}&r&f 級。 +Overhaul.Name.Acrobatics=雜技 +Overhaul.Name.Alchemy=煉金術 +Overhaul.Name.Archery=箭術 +Overhaul.Name.Axes=斧技 +Overhaul.Name.Excavation=挖掘 +Overhaul.Name.Fishing=釣魚 +Overhaul.Name.Herbalism=草藥學 +Overhaul.Name.Mining=挖礦 +Overhaul.Name.Repair=修理 +Overhaul.Name.Salvage=分解 +Overhaul.Name.Smelting=冶煉 +Overhaul.Name.Swords=劍術 +Overhaul.Name.Taming=馴獸 +Overhaul.Name.Unarmed=格鬥 +Overhaul.Name.Woodcutting=伐木 +# /mcMMO Command Style Stuff +Commands.mcc.Header=&c---[]&amcMMO 指令&c[]--- +Commands.Other=&c---[]&a其他指令&c[]--- +Commands.Party.Header=&c-----[]&a隊伍&c[]----- +Commands.Party.Features.Header=&c-----[]&a特色&c[]----- +# XP BAR Allows for the following variables -- {0} = Skill Level,{1} Current XP,{2} XP Needed for next level,{3} Power Level,{4} Percentage of Level +# Make sure you turn on Experience_Bars.ThisMayCauseLag.AlwaysUpdateTitlesWhenXPIsGained if you want the XP bar title to update every time a player gains XP ! +XPBar.Template={0} +XPBar.Template.EarlyGameBoost=&6正在學習新技能…… +XPBar.Acrobatics=雜技 Lv.&6{0} +XPBar.Alchemy=煉金術 Lv.&6{0} +XPBar.Archery=箭術 Lv.&6{0} +XPBar.Axes=斧技 Lv.&6{0} +XPBar.Excavation=挖掘 Lv.&6{0} +XPBar.Fishing=釣魚 Lv.&6{0} +XPBar.Herbalism=草藥學 Lv.&6{0} +XPBar.Mining=挖礦 Lv.&6{0} +XPBar.Repair=修理 Lv.&6{0} +XPBar.Salvage=分解 Lv.&6{0} +XPBar.Smelting=冶煉 Lv.&6{0} +XPBar.Swords=劍術 Lv.&6{0} +XPBar.Taming=馴獸 Lv.&6{0} +XPBar.Unarmed=格鬥 Lv.&6{0} +XPBar.Woodcutting=伐木 Lv.&6{0} +#This is just a preset template that gets used if the 'ExtraDetails' setting is turned on in experience.yml (off by default),you can ignore this template and just edit the strings above +XPBar.Complex.Template={0} &3{4}&f% &3(&f{1}&3/&f{2}&3) +# XP BAR Allows for the following variables -- {0} = Skill Level,{1} Current XP,{2} XP Needed for next level,{3} Power Level,{4} Percentage of Level +# Make sure you turn on Experience_Bars.ThisMayCauseLag.AlwaysUpdateTitlesWhenXPIsGained if you want the XP bar title to update every time a player gains XP ! +# END STYLING + +#ACROBATICS +Acrobatics.Ability.Proc=&a**華爾茲般的降落** +Acrobatics.Combat.Proc=&a**迴避** +Acrobatics.SubSkill.Roll.Stats=&6翻滾機率 &e{0}%&6 優雅翻滾機率&e {1}% +Acrobatics.SubSkill.Roll.Stat=翻滾機率 +Acrobatics.SubSkill.Roll.Stat.Extra=優雅翻滾機率 +Acrobatics.SubSkill.Roll.Name=翻滾 +Acrobatics.SubSkill.Roll.Description=減少或者取消掉落傷害。 +Acrobatics.SubSkill.Roll.Chance=翻滾機率 : &e{0} +Acrobatics.SubSkill.Roll.GraceChance=優雅的翻滾機率 : &e{0} +Acrobatics.SubSkill.Roll.Mechanics=&7翻滾是雜技的被動子技能。\n當你受到摔落傷害時,有機率會根據你的雜技技能等級獲得減少傷害或免除傷害,在你 50 級時你有 &e{0}%&7 的機率獲得減少傷害或免除傷害,如果你開啟優雅的翻滾則有 &e{1}%&7 的機率觸發雙倍翻滾效果。\n觸發的機率會隨著你技能等級線性增長,直到 &e{2}&7 級,每一級的雜技等級提供 &e{3}%&7 的觸發機率。\n透過按住蹲下鍵 (shift) 可以翻倍翻滾機率以及雙倍減少傷害效果 ! 翻滾最多減少傷害 &c{4}&7 點傷害。 優雅翻滾最多減少傷害 &a{5}&7 點傷害。 +Acrobatics.SubSkill.GracefulRoll.Name=優雅翻滾 +Acrobatics.SubSkill.GracefulRoll.Description=普通翻滾的雙倍效果 +Acrobatics.SubSkill.Dodge.Name=迴避 +Acrobatics.SubSkill.Dodge.Description=減少一半所受攻擊傷害 +Acrobatics.SubSkill.Dodge.Stat=迴避機率 +Acrobatics.Listener=雜技 (Acrobatics) : +Acrobatics.Roll.Text=&o**迴避** +Acrobatics.SkillName=雜技 +#ALCHEMY +Alchemy.SubSkill.Catalysis.Name=催化 +Alchemy.SubSkill.Catalysis.Description=提升藥水釀造速度 +Alchemy.SubSkill.Catalysis.Stat=釀造速度 +Alchemy.SubSkill.Concoctions.Name=混合 +Alchemy.SubSkill.Concoctions.Description=釀造帶有多重材料的藥水 +Alchemy.SubSkill.Concoctions.Stat=混合等級 : &a{0}&3/&a{1} +Alchemy.SubSkill.Concoctions.Stat.Extra=配方 [&a{0}&3] : &a{1} +Alchemy.Listener=煉金術 (Alchemy) : +Alchemy.Ability.Locked.0=鎖定狀態,直到 {0}+ 技能(催化) +Alchemy.SkillName=煉金術 +#ARCHERY + + +Archery.SubSkill.SkillShot.Name=技巧射擊 +Archery.SubSkill.SkillShot.Description=增加弓箭造成的傷害 +Archery.SubSkill.SkillShot.Stat=增加射擊造成的傷害 +Archery.SubSkill.Daze.Name=擊暈 +Archery.SubSkill.Daze.Description=迷惑敵人並造成額外的傷害 +Archery.SubSkill.Daze.Stat=擊暈機率 +Archery.SubSkill.ArrowRetrieval.Name=箭矢回收 +Archery.SubSkill.ArrowRetrieval.Description=有機率從屍體上回收箭矢 +Archery.SubSkill.ArrowRetrieval.Stat=箭矢回收機率 +Archery.SubSkill.ArcheryLimitBreak.Name=箭術極限突破 +Archery.SubSkill.ArcheryLimitBreak.Description=突破你的極限。 +Archery.SubSkill.ArcheryLimitBreak.Stat=突破極限的傷害加成 +Archery.Listener=箭術 (Archery) : +Archery.SkillName=箭術 +#AXES +Axes.Ability.Bonus.0=斧頭精通 +Axes.Ability.Bonus.1=附加 {0} 傷害 +Axes.Ability.Bonus.2=破甲 +Axes.Ability.Bonus.3=對盔甲造成 {0} 點額外傷害 +Axes.Ability.Bonus.4=強力衝擊 +Axes.Ability.Bonus.5=對無盔甲的敵人造成 {0} 點額外傷害 +Axes.Ability.Lower=&7你放下了你的斧頭。 +Axes.Ability.Ready=&3你 &6握緊&3 了你的斧頭。 +Axes.Ability.Ready.Extra=&3你 &6拿起了&3 你的斧頭。&7({0} 正在冷卻 {1} 秒) +Axes.Combat.CritStruck=&4你打出了暴擊 ! +Axes.Combat.CriticalHit=暴擊 ! +Axes.Combat.GI.Proc=&a**巨力攻擊** +Axes.Combat.GI.Struck=**被強烈衝擊擊中** +Axes.Combat.SS.Struck=&4被斬首者技能攻擊 ! +Axes.SubSkill.SkullSplitter.Name=斬首者 (主動技能) +Axes.SubSkill.SkullSplitter.Description=造成範圍傷害 +Axes.SubSkill.SkullSplitter.Stat=斬首者持續時間 +Axes.SubSkill.CriticalStrikes.Name=暴擊 +Axes.SubSkill.CriticalStrikes.Description=雙倍傷害 +Axes.SubSkill.CriticalStrikes.Stat=暴擊機率 +Axes.SubSkill.AxeMastery.Name=斧頭精通 +Axes.SubSkill.AxeMastery.Description=增加額外傷害 +Axes.SubSkill.AxesLimitBreak.Name=斧技極限突破 +Axes.SubSkill.AxesLimitBreak.Description=突破你的極限。 +Axes.SubSkill.AxesLimitBreak.Stat=突破極限的傷害加成 +Axes.SubSkill.ArmorImpact.Name=破甲 +Axes.SubSkill.ArmorImpact.Description=用足夠的力量擊碎盔甲 +Axes.SubSkill.GreaterImpact.Name=強烈衝擊 +Axes.SubSkill.GreaterImpact.Description=對無盔甲敵人造成額外傷害 +Axes.Listener=斧技 (Axes) : +Axes.SkillName=斧技 +Axes.Skills.SS.Off=**斬首者技能結束** +Axes.Skills.SS.On=&a**斬首者技能啟動** +Axes.Skills.SS.Refresh=&a你的 &e斬首者 &a技能可以使用了 ! +Axes.Skills.SS.Other.Off=斬首者&a 結束了,進入冷卻 &e{0} +Axes.Skills.SS.Other.On=&a{0}&2使用了 &c斬首者 ! +#EXCAVATION +Excavation.Ability.Lower=&7你放下了你的鏟子。 +Excavation.Ability.Ready=&3你 &6握緊&3 了你的鏟子。 +Excavation.SubSkill.GigaDrillBreaker.Name=暴走鑽頭 +Excavation.SubSkill.GigaDrillBreaker.Description=3 倍掉落和 3 倍經驗以及+速度 +Excavation.SubSkill.GigaDrillBreaker.Stat=暴走鑽頭持續時間 +Excavation.SubSkill.Archaeology.Name=考古學 +Excavation.SubSkill.Archaeology.Description=挖掘大地的秘密 ! 較高的挖掘等級使你在挖掘土地寶藏時有較高機率獲得經驗值 ! +Excavation.SubSkill.Archaeology.Stat=考古學獲得經驗值的機率 +Excavation.SubSkill.Archaeology.Stat.Extra=考古學獲得經驗值的數量 +Excavation.Listener=挖掘 (Excavation) : +Excavation.SkillName=挖掘 +Excavation.Skills.GigaDrillBreaker.Off=**暴走鑽頭已結束** +Excavation.Skills.GigaDrillBreaker.On=&a**暴走鑽頭開啟** +Excavation.Skills.GigaDrillBreaker.Refresh=&a你的 &e暴走鑽頭 &a技能可以使用了 ! +Excavation.Skills.GigaDrillBreaker.Other.Off=暴走鑽頭&a 結束了,進入冷卻 &e{0} +Excavation.Skills.GigaDrillBreaker.Other.On=&a{0}&2 使用了 &c暴走鑽頭 ! +#FISHING +Fishing.ScarcityTip=&e&o該區域已經過度捕撈,請到至少 {0} 的方塊以外再嘗試。 +Fishing.Scared=&7&o亂動會嚇跑魚 ! +Fishing.Exhausting=&c&o不正確使用釣竿會加劇耐久的損耗 ! +Fishing.LowResourcesTip=&7你覺得這塊區域似乎沒有多少魚了。 +Fishing.Ability.Info=魔法獵人 : &7**隨著淘金者等級提高** +Fishing.Ability.Locked.0=鎖定狀態,直到 {0}+ 技能(抖動) +Fishing.Ability.Locked.1={0}+ 級後解鎖 (冰釣) +Fishing.Ability.Locked.2=鎖定狀態,直到 {0}+ 技能 (釣魚大師) +Fishing.SubSkill.TreasureHunter.Name=淘金者 +Fishing.SubSkill.TreasureHunter.Description=釣出各種各樣的物品 +Fishing.SubSkill.TreasureHunter.Stat=淘金者等級 : &a{0}&3/&a{1} +Fishing.SubSkill.TreasureHunter.Stat.Extra=掉落率 : &7一般 : &e{0} &a普通 : &e{1}\n&9稀有 : &e{2} &d罕見 : &e{3} &6史詩 : &e{4} &b神話 : &e{5} +Fishing.SubSkill.MagicHunter.Name=魔法獵人 +Fishing.SubSkill.MagicHunter.Description=找到附魔物品 +Fishing.SubSkill.MagicHunter.Stat=魔法獵人機率 +Fishing.SubSkill.Shake.Name=抖動 +Fishing.SubSkill.Shake.Description=用釣竿把玩家或生物身上的物品抖下來 +Fishing.SubSkill.Shake.Stat=抖動機率 +Fishing.SubSkill.FishermansDiet.Name=漁夫的食譜 +Fishing.SubSkill.FishermansDiet.Description=提高魚類食物回復的飽食度 +Fishing.SubSkill.FishermansDiet.Stat=漁夫的食譜 : &a等級 {0} +Fishing.SubSkill.MasterAngler.Name=釣魚大師 +Fishing.SubSkill.MasterAngler.Description=魚頻繁地被捕獲,從船上釣魚效果更好。 +Fishing.SubSkill.MasterAngler.Stat=釣魚最少等待時間減少 : &a-{0} 秒 +Fishing.SubSkill.MasterAngler.Stat.Extra=釣魚最多等待時間減少 : &a-{0} 秒 +Fishing.SubSkill.IceFishing.Name=冰釣 +Fishing.SubSkill.IceFishing.Description=允許你在冰冷的環境下釣魚 +Fishing.SubSkill.IceFishing.Stat=冰釣 +Fishing.Chance.Raining=&9大量獎勵 +Fishing.Listener=釣魚 (Fishing) : +Fishing.Ability.TH.MagicFound=&7你感到一股魔力的波動…… +Fishing.Ability.TH.Boom=&7繁榮時期 !!! +Fishing.Ability.TH.Poison=&7有什麼東西聞起來不太對勁…… +Fishing.SkillName=釣魚 +#HERBALISM +Herbalism.Ability.GTe.NeedMore=你需要更多種子使用綠手指。 +Herbalism.Ability.GTh.Fail=**綠化失敗** +Herbalism.Ability.GTh=&a**綠化** +Herbalism.Ability.Lower=&7你放下了你的鋤頭。 +Herbalism.Ability.Ready=&3你 &6挑起&3 了你的鋤頭。 +Herbalism.Ability.ShroomThumb.Fail=**菌絲化失敗** +Herbalism.SubSkill.GreenTerra.Name=大地祝福 +Herbalism.SubSkill.GreenTerra.Description=播撒大地之神的恩惠,獲得 3 倍掉率 +Herbalism.SubSkill.GreenTerra.Stat=大地祝福持續時間 +Herbalism.SubSkill.GreenThumb.Name=綠手指 +Herbalism.SubSkill.GreenThumb.Description=收穫時自動播種種子 +Herbalism.SubSkill.GreenThumb.Stat=綠手指觸發機率 +Herbalism.SubSkill.GreenThumb.Stat.Extra=綠手指階段 : &a作物生長在第 {0} 階段 +Herbalism.Effect.4=綠化 (方塊) +Herbalism.SubSkill.GreenThumb.Description.2=使磚塊等長苔蘚,或讓草生長 +Herbalism.SubSkill.FarmersDiet.Name=農夫食譜 +Herbalism.SubSkill.FarmersDiet.Description=食用農產品時額外回复飢餓度 +Herbalism.SubSkill.FarmersDiet.Stat=農夫食譜 : &a等級 {0} +Herbalism.SubSkill.DoubleDrops.Name=雙倍掉落 +Herbalism.SubSkill.DoubleDrops.Description=雙倍物品 +Herbalism.SubSkill.DoubleDrops.Stat=雙倍掉落機率 +Herbalism.SubSkill.HylianLuck.Name=海拉爾的祝福 +Herbalism.SubSkill.HylianLuck.Description=給予小機率找到稀有物品的能力 +Herbalism.SubSkill.HylianLuck.Stat=海拉爾的祝福的機率 +Herbalism.SubSkill.ShroomThumb.Name=菌絲化 +Herbalism.SubSkill.ShroomThumb.Description=向泥土和草地散播菌絲 +Herbalism.SubSkill.ShroomThumb.Stat=菌絲化機率 +Herbalism.HylianLuck=&a願海拉爾的祝福與你同在 ! +Herbalism.Listener=草藥學 (Herbalism) : +Herbalism.SkillName=草藥學 +Herbalism.Skills.GTe.Off=**土神庇佑已結束** +Herbalism.Skills.GTe.On=&a**土神庇佑開啟** +Herbalism.Skills.GTe.Refresh=&a你的 &e土神庇佑 &a技能可以使用了 ! +Herbalism.Skills.GTe.Other.Off=土神庇佑&a 結束了,進入冷卻 &e{0} +Herbalism.Skills.GTe.Other.On=&a{0}&2 使用了 &c土神庇佑 ! +#MINING +Mining.Ability.Locked.0=鎖定直到 {0}+ 技能 (爆破開挖) +Mining.Ability.Locked.1=鎖定直到 {0}+ 技能 (大型炸彈) +Mining.Ability.Locked.2=鎖定直到 {0}+ 技能 (爆破專家) +Mining.Ability.Lower=&7你放下了你的鎬子。 +Mining.Ability.Ready=&3你 &6拿起&3 了你的鎬子。 +Mining.SubSkill.SuperBreaker.Name=超級碎石機 +Mining.SubSkill.SuperBreaker.Description=+速度和 3 倍掉落率 +Mining.SubSkill.SuperBreaker.Stat=超級碎石機持續時間 +Mining.SubSkill.DoubleDrops.Name=雙倍掉落 +Mining.SubSkill.DoubleDrops.Description=雙倍普通物品 +Mining.SubSkill.DoubleDrops.Stat=雙倍掉落機率 : &e{0} +Mining.SubSkill.BlastMining.Name=爆破開挖 +Mining.SubSkill.BlastMining.Description=使用 TNT 炸礦物時會獲得額外物品 +Mining.SubSkill.BlastMining.Stat=爆破開挖 : &a等級 {0}/{1} &7({2}) +Mining.SubSkill.BlastMining.Stat.Extra=爆破半徑加成 : &a+{0} +Mining.SubSkill.BiggerBombs.Name=大型炸彈 +Mining.SubSkill.BiggerBombs.Description=增加 TNT 爆炸範圍 +Mining.SubSkill.DemolitionsExpertise.Name=爆破專家 +Mining.SubSkill.DemolitionsExpertise.Description=減少 TNT 的傷害 +Mining.SubSkill.DemolitionsExpertise.Stat=爆炸傷害減少 + +Mining.Listener=挖礦 (Mining) : +Mining.SkillName=挖礦 +Mining.Skills.SuperBreaker.Off=**超級碎石機結束** +Mining.Skills.SuperBreaker.On=&a**超級碎石機開啟** +Mining.Skills.SuperBreaker.Other.Off=超級碎石機 &a結束了,進入冷卻 &e{0} +Mining.Skills.SuperBreaker.Other.On=&a{0}&2 使用了 &c超級碎石機 ! +Mining.Skills.SuperBreaker.Refresh=&a你的 &e超級碎石機 &a技能可以使用了 ! +#Blast Mining +Mining.Blast.Boom=&7**嘣** +Mining.Blast.Cooldown= +Mining.Blast.Effect=+{0} 礦物量和 {1} 倍掉落 +Mining.Blast.Other.On=&a{0}&2 使用了 &c爆破開挖 ! +Mining.Blast.Refresh=&a你的 &e爆破開挖 &a技能可以使用了 ! +#REPAIR +Repair.SubSkill.Repair.Name=修理 +Repair.SubSkill.Repair.Description=修理工具和裝備 +Repair.SubSkill.GoldRepair.Name=修理黃金物品 ({0}+ 技能) +Repair.SubSkill.GoldRepair.Description=修理黃金工具和裝備 +Repair.SubSkill.IronRepair.Name=修理鐵製物品 ({0}+ 技能) +Repair.SubSkill.IronRepair.Description=修理鐵製工具和盔甲 +Repair.SubSkill.StoneRepair.Name=修理石頭物品 ({0}+ 技能) +Repair.SubSkill.StoneRepair.Description=修理石頭工具 +Repair.SubSkill.RepairMastery.Name=修理精通 +Repair.SubSkill.RepairMastery.Description=修理時提升回復的耐久度 +Repair.SubSkill.RepairMastery.Stat=修理精通 : &a額外回復 {0} 耐久 +Repair.SubSkill.SuperRepair.Name=超級修理 +Repair.SubSkill.SuperRepair.Description=雙倍修理效果 +Repair.SubSkill.SuperRepair.Stat=超級修理機率 +Repair.SubSkill.DiamondRepair.Name=鑽石修理 ({0}+ 技能) +Repair.SubSkill.DiamondRepair.Description=修理鑽石工具和裝備 +Repair.SubSkill.ArcaneForging.Name=秘法鍛造 +Repair.SubSkill.ArcaneForging.Description=修理附魔物品 +Repair.SubSkill.ArcaneForging.Stat=秘法鍛造 : &e等級 {0}/{1} +Repair.SubSkill.ArcaneForging.Stat.Extra=&3秘法鍛造賠率 : &7成功 &a{0}&7%,失敗 &c{1}&7% +Repair.Error=&4mcMMO 在嘗試修理此物品時發生了錯誤 ! +Repair.Listener.Anvil=&4你放置的鐵方塊可以用來修理工具和裝備。 +Repair.Listener=修理 (Repair) : +Repair.SkillName=修理 +Repair.Skills.AdeptDiamond=&4你的技能等級不足以修理鑽石裝備。 +Repair.Skills.AdeptGold=&4你的技能等級不足以修理黃金裝備。 +Repair.Skills.AdeptIron=&4你的技能不足以修理鐵製裝備。 +Repair.Skills.AdeptStone=&4你的技能等級不足以修理石頭裝備 +Repair.Skills.Adept=你必須達到等級 &e{0}&c 才能修理 &e{1} +Repair.Skills.FeltEasy=&7那看起來很簡單。 +Repair.Skills.FullDurability=&7你的裝備已經滿耐久度了 +Repair.Skills.StackedItems=&4你無法修理已疊加的物品。 +Repair.Pretty.Name=修理 +#Arcane Forging +Repair.Arcane.Downgrade=這件物品的附魔等級已下降。 +Repair.Arcane.Fail=這件物品的附魔已消失。 +Repair.Arcane.Lost=你的技能等級不足以保留附魔屬性。 +Repair.Arcane.Perfect=&a你成功地保留了這件物品的附魔。 +#SALVAGE +Salvage.Pretty.Name=分解 +Salvage.SubSkill.UnderstandingTheArt.Name=分解精通 +Salvage.SubSkill.UnderstandingTheArt.Description=你不只是再翻鄰居的垃圾,你是在保護環境。\n增強分解的各種屬性。 +Salvage.SubSkill.ScrapCollector.Name=廢物利用 +Salvage.SubSkill.ScrapCollector.Description=從物品中分解出材料,完美分解取決於技能和運氣。 +Salvage.SubSkill.ScrapCollector.Stat=廢物利用 : &a最多分解出 &e{0}&a 個物品。佔一些運氣成分。 +Salvage.SubSkill.ArcaneSalvage.Name=奧數分解 +Salvage.SubSkill.ArcaneSalvage.Description=從物品中拆解附魔 +Salvage.SubSkill.ArcaneSalvage.Stat=奧數分解 : &e等級 {0}/{1} +Salvage.Ability.Bonus.0=進階分解 +Salvage.Ability.Bonus.1=最大限度回收 {0} 損壞的物品 +Salvage.Arcane.ExtractFull=&7完全拆解出附魔機率 +Salvage.Arcane.ExtractPartial=&7部分拆解出附魔機率 +Salvage.Skills.Success=&a物品已分解 ! +Salvage.Skills.Adept.Damaged=&4你的技能等級不足以分解損壞的物品。 +Salvage.Skills.Adept.Level=你必須達到 &e{0}&c 級才能分解 &e{1} +Salvage.Skills.TooDamaged=&4該物品損壞過於嚴重,無法分解。 +Salvage.Skills.ArcaneFailed=&c你無法拆解出本物品所蘊含的知識。 +Salvage.Skills.ArcanePartial=&c你只能拆解出本物品所蘊含的部分知識。 +Salvage.Skills.ArcaneSuccess=&a你能夠完全拆解出本物品所含的知識 ! +Salvage.Listener.Anvil=&4你已經放置了分解鐵砧,使用它來分解工具和盔甲。 +Salvage.Listener=分解 (Salvage) : +Salvage.SkillName=分解 +Salvage.Skills.Lottery.Normal=&6你能夠從 &e{1}&6 中回收 &3{0}&6 材料。 +Salvage.Skills.Lottery.Perfect=&a&l完美 !&r&6 你毫不費力地搶救了 &3{1}&6,檢視了 &3{0}&6 材料。 +Salvage.Skills.Lottery.Untrained=&7你在回收方面沒有得到適當的訓練,你只能從 &a{1}&7 中回復 &c{0}&7 材料。 +#Anvil (Shared between SALVAGE and REPAIR) +Anvil.Unbreakable=這個物品不會損壞 ! +#SWORDS +Swords.Ability.Lower=&7你放下了你的劍。 +Swords.Ability.Ready=&3你 &6握緊&3 了你的劍。 +Swords.Combat.Rupture.Note=&7注意 : &e週期傷害並非致命的 ! +Swords.Combat.Bleeding.Started=&4你在流血 ! +Swords.Combat.Bleeding.Stopped=&7流血 &a已停止&7 ! +Swords.Combat.Bleeding=&a**敵人正在不斷流血** +Swords.Combat.Counter.Hit=&4你反擊了對手 ! +Swords.Combat.Countered=&a**反擊了敵人** +Swords.Combat.SS.Struck=&4發動利刃突刺 ! +Swords.SubSkill.CounterAttack.Name=反擊 +Swords.SubSkill.CounterAttack.Description=受到攻擊時反射一定傷害 ! +Swords.SubSkill.CounterAttack.Stat=反擊機率 +Swords.SubSkill.SerratedStrikes.Name=利刃突刺 +Swords.SubSkill.SerratedStrikes.Description=在範圍攻擊 (橫掃) 時,造成攻擊的部分傷害,有機率伴隨撕裂 ! +Swords.SubSkill.SerratedStrikes.Stat=利刃突刺持續時間 +Swords.SubSkill.Rupture.Name=撕裂 +Swords.SubSkill.Rupture.Description=造成流血的持續性傷害 +Swords.SubSkill.Stab.Name=穿刺 +Swords.SubSkill.Stab.Description=為你的攻擊增加額外傷害。 +Swords.SubSkill.Stab.Stat=穿刺傷害 +Swords.SubSkill.SwordsLimitBreak.Name=劍術極限突破 +Swords.SubSkill.SwordsLimitBreak.Description=突破你的極限。 +Swords.SubSkill.SwordsLimitBreak.Stat=突破極限的傷害加成 +Swords.SubSkill.Rupture.Stat=撕裂機率 +Swords.SubSkill.Rupture.Stat.Extra=&3撕裂持續時間 :&e{0}s&a 對抗玩家,&e{1}s&a 對抗生物。 +Swords.SubSkill.Rupture.Stat.TickDamage=&3撕裂每刻傷害 :&e{0}&a 對抗玩家,&e{1}&a 對抗生物。 +Swords.SubSkill.Rupture.Stat.ExplosionDamage=&3撕裂爆裂傷害 :&e{0}&a 對抗玩家,&e{1}&a 對抗生物。 +Swords.Effect.4=利刃突刺 撕裂+ +Swords.Effect.5={0} 刻撕裂 +Swords.Listener=劍術 (Swords) : +Swords.SkillName=劍術 +Swords.Skills.SS.Off=**利刃突刺結束** +Swords.Skills.SS.On=&a**利刃突刺開啟** +Swords.Skills.SS.Refresh=&a你的 &e利刃突刺 &a技能可以使用了 ! +Swords.Skills.SS.Other.Off=利刃突刺&a 結束了,進入冷卻 &e{0} +Swords.Skills.SS.Other.On=&a{0}&2 使用了 &c利刃突刺 ! +#TAMING +Taming.Ability.Bonus.0=環境感知 +Taming.Ability.Bonus.1=狼會避免危險 +Taming.Ability.Bonus.2=毛皮強化 +Taming.Ability.Bonus.3=1/{0} 傷害,抗火 +Taming.Ability.Bonus.4=衝擊抗性 +Taming.Ability.Bonus.5=爆炸造成 1/{0} 普通傷害 +Taming.Ability.Bonus.6=利爪 +Taming.Ability.Bonus.7=+{0} 傷害 +Taming.Ability.Bonus.8=速食服務 +Taming.Ability.Bonus.9={0} 的機率攻擊時回血 +Taming.Ability.Bonus.10=犬神的庇護 +Taming.Ability.Bonus.11=受到魔法或中毒傷害時回復生命值 +Taming.Ability.Locked.0= {0}+ 級後解鎖 (環境感知) +Taming.Ability.Locked.1=鎖定直到 {0}+ 技能 (毛皮強化) +Taming.Ability.Locked.2=鎖定直到 {0}+ 技能 (衝擊抗性) +Taming.Ability.Locked.3=鎖定直到 {0}+ 技能 (利爪) +Taming.Ability.Locked.4={0}+ 級後解鎖 (速食服務) +Taming.Ability.Locked.5={0}+ 級後解鎖 (犬神的庇護) +Taming.Combat.Chance.Gore=嗜血 +Taming.SubSkill.BeastLore.Name=野獸資訊 +Taming.SubSkill.BeastLore.Description=骨頭點擊狼或山貓 +Taming.SubSkill.ShockProof.Name=衝擊抗性 +Taming.SubSkill.ShockProof.Description=減少爆炸傷害 +Taming.SubSkill.CallOfTheWild.Name=野性呼喚 +Taming.SubSkill.CallOfTheWild.Description=為你召喚一隻寵物 +Taming.SubSkill.CallOfTheWild.Description.2=&7召喚 : 蹲下和點擊左鍵,手持指定物品\n {0} {1} (山貓)、{2} {3} (狼)、{4} {5} (馬) +Taming.SubSkill.FastFoodService.Name=速食服務 +Taming.SubSkill.FastFoodService.Description=一定機率使狼在攻擊時回復自身血量 +Taming.SubSkill.HolyHound.Name=犬神的庇護 +Taming.SubSkill.HolyHound.Description=已被魔法和中毒效果治愈 +Taming.SubSkill.Gore.Name=嗜血 +Taming.SubSkill.Gore.Description=致命攻擊會給目標放血 +Taming.SubSkill.SharpenedClaws.Name=利爪 +Taming.SubSkill.SharpenedClaws.Description=額外傷害 +Taming.SubSkill.EnvironmentallyAware.Name=環境感知 +Taming.SubSkill.EnvironmentallyAware.Description=仙人掌/岩漿恐懼症,減少摔落傷害 +Taming.SubSkill.ThickFur.Name=毛皮強化 +Taming.SubSkill.ThickFur.Description=削減受到的傷害,抗火 +Taming.SubSkill.Pummel.Name=猛擊 +Taming.SubSkill.Pummel.Description=你的狼有機率擊退敵人 +Taming.SubSkill.Pummel.TargetMessage=你被狼擊退了 ! +Taming.Listener.Wolf=&8你的狼回到你身邊…… +Taming.Listener=馴獸 (Taming) : +Taming.SkillName=馴獸 +Taming.Summon.COTW.Success.WithoutLifespan=&a(野性的呼喚) &7你已經召喚了一個 &6{0}&7。 +Taming.Summon.COTW.Success.WithLifespan=&a(野性的呼喚) &7你已經召喚了一個 &6{0}&7,它的持續時間為 &6{1}&7 秒。 +Taming.Summon.COTW.Limit=&a(Call Of The Wild) &7你只能同時擁有 &c{0} &7召喚 &7{1} 寵物。 +Taming.Summon.COTW.TimeExpired=&a(野性的呼喚)&7時間到了,你的 &6{0}&7 出發了。 +Taming.Summon.COTW.Removed=&a(野性的呼喚) &7你召喚的 &6{0}&7 已經從這個世界消失了。 +Taming.Summon.COTW.BreedingDisallowed=&a(野性的呼喚) &c你不能繁殖被召喚的動物。 +Taming.Summon.COTW.NeedMoreItems=&a(野性的呼喚)&7你還需要 &e{0}&7 個 &3{1}&7。 +Taming.Summon.Name.Format={0} 的 {1} +#UNARMED +Unarmed.Ability.Bonus.0=鐵臂式 +Unarmed.Ability.Bonus.1=+{0} 傷害加成 +Unarmed.Ability.IronGrip.Attacker=你的對手有超強握力 ! +Unarmed.Ability.IronGrip.Defender=&a你的超強握力抵擋住了對方的繳械攻擊 ! +Unarmed.Ability.Lower=&7你鬆開了你的拳頭。 +Unarmed.Ability.Ready=&3你 &6握緊&3 了你的拳頭。 +Unarmed.SubSkill.Berserk.Name=狂暴 +Unarmed.SubSkill.Berserk.Description=+50% 傷害,能破壞硬度低的方塊 +Unarmed.SubSkill.Berserk.Stat=狂暴持續時間 +Unarmed.SubSkill.Disarm.Name=繳械 +Unarmed.SubSkill.Disarm.Description=擊落敵人手中的武器 +Unarmed.SubSkill.Disarm.Stat=繳械機率 +Unarmed.SubSkill.UnarmedLimitBreak.Name=格鬥極限突破 +Unarmed.SubSkill.UnarmedLimitBreak.Description=突破你的極限。 +Unarmed.SubSkill.UnarmedLimitBreak.Stat=突破極限的傷害加成 +Unarmed.SubSkill.SteelArmStyle.Name=鐵臂式 +Unarmed.SubSkill.SteelArmStyle.Description=隨著時間推移,手臂將越來越硬 +Unarmed.SubSkill.ArrowDeflect.Name=箭矢偏向 +Unarmed.SubSkill.ArrowDeflect.Description=讓箭矢偏向 +Unarmed.SubSkill.ArrowDeflect.Stat=箭矢偏向機率 +Unarmed.SubSkill.IronGrip.Name=鐵腕 +Unarmed.SubSkill.IronGrip.Description=防止你被繳械 +Unarmed.SubSkill.IronGrip.Stat=鐵腕觸發機率 +Unarmed.SubSkill.BlockCracker.Name=方塊粉碎機 +Unarmed.SubSkill.BlockCracker.Description=用拳頭打碎石頭 +Unarmed.Listener=格鬥 (Unarmed) : +Unarmed.SkillName=格鬥 +Unarmed.Skills.Berserk.Off=**狂暴結束** +Unarmed.Skills.Berserk.On=&a**狂暴開啟** +Unarmed.Skills.Berserk.Other.Off=狂暴&a 結束了,進入冷卻 &e{0} +Unarmed.Skills.Berserk.Other.On=&a{0}&2 使用了 &c狂暴 ! +Unarmed.Skills.Berserk.Refresh=&a你的 &e狂暴 &a技能可以使用了 ! +#WOODCUTTING +Woodcutting.Ability.0=秋風掃落葉 +Woodcutting.Ability.1=掃除樹葉 +Woodcutting.Ability.Locked.0=鎖定狀態,直到 {0}+ 技能 (秋風掃落葉) +Woodcutting.SubSkill.TreeFeller.Name=伐木工 +Woodcutting.SubSkill.TreeFeller.Description=爆發式砍樹 +Woodcutting.SubSkill.TreeFeller.Stat=爆發式砍樹持續時間 +Woodcutting.SubSkill.LeafBlower.Name=秋風掃落葉 +Woodcutting.SubSkill.LeafBlower.Description=掃除樹葉 +Woodcutting.SubSkill.KnockOnWood.Name=敲木頭 +Woodcutting.SubSkill.KnockOnWood.Description=使用伐木機時尋找額外的好東西 +Woodcutting.SubSkill.KnockOnWood.Stat=敲木頭 +Woodcutting.SubSkill.KnockOnWood.Loot.Normal=來自樹木的標準戰利品 +Woodcutting.SubSkill.KnockOnWood.Loot.Rank2=來自樹木和經驗值的標準戰利品 +Woodcutting.SubSkill.HarvestLumber.Name=樹木豐收 +Woodcutting.SubSkill.HarvestLumber.Description=巧妙地獲得更多木頭\n有機率雙倍掉落 +Woodcutting.SubSkill.HarvestLumber.Stat=樹木豐收雙倍機率 +Woodcutting.SubSkill.Splinter.Name=粉碎 +Woodcutting.SubSkill.Splinter.Description=更有效的砍樹。 +Woodcutting.SubSkill.BarkSurgeon.Name=樹木外科醫生 +Woodcutting.SubSkill.BarkSurgeon.Description=剝樹時提取實用的材料。 +Woodcutting.SubSkill.NaturesBounty.Name=大自然的恩惠 +Woodcutting.SubSkill.NaturesBounty.Description=從大自然中獲得經驗。 +Woodcutting.Listener=伐木 (Woodcutting) : +Woodcutting.SkillName=伐木 +Woodcutting.Skills.TreeFeller.Off=**伐木工結束** +Woodcutting.Skills.TreeFeller.On=&a**伐木工開啟** +Woodcutting.Skills.TreeFeller.Refresh=&a你的 &e伐木工 &a技能可以使用了 ! +Woodcutting.Skills.TreeFeller.Other.Off=伐木技能 &a結束了,進入冷卻 &e{0} +Woodcutting.Skills.TreeFeller.Other.On=&a{0}&2 使用了 &c伐木工技能 ! +Woodcutting.Skills.TreeFeller.Splinter=你的斧頭變成了一堆碎片 ! +Woodcutting.Skills.TreeFeller.Threshold=那棵樹太大了 ! +#ABILITIY + +#COMBAT +Combat.ArrowDeflect=&f**箭矢偏向** +Combat.BeastLore=&a**馴獸知識** +Combat.BeastLoreHealth=&3生命值 (&a{0}&3/{1}) +Combat.BeastLoreOwner=&3擁有者 (&c{0}&3) +Combat.BeastLoreHorseSpeed=&3馬匹移動速度 (&a{0} 格/秒&3) +Combat.BeastLoreHorseJumpStrength=&3馬匹跳躍高度 (&a最高 {0} 格&3) +Combat.Gore=&a**目標被放血** +Combat.StruckByGore=**你被放血了** +Combat.TargetDazed=目標被 &4被擊暈 +Combat.TouchedFuzzy=&4頭暈目眩。 +#COMMANDS +##generic +mcMMO.Description=&3關於&e mcMMO &3: &6mcMMO 是&c開源&6 RPG 模組,&6由 &9nossr50&6 主導建立於 2011 年 2 月。主旨為玩家提供高品質的 RPG 體驗。&3小提醒 : &6- &a使用&c/mcMMO help&a 查看指令,&6 - &a輸入 &c/mcmmo help&a 查看詳細的技能資訊,&3開發者 : &6- &anossr50 &9(創始人& 項目負責人)&6 - &aGJ &9(項目組長)&6 - &aNuclearW &9(開發者)&6 - &abm01 &9(開發者)&6 - &aTfT_02 &9(開發者)&6 - &aGlitchfinder &9(開發者)&6 - &at00thpick1 &9(開發者)&6 - &aFlandre_tw &3翻譯員。&3實用連結 :&6 - &ahttps://github.com/mcMMO-Dev/mcMMO/issues&6 漏洞報告&6 - &ahttps://discord.gg/EJGVanb &6官方 Discord 伺服器 +mcMMO.Description.FormerDevs=&3前開發者 : &aGJ、NuclearW、bm01、TfT_02、Glitchfinder +Commands.addlevels.AwardAll.1=你所有的技能等級被提升了 {0} 級 ! +Commands.addlevels.AwardAll.2=你所有的技能等級已被 {0} 修改。 +Commands.addlevels.AwardSkill.1=&a你的 {0} 技能等級被提升了 {1} 級 ! +Commands.addlevels.AwardSkill.2={0} 技能等級已被 {1} 修改。 +Commands.addxp.AwardAll=&a你所有的技能獲得 {0} 經驗 ! +Commands.addxp.AwardSkill=&a你的 {0} 技能獲得了 {1} 經驗 ! +Commands.Ability.Off=&c關閉能力使用 +Commands.Ability.On=&a開啟能力使用 +Commands.Ability.Toggle=能力使用已切換為 &e{0} +Commands.AdminChat.Off=&c關閉管理聊天模式 +Commands.AdminChat.On=&a開啟管理聊天模式 +Commands.AdminToggle=&a- 切換管理員聊天 +Commands.Chat.Console=*控制台* +Commands.Cooldowns.Header=&6--= &amcMMO 能力冷卻&6 =-- +Commands.Cooldowns.Row.N=\ &c{0}&f - 剩餘 &6{1} &f秒 +Commands.Cooldowns.Row.Y=\ &b{0}&f - &2準備就緒 ! +Commands.Database.CooldownMS=你必須等待 {0} 毫秒才能再次使用該指令。 +Commands.Database.Cooldown=你必須等待 {0} 秒才能再次使用該指令。 +Commands.Database.Processing=你的指令正在處理中,請耐心等待。 +Commands.Disabled=這個指令被關閉了。 +Commands.DoesNotExist= &c該名玩家不存在於資料庫中 ! +Commands.GodMode.Disabled=mcMMO 上帝模式關閉 +Commands.GodMode.Enabled=mcMMO 上帝模式開啟 +Commands.AdminChatSpy.Enabled=mcMMO 隊伍聊天監視已開啟 +Commands.AdminChatSpy.Disabled=mcMMO 隊伍聊天監視已關閉 +Commands.AdminChatSpy.Toggle=mcMMO 隊伍聊天已切換為&e {0} +Commands.AdminChatSpy.Chat=&6[監視 : &a{0}&6] &f{1} +Commands.GodMode.Forbidden=[mcMMO] 上帝模式不允許在這個世界開啟 (詳見權限配置) +Commands.GodMode.Toggle=上帝模式已切換為 &e{0} +Commands.Healthbars.Changed.HEARTS=[mcMMO] 你的血量顯示類型已更改為 &c心形&f。 +Commands.Healthbars.Changed.BAR=[mcMMO] 你的血量顯示類型已更改為 &c方形&f。 +Commands.Healthbars.Changed.DISABLED=[mcMMO] 你的怪物血量顯示已被 &7關閉&f。 +Commands.Healthbars.Invalid=無效的血量類型 ! +Commands.Inspect= &a- 查看玩家詳細資訊 +Commands.Invite.Success=&a邀請已成功傳送。 +Commands.Leaderboards= &a- 排名板 +Commands.mcgod=&a- 切換上帝模式 +Commands.mchud.Invalid=這不是有效的 HUD 類型。 +Commands.mcpurge.Success=&a資料庫已成功清除 ! +Commands.mcrank.Heading=&6-=個人排名=- +Commands.mcrank.Overall=綜合&a - &6排名 &f#&a{0} +Commands.mcrank.Player=&f{0} &e的排名 +Commands.mcrank.Skill=&e{0}&a - &6排名 &f#&a{1} +Commands.mcrank.Unranked=&f無排名 +Commands.mcrefresh.Success={0} 的冷卻時間已重新整理 +Commands.mcremove.Success=&a{0} 從資料庫中刪除 ! +Commands.mctop.Tip=&6小提醒 : 使用 &c/mcrank&6 來查看你所有的個人排名 ! +Commands.mmoedit=[player] &a- 編輯目標 +Commands.mmoedit.AllSkills.1=&a你所有的技能等級被設定為 {0} 級 ! +Commands.mmoedit.Modified.1=&a你的 {0} 技能等級被設定為 {1} 級 ! +Commands.mmoedit.Modified.2={0} 已被 {1} 修改。 +Commands.mcconvert.Database.Same=你已經在使用 {0} 資料庫 ! +Commands.mcconvert.Database.InvalidType={0} 不是有效的資料庫類型。 +Commands.mcconvert.Database.Start=&7開始從 {0} 轉換至 {1}…… +Commands.mcconvert.Database.Finish=&7資料庫遷移完成 ; {1} 資料庫現在擁有 {0} 資料庫的所有資料。 +Commands.mmoshowdb=目前使用的資料庫為 &a{0} +Commands.mcconvert.Experience.Invalid=錯誤的公式類型 ! 有效類型為 : &a線性 &c和 &a指數。 +Commands.mcconvert.Experience.Same=正在使用公式{0} +Commands.mcconvert.Experience.Start=&7開始從{0}轉換到{1}曲線 +Commands.mcconvert.Experience.Finish=&7公式轉換完成 ; 現在使用 {0} 經驗曲線。 +Commands.ModDescription=&a- 請閱讀簡要插件描述 +Commands.NoConsole=這個指令不支援在控制台使用。 +Commands.Notifications.Off=技能小提醒 &c關閉 +Commands.Notifications.On=技能小提醒 &a開啟 +Commands.Offline=這個指令對離線玩家無效 +Commands.NotLoaded=玩家資料尚未載入。 +Commands.Party.Status=&8名稱 : &f{0} {1} &8等級 : &3{2} +Commands.Party.Status.Alliance=&8組隊 : &f{0} +Commands.Party.UnlockedFeatures=&8已解鎖功能 : &7&o{0} +Commands.Party.ShareMode=&8共享模式 : +Commands.Party.ItemShare=&7物品 &3({0}) +Commands.Party.ExpShare=&7經驗 &3({0}) +Commands.Party.ItemShareCategories=&8物品分配 : &7&o{0} +Commands.Party.MembersNear=&8你附近 &3{0}&8/&3{1} +Commands.Party.Accept=&a- 接受隊伍邀請 +Commands.Party.Chat.Off=只允許隊伍聊天 &c關閉 +Commands.Party.Chat.On=只允許隊伍聊天 &a開啟 +Commands.Party.Commands=&c---[]&a隊伍指令&c[]--- +Commands.Party.Invite.0=&c注意 : &a你收到了組隊邀請 {0} 來自 {1} +Commands.Party.Invite.1=&e輸入 &a/party accept&e 來接受邀請 +Commands.Party.Invite=&a- 傳送組隊邀請 +Commands.Party.Invite.Accepted=&a已接受組隊邀請。你已經加入隊伍 {0} +Commands.Party.Join=&7加入的隊伍 : {0} +Commands.Party.PartyFull=&6{0}&c 已滿 ! +Commands.Party.PartyFull.Invite=你不能邀請 &e{0}&c 到 &a{1}&c 因為隊伍已經有 &3{2}&c 個玩家了 ! +Commands.Party.PartyFull.InviteAccept=你不能加入隊伍 &a{0}&c 因為隊伍已經有 &3{1}&c 個玩家了 ! +Commands.Party.Create=&7已建立隊伍 : {0} +Commands.Party.Rename=&7隊伍名變更為 : &f{0} +Commands.Party.SetSharing=&7隊伍 {0} 共享設定為 : &3{1} +Commands.Party.ToggleShareCategory=&7隊伍物品分配由 &6{0} &7變為 &3{1} +Commands.Party.AlreadyExists=&4隊伍 {0} 已存在 ! +Commands.Party.Kick=&c你已被 &a{0}&c &c踢出 !! +Commands.Party.Leave=&e你離開了這支隊伍 +Commands.Party.Members.Header=&c-----[]&a成員&c[]----- +Commands.Party.None=&c你不在隊伍中。 +Commands.Party.Quit=&a- 離開你現有的隊伍 +Commands.Party.Teleport=&a- 傳送到隊伍成員 +Commands.Party.Toggle=&a- 切換隊伍聊天 +Commands.Party1=&a- 建立新隊伍 +Commands.Party2=&a- 加入玩家的隊伍 +Commands.Party.Alliance.Header=&c-----[]&a隊伍組隊&c[]----- +Commands.Party.Alliance.Ally=&f{0} &8的組隊隊伍 : &f{1} +Commands.Party.Alliance.Members.Header=&c-----[]&a組隊成員&c[]----- +Commands.Party.Alliance.Invite.0=注意 : &a你從 {1} 收到隊伍組隊邀請來 {0} +Commands.Party.Alliance.Invite.1=輸入 &a/party alliance accept&e 來接受邀請 +Commands.Party.Alliance.Invite.Accepted=&a已接受組隊邀請。 +Commands.Party.Alliance.None=&c你沒有組隊.&c&a +Commands.Party.Alliance.AlreadyAllies=&c你的隊伍已經有盟友。使用 &3/party alliance disband &c來解散目前組隊。 +Commands.Party.Alliance.Help.0=&c這個隊伍還沒有組隊,邀請他的隊長結成組隊。 +Commands.Party.Alliance.Help.1=&c使用 &3/party alliance invite <玩家>&c。 +Commands.ptp.Enabled=隊伍傳送 &a開啟 +Commands.ptp.Disabled=隊伍傳送 &c關閉 +Commands.ptp.NoRequests=&c目前沒有傳送請求 +Commands.ptp.NoWorldPermissions=&c[mcMMO] 你沒有權限傳送到世界 {0}。 +Commands.ptp.Request1=&e{0} &a已經向你發出請求傳送 +Commands.ptp.Request2=&a同意傳送輸入 &e/ptp accept。&a請求將在 &c{0} &a秒後失效 +Commands.ptp.AcceptAny.Enabled=隊伍傳送請求確認 &a開啟 +Commands.ptp.AcceptAny.Disabled=隊伍傳送請求確認 &c關閉 +Commands.ptp.RequestExpired=&c隊伍傳送請求已失效 ! +Commands.PowerLevel.Leaderboard=&e--mcMMO &9戰鬥力 &e排名榜-- +Commands.PowerLevel.Capped=&4戰鬥力 : &a{0} &4最高等級 : &e{1} +Commands.PowerLevel=&4戰鬥力 : &a{0} +Commands.Reset.All=&a你的技能等級已復位成功。 +Commands.Reset.Single=&a你的 {0} 技能等級已成功重設。 +Commands.Reset=&a- 重設技能等級為 0 +Commands.Scoreboard.Clear=&3mcMMO 計分板已清空。 +Commands.Scoreboard.NoBoard=&cmcMMO 計分板目前未開啟。 +Commands.Scoreboard.Keep=&3mcMMO 計分板將懸停直到你使用 &a/mcscoreboard clear&3。 +Commands.Scoreboard.Timer=&3mcMMO 計分板將在 &6{0}&3 秒後清空。 +Commands.Scoreboard.Help.0=&6== &c/mcscoreboard &a幫助&6 == +Commands.Scoreboard.Help.1=&3/mcscoreboard&b clear &f- 清空 mcMMO 計分板 +Commands.Scoreboard.Help.2=&3/mcscoreboard&b keep &f- 保持 mcMMO 計分板懸停 +Commands.Scoreboard.Help.3=&3/mcscoreboard&b time [n] &f- &dn&f 秒後清空 mcMMO 計分板 +Commands.Scoreboard.Tip.Keep=&6小提醒 : 當計分板顯示時使用 &c/mcscoreboard keep&6 來保持它不消失。 +Commands.Scoreboard.Tip.Clear=&6小提醒 : 使用 &c/mcscoreboard clear&6 來關閉計分板。 +Commands.XPBar.Reset=&6XP 已重設 mcMMO 的欄位設定。 +Commands.XPBar.SettingChanged=&6經驗值 &a{0}&6 的欄位設定現在設定為 &a{1} +Commands.Skill.Invalid=這不是有效的技能名稱 ! +Commands.Skill.ChildSkill=子技能對該指令無效 ! +Commands.Skill.Leaderboard=--mcMMO &9{0}&e 排名榜-- +Commands.SkillInfo=&a- 查看技能的詳細資訊 +Commands.Stats=&a- 你的資訊 +Commands.ToggleAbility=&a- 點擊右鍵切換技能開啟模式 +Commands.Usage.0=&c正確的用法是 /{0} +Commands.Usage.1=&c正確的用法是 /{0} {1} +Commands.Usage.2=&c正確的用法是 /{0} {1} {2} +Commands.Usage.3=&c正確的用法是 /{0} {1} {2} {3} +Commands.Usage.3.XP=&c正確的用法是/{0} {1} {2} {3}&7 (你可以在最後加上 -s 來執行指令而不通知玩家,有效地使其靜音) +Commands.Usage.FullClassName=資料類型 +Commands.Usage.Level=等級 +Commands.Usage.Message=訊息 +Commands.Usage.Page=頁 +Commands.Usage.PartyName=名稱 +Commands.Usage.Password=密碼 +Commands.Usage.Player=玩家 +Commands.Usage.Rate=比率 +Commands.Usage.Skill=技能 +Commands.Usage.SubSkill=子技能 +Commands.Usage.XP=經驗值 +Commands.Description.mmoinfo=閱讀有關技能或機制的詳細資訊。 +Commands.MmoInfo.Mystery=&7你沒有解鎖這項能力,但當你解鎖了這項能力後再點擊可以查看能力的詳細資訊 ! +Commands.MmoInfo.NoMatch=那個子技能不存在 ! +Commands.MmoInfo.Header=&3-=[]=====[]&6 MMO 資訊 &3[]=====[]=- +Commands.MmoInfo.SubSkillHeader=&6名稱 : &e{0} +Commands.MmoInfo.DetailsHeader=&3-=[]=====[]&a 細節 &3[]=====[]=- +Commands.MmoInfo.OldSkill=&7mcMMO 技能正在被轉換為更先進的模組化技能系統,遺憾的是這項技能尚未轉換,缺少詳細的統計資料。新系統將允許更快的新 mcMMO 技能更快地釋放和現有技能更大的靈活性。 +Commands.MmoInfo.Mechanics=&3-=[]=====[]&6 機械學 &3[]=====[]=- +Commands.MmoInfo.Stats=統計 : {0} +Commands.Mmodebug.Toggle=mcMMO 除錯模式 &6{0}&7,使用這個指令切換狀態。如果開啟除錯模式,你可以點擊方塊輸出用於支援的實用資訊。 +mcMMO.NoInvites=&c你現在沒有收到任何邀請 +mcMMO.NoPermission=&4你沒有使用該指令的權限。 +mcMMO.NoSkillNote=&8如果你沒有某個技能的使用權限,那麼他將不會在這裡顯示…… +##party +Party.Forbidden=[mcMMO] 隊伍功能不允許在這個世界開啟 (詳見權限配置) +Party.Help.0=&c正確的用法 &3{0} [password]。 +Party.Help.1=&c建立隊伍,使用 &3{0} [password]。 +Party.Help.2=&c查閱 &3{0} &c獲得更多資訊 +Party.Help.3=&c使用 &3{0} [password] &c加入或 &3{1} &c退出 +Party.Help.4=&c鎖定或解鎖你的隊伍,使用 &3{0} +Party.Help.5=&c設定隊伍密碼,使用 &3{0} +Party.Help.6=&c從你的隊伍中踢出玩家,使用 &3{0} +Party.Help.7=&c移交隊長,使用 &3{0} +Party.Help.8=&c解散隊伍,使用 &3{0} +Party.Help.9=&c使用 &3{0} &c來與你的隊伍成員分享物品 +Party.Help.10=&c使用 &3{0} &c開啟與你的隊伍成員分享經驗 +Party.InformedOnJoin={0} &a已經加入你的隊伍 +Party.InformedOnQuit={0} &a離開了隊伍 +Party.InformedOnNameChange=&6{0} &a已設定隊伍名為 &f{1} +Party.InvalidName=&4那不是有效的隊伍名稱。 +Party.Invite.Self=&c你不能邀請自己 ! +Party.IsLocked=&c這個隊伍已經鎖定 ! +Party.IsntLocked=&c這個隊伍並沒有鎖定 ! +Party.Locked=&c隊伍被鎖定,只有隊長可以邀請。 +Party.NotInYourParty=&4{0} 你不在你的團隊 +Party.NotOwner=&4你不是隊長 +Party.Target.NotOwner=&4{0} 不是隊長。 +Party.Owner.New=&a{0} 現在是新的隊伍隊長。 +Party.Owner.NotLeader=&4你已經不再是隊伍內的隊長。 +Party.Owner.Player=&a你現在不是隊長了 +Party.Password.None=&c加入這個隊伍需要密碼。請提供密碼再加入 +Party.Password.Incorrect=&c隊伍密碼錯誤 +Party.Password.Set=&a隊伍密碼設定為 {0} +Party.Password.Removed=&a隊伍密碼已被清除 +Party.Player.Invalid=&c這不是一名有效的玩家 +Party.NotOnline=&4{0} 離線 ! +Party.Player.InSameParty=&c{0} 已經在隊伍中 ! +Party.PlayerNotInParty=&4{0} 不在隊伍裡 +Party.Specify=&c你必須指定隊伍 +Party.Teleport.Dead=&c你不能傳送到死亡的玩家身邊 +Party.Teleport.Hurt=&c你受到傷害,至少 {0} 秒內不能傳送 +Party.Teleport.Player=&a你已經傳送到 {0}。 +Party.Teleport.Self=&c你不能傳送到你自己那裡 ! +Party.Teleport.Target=&a{0} 已經傳送到你身邊。 +Party.Teleport.Disabled=&c{0} 不允許隊伍傳送 +Party.Rename.Same=&c這已經是你的隊伍名稱了 ! +Party.Join.Self=&c你不能加入你自己 ! +Party.Unlocked=&7隊伍已解鎖 +Party.Disband=&7隊伍已解散 +Party.Alliance.Formed=&7你的隊伍目前與 &a{0} &7結盟 +Party.Alliance.Disband=&7你的隊伍不再與 &c{0} &7結盟 +Party.Status.Locked=&4(僅邀請) +Party.Status.Unlocked=&2(開啟) +Party.LevelUp=&e隊伍等級提升 {0} 級。總計 ({1}) +Party.Feature.Chat=隊伍聊天 +Party.Feature.Teleport=隊伍傳送 +Party.Feature.Alliance=組隊 +Party.Feature.ItemShare=物品共享 +Party.Feature.XpShare=經驗共享 +Party.Feature.Locked.Chat=功能鎖定直至 {0}+ 級(隊伍聊天) +Party.Feature.Locked.Teleport=功能鎖定直至 {0}+ (隊伍傳送) +Party.Feature.Locked.Alliance=功能鎖定直至 {0}+ (組隊) +Party.Feature.Locked.ItemShare=功能鎖定直至 {0}+ (物品共享) +Party.Feature.Locked.XpShare=功能鎖定直至 {0}+ (經驗共享) +Party.Feature.Disabled.1=&c隊伍聊天尚未解鎖。 +Party.Feature.Disabled.2=&c隊伍傳送尚未解鎖。 +Party.Feature.Disabled.3=&c隊伍組隊尚未解鎖。 +Party.Feature.Disabled.4=&c隊伍物品共享尚未解鎖。 +Party.Feature.Disabled.5=&c隊伍經驗共享尚未解鎖。 +Party.ShareType.Xp=經驗 +Party.ShareType.Item=物品 +Party.ShareMode.None=無 +Party.ShareMode.Equal=均勻分配 +Party.ShareMode.Random=隨機 +Party.ItemShare.Category.Loot=掠奪 +Party.ItemShare.Category.Mining=挖礦 +Party.ItemShare.Category.Herbalism=草藥學 +Party.ItemShare.Category.Woodcutting=伐木 +Party.ItemShare.Category.Misc=雜項 +##xp +Commands.XPGain.Acrobatics=掉落 +Commands.XPGain.Alchemy=釀造藥水 +Commands.XPGain.Archery=空手攻擊怪物 +Commands.XPGain.Axes=攻擊怪物 +Commands.XPGain.Child=從主技能獲得等級 +Commands.XPGain.Excavation=挖到寶物 +Commands.XPGain.Fishing=釣魚 (去想想吧!) +Commands.XPGain.Herbalism=收穫作物 +Commands.XPGain.Mining=挖掘石頭和礦物 +Commands.XPGain.Repair=修理 +Commands.XPGain.Swords=攻擊怪物 +Commands.XPGain.Taming=馴獸,和你的狼一起戰鬥 +Commands.XPGain.Unarmed=攻擊怪物 +Commands.XPGain.Woodcutting=正在砍倒樹木 +Commands.XPGain=&8經驗來源 : &f{0} +Commands.xplock.locked=&6你的經驗條鎖定在 {0} ! +Commands.xplock.unlocked=&6你的經驗條現在 &a解除鎖定了&6 ! +Commands.xprate.modified=&c經驗倍率已設定為 {0} +Commands.xprate.over=&cmcMMO 高經驗事件結束 !! +Commands.xprate.proper.0=&c想修改經驗來源率請輸入 /xprate +Commands.xprate.proper.1=&c想把經驗獲得率調整為預設請輸入 /xprate reset +Commands.xprate.proper.2=&c請指定 true 或 false 來表明這是否是經驗事件 +Commands.NegativeNumberWarn=不要使用負數 ! +Commands.Event.Start=&amcMMO &6事件 ! +Commands.Event.Stop=&amcMMO &3事件結束 ! +Commands.Event.Stop.Subtitle=&a希望你玩的開心 ! +Commands.Event.XP=&3多倍經驗速率為 &6{0}&3 倍 +Commands.xprate.started.0=&6mcMMO 經驗事件已開始 ! +Commands.xprate.started.1=&6mcMMO 經驗獲得率現在為 {0} 倍 ! + +# Admin Notifications +Server.ConsoleName=&e[Server] +Notifications.Admin.XPRate.Start.Self=&7你已將全局多倍經驗設定為 &6{0} 倍 +Notifications.Admin.XPRate.End.Self=&7你結束了多倍經驗事件。 +Notifications.Admin.XPRate.End.Others={0} &7結束了多倍經驗事件 +Notifications.Admin.XPRate.Start.Others={0} &7已啟動或修改具有全局 {1} 倍的多倍經驗事件 +Notifications.Admin.Format.Others=&6(&amcMMO &3管理員&6) &7{0} +Notifications.Admin.Format.Self=&6(&amcMMO&6) &7{0} + +# Event +XPRate.Event=&6mcMMO 現在正處於多倍經驗事件階段 ! 經驗獲得率為 {0}倍 ! + +#GUIDES +Guides.Available=&7{0} 的嚮導 - 輸入 /{1} ? [頁數] +Guides.Header=&6-=&a{0} 嚮導&6=- +Guides.Page.Invalid=不是有效的頁數 ! +Guides.Page.OutOfRange=那頁不存在,總共只有 {0} 頁 +Guides.Usage= 用法 /{0} ? [頁數] +##Acrobatics +Guides.Acrobatics.Section.0=&3關於雜技 : \n&e雜技是 mcMMO 中優雅移動的藝術。\n&e它提供了戰鬥加成和環境傷害加成。\n\n&3經驗來源 : \n&e透過在戰鬥中迴避或者從高處\n&e摔落時受傷並倖存來獲得經驗。 +Guides.Acrobatics.Section.1=&3翻滾是如何運作的 ? \n&e當你受到摔落傷害時你有被動機會來免受傷害。\n&e你可以在摔落中按住蹲下鍵來提升觸發機率。\n&e這將觸發優雅地翻滾而不是普通的翻滾。\n&e優雅地翻滾類似普通的翻滾但是它有雙倍機率\n&e發生,並且能夠提供比普通地翻滾更高的傷害減少,\n&e翻滾機率取決於你的技能等級。 +Guides.Acrobatics.Section.2=&3迴避是如何運作的 ? \n&e迴避是被動技能\n&e他在你被攻擊時有一定機率被激發\n&e這個機率和你的技能等級有關。 +##Alchemy +Guides.Alchemy.Section.0=&3關於煉金術 : \n&e煉金術是藥水釀造的技能。\n&e它提升了藥水釀造時的速度,並且加入了\n&e新的 (相對之前) 無法獲得的藥水。\n\n\n&3經驗來源 : \n&e透過釀造藥水來獲得經驗。 +Guides.Alchemy.Section.1=&3催化是如何運作的 ? \n&e催化提升釀造的速度,在 1000 級\n&e時能達到最高 4 倍。\n&e此能力預設在 100 級解鎖。 +Guides.Alchemy.Section.2=&3混合是如何運作的 ? \n&e混合允許使用自訂材料釀造更多藥水。\n&e特殊材料根據你的等級來解鎖。\n&e總共有 8 個等級需要解鎖。 +Guides.Alchemy.Section.3=&3混合第 1 階材料 : \n&e烈焰粉、發酵蜘蛛眼、幽靈之淚、紅石、\n&e螢石粉、糖、鑲金西瓜片、金胡蘿蔔、\n&e岩漿球、地獄疙瘩、蜘蛛眼、火藥、荷葉、\n&e河豚\n&e(純淨藥水)。 +Guides.Alchemy.Section.4=&3混合第 2 階材料 : \n&e胡蘿蔔 (挖掘加速藥水)\n&e史萊姆球 (緩速藥水)\n\n&3混合第 3 階材料 : \n&e地獄石英 (吸收藥水)\n&e紅色蘑菇 (跳躍藥水)。 +Guides.Alchemy.Section.5=&3混合第 4 階材料 : \n&e蘋果 (生命加成藥水)\n&e腐肉(飢餓藥水)\n\n&3混合第 5 階材料 : \n&e棕色蘑菇 (反胃藥水)\n&e墨囊 (失明藥水)。 +Guides.Alchemy.Section.6=&3混合第 6 階材料 : \n&e蕨類 (飽和藥水)\n\n&3混合第 7 階材料 : \n&e毒馬鈴薯 (腐爛藥水)\n\n混合第 8 階材料 : \n&e金蘋果 (抗性提升藥水)。 + +##Archery +Guides.Archery.Section.0=&3關於箭術 : \n&e箭術是用弓射箭。\n&e為你提供各種戰鬥加成,\n&e例如隨著你的等級提升傷害,以及將對手擊暈的能力\n&e除此之外你還能從對手的身上回收箭矢。\n\n\n&3經驗來源 : \n&e要獲得此僅能的經驗\n&e你需要射擊怪物或其他玩家。 +Guides.Archery.Section.1=&3技巧射擊如何運作 ? \n&e技巧射擊會使你的射箭攻擊獲得傷害加成。\n&e技巧射擊提供的傷害加成會隨著\n&e箭術等級的提升而增加。\n&e使用預設設定你的箭術每五十級提高 10% 的傷害加成\n&e最高提供 200% 的傷害加成。 +Guides.Archery.Section.2=&3擊暈如何運作 ? \n&e當你射擊玩家時,這個被動有機率使其他玩家獲得眩暈。\n&e當擊暈觸發時他會時\n&e對手直視前方一定時間。\n&e並提供 4 點 (2 顆心) 的額外傷害。 +Guides.Archery.Section.3=&3箭矢回收如何運作 ? \n&e當你用弓箭擊殺怪物時\n&e有機率回收箭矢。\n&e這個機率隨著你箭術等級的提升而增加。\n&e預設情況下這個能力每級增加 0.1%,\n&e1000 級增加 100%。 +##Axes +Guides.Axes.Section.0=&3關於斧技 : \n&e有了斧技,斧頭不再只是砍樹而已。\n&e你還可以砍其他生物和玩家來賺取經驗。\n&e攻擊生物時附加擊退效果。\n&e還會對生物和玩家造成致命傷害。\n&e你的斧頭會像手持伐木機一樣。\n&e輕鬆削掉敵人的盔甲。\n&e效果隨著技能等級提高。\n&3經驗的獲得 : \n&e手持斧頭攻擊其他生物或玩家。 +Guides.Axes.Section.1=&3什麼是斬首者 ? \n&e這個技能會造成範圍攻擊傷害\n&e傷害等於對主要攻擊目標造成傷害的 50%\n&e所以很容易清理掉一大片怪物。 +Guides.Axes.Section.2=&3什麼是致命一擊 ? \n&e這是被動技能\n&e一定機率對目標造成額外傷害\n&e預設每 2 級增加 0.1%\n&e對生物造成 2 倍傷害\n&e對玩家造成 1.5 倍傷害。 +Guides.Axes.Section.3=&3什麼是斧精通 ? \n&e這是被動技能\n&e使用斧頭攻擊時附加額外傷害\n&e預設每 50 級額外提高1點傷害\n&e4點額外傷害封頂。 +Guides.Axes.Section.4=&3什麼是破甲 ? \n&e用足夠的力量擊碎盔甲 ! \n&e破甲是被動的能力,它有機率會損耗\n&e對手盔甲的耐久度。這個傷害會隨著你斧技技能等級提升。 +Guides.Axes.Section.5=&3什麼是強力衝擊 ? \n&e這是被動技能\n&e使用斧頭攻擊時一定機率給敵人帶來巨大的衝擊力\n&e預設機率為 25%\n&e效果相當於擊退 II 的附魔效果\n&e此外還會對目標造成額外傷害。 +##Excavation +Guides.Excavation.Section.0=&3關於挖掘 : \n&e挖掘是以挖掘泥土以尋找寶藏的行為。\n&e透過挖掘,你將會找到隱藏的寶藏。\n&e你挖的越多你找到的寶藏也就越多。\n\n&3經驗來源 : \n&e要獲得該技能的經驗你必須手持鏟子挖掘。\n&e只有特定的方塊才能獲得經驗、挖掘到寶藏。 +Guides.Excavation.Section.1=&3可以挖掘的方塊 : \n&e草地、泥土、沙子、黏土、砂礫、菌絲土、靈魂沙、雪。 +Guides.Excavation.Section.2=&3如何使用暴走鑽頭 : \n&e手拿鏟子點擊右鍵以進入準備狀態。\n&e一旦進入這種狀態,你約有4秒的時間讓工具\n&e點擊與挖掘機能對應的方塊\n&e這樣就會開啟暴走鑽頭技能。 +Guides.Excavation.Section.3=&3什麼是暴走鑽頭 ? \n&e暴走鑽頭是一種與挖掘技能相關,且有時間限制的能力\n&e它使你找到寶藏的機率增加 3 倍\n&e並且能瞬間打破對應的方塊。 +Guides.Excavation.Section.4=&3考古學是怎樣運作的 ? \n&e挖掘出來的每個寶藏的掉落物都有自己的技能等級要求\n&e因此很難說它對你的幫助有多大\n&e請記住,挖掘機能等級越高挖到的寶藏就越多。\n&e還要記得每種對應挖掘的方塊都有自己獨特的寶藏清單\n&e換句話說,你在泥土中找到的寶藏,\n&e在砂礫中不一定能找到。 +Guides.Excavation.Section.5=&3關於挖掘注意事項 : \n&e挖掘掉落物是完全可定制的\n&e因此挖出的結果因伺服器設定而異。 +##Fishing +Guides.Fishing.Section.0=&3關於釣魚 : \n&e關於釣魚技能,釣魚再次使人振奮 ! \n&e找到隱藏的寶藏從怪物身上抖落物品。\n\n&3經驗來源 : \n&e釣魚。 +Guides.Fishing.Section.1=&3淘金者如何運作 ? \n&e這個能力使你在釣魚時找到寶藏\n&e並且物品有小機率帶有附魔。\n&e釣魚技能的每級別的寶藏都有機率掉落\n&e。寶藏的機率取決於稀有度的掉落機率\n&e你的釣魚等級越高,你越有可能找到更好的寶藏,\n&e獲得寶藏的機率也越高。 +Guides.Fishing.Section.2=&3冰釣如何運作 ? \n&e這個被動技能可以讓你在冰湖中釣魚 ! \n&e將你的釣竿扔在冰湖里這個能力會在冰上\n&e形成小孔供你釣魚。 +Guides.Fishing.Section.3=&3釣魚大師如何運作 ? \n&e這個被動增加了釣魚時咬鉤的機率。\n&e當你解鎖這種能力時\n&e在船上或者在海洋生物群系釣魚時釣到魚的機率增加一倍。 +Guides.Fishing.Section.4=&3抖動如何運作 ? \n&e這種主動技能可以讓你用釣竿勾住生物\n&e並從他們身上獲得物品。\n&e生物會掉落他們死亡時掉落的物品。\n&e也可能獲得怪物的頭\n&e一般情況下這些頭無法在生存模式中獲得。 +Guides.Fishing.Section.5=&3漁夫的食譜如何運作 ? \n&e這個被動增加了吃魚時回復的飽食度。 +Guides.Fishing.Section.6=&3關於釣魚的說明 : \n&e釣魚的掉落物是可以自定義的,\n&e所以掉落物因伺服器設定而異。 +##Herbalism +Guides.Herbalism.Section.0=&3關於草藥學 : \n&e草藥學是關於採集草藥與植物的技能。\n\n&3經驗拉遠 : \n&e採集草藥或植物。 +Guides.Herbalism.Section.1=&3可作用的草藥/植物\n&e小麥、馬鈴薯、胡蘿蔔、西瓜、\n&e南瓜、甘蔗、可可豆、仙人掌、蘑菇、\n&e地獄疙瘩、荷葉與藤蔓。 +Guides.Herbalism.Section.2=&3大地祝福如何運作 ? \n&e大地祝福是主動技能,當你手持鋤頭時\n&e點擊右鍵可發動技能,大地祝福提高三倍收穫的機率。\n&e同時也讓玩家有能力使用身上的種子來轉化\n&e方塊並賦予生命。 +Guides.Herbalism.Section.3=&3綠手指 (作物) 如何運作 ? \n&e這是被動技能,讓作物在採集時\n&e自動播種回去。\n&e機率取決於你的草藥學技能等級。 +Guides.Herbalism.Section.4=&3綠手指 (鵝卵石/石磚/泥土) 如何運作 ? \n&e這是主動技能,讓你在手拿著種子時,\n&e對鵝卵石/石磚/泥土點擊右鍵,可使它們變成\n&e青苔石、草地等,這會消耗一顆種子。 +Guides.Herbalism.Section.5=&3農夫食譜如何運作 ? \n&e這是被動技能,可增加下列食物的飽食度回復 -\n&e麵包,餅乾、西瓜、蘑菇湯、胡蘿蔔、馬鈴薯。 +Guides.Herbalism.Section.6=&3海拉爾的祝福如何運作 ? \n&e這是主動技能,有機率在用劍破壞特定\n&e方塊時獲得稀有道具。 +Guides.Herbalism.Section.7=&3雙倍掉落如何運作 ? \n&e這是被動技能使玩家能加倍收穫。 +##Mining +Guides.Mining.Section.0=&3關於挖礦 : \n&e挖礦包括挖掘石頭和礦物。\n&e挖礦技能可以提供多重礦物掉落的獎勵。\n\n&3經驗來源 : \n&e獲得此技能的經驗值,你必須拿著礦鎬進行挖掘,\n&e只有特定方塊才能獲得經驗。 +Guides.Mining.Section.1=&3對應材料 : \n&e石頭、煤礦、鐵礦、金礦、鑽石礦、紅石礦、\n&e青金石礦、黑曜石、青苔石、終界石、\n&e螢光石、地獄石。 +Guides.Mining.Section.2=&3如何使用超級碎石機 : \n&e把鎬子拿在你的手上,點擊右鍵來準備你的鎬子。\n&e你將有 4 秒的時間來激發你的技能。\n&e當你敲下對應的石頭以後,超級碎石機將被開啟。 +Guides.Mining.Section.3=&3什麼是超級碎石機 ? \n&e超級碎石機是主動技能\n&e它能使你在挖掉對應礦物的時候增加 3 倍掉落機率\n&e並且在技能時間內瞬間破壞石頭和礦物 +Guides.Mining.Section.4=&3如何使用爆破開挖 : \n&e把鎬子拿在手上,\n&e在一定距離內對 TNT 點擊右鍵,這將會使得 TNT 在瞬間內爆炸。 +Guides.Mining.Section.5=&3什麼是爆破開挖 ? \n&e爆破開挖是需要冷卻時間的挖礦技能\n&e它能使你在使用 TNT 炸礦時獲得額外獎勵\n&e爆破開挖總共有 3 個功能\n&e大型炸彈 : 使你的 TNT 爆炸範圍擴大\n&e爆破專家 : 降低你受到 TNT 的爆炸傷害\n&e爆破開挖 : 使你點燃的 TNT 炸掉範圍內一定數量的礦物 +##Repair +Guides.Repair.Section.0=&3關於修理 : \n&e修理可以讓你使用鐵方塊來修理盔甲和工具。\n\n&3經驗來源 : \n&e使用 mcMMO 的鐵砧修理工具或裝備。\n&emcMMO 預設的修理台是鐵方塊\n&e不要與用經驗修理的鐵砧混淆。 +Guides.Repair.Section.1=&3如何使用修理 ? \n&e放下 mcMMO 鐵砧 (鐵方塊),手持需要修理的道具 \n&e,對鐵方塊點擊右鍵,每次使用消耗物品。 +Guides.Repair.Section.2=&3修理精通如何運作 ? \n&e修理精通提升修理時耐久回復量。\n&e額外修理的耐久度量取決於你的修理技能等級。 +Guides.Repair.Section.3=&3超級修理如何運作 ? \n&e超級修理是被動技能。當修理物品時,\n&e會使物品的修理效果翻倍。 +Guides.Repair.Section.4=&3秘法鍛造如何運作 ? \n&e這是被動技能,允許你修理附魔物品\n&e修理物品時有一定機率保留附魔屬性\n&e附魔屬性可以保持現有的等級,\n&e降級到較低等級或者完全消失。 +##Salvage +Guides.Salvage.Section.0=&3關於分解 : \n&e分解使你可以使用黃金方塊來分解裝備和工具。\n\n&3經驗來源 : \n&e分解時修理和釣魚的子技能,\n&e技能等級取決於你的釣魚和修理的等級。 +Guides.Salvage.Section.1=&3如何使用分解 ? \n&e放 mcMMO 分解鐵砧 (黃金方塊) 拿著物品對黃金方塊點擊右鍵。\n&e這將拆解物品,並返還物品的製作材料\n&e例如 : 拆解鐵鎬你將獲得鐵錠。 +Guides.Salvage.Section.2=&3如何使用進階分解 ? \n&e解鎖後,此功能使你可以分解損壞的物品。\n&e隨著等級的提升分解所得的物品會獲得更多的材料\n&e透過進階分解你始終能獲得材料。\n&e不用擔心不會獲得材料,除非你的耐久度太低。 +Guides.Salvage.Section.3=&3為了說明這是如何運作的,這有例子 : \n&e假設我們分解了損壞了 20% 的金鎬,\n&e亦為之你最多獲得兩個金錠\n&e(因為金鎬使用三個金錠製作的,\n&e33,33% 的損耗) 等於 66% 的耐久度。\n&e如果你的耐久度低於 66% 則無法獲得兩個材料,高於此值獲得兩個。 +Guides.Salvage.Section.4=&3如何使用奧術分解 ? \n&e這個技能可以使你在分解附魔物品時獲得附魔書\n&e根據你的分解等級,分為全部提取和部分提取\n&e當分解位部分提取時。\n\n&e附魔書的附魔與物品相比\n&e附魔等級偏低。 +##Smelting +Guides.Smelting.Section.0=馬上到來…… +##Swords +Guides.Swords.Section.0=&3關於劍術 : \n&e這個技能在使用劍進行戰鬥時\n&e提供各種加成。\n\n&3經驗來源 : \n&e經驗值是透過用劍對怪物或其他玩家\n&e造成傷害獲得。 +Guides.Swords.Section.1=&3如何使用利刃突刺 ? \n&e利刃突刺是主動技能,將劍拿在手中並點擊右鍵開啟\n&e這個技能讓你發動範圍攻擊,提供 25% 的傷害加成\n&e並伴有撕裂效果。 +Guides.Swords.Section.2=&3反擊如何運作 ? \n&e反擊是主動技能,格擋對手對你的傷害\n&e並有機率反射50%的傷害給對手。 +Guides.Swords.Section.3=&3撕裂如何運作 ? \n&e撕裂是被動技能,攻擊時有機率觸發撕裂。\n&e撕裂會對對少造成持續的流血傷害,直到結束或對手死亡,\n&e持續時間取決於你的劍術等級。 +##Taming +Guides.Taming.Section.0=&3馴獸\n&e馴獸技能讓玩家能在用狼戰鬥時\n&e時有加成效果。\n\n&3經驗來源 : \n&e要獲得經驗,須馴服狼或山貓,\n&e或與你的狼一同戰鬥。 +Guides.Taming.Section.1=&3什麼是野性呼喊 ? \n&e野性呼喊是主動技能讓你\n&e可以召喚一隻狼或山貓,\n&e只要手持骨頭或生魚對其點擊左鍵。 +Guides.Taming.Section.2=&3什麼是野獸資訊 ? \n&e野獸資訊能讓你查看寵物的狀態,\n&e對寵物點擊左鍵就能使用這項能力。 +Guides.Taming.Section.3=&3什麼是嗜血 ? \n&e血腥攻擊是主動技能,能造成\n&e狼的攻擊目標有機率陷入流血狀態。 +Guides.Taming.Section.4=&3什麼是利爪 ? \n&e利爪使狼的攻擊力隨著馴獸等級\n&e增加而增加。 +Guides.Taming.Section.5=&3什麼是環境感知 ? \n&e這個被動技能能讓狼在遇到危險時\n&e迅速回到你身邊 (如仙人掌或岩漿),\n&e也可以減少摔落傷害。 +Guides.Taming.Section.6=&3什麼是毛皮強化 ? \n&e這是被動技能能讓狼\n&e受到攻擊或燃燒時減少除傷害。 +Guides.Taming.Section.7=&3什麼是衝擊抗性 ? \n&e這是被動技能,讓狼群\n&e減少爆炸傷害。 +Guides.Taming.Section.8=&3什麼是速食服務 ? \n&e這是被動技能,讓狼群在攻擊時\n&e有機率回復血量。 +##Unarmed +Guides.Unarmed.Section.0=&3格鬥 : \n&e格鬥使玩家在使用拳頭作戰時有\n&e各種加成效果。\n\n&3經驗來源 : \n&e在用手攻擊怪物或玩家時可以獲得經驗。 +Guides.Unarmed.Section.1=&3什麼是狂暴 ? \n&e狂暴是主動技能,空手時點擊右鍵發動。\n&e狂暴可以加成 50% 對方塊的傷害,\n&e使你可以輕鬆破壞脆弱物體,\n&e如泥土與沙子。 +Guides.Unarmed.Section.2=&3什麼是鐵臂式 ? \n&e鐵臂能增加徒手攻擊怪物或\n&e玩家的傷害。 +Guides.Unarmed.Section.3=&3什麼是箭矢偏向 ? \n&e箭矢偏向是被動技能,讓你有機率\n&e能改變骷髏獲玩家射向你的箭的方向。\n&e箭會落至地面。 +Guides.Unarmed.Section.4=&3什麼是鐵腕 ? \n&e鐵腕有機率防止對手的繳械。\n&e觸發的機率卻決於你格鬥的等級。 +Guides.Unarmed.Section.5=&3什麼是繳械 ? \n&e這個被動技能讓玩家解除其他玩家的武裝,\n&e使目標所裝備的物品掉落到地上。 +##Woodcutting +Guides.Woodcutting.Section.0=&3關於伐木 : \n&e伐木是關於砍樹的。\n\n&3經驗來源 : \n&e破壞木頭類的方塊就會獲得伐木經驗。 +Guides.Woodcutting.Section.1=&3伐木工如何運作 ? \n&e伐木工是主動技能\n&e在手持斧頭的同時右鍵並破壞木頭以開啟伐木工\n&e這將瞬間破壞整棵樹。 +Guides.Woodcutting.Section.2=&3秋風掃落葉如何運作 ? \n&e秋風掃落葉是被動技能\n&e當斧頭擊中樹葉方塊時會導致瞬間消失\n&e預設情況下,100 級解鎖。 +Guides.Woodcutting.Section.3=&3樹木豐收如何運作 ? \n&e這個被動技能使你在砍樹時\n&e有機率掉落雙倍木頭。 +#INSPECT +Inspect.Offline= &c你沒有查詢離線玩家資訊的權限 ! +Inspect.OfflineStats=離線玩家的 mcMMO 統計資訊 &e{0} +Inspect.Stats=&e{0} 的 mcMMO 統計資訊 +Inspect.TooFar=你無法查詢那個玩家因為你們距離太遠了 ! +#ITEMS +Item.ChimaeraWing.Fail=**奇美拉之翼失敗了 !** +Item.ChimaeraWing.Pass=**奇美拉之翼** +Item.ChimaeraWing.Name=奇美拉之翼 +Item.ChimaeraWing.Lore=&7傳送至你的床。 +Item.ChimaeraWing.NotEnough=你需要 &e{0}&c 更多 &6{1}&c ! +Item.NotEnough=你需要 &e{0}&c 更多 &6{1}&c ! +Item.Generic.Wait=你需要等待一段時間才能再次使用 !&e({0}s) +Item.Injured.Wait=你最近受傷了所以你必須等一段時間才能使用這個。&e({0}s) +Item.FluxPickaxe.Name=灼熱之鎬 +Item.FluxPickaxe.Lore.1=&7有機率瞬間冶煉礦物。 +Item.FluxPickaxe.Lore.2=&7需要冶煉等級 {0}+ +#TELEPORTATION +Teleport.Commencing=&7傳送將在 &6({0}) &7秒後進行,請保持站立不動…… +Teleport.Cancelled=&4傳送已取消 ! +#SKILLS +Skills.Child=&6(分支技能) +Skills.Disarmed=&4你被繳械了 ! +Skills.Header=-----[] &a{0}&c []----- +Skills.NeedMore=&4你需要更多 &7{0} +Skills.NeedMore.Extra=&4你需要更多 &7{0}{1} +Skills.Parents=主技能 +Skills.Stats={0}&a{1}&3 點經驗值 (&7{2}&3/&7{3}&3) +Skills.ChildStats={0}&a{1} +Skills.MaxXP=最大 +Skills.TooTired=你太累了暫時無法使用該技能。&({0}s) +Skills.TooTired.Named=&7(&6{0}&e {1}s&7) +Skills.TooTired.Extra=&6{0} &e超能力冷卻 - {1} +Skills.Cancelled=&6{0} &c已取消 ! +Skills.ConfirmOrCancel=&a再次點擊右鍵以確定 &6{0}&a,點擊左鍵取消。 +Skills.AbilityGateRequirementFail=&7你需要 &e{0}&7 級以上的 &3{1}&7 來使用這個能力。 +#STATISTICS +Stats.Header.Combat=&6-=格鬥技能=- +Stats.Header.Gathering=&6-=採集技能=- +Stats.Header.Misc=&6-=雜項技能=- +Stats.Own.Stats=&a[mcMMO] 統計資訊 +#PERKS +Perks.XP.Name=經驗 +Perks.XP.Desc=從技能學習中獲得經驗提升 +Perks.Lucky.Name=幸運 +Perks.Lucky.Desc=給予 {0} 技能和能力 33.3% 的更高機率觸發 +Perks.Lucky.Desc.Login=給予技能和能力 33.3% 得更高機率觸發 +Perks.Lucky.Bonus=&6({0} 的好運加成) +Perks.Cooldowns.Name=快速回復 +Perks.Cooldowns.Desc=減少冷卻時間 {0}。 +Perks.ActivationTime.Name=耐力 +Perks.ActivationTime.Desc=提高能力開啟時間 {0} 秒。 +Perks.ActivationTime.Bonus=&6({0} 秒額外持續時間) +#HARDCORE +Hardcore.Mode.Disabled=&6[mcMMO] 硬核模式 {0} 關閉。{1} +Hardcore.Mode.Enabled=&6[mcMMO] 硬核模式 {0} 開啟。{1} +Hardcore.DeathStatLoss.Name=技能死亡懲罰 +Hardcore.DeathStatLoss.PlayerDeath=&6[mcMMO] &4死亡,你失去了 &9{0}&4。 +Hardcore.DeathStatLoss.PercentageChanged=&6[mcMMO] 狀態遺失率變更為 {0}。 +Hardcore.Vampirism.Name=吸血模式 +Hardcore.Vampirism.Killer.Failure=&6[mcMMO] &e{0}&7太不熟練授予你獲得任何的知識。 +Hardcore.Vampirism.Killer.Success=&6[mcMMO] &3你從&e{1}&3那偷取了 &9{0}&3 個等級。 +Hardcore.Vampirism.Victim.Failure=&6[mcMMO] &e{0}&7無法從你這偷取任何的知識 ! +Hardcore.Vampirism.Victim.Success=&6[mcMMO] &e{0}&4從你這偷取了 &9{1}&4 個等級 ! +Hardcore.Vampirism.PercentageChanged=&6[mcMMO] 狀態吸血率變更為 {0}。 +#MOTD +MOTD.Donate=&3捐贈資訊 : +MOTD.Hardcore.Enabled=&6[mcMMO] &3硬核模式已開啟 : &4{0} +MOTD.Hardcore.DeathStatLoss.Stats=&6[mcMMO] &3技能死亡懲罰 : &4{0}% +MOTD.Hardcore.Vampirism.Stats=&6[mcMMO] &3吸血統計 : &4{0}% +MOTD.PerksPrefix=&6[mcMMO 能力] +MOTD.Version=&6[mcMMO] 正在運行版本 &3{0} +MOTD.Website=&6[mcMMO] &a{0}&e -mcMMO 網站 +#SMELTING +Smelting.SubSkill.UnderstandingTheArt.Name=冶煉精通 +Smelting.SubSkill.UnderstandingTheArt.Description=也許你花費了太多時間在洞穴中冶煉,\n提升冶煉的各種屬性。 +Smelting.SubSkill.UnderstandingTheArt.Stat=經驗值倍數 : &e{0} 倍 +Smelting.Ability.Locked.0={0}+ 級後解鎖 (更多冶煉經驗值) +Smelting.Ability.Locked.1={0}+ 級後解鎖 (祝融之鎬) +Smelting.SubSkill.FuelEfficiency.Name=燃料效率 +Smelting.SubSkill.FuelEfficiency.Description=冶煉時提高熔爐內燃料的燃燒時間 +Smelting.SubSkill.FuelEfficiency.Stat=燃料效率倍數 : &e{0} 倍 +Smelting.SubSkill.SecondSmelt.Name=二次冶煉 +Smelting.SubSkill.SecondSmelt.Description=透過冶煉獲得雙倍資源 +Smelting.SubSkill.SecondSmelt.Stat=二次冶煉觸發的機率 +Smelting.Effect.4=更多冶煉經驗值 +Smelting.Effect.5=提高冶煉獲得的經驗值 +Smelting.SubSkill.FluxMining.Name=祝融之鎬 +Smelting.SubSkill.FluxMining.Description=挖礦時一定機率使礦物立即被冶煉 +Smelting.SubSkill.FluxMining.Stat=祝融之鎬發動機率 +Smelting.Listener=冶煉 (Smelting) : +Smelting.SkillName=冶煉 +#COMMAND DESCRIPTIONS +Commands.Description.addlevels=給玩家增加 mcMMO 等級 +Commands.Description.adminchat=切換 mcMMO 管理員聊天或傳送管理員聊天資訊 +Commands.Description.addxp=給玩家增加 mcMMO 經驗 +Commands.Description.hardcore=修改 mcMMO 硬核模式百分比或切換硬核模式開/關 +Commands.Description.inspect=查看玩家詳細的 mcMMO 資訊 +Commands.Description.mcability=切換 mcMMO 技能點擊右鍵開啟 開/關 +Commands.Description.mccooldown=查看所有 mcMMO 技能冷卻時間 +Commands.Description.mcchatspy=切換隊伍聊天監視開/關 +Commands.Description.mcgod=切換 mcMMO 上帝模式開/關 +Commands.Description.mchud=變更你的 mcMMO HUD 樣式 +Commands.Description.mcmmo=顯示 mcMMO 的簡單描述 +Commands.Description.mcnotify=切換 mcMMO 技能提醒開關 +Commands.Description.mcpurge=清除沒有 mcMMO 等級的玩家和超過 {0} 個月沒有登入的玩家的 mcMMO 資料 +Commands.Description.mcrank=顯示玩家的 mcMMO 排名 +Commands.Description.mcrefresh=重新整理所有的 mcMMO 冷卻時間 +Commands.Description.mcremove=從 mcMMO 資料庫中移除玩家 +Commands.Description.mcscoreboard=管理你的 mcMMO 計分板 +Commands.Description.mcstats=顯示你的 mcMMO 等級和經驗 +Commands.Description.mctop=顯示 mcMMO 排名榜 +Commands.Description.mmoedit=編輯用戶的 mcMMO 的等級 +Commands.Description.mmodebug=切換除錯模式,點擊方塊輸出實用的資訊 +Commands.Description.mmoupdate=從舊的 mcMMO 資料庫遷移到目前資料庫內 +Commands.Description.mcconvert=轉換資料庫的類型或經驗值公式的類型 +Commands.Description.mmoshowdb=顯示目前資料庫類型名稱 (舊版本使用 /mmoupdate) +Commands.Description.party=控制各種 mcMMO 隊伍設定 +Commands.Description.partychat=切換 mcMMO 隊伍聊天或傳送隊伍聊天訊息 +Commands.Description.ptp=傳送至 mcMMO 隊伍成員 +Commands.Description.Skill=顯示 {0} 詳細的 mcMMO 技能資訊 +Commands.Description.skillreset=重設 mcMMO 等級 +Commands.Description.vampirism=更改 mcMMO 榨取百分比 或切換吸血模式開/關 +Commands.Description.xplock=鎖定指定 mcMMO 技能的經驗條 +Commands.Description.xprate=更改 mcMMO 經驗倍率或開啟 mcMMO 經驗翻倍事件 +#UPDATE CHECKER +UpdateChecker.Outdated=你正在使用這舊版本的 mcMMO ! +UpdateChecker.NewAvailable=Spigot 上有新版本。 +#SCOREBOARD HEADERS +Scoreboard.Header.PlayerStats=&emcMMO 統計 +Scoreboard.Header.PlayerCooldowns=&emcMMO 冷卻 +Scoreboard.Header.PlayerRank=&emcMMO 排名 +Scoreboard.Header.PlayerInspect=&emcMMO 統計 : {0} +Scoreboard.Header.PowerLevel=&c戰鬥力 +Scoreboard.Misc.PowerLevel=&6戰鬥力 +Scoreboard.Misc.Level=&3等級 +Scoreboard.Misc.CurrentXP=&a目前經驗 +Scoreboard.Misc.RemainingXP=&e升級所需經驗 +Scoreboard.Misc.Cooldown=&d冷卻 +Scoreboard.Misc.Overall=&6總體 +Scoreboard.Misc.Ability=能力 +#DATABASE RECOVERY +Profile.PendingLoad=&c你的 mcMMO 玩家資料未載入。 +Profile.Loading.Success=&a你的 mcMMO 資料已載入。 +Profile.Loading.FailurePlayer=&cmcMMO 無法載入你的資料,請聯繫&b伺服器管理員回饋你的問題。\n&e你可以繼續在伺服器遊玩,但是你&l沒有 mcMMO 等級&e並且你獲得的任何經驗都&l不會被儲存&e。 +Profile.Loading.FailureNotice=&4[A]&c mcMMO 無法載入玩家 &e{0}&c 的資料。&d請檢查你的資料庫,到目前為止的嘗試 {1}。 +#Holiday +Holiday.AprilFools.Levelup=&6{0} 現在 &a{1}&6 級 ! +Holiday.Anniversary=&9mcMMO {0} 週年快樂 ! \n&9為了紀念 nossr50 和所有開發者的工作,這裡有一場煙火表演 ! +#Reminder Messages +Reminder.Squelched=&7提醒 : 你現在不再接收來自 mcMMO 的通知訊息,如想開啟請再次使用 /mcnotify 指令,每小時提醒一次。 +#Locale +Locale.Reloaded=&a語言配置已經重新載入,中文化重編 : Flandre_tw,原作為簡體中文 (有問題請聯絡 Discord 蘭蘭露#4885) +#Player Leveling Stuff +LevelCap.PowerLevel=&6(&amcMMO&6) &e你已經到達了戰鬥力的等級封頂 &c{0}&e 級,你的該技能將無法再升級。 +LevelCap.Skill=&6(&amcMMO&6) &e你已經到達了&6{1}&e技能的等級封頂 &c{0}&e 級,你的該技能將無法再升級。 +Commands.XPBar.Usage=正確的用法是 /mmoxpbar +Commands.Description.mmoxpbar=mcMMO 經驗條的玩家設定 +Commands.Description.mmocompat=有關 mcMMO 以及它是否處於相容模式或功能齊全的資訊。 +Compatibility.Layer.Unsupported=&6此版本的 Minecraft 不支持 &a{0}&6 的相容性。 +Compatibility.Layer.PartialSupport=&6相容性 &a{0}&6 這個版本的 Minecraft 並不完全支援,但是 mcMMO 正在運行一個輔助系統來模擬一些缺失的功能。 +Commands.XPBar.DisableAll=&6所有 mcMMO 經驗欄現在都被關閉,使用 /mmoxpbar reset 回復預設設定。 +#Modern Chat Settings +Chat.Style.Admin=&b(A) &r{0} &b→ &r{1} +Chat.Style.Party=&a(P) &r{0} &a→ &r{1} +Chat.Style.Party.Leader=&a(P) &r{0} &6→ &r{1} +Chat.Identity.Console=&6* 控制台 * +Chat.Channel.On=&6(&amcMMO -聊天&6) &e你的聊天訊息現在將自動傳送到 &a{0}&e 聊天頻道。 +Chat.Channel.Off=&6(&amcMMO -聊天&6) &7你的聊天訊息將不再自動傳送到特定的聊天頻道。 +Chat.Spy.Party=&6[&eSPY&6-&a{2}&6] &r{0} &b→ &r{1} +Broadcasts.LevelUpMilestone=&6(&amcMMO&6) {0}&7 在&3{2}&7 已經達到了 &a{1}&7 級 ! +Broadcasts.PowerLevelUpMilestone=&6(&amcMMO&6) {0}&7 已經達到 &a{1}&7 的最高等級 ! +Scoreboard.Recovery=正在嘗試回復 mcMMO 計分板…… diff --git a/src/main/resources/persistent_data.yml b/src/main/resources/persistent_data.yml new file mode 100644 index 000000000..8508ab84f --- /dev/null +++ b/src/main/resources/persistent_data.yml @@ -0,0 +1,37 @@ +# This config allows servers to change which data is persistent and which data isn't +# For 10 years mcMMO had transient data (temporary) for a lot of things and recently in October 2020 I added the option to have things be persistent (saved to disk and permanently remembered) +# However, this is Minecraft, and Minecraft has a lot of entities, and when you start to make data persistent there is a performance cost associated with that +# Any option you turn on, is another thing your disk has to save when a chunk is being unloaded with that entity inside of it, Minecraft can quickly build up tens of thousands of entities so keep this in mind. +# +# I am considering alternative to using Spigots NBT API to avoid this performance cost, but the code for those will take some time to write and test, for now it is not recommended +# to turn any of these settings on without monitoring the TPS of your server afterwards. With the exception of the COTW setting which will probably have almost no performance impact if left on. +Persistent_Data: + Mobs: + Flags: + # By default mcMMO gives 0 XP for this type of mob, adjust in experience.yml + MOB_SPAWNER_MOB: + Saved_To_Disk: false + # By default mcMMO gives 0 XP for this type of mob, adjust in experience.yml + EGG_MOB: + Saved_To_Disk: false + # By default mcMMO gives 0 XP for this type of mob, adjust in experience.yml + NETHER_PORTAL_MOB: + Saved_To_Disk: false + # These mobs have low impact on performance and thus it is recommended you leave this on true + COTW_SUMMONED_MOB: + Saved_To_Disk: true + # By default mcMMO gives normal XP for player bred mobs, adjust in experience.yml + PLAYER_BRED_MOB: + Saved_To_Disk: false + # By default mcMMO gives 0 XP for this type of mob, due to an exploit in Minecraft you can spawn 1000 endermen in seconds using this trick. + # Adjust in experience.yml under the section labeled exploit fix + EXPLOITED_ENDERMEN: + Saved_To_Disk: false + # By default mcMMO gives 0 XP for this type of mob, not adjustable currently + PLAYER_TAMED_MOB: + Saved_To_Disk: false +# When players put down a block we track it, the system used to track player blocks is super efficient and has been coded extremely well +# It is never recommended to turn this off as it allows exploits such as player dupes etc +# We use our own file system for this outside of NBT which has been programmed to be lightning fast +mcMMO_Region_System: + Enabled: true \ No newline at end of file diff --git a/src/main/resources/plugin.yml b/src/main/resources/plugin.yml index c8f1c2afa..2173e7de9 100644 --- a/src/main/resources/plugin.yml +++ b/src/main/resources/plugin.yml @@ -19,6 +19,12 @@ load: POSTWORLD api-version: 1.13 commands: +# mmodroptreasures: +# description: An admin command used to spawn treasure drops +# permission: mcmmo.commands.droptreasures + mmoxpbar: + aliases: xpbarsettings + description: Change XP bar settings mmocompat: description: Information about the server and whether or not its considered fully compatible or running in compatibility mode mmodebug: @@ -83,6 +89,7 @@ commands: description: Create/join a party permission: mcmmo.commands.party inspect: + aliases: [mcinspect, mmoinspect] description: View detailed mcMMO info on another player permission: mcmmo.commands.inspect mmoshowdb: @@ -150,21 +157,18 @@ commands: mcpurge: description: Purge users with 0 powerlevel and/or who haven't connected in several months from the server DB. permission: mcmmo.commands.mcpurge - hardcore: - aliases: [mchardcore] - description: Modify the mcMMO hardcore percentage or toggle hardcore mode on/off - permission: mcmmo.commands.hardcore - vampirism: - aliases: [mcvampirism] - description: Modify the mcMMO vampirism percentage or toggle vampirism mode on/off - permission: mcmmo.commands.vampirism +# hardcore: +# aliases: [mchardcore] +# description: Modify the mcMMO hardcore percentage or toggle hardcore mode on/off +# permission: mcmmo.commands.hardcore +# vampirism: +# aliases: [mcvampirism] +# description: Modify the mcMMO vampirism percentage or toggle vampirism mode on/off +# permission: mcmmo.commands.vampirism mcnotify: aliases: [notify] description: Toggle mcMMO abilities chat display notifications on/off permission: mcmmo.commands.mcnotify - mhd: - description: Sets all players mob health settings to default - permission: mcmmo.commands.mhd mcscoreboard: aliases: [mcsb] description: Manage your mcMMO Scoreboard @@ -179,6 +183,25 @@ commands: description: Reloads locale permission: mcmmo.commands.reloadlocale permissions: + #mcmmo.defaults is the intended default permission, give this to your players for the intended experience + mcmmo.defaults: + default: true + description: mcmmo permisions that default to true + children: + mcmmo.chat.partychat: true + mcmmo.commands.defaults: true + mcmmo.motd: true + mcmmo.skills.all: true + mcmmo.chat.colors: true + mcmmo.broadcast.levelup: true + mcmmo.defaultsop: + default: op + description: mcmmo permissions that default to op + children: + mcmmo.chat.adminchat: true + mcmmo.commands.defaultsop: true + mcmmo.item.all: true + mcmmo.tools.all: true mcmmo.*: default: false description: Implies all mcmmo permissions. @@ -195,6 +218,8 @@ permissions: mcmmo.defaultsop: true mcmmo.party.all: true mcmmo.perks.all: true + mcmmo.broadcast.levelup: + description: when the player reaches certain level milestones their achievement will be broadcast in chat to other plays mcmmo.ability.*: default: false description: Implies all mcmmo.ability permissions. @@ -462,6 +487,7 @@ permissions: mcmmo.ability.repair.arcaneforging: true mcmmo.ability.repair.superrepair: true mcmmo.ability.repair.armorrepair: true + mcmmo.ability.repair.netheriterepair: true mcmmo.ability.repair.diamondrepair: true mcmmo.ability.repair.goldrepair: true mcmmo.ability.repair.ironrepair: true @@ -478,6 +504,8 @@ permissions: description: Allows access to the Arcane Forging ability mcmmo.ability.repair.armorrepair: description: Allows ability to repair armor + mcmmo.ability.repair.netheriterepair: + description: Allows ability to repair Netherite tools & armor mcmmo.ability.repair.diamondrepair: description: Allows ability to repair Diamond tools & armor mcmmo.ability.repair.goldrepair: @@ -514,6 +542,7 @@ permissions: mcmmo.ability.salvage.arcanesalvage: true mcmmo.ability.salvage.armorsalvage: true mcmmo.ability.salvage.diamondsalvage: true + mcmmo.ability.salvage.netheritesalvage: true mcmmo.ability.salvage.goldsalvage: true mcmmo.ability.salvage.ironsalvage: true mcmmo.ability.salvage.leathersalvage: true @@ -529,6 +558,8 @@ permissions: description: Allows access to the Arcane Salvage ability mcmmo.ability.salvage.armorsalvage: description: Allows ability to salvage armor + mcmmo.ability.salvage.netheritesalvage: + description: Allows ability to salvage Netherite tools & armor mcmmo.ability.salvage.diamondsalvage: description: Allows ability to salvage Diamond tools & armor mcmmo.ability.salvage.goldsalvage: @@ -655,7 +686,7 @@ permissions: children: mcmmo.ability.unarmed.berserk: true mcmmo.ability.unarmed.blockcracker: true - mcmmo.ability.unarmed.ironarmstyle: true + mcmmo.ability.unarmed.steelarmstyle: true mcmmo.ability.unarmed.arrowdeflect: true mcmmo.ability.unarmed.disarm: true mcmmo.ability.unarmed.irongrip: true @@ -666,8 +697,8 @@ permissions: description: Allows access to the Berserker ability mcmmo.ability.unarmed.blockcracker: description: Allows access to the Block Cracker ability - mcmmo.ability.unarmed.ironarmstyle: - description: Allows bonus damage from the Iron Arm ability + mcmmo.ability.unarmed.steelarmstyle: + description: Allows bonus damage from the Steel Arm Style ability mcmmo.ability.unarmed.arrowdeflect: description: Allows access to the Arrow Deflect ability mcmmo.ability.unarmed.disarm: @@ -686,8 +717,11 @@ permissions: mcmmo.ability.woodcutting.splinter: true mcmmo.ability.woodcutting.barksurgeon: true mcmmo.ability.woodcutting.naturesbounty: true + mcmmo.ability.woodcutting.knockonwood: true mcmmo.ability.woodcutting.leafblower: true mcmmo.ability.woodcutting.treefeller: true + mcmmo.ability.woodcutting.knockonwood: + description: Allows access to Knock on Wood subskill mcmmo.ability.woodcutting.splinter: description: Allows access to Splinter mcmmo.ability.woodcutting.barksurgeon: @@ -737,12 +771,15 @@ permissions: mcmmo.chat.all: description: Implies all mcmmo.chat permissions. (Warning, contains adminchat) children: - mcmmo.chat.adminchat: true - mcmmo.chat.partychat: true + mcmmo.chat.adminchat: true + mcmmo.chat.partychat: true + mcmmo.chat.colors: true mcmmo.chat.adminchat: description: Allows participation in admin chat mcmmo.chat.partychat: description: Allows participation in party chat + mcmmo.chat.colors: + description: players can use color codes like &a or [[GREEN]] in mcMMO chat channels mcmmo.motd: description: Allows access to the motd mcmmo.commands.*: @@ -794,7 +831,7 @@ permissions: mcmmo.commands.addxp: true mcmmo.commands.addxp.others: true mcmmo.commands.defaults: true - mcmmo.commands.hardcore.all: true +# mcmmo.commands.hardcore.all: true mcmmo.commands.inspect.far: true mcmmo.commands.inspect.hidden: true mcmmo.commands.mcability.others: true @@ -815,7 +852,7 @@ permissions: mcmmo.commands.ptp.world.all: true mcmmo.commands.reloadlocale: true mcmmo.commands.skillreset.all: true - mcmmo.commands.vampirism.all: true +# mcmmo.commands.vampirism.all: true mcmmo.commands.xprate.all: true mcmmo.commands.acrobatics: description: Allows access to the acrobatics command @@ -837,23 +874,23 @@ permissions: description: Allows access to the excavation command mcmmo.commands.fishing: description: Allows access to the fishing command - mcmmo.commands.hardcore.*: - default: false - description: Implies access to all mcmmo.commands.hardcore permissions - children: - mcmmo.commands.hardcore.all: true - mcmmo.commands.hardcore.all: - description: Implies access to all mcmmo.commands.hardcore permissions - children: - mcmmo.commands.hardcore: true - mcmmo.commands.hardcore.modify: true - mcmmo.commands.hardcore.toggle: true - mcmmo.commands.hardcore: - description: Allows access to the hardcore command - mcmmo.commands.hardcore.modify: - description: Allows access to the hardcore command to modify the hardcore rate - mcmmo.commands.hardcore.toggle: - description: Allows access to the hardcore command to toggle hardcore on/off +# mcmmo.commands.hardcore.*: +# default: false +# description: Implies access to all mcmmo.commands.hardcore permissions +# children: +# mcmmo.commands.hardcore.all: true +# mcmmo.commands.hardcore.all: +# description: Implies access to all mcmmo.commands.hardcore permissions +# children: +# mcmmo.commands.hardcore: true +# mcmmo.commands.hardcore.modify: true +# mcmmo.commands.hardcore.toggle: true +# mcmmo.commands.hardcore: +# description: Allows access to the hardcore command +# mcmmo.commands.hardcore.modify: +# description: Allows access to the hardcore command to modify the hardcore rate +# mcmmo.commands.hardcore.toggle: +# description: Allows access to the hardcore command to toggle hardcore on/off mcmmo.commands.herbalism: description: Allows access to the herbalism command mcmmo.commands.inspect.*: @@ -1244,23 +1281,23 @@ permissions: description: Allows access to the taming command mcmmo.commands.unarmed: description: Allows access to the unarmed command - mcmmo.commands.vampirism.*: - default: false - description: Implies access to all mcmmo.commands.vampirism permissions - children: - mcmmo.commands.vampirism.all: true - mcmmo.commands.vampirism.all: - description: Implies access to all mcmmo.commands.vampirism permissions - children: - mcmmo.commands.vampirism: true - mcmmo.commands.vampirism.modify: true - mcmmo.commands.vampirism.toggle: true - mcmmo.commands.vampirism: - description: Allows access to the vampirism command - mcmmo.commands.vampirism.modify: - description: Allows access to the vampirism command to modify the vampirism rate - mcmmo.commands.vampirism.toggle: - description: Allows access to the vampirism command to toggle vampirism on/off +# mcmmo.commands.vampirism.*: +# default: false +# description: Implies access to all mcmmo.commands.vampirism permissions +# children: +# mcmmo.commands.vampirism.all: true +# mcmmo.commands.vampirism.all: +# description: Implies access to all mcmmo.commands.vampirism permissions +# children: +# mcmmo.commands.vampirism: true +# mcmmo.commands.vampirism.modify: true +# mcmmo.commands.vampirism.toggle: true +# mcmmo.commands.vampirism: +# description: Allows access to the vampirism command +# mcmmo.commands.vampirism.modify: +# description: Allows access to the vampirism command to modify the vampirism rate +# mcmmo.commands.vampirism.toggle: +# description: Allows access to the vampirism command to toggle vampirism on/off mcmmo.commands.woodcutting: description: Allows access to the woodcutting command mcmmo.commands.xprate.*: @@ -1280,22 +1317,6 @@ permissions: description: Allows access to the xprate reset command mcmmo.commands.xprate.set: description: Allows access to the xprate command to control xp events - mcmmo.defaults: - default: true - description: mcmmo permisions that default to true - children: - mcmmo.chat.partychat: true - mcmmo.commands.defaults: true - mcmmo.motd: true - mcmmo.skills.all: true - mcmmo.defaultsop: - default: op - description: mcmmo permissions that default to op - children: - mcmmo.chat.adminchat: true - mcmmo.commands.defaultsop: true - mcmmo.item.all: true - mcmmo.tools.all: true mcmmo.item.*: default: true description: Implies all mcmmo.item permissions diff --git a/src/main/resources/potions.yml b/src/main/resources/potions.yml index b85bd9739..4e14491b7 100644 --- a/src/main/resources/potions.yml +++ b/src/main/resources/potions.yml @@ -25,7 +25,7 @@ Concoctions: - PHANTOM_MEMBRANE Tier_Three_Ingredients: - QUARTZ - - RED_MUSHROOM + - RABBIT_FOOT Tier_Four_Ingredients: - APPLE - ROTTEN_FLESH diff --git a/src/main/resources/repair.vanilla.yml b/src/main/resources/repair.vanilla.yml index 357c1b6d1..72ba687bd 100644 --- a/src/main/resources/repair.vanilla.yml +++ b/src/main/resources/repair.vanilla.yml @@ -1,7 +1,6 @@ # # Repair configuration # -# Any file named repair.*.yml in the mcmmmo folder will be loaded as a repair config # All repair configs have a main section titled "Repairables" # Afterwards, all sub-items are considered a Repairable to be loaded. The names of each subitem should be the exact material name. # The bare minimum of a Repairable is that it have a RepairMaterial and a MaximumDurability @@ -45,6 +44,14 @@ Repairables: # Wooden repairables ### # Tools + SHIELD: + MinimumLevel: 0 + XpMultiplier: .25 + ItemType: OTHER + ItemMaterialCategory: WOOD + RepairMaterial: OAK_PLANKS + MinimumQuantity: 6 + MaximumDurability: 336 WOODEN_SWORD: MinimumLevel: 0 XpMultiplier: .25 @@ -183,7 +190,7 @@ Repairables: XpMultiplier: 6 # - # Diamond repairables + # Netherite repairables ### # Tools NETHERITE_SWORD: @@ -243,3 +250,38 @@ Repairables: CARROT_ON_A_STICK: MinimumLevel: 0 XpMultiplier: .5 + CROSSBOW: + MinimumLevel: 0 + XpMultiplier: .5 + ItemType: TOOL + ItemMaterialCategory: STRING + RepairMaterial: STRING + MinimumQuantity: 3 + MaximumDurability: 326 + WARPED_FUNGUS_ON_A_STICK: + MinimumLevel: 0 + XpMultiplier: .5 + ItemType: TOOL + ItemMaterialCategory: STRING + RepairMaterial: STRING + MinimumQuantity: 3 + MaximumDurability: 100 + # + # Other + ### + ELYTRA: + MinimumLevel: 0 + XpMultiplier: 3 + ItemType: OTHER + ItemMaterialCategory: OTHER + RepairMaterial: PHANTOM_MEMBRANE + MinimumQuantity: 8 + MaximumDurability: 432 + TRIDENT: + MinimumLevel: 0 + XpMultiplier: 3 + ItemType: TOOL + ItemMaterialCategory: OTHER + RepairMaterial: PRISMARINE_CRYSTALS + MinimumQuantity: 16 + MaximumDurability: 250 \ No newline at end of file diff --git a/src/main/resources/salvage.vanilla.yml b/src/main/resources/salvage.vanilla.yml index f310af65d..4977c492b 100644 --- a/src/main/resources/salvage.vanilla.yml +++ b/src/main/resources/salvage.vanilla.yml @@ -221,40 +221,40 @@ Salvageables: MaximumQuantity: 4 NETHERITE_SWORD: - MinimumLevel: 50 + MinimumLevel: 100 XpMultiplier: .5 - MaximumQuantity: 2 + MaximumQuantity: 4 NETHERITE_SHOVEL: - MinimumLevel: 50 + MinimumLevel: 100 XpMultiplier: .3 - MaximumQuantity: 1 + MaximumQuantity: 4 NETHERITE_PICKAXE: - MinimumLevel: 50 + MinimumLevel: 100 XpMultiplier: 1 - MaximumQuantity: 3 + MaximumQuantity: 4 NETHERITE_AXE: - MinimumLevel: 50 + MinimumLevel: 100 XpMultiplier: 1 - MaximumQuantity: 3 + MaximumQuantity: 4 NETHERITE_HOE: - MinimumLevel: 50 + MinimumLevel: 100 XpMultiplier: .5 - MaximumQuantity: 2 + MaximumQuantity: 4 # Armor NETHERITE_HELMET: - MinimumLevel: 50 + MinimumLevel: 100 XpMultiplier: 6 - MaximumQuantity: 5 + MaximumQuantity: 4 NETHERITE_CHESTPLATE: - MinimumLevel: 50 + MinimumLevel: 100 XpMultiplier: 6 - MaximumQuantity: 8 + MaximumQuantity: 4 NETHERITE_LEGGINGS: - MinimumLevel: 50 + MinimumLevel: 100 XpMultiplier: 6 - MaximumQuantity: 7 + MaximumQuantity: 4 NETHERITE_BOOTS: - MinimumLevel: 50 + MinimumLevel: 100 XpMultiplier: 6 MaximumQuantity: 4 # diff --git a/src/main/resources/skillranks.yml b/src/main/resources/skillranks.yml index 0e51b10e4..6e68929a0 100644 --- a/src/main/resources/skillranks.yml +++ b/src/main/resources/skillranks.yml @@ -14,21 +14,21 @@ Alchemy: Concoctions: Standard: Rank_1: 0 - Rank_2: 1 - Rank_3: 35 - Rank_4: 50 - Rank_5: 65 + Rank_2: 10 + Rank_3: 20 + Rank_4: 35 + Rank_5: 50 Rank_6: 75 - Rank_7: 85 + Rank_7: 90 Rank_8: 100 RetroMode: Rank_1: 0 - Rank_2: 1 - Rank_3: 350 - Rank_4: 500 - Rank_5: 650 + Rank_2: 100 + Rank_3: 200 + Rank_4: 350 + Rank_5: 500 Rank_6: 750 - Rank_7: 850 + Rank_7: 900 Rank_8: 1000 Archery: ArcheryLimitBreak: @@ -410,9 +410,23 @@ Fishing: Rank_1: 150 MasterAngler: Standard: - Rank_1: 50 + Rank_1: 1 + Rank_2: 20 + Rank_3: 30 + Rank_4: 40 + Rank_5: 60 + Rank_6: 70 + Rank_7: 80 + Rank_8: 90 RetroMode: - Rank_1: 500 + Rank_1: 1 + Rank_2: 200 + Rank_3: 300 + Rank_4: 400 + Rank_5: 600 + Rank_6: 700 + Rank_7: 800 + Rank_8: 900 IceFishing: Standard: Rank_1: 5 @@ -546,30 +560,51 @@ Unarmed: Rank_1: 60 RetroMode: Rank_1: 600 - IronArmStyle: + SteelArmStyle: Standard: Rank_1: 1 - Rank_2: 25 - Rank_3: 50 - Rank_4: 75 - Rank_5: 100 + 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: 1 - Rank_2: 250 - Rank_3: 500 - Rank_4: 750 - Rank_5: 1000 + 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 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 @@ -583,29 +618,18 @@ Woodcutting: 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: 1 + KnockOnWood: + Standard: + Rank_1: 30 + Rank_2: 60 + RetroMode: + Rank_1: 300 + Rank_2: 600 LeafBlower: Standard: Rank_1: 15 diff --git a/src/main/resources/sounds.yml b/src/main/resources/sounds.yml index f705b7d24..8f88c574f 100644 --- a/src/main/resources/sounds.yml +++ b/src/main/resources/sounds.yml @@ -22,7 +22,7 @@ Sounds: Volume: 0.5 LEVEL_UP: Enable: true - Volume: 0.75 + Volume: 0.3 Pitch: 0.5 ITEM_BREAK: Enable: true diff --git a/src/main/resources/treasures.yml b/src/main/resources/treasures.yml index 077a628c8..a28024472 100755 --- a/src/main/resources/treasures.yml +++ b/src/main/resources/treasures.yml @@ -1,964 +1,249 @@ # -# Settings for Fishing -# Last updated on ${project.version}-b${BUILD_NUMBER} -### -Fishing: - LEATHER_BOOTS: - Amount: 1 - XP: 200 - Rarity: COMMON - LEATHER_HELMET: - Amount: 1 - XP: 200 - Rarity: COMMON - LEATHER_LEGGINGS: - Amount: 1 - XP: 200 - Rarity: COMMON - LEATHER_CHESTPLATE: - Amount: 1 - XP: 200 - Rarity: COMMON - WOODEN_SWORD: - Amount: 1 - XP: 200 - Rarity: COMMON - WOODEN_SHOVEL: - Amount: 1 - XP: 200 - Rarity: COMMON - WOODEN_PICKAXE: - Amount: 1 - XP: 200 - Rarity: COMMON - WOODEN_AXE: - Amount: 1 - XP: 200 - Rarity: COMMON - WOODEN_HOE: - Amount: 1 - XP: 200 - Rarity: COMMON - LAPIS_LAZULI: - Amount: 20 - XP: 200 - Rarity: COMMON - STONE_SWORD: - Amount: 1 - XP: 200 - Rarity: UNCOMMON - STONE_SHOVEL: - Amount: 1 - XP: 200 - Rarity: UNCOMMON - STONE_PICKAXE: - Amount: 1 - XP: 200 - Rarity: UNCOMMON - STONE_AXE: - Amount: 1 - XP: 200 - Rarity: UNCOMMON - STONE_HOE: - Amount: 1 - XP: 200 - Rarity: UNCOMMON - GOLDEN_SWORD: - Amount: 1 - XP: 200 - Rarity: UNCOMMON - GOLDEN_SHOVEL: - Amount: 1 - XP: 200 - Rarity: UNCOMMON - GOLDEN_PICKAXE: - Amount: 1 - XP: 200 - Rarity: UNCOMMON - GOLDEN_AXE: - Amount: 1 - XP: 200 - Rarity: UNCOMMON - GOLDEN_HOE: - Amount: 1 - XP: 200 - Rarity: UNCOMMON - GOLDEN_BOOTS: - Amount: 1 - XP: 200 - Rarity: UNCOMMON - GOLDEN_HELMET: - Amount: 1 - XP: 200 - Rarity: UNCOMMON - GOLDEN_LEGGINGS: - Amount: 1 - XP: 200 - Rarity: UNCOMMON - GOLDEN_CHESTPLATE: - Amount: 1 - XP: 200 - Rarity: UNCOMMON - IRON_INGOT: - Amount: 5 - XP: 200 - Rarity: UNCOMMON - GOLD_INGOT: - Amount: 5 - XP: 200 - Rarity: UNCOMMON - IRON_SWORD: - Amount: 1 - XP: 200 - Rarity: RARE - IRON_SHOVEL: - Amount: 1 - XP: 200 - Rarity: RARE - IRON_PICKAXE: - Amount: 1 - XP: 200 - Rarity: RARE - IRON_AXE: - Amount: 1 - XP: 200 - Rarity: RARE - IRON_HOE: - Amount: 1 - XP: 200 - Rarity: RARE - BOW: - Amount: 1 - XP: 200 - Rarity: RARE - ENDER_PEARL: - Amount: 1 - XP: 200 - Rarity: RARE - BLAZE_ROD: - Amount: 1 - XP: 200 - Rarity: RARE - IRON_BOOTS: - Amount: 1 - XP: 200 - Rarity: EPIC - IRON_HELMET: - Amount: 1 - XP: 200 - Rarity: EPIC - IRON_LEGGINGS: - Amount: 1 - XP: 200 - Rarity: EPIC - IRON_CHESTPLATE: - Amount: 1 - XP: 200 - Rarity: EPIC - GHAST_TEAR: - Amount: 1 - XP: 200 - Rarity: EPIC - DIAMOND: - Amount: 5 - XP: 200 - Rarity: EPIC - DIAMOND_SWORD: - Amount: 1 - XP: 200 - Rarity: LEGENDARY - DIAMOND_SHOVEL: - Amount: 1 - XP: 200 - Rarity: LEGENDARY - DIAMOND_PICKAXE: - Amount: 1 - XP: 200 - Rarity: LEGENDARY - DIAMOND_AXE: - Amount: 1 - XP: 200 - Rarity: LEGENDARY - DIAMOND_HOE: - Amount: 1 - XP: 200 - Rarity: LEGENDARY - DIAMOND_BOOTS: - Amount: 1 - XP: 200 - Rarity: LEGENDARY - DIAMOND_HELMET: - Amount: 1 - XP: 200 - Rarity: LEGENDARY - DIAMOND_LEGGINGS: - Amount: 1 - XP: 200 - Rarity: LEGENDARY - DIAMOND_CHESTPLATE: - Amount: 1 - XP: 200 - Rarity: LEGENDARY - MUSIC_DISC_BLOCKS: - Amount: 1 - XP: 200 - Rarity: RECORD - MUSIC_DISC_CHIRP: - Amount: 1 - XP: 200 - Rarity: RECORD - MUSIC_DISC_FAR: - Amount: 1 - XP: 200 - Rarity: RECORD - MUSIC_DISC_MALL: - Amount: 1 - XP: 200 - Rarity: RECORD - MUSIC_DISC_MELLOHI: - Amount: 1 - XP: 200 - Rarity: RECORD - MUSIC_DISC_STAL: - Amount: 1 - XP: 200 - Rarity: RECORD - MUSIC_DISC_STRAD: - Amount: 1 - XP: 200 - Rarity: RECORD - MUSIC_DISC_WARD: - Amount: 1 - XP: 200 - Rarity: RECORD - MUSIC_DISC_11: - Amount: 1 - XP: 200 - Rarity: RECORD - MUSIC_DISC_WAIT: - Amount: 1 - XP: 200 - Rarity: RECORD - MUSIC_DISC_13: - Amount: 1 - XP: 200 - Rarity: RECORD -# -# Fishing drop rates -### -Item_Drop_Rates: - Tier_1: - TRAP: 7.68 - COMMON: 7.50 - UNCOMMON: 1.25 - RARE: 0.25 - EPIC: 0.10 - LEGENDARY: 0.01 - RECORD: 0.01 - Tier_2: - TRAP: 2.50 - COMMON: 6.50 - UNCOMMON: 1.75 - RARE: 0.75 - EPIC: 0.50 - LEGENDARY: 0.05 - RECORD: 0.01 - Tier_3: - TRAP: 1.50 - COMMON: 3.50 - UNCOMMON: 2.75 - RARE: 1.25 - EPIC: 1.00 - LEGENDARY: 0.10 - RECORD: 0.01 - Tier_4: - TRAP: 1.00 - COMMON: 2.00 - UNCOMMON: 3.50 - RARE: 2.25 - EPIC: 1.50 - LEGENDARY: 1.00 - RECORD: 0.01 - Tier_5: - TRAP: 0.25 - COMMON: 1.50 - UNCOMMON: 3.75 - RARE: 2.50 - EPIC: 2.00 - LEGENDARY: 1.00 - RECORD: 0.01 - Tier_6: - TRAP: 0.10 - COMMON: 1.00 - UNCOMMON: 3.25 - RARE: 3.75 - EPIC: 2.50 - LEGENDARY: 1.50 - RECORD: 0.05 - Tier_7: - TRAP: 0.05 - COMMON: 0.25 - UNCOMMON: 2.75 - RARE: 4.00 - EPIC: 5.00 - LEGENDARY: 2.50 - RECORD: 0.10 - Tier_8: - TRAP: 0.01 - COMMON: 0.10 - UNCOMMON: 1.50 - RARE: 6.00 - EPIC: 7.50 - LEGENDARY: 5.00 - RECORD: 0.25 -# -# Fishing enchantment drop rates -### -Enchantments_Rarity: - COMMON: - EFFICIENCY: 1 - UNBREAKING: 1 - FORTUNE: 1 - PROTECTION: 1 - FIRE_PROTECTION: 1 - FEATHER_FALLING: 1 - BLAST_PROTECTION: 1 - PROJECTILE_PROTECTION: 1 - RESPIRATION: 1 - THORNS: 1 - SHARPNESS: 1 - SMITE: 1 - BANE_OF_ARTHROPODS: 1 - POWER: 1 - UNCOMMON: - EFFICIENCY: 2 - PROTECTION: 2 - FIRE_PROTECTION: 2 - FEATHER_FALLING: 2 - BLAST_PROTECTION: 2 - PROJECTILE_PROTECTION: 2 - SHARPNESS: 2 - SMITE: 2 - BANE_OF_ARTHROPODS: 2 - KNOCKBACK: 1 - LOOTING: 1 - POWER: 2 - PUNCH: 1 - RARE: - EFFICIENCY: 3 - UNBREAKING: 2 - PROTECTION: 3 - FIRE_PROTECTION: 3 - FEATHER_FALLING: 3 - BLAST_PROTECTION: 3 - PROJECTILE_PROTECTION: 3 - RESPIRATION: 2 - SHARPNESS: 3 - SMITE: 3 - BANE_OF_ARTHROPODS: 3 - FIRE_ASPECT: 1 - LOOTING: 2 - POWER: 3 - EPIC: - EFFICIENCY: 4 - FORTUNE: 2 - AQUA_AFFINITY: 1 - THORNS: 2 - SHARPNESS: 4 - SMITE: 4 - BANE_OF_ARTHROPODS: 4 - POWER: 4 - FLAME: 1 - LEGENDARY: - EFFICIENCY: 5 - UNBREAKING: 3 - FORTUNE: 3 - PROTECTION: 4 - FIRE_PROTECTION: 4 - FEATHER_FALLING: 4 - BLAST_PROTECTION: 4 - PROJECTILE_PROTECTION: 4 - RESPIRATION: 3 - AQUA_AFFINITY: 1 - THORNS: 3 - SHARPNESS: 5 - SMITE: 5 - BANE_OF_ARTHROPODS: 5 - KNOCKBACK: 2 - FIRE_ASPECT: 2 - LOOTING: 3 - SILK_TOUCH: 1 - POWER: 5 - PUNCH: 2 - INFINITY: 1 - -Enchantment_Drop_Rates: - Tier_1: - COMMON: 5.00 - UNCOMMON: 1.00 - RARE: 0.10 - EPIC: 0.01 - LEGENDARY: 0.01 - Tier_2: - COMMON: 7.50 - UNCOMMON: 1.00 - RARE: 0.10 - EPIC: 0.01 - LEGENDARY: 0.01 - Tier_3: - COMMON: 7.50 - UNCOMMON: 2.50 - RARE: 0.25 - EPIC: 0.10 - LEGENDARY: 0.01 - Tier_4: - COMMON: 10.0 - UNCOMMON: 2.75 - RARE: 0.50 - EPIC: 0.10 - LEGENDARY: 0.05 - Tier_5: - COMMON: 10.0 - UNCOMMON: 4.00 - RARE: 0.75 - EPIC: 0.25 - LEGENDARY: 0.10 - Tier_6: - COMMON: 9.50 - UNCOMMON: 5.50 - RARE: 1.75 - EPIC: 0.50 - LEGENDARY: 0.25 - Tier_7: - COMMON: 8.50 - UNCOMMON: 7.50 - RARE: 2.75 - EPIC: 0.75 - LEGENDARY: 0.50 - Tier_8: - COMMON: 7.50 - UNCOMMON: 10.0 - RARE: 5.25 - EPIC: 1.50 - LEGENDARY: 0.75 -# # Settings for Excavation's Archaeology -# If you are in retro mode, Drop_Level is multiplied by 10. ### Excavation: CAKE: Amount: 1 XP: 3000 Drop_Chance: 0.05 - Drop_Level: 75 + Level_Requirement: + Standard_Mode: 75 + Retro_Mode: 750 Drops_From: [Dirt, Coarse_Dirt, Podzol, Grass_Block, Sand, Red_Sand, Gravel, Clay, Mycelium, Soul_Sand, Soul_Soil] GUNPOWDER: Amount: 1 XP: 30 Drop_Chance: 10.0 - Drop_Level: 10 + Level_Requirement: + Standard_Mode: 10 + Retro_Mode: 100 Drops_From: [Gravel] BONE: Amount: 1 XP: 30 Drop_Chance: 10.0 - Drop_Level: 20 + Level_Requirement: + Standard_Mode: 20 + Retro_Mode: 200 Drops_From: [Gravel] APPLE: Amount: 1 XP: 100 Drop_Chance: 0.1 - Drop_Level: 25 + Level_Requirement: + Standard_Mode: 25 + Retro_Mode: 250 Drops_From: [Grass_Block, Mycelium] SLIME_BALL: Amount: 1 XP: 100 Drop_Chance: 5.0 - Drop_Level: 15 + Level_Requirement: + Standard_Mode: 15 + Retro_Mode: 150 Drops_From: [Clay] BUCKET: Amount: 1 XP: 100 Drop_Chance: 0.1 - Drop_Level: 50 + Level_Requirement: + Standard_Mode: 50 + Retro_Mode: 500 Drops_From: [Clay] NETHERRACK: Amount: 1 XP: 30 Drop_Chance: 0.5 - Drop_Level: 85 + Level_Requirement: + Standard_Mode: 85 + Retro_Mode: 850 Drops_From: [Gravel] RED_MUSHROOM: Amount: 1 XP: 80 Drop_Chance: 0.5 - Drop_Level: 50 + Level_Requirement: + Standard_Mode: 50 + Retro_Mode: 500 Drops_From: [Dirt, Coarse_Dirt, Podzol, Grass_Block, Mycelium] BROWN_MUSHROOM: Amount: 1 XP: 80 Drop_Chance: 0.5 - Drop_Level: 50 + Level_Requirement: + Standard_Mode: 50 + Retro_Mode: 500 Drops_From: [Dirt, Coarse_Dirt, Podzol, Grass_Block, Mycelium] EGG: Amount: 1 XP: 100 Drop_Chance: 1.0 - Drop_Level: 25 + Level_Requirement: + Standard_Mode: 25 + Retro_Mode: 250 Drops_From: [Grass_Block] SOUL_SAND: Amount: 1 XP: 80 Drop_Chance: 0.5 - Drop_Level: 65 + Level_Requirement: + Standard_Mode: 65 + Retro_Mode: 650 Drops_From: [Sand, Red_Sand] CLOCK: Amount: 1 XP: 100 Drop_Chance: 0.1 - Drop_Level: 50 + Level_Requirement: + Standard_Mode: 50 + Retro_Mode: 500 Drops_From: [Clay] COBWEB: Amount: 1 XP: 150 Drop_Chance: 5.0 - Drop_Level: 75 + Level_Requirement: + Standard_Mode: 75 + Retro_Mode: 750 Drops_From: [Clay] STRING: Amount: 1 XP: 200 Drop_Chance: 5.0 - Drop_Level: 25 + Level_Requirement: + Standard_Mode: 25 + Retro_Mode: 250 Drops_From: [Clay] GLOWSTONE_DUST: Amount: 1 XP: 80 Drop_Chance: 5.0 - Drop_Level: 5 + Level_Requirement: + Standard_Mode: 5 + Retro_Mode: 50 Drops_From: [Dirt, Coarse_Dirt, Podzol, Grass_Block, Sand, Red_Sand, Mycelium] MUSIC_DISC_13: Amount: 1 XP: 3000 Drop_Chance: 0.05 - Drop_Level: 25 + Level_Requirement: + Standard_Mode: 25 + Retro_Mode: 250 Drops_From: [Dirt, Coarse_Dirt, Podzol, Grass_Block, Sand, Red_Sand, Gravel, Clay, Mycelium, Soul_Sand, Soul_Soil] MUSIC_DISC_CAT: Amount: 1 XP: 3000 Drop_Chance: 0.05 - Drop_Level: 25 + Level_Requirement: + Standard_Mode: 25 + Retro_Mode: 250 Drops_From: [Dirt, Coarse_Dirt, Podzol, Grass_Block, Sand, Red_Sand, Gravel, Clay, Mycelium, Soul_Sand, Soul_Soil] DIAMOND: Amount: 1 XP: 1000 Drop_Chance: 0.13 - Drop_Level: 35 + Level_Requirement: + Standard_Mode: 35 + Retro_Mode: 350 Drops_From: [Dirt, Coarse_Dirt, Podzol, Grass_Block, Sand, Red_Sand, Gravel, Clay, Mycelium, Soul_Sand, Soul_Soil] COCOA_BEANS: Amount: 1 XP: 100 Drop_Chance: 1.33 - Drop_Level: 35 + Level_Requirement: + Standard_Mode: 35 + Retro_Mode: 350 Drops_From: [Dirt, Coarse_Dirt, Podzol, Grass_Block, Mycelium] QUARTZ: Amount: 1 XP: 100 Drop_Chance: 0.5 - Drop_Level: 85 + Level_Requirement: + Standard_Mode: 85 + Retro_Mode: 850 Drops_From: [Dirt, Coarse_Dirt, Podzol, Grass_Block, Sand, Red_Sand, Gravel, Mycelium, Soul_Sand, Soul_Soil] NAME_TAG: Amount: 1 XP: 3000 Drop_Chance: 0.05 - Drop_Level: 25 + Level_Requirement: + Standard_Mode: 25 + Retro_Mode: 250 Drops_From: [Dirt, Coarse_Dirt, Podzol, Grass_Block, Sand, Red_Sand, Gravel, Clay, Mycelium, Soul_Sand, Soul_Soil] # # Settings for Hylian Luck -# If you are in retro mode, Drop_Level is multiplied by 10. +# If you are in retro mode, Level_Requirement is multiplied by 10. ### Hylian_Luck: MELON_SEEDS: Amount: 1 XP: 0 Drop_Chance: 100.0 - Drop_Level: 0 + Level_Requirement: + Standard_Mode: 0 + Retro_Mode: 0 Drops_From: [Bushes] PUMPKIN_SEEDS: Amount: 1 XP: 0 Drop_Chance: 100.0 - Drop_Level: 0 + Level_Requirement: + Standard_Mode: 0 + Retro_Mode: 0 Drops_From: [Bushes] COCOA_BEANS: Amount: 1 XP: 0 Drop_Chance: 100.0 - Drop_Level: 0 + Level_Requirement: + Standard_Mode: 0 + Retro_Mode: 0 Drops_From: [Bushes] CARROT: Amount: 1 XP: 0 Drop_Chance: 100.0 - Drop_Level: 0 + Level_Requirement: + Standard_Mode: 0 + Retro_Mode: 0 Drops_From: [Flowers] POTATO: Amount: 1 XP: 0 Drop_Chance: 100.0 - Drop_Level: 0 + Level_Requirement: + Standard_Mode: 0 + Retro_Mode: 0 Drops_From: [Flowers] APPLE: Amount: 1 XP: 0 Drop_Chance: 100.0 - Drop_Level: 0 + Level_Requirement: + Standard_Mode: 0 + Retro_Mode: 0 Drops_From: [Flowers] EMERALD: Amount: 1 XP: 0 Drop_Chance: 100.0 - Drop_Level: 0 + Level_Requirement: + Standard_Mode: 0 + Retro_Mode: 0 Drops_From: [Pots] DIAMOND: Amount: 1 XP: 0 Drop_Chance: 100.0 - Drop_Level: 0 + Level_Requirement: + Standard_Mode: 0 + Retro_Mode: 0 Drops_From: [Pots] GOLD_NUGGET: Amount: 1 XP: 0 Drop_Chance: 100.0 - Drop_Level: 0 + Level_Requirement: + Standard_Mode: 0 + Retro_Mode: 0 Drops_From: [Pots] -# -# Settings for Shake -# If you are in retro mode, Drop_Level is multiplied by 10. -### -Shake: - BLAZE: - BLAZE_ROD: - Amount: 1 - XP: 0 - Drop_Chance: 100.0 - Drop_Level: 0 - CAVE_SPIDER: - SPIDER_EYE: - Amount: 1 - XP: 0 - Drop_Chance: 49.0 - Drop_Level: 0 - STRING: - Amount: 1 - XP: 0 - Drop_Chance: 49.0 - Drop_Level: 0 - COBWEB: - Amount: 1 - XP: 0 - Drop_Chance: 1.0 - Drop_Level: 0 - POTION|0|POISON: - PotionData: - PotionType: POISON - Amount: 1 - XP: 0 - Drop_Chance: 1.0 - Drop_Level: 0 - CHICKEN: - FEATHER: - Amount: 1 - XP: 0 - Drop_Chance: 33.3 - Drop_Level: 0 - CHICKEN: - Amount: 1 - XP: 0 - Drop_Chance: 33.3 - Drop_Level: 0 - EGG: - Amount: 1 - XP: 0 - Drop_Chance: 33.3 - Drop_Level: 0 - COW: - MILK_BUCKET: - Amount: 1 - XP: 0 - Drop_Chance: 2.0 - Drop_Level: 0 - LEATHER: - Amount: 1 - XP: 0 - Drop_Chance: 49.0 - Drop_Level: 0 - BEEF: - Amount: 1 - XP: 0 - Drop_Chance: 49.0 - Drop_Level: 0 - CREEPER: - CREEPER_HEAD: - Amount: 1 - XP: 0 - Drop_Chance: 1.0 - Drop_Level: 0 - GUNPOWDER: - Amount: 1 - XP: 0 - Drop_Chance: 99.0 - Drop_Level: 0 - ENDERMAN: - ENDER_PEARL: - Amount: 1 - XP: 0 - Drop_Chance: 100.0 - Drop_Level: 0 - GHAST: - GUNPOWDER: - Amount: 1 - XP: 0 - Drop_Chance: 50.0 - Drop_Level: 0 - GHAST_TEAR: - Amount: 1 - XP: 0 - Drop_Chance: 50.0 - Drop_Level: 0 - HORSE: - LEATHER: - Amount: 1 - XP: 0 - Drop_Chance: 99.0 - Drop_Level: 0 - SADDLE: - Amount: 1 - XP: 0 - Drop_Chance: 1.0 - Drop_Level: 0 - IRON_GOLEM: - PUMPKIN: - Amount: 1 - XP: 0 - Drop_Chance: 3.0 - Drop_Level: 0 - IRON_INGOT: - Amount: 1 - XP: 0 - Drop_Chance: 12.0 - Drop_Level: 0 - POPPY: - Amount: 1 - XP: 0 - Drop_Chance: 85.0 - Drop_Level: 0 - MAGMA_CUBE: - MAGMA_CREAM: - Amount: 1 - XP: 0 - Drop_Chance: 100.0 - Drop_Level: 0 - MUSHROOM_COW: - MILK_BUCKET: - Amount: 1 - XP: 0 - Drop_Chance: 5.0 - Drop_Level: 0 - MUSHROOM_STEW: - Amount: 1 - XP: 0 - Drop_Chance: 5.0 - Drop_Level: 0 - LEATHER: - Amount: 1 - XP: 0 - Drop_Chance: 30.0 - Drop_Level: 0 - BEEF: - Amount: 1 - XP: 0 - Drop_Chance: 30.0 - Drop_Level: 0 - RED_MUSHROOM: - Amount: 2 - XP: 0 - Drop_Chance: 30.0 - Drop_Level: 0 - PIG: - PORKCHOP: - Amount: 1 - XP: 0 - Drop_Chance: 100.0 - Drop_Level: 0 - PIG_ZOMBIE: - ROTTEN_FLESH: - Amount: 1 - XP: 0 - Drop_Chance: 50.0 - Drop_Level: 0 - GOLD_NUGGET: - Amount: 1 - XP: 0 - Drop_Chance: 50.0 - Drop_Level: 0 - PLAYER: - SKELETON_SKULL: - Amount: 1 - XP: 0 - Drop_Chance: 0.0 - Drop_Level: 0 - INVENTORY: - Whole_Stacks: false - Drop_Chance: 0.0 - Drop_Level: 0 - SHEEP: - WHITE_WOOL: - Amount: 3 - XP: 0 - Drop_Chance: 100.0 - Drop_Level: 0 - SHULKER: - SHULKER_SHELL: - Amount: 1 - XP: 0 - Drop_Chance: 25.0 - Drop_Level: 0 - PURPUR_BLOCK: - Amount: 1 - XP: 0 - Drop_Chance: 75.0 - Drop_Level: 0 - SKELETON: - SKELETON_SKULL: - Amount: 1 - XP: 0 - Drop_Chance: 2.0 - Drop_Level: 0 - BONE: - Amount: 1 - XP: 0 - Drop_Chance: 49.0 - Drop_Level: 0 - ARROW: - Amount: 2 - XP: 0 - Drop_Chance: 49.0 - Drop_Level: 0 - SLIME: - SLIME_BALL: - Amount: 1 - XP: 0 - Drop_Chance: 100.0 - Drop_Level: 0 - SPIDER: - SPIDER_EYE: - Amount: 1 - XP: 0 - Drop_Chance: 50.0 - Drop_Level: 0 - STRING: - Amount: 1 - XP: 0 - Drop_Chance: 50.0 - Drop_Level: 0 - SNOWMAN: - PUMPKIN: - Amount: 1 - XP: 0 - Drop_Chance: 3.0 - Drop_Level: 0 - SNOWBALL: - Amount: 2 - XP: 0 - Drop_Chance: 97.0 - Drop_Level: 0 - SQUID: - INK_SAC: - Amount: 1 - XP: 0 - Drop_Chance: 100.0 - Drop_Level: 0 - WITCH: - SPLASH_POTION|0|INSTANT_HEAL: - PotionData: - PotionType: INSTANT_HEAL - Amount: 1 - XP: 0 - Drop_Chance: 1.0 - Drop_Level: 0 - SPLASH_POTION|0|FIRE_RESISTANCE: - PotionData: - PotionType: FIRE_RESISTANCE - Amount: 1 - XP: 0 - Drop_Chance: 1.0 - Drop_Level: 0 - SPLASH_POTION|0|SPEED: - PotionData: - PotionType: SPEED - Amount: 1 - XP: 0 - Drop_Chance: 1.0 - Drop_Level: 0 - GLASS_BOTTLE: - Amount: 1 - XP: 0 - Drop_Chance: 7.0 - Drop_Level: 0 - GLOWSTONE_DUST: - Amount: 1 - XP: 0 - Drop_Chance: 15.0 - Drop_Level: 0 - GUNPOWDER: - Amount: 1 - XP: 0 - Drop_Chance: 15.0 - Drop_Level: 0 - REDSTONE: - Amount: 1 - XP: 0 - Drop_Chance: 15.0 - Drop_Level: 0 - SPIDER_EYE: - Amount: 1 - XP: 0 - Drop_Chance: 15.0 - Drop_Level: 0 - STICK: - Amount: 1 - XP: 0 - Drop_Chance: 15.0 - Drop_Level: 0 - SUGAR: - Amount: 1 - XP: 0 - Drop_Chance: 15.0 - Drop_Level: 0 - WITHER_SKELETON: - WITHER_SKELETON_SKULL: - Amount: 1 - XP: 0 - Drop_Chance: 2.0 - Drop_Level: 0 - BONE: - Amount: 1 - XP: 0 - Drop_Chance: 49.0 - Drop_Level: 0 - COAL: - Amount: 2 - XP: 0 - Drop_Chance: 49.0 - Drop_Level: 0 - ZOMBIE: - ZOMBIE_HEAD: - Amount: 1 - XP: 0 - Drop_Chance: 2.0 - Drop_Level: 0 - ROTTEN_FLESH: - Amount: 1 - XP: 0 - Drop_Chance: 98.0 - Drop_Level: 0 diff --git a/src/main/resources/upgrades.yml b/src/main/resources/upgrades_overhaul.yml similarity index 58% rename from src/main/resources/upgrades.yml rename to src/main/resources/upgrades_overhaul.yml index 3858dfe0c..df0290061 100644 --- a/src/main/resources/upgrades.yml +++ b/src/main/resources/upgrades_overhaul.yml @@ -7,3 +7,8 @@ Upgrades_Finished: DROP_SQL_PARTY_NAMES: false DROP_SPOUT: false ADD_ALCHEMY: false + FIX_SPELLING_NETHERITE_SALVAGE: false + FIX_SPELLING_NETHERITE_REPAIR: false + FIX_NETHERITE_SALVAGE_QUANTITIES: false + ADD_UUIDS: false + SQL_CHARSET_UTF8MB4: false diff --git a/src/test/java/com/gmail/nossr50/database/FlatFileDataProcessorTest.java b/src/test/java/com/gmail/nossr50/database/FlatFileDataProcessorTest.java new file mode 100644 index 000000000..6f1847fae --- /dev/null +++ b/src/test/java/com/gmail/nossr50/database/FlatFileDataProcessorTest.java @@ -0,0 +1,26 @@ +package com.gmail.nossr50.database; + +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; + +class FlatFileDataProcessorTest { + + @SuppressWarnings("ResultOfMethodCallIgnored") + @Test + void testGetExpectedValueType() { + for (int i = 0; i < FlatFileDatabaseManager.DATA_ENTRY_COUNT; i++) { + FlatFileDataProcessor.getExpectedValueType(i); + } + } + + @SuppressWarnings("ResultOfMethodCallIgnored") + @Test + void testGetExpectedValueTypeException() { + Assertions.assertThrows(IndexOutOfBoundsException.class, () -> { + for (int i = 0; i < FlatFileDatabaseManager.DATA_ENTRY_COUNT + 1; i++) { + FlatFileDataProcessor.getExpectedValueType(i); + } + }); + } + +} diff --git a/src/test/java/com/gmail/nossr50/database/FlatFileDatabaseManagerTest.java b/src/test/java/com/gmail/nossr50/database/FlatFileDatabaseManagerTest.java new file mode 100644 index 000000000..f626002c1 --- /dev/null +++ b/src/test/java/com/gmail/nossr50/database/FlatFileDatabaseManagerTest.java @@ -0,0 +1,856 @@ +package com.gmail.nossr50.database; + +import com.gmail.nossr50.database.flatfile.LeaderboardStatus; +import com.gmail.nossr50.datatypes.database.DatabaseType; +import com.gmail.nossr50.datatypes.player.PlayerProfile; +import com.gmail.nossr50.datatypes.player.UniqueDataType; +import com.gmail.nossr50.datatypes.skills.PrimarySkillType; +import com.gmail.nossr50.datatypes.skills.SuperAbilityType; +import com.gmail.nossr50.util.skills.SkillTools; +import com.google.common.io.Files; +import org.bukkit.entity.Player; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; +import org.junit.jupiter.api.AfterEach; +import org.junit.jupiter.api.BeforeAll; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.mockito.Mockito; + +import java.io.*; +import java.net.URI; +import java.net.URISyntaxException; +import java.util.ArrayList; +import java.util.List; +import java.util.Map; +import java.util.UUID; +import java.util.logging.Filter; +import java.util.logging.LogRecord; +import java.util.logging.Logger; + +import static org.junit.jupiter.api.Assertions.*; +import static org.mockito.Mockito.mock; + +//This class uses JUnit5/Jupiter +class FlatFileDatabaseManagerTest { + + public static final @NotNull String TEST_FILE_NAME = "test.mcmmo.users"; + public static final @NotNull String BAD_FILE_LINE_ONE = "mrfloris:2420:::0:2452:0:1983:1937:1790:3042:1138:3102:2408:3411:0:0:0:0:0:0:0:0::642:0:1617583171:0:1617165043:0:1617583004:1617563189:1616785408::2184:0:0:1617852413:HEARTS:415:0:631e3896-da2a-4077-974b-d047859d76bc:5:1600906906:"; + public static final @NotNull String BAD_DATA_FILE_LINE_TWENTY_THREE = "nossr51:baddata:::baddata:baddata:640:baddata:1000:1000:1000:baddata:baddata:baddata:baddata:16:0:500:20273:0:0:0:0::1000:0:0:baddata:1593543012:0:0:0:0::1000:0:0:baddata:IGNORED:1000:0:588fe472-1c82-4c4e-9aa1-7eefccb277e3:1:0:"; + public static final @NotNull String DB_BADDATA = "baddatadb.users"; + public static final @NotNull String DB_HEALTHY = "healthydb.users"; + public static final @NotNull String HEALTHY_DB_LINE_1 = "nossr50:1:IGNORED:IGNORED:10:2:20:3:4:5:6:7:8:9:10:30:40:50:60:70:80:90:100:IGNORED:11:110:111:222:333:444:555:666:777:IGNORED:12:120:888:IGNORED:HEARTS:13:130:588fe472-1c82-4c4e-9aa1-7eefccb277e3:1111:999:2020:"; + public static final @NotNull String HEALTHY_DB_LINE_ONE_UUID_STR = "588fe472-1c82-4c4e-9aa1-7eefccb277e3"; + public static final String DB_MISSING_LAST_LOGIN = "missinglastlogin.users"; + public static final String LINE_TWO_FROM_MISSING_DB = "nossr50:1:IGNORED:IGNORED:10:2:20:3:4:5:6:7:8:9:10:30:40:50:60:70:80:90:100:IGNORED:11:110:111:222:333:444:555:666:777:IGNORED:12:120:888:0:HEARTS:13:130:588fe472-1c82-4c4e-9aa1-7eefccb277e3:1111:999:"; + private static File tempDir; + private final static @NotNull Logger logger = Logger.getLogger(Logger.GLOBAL_LOGGER_NAME); + private final long PURGE_TIME = 2630000000L; + private static @Nullable FlatFileDatabaseManager db; + + //Making them all unique makes it easier on us to edit this stuff later + int expectedLvlMining = 1, expectedLvlWoodcutting = 2, expectedLvlRepair = 3, + expectedLvlUnarmed = 4, expectedLvlHerbalism = 5, expectedLvlExcavation = 6, + expectedLvlArchery = 7, expectedLvlSwords = 8, expectedLvlAxes = 9, expectedLvlAcrobatics = 10, + expectedLvlTaming = 11, expectedLvlFishing = 12, expectedLvlAlchemy = 13; + + float expectedExpMining = 10, expectedExpWoodcutting = 20, expectedExpRepair = 30, + expectedExpUnarmed = 40, expectedExpHerbalism = 50, expectedExpExcavation = 60, + expectedExpArchery = 70, expectedExpSwords = 80, expectedExpAxes = 90, expectedExpAcrobatics = 100, + expectedExpTaming = 110, expectedExpFishing = 120, expectedExpAlchemy = 130; + + long expectedBerserkCd = 111, expectedGigaDrillBreakerCd = 222, expectedTreeFellerCd = 333, + expectedGreenTerraCd = 444, expectedSerratedStrikesCd = 555, expectedSkullSplitterCd = 666, + expectedSuperBreakerCd = 777, expectedBlastMiningCd = 888, expectedChimaeraWingCd = 999; + + int expectedScoreboardTips = 1111; + Long expectedLastLogin = 2020L; + + @BeforeAll + static void initBeforeAll() { + logger.setFilter(new DebugFilter()); + } + + @BeforeEach + void init() { + assertNull(db); + //noinspection UnstableApiUsage + tempDir = Files.createTempDir(); + db = new FlatFileDatabaseManager(new File(getTemporaryUserFilePath()), logger, PURGE_TIME, 0, true); + } + + private @NotNull String getTemporaryUserFilePath() { + return tempDir.getPath() + File.separator + TEST_FILE_NAME; + } + + @AfterEach + void tearDown() { + recursiveDelete(tempDir); + db = null; + } + + //Nothing wrong with this database + private static final String[] normalDatabaseData = { + "nossr50:1000:::0:1000:640:1000:1000:1000:1000:1000:1000:1000:1000:16:0:500:0:0:0:0:0::1000:0:0:0:1593543012:0:0:0:0::1000:0:0:1593806053:HEARTS:1000:0:588fe472-1c82-4c4e-9aa1-7eefccb277e3:0:0:", + "mrfloris:2420:::0:2452:0:1983:1937:1790:3042:1138:3102:2408:3411:0:0:0:0:0:0:0:0::642:0:1617583171:0:1617165043:0:1617583004:1617563189:1616785408::2184:0:0:1617852413:HEARTS:415:0:631e3896-da2a-4077-974b-d047859d76bc:5:1600906906:", + "powerless:0:::0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0::0:0:0:0:0:0:0:0:0::0:0:0:0:HEARTS:0:0:e0d07db8-f7e8-43c7-9ded-864dfc6f3b7c:5:1600906906:" + }; + + private static final String[] badUUIDDatabaseData = { + "nossr50:1000:::0:1000:640:1000:1000:1000:1000:1000:1000:1000:1000:16:0:500:0:0:0:0:0::1000:0:0:0:1593543012:0:0:0:0::1000:0:0:1593806053:HEARTS:1000:0:588fe472-1c82-4c4e-9aa1-7eefccb277e3:0:0:", + "z750:2420:::0:2452:0:1983:1937:1790:3042:1138:3102:2408:3411:0:0:0:0:0:0:0:0::642:0:1617583171:0:1617165043:0:1617583004:1617563189:1616785408::2184:0:0:1617852413:HEARTS:415:0:3:5:1600906906:", //This one has an incorrect UUID representation + "powerless:0:::0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0::0:0:0:0:0:0:0:0:0::0:0:0:0:HEARTS:0:0:e0d07db8-f7e8-43c7-9ded-864dfc6f3b7c:5:1600906906:" + }; + + private static final String[] outdatedDatabaseData = { + "nossr50:1000:::0:1000:640:1000:1000:1000:1000:1000:1000:1000:1000:16:0:500:0:0:0:0:0::1000:0:0:0:1593543012:0:0:0:0::1000:0:0:1593806053:HEARTS:1000:0:588fe472-1c82-4c4e-9aa1-7eefccb277e3:0:0:", + "mrfloris:2420:::0:2452:0:1983:1937:1790:3042:1138:3102:2408:3411:0:0:0:0:0:0:0:0::642:0:1617583171:0:1617165043:0:1617583004:1617563189:1616785408::2184:0:0:1617852413:HEARTS:415:0:631e3896-da2a-4077-974b-d047859d76bc:5:1600906906:", + "electronicboy:0:::0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0::0:0:0:0:0:0:0:0:0::0:0:0:0:HEARTS:0:0:e0d07db8-f7e8-43c7-9ded-864dfc6f3b7c:" //This user is missing data added after UUID index + }; + + private static final String[] emptyLineDatabaseData = { + "nossr50:1000:::0:1000:640:1000:1000:1000:1000:1000:1000:1000:1000:16:0:500:0:0:0:0:0::1000:0:0:0:1593543012:0:0:0:0::1000:0:0:1593806053:HEARTS:1000:0:588fe472-1c82-4c4e-9aa1-7eefccb277e3:0:0:", + "mrfloris:2420:::0:2452:0:1983:1937:1790:3042:1138:3102:2408:3411:0:0:0:0:0:0:0:0::642:0:1617583171:0:1617165043:0:1617583004:1617563189:1616785408::2184:0:0:1617852413:HEARTS:415:0:631e3896-da2a-4077-974b-d047859d76bc:5:1600906906:", + "kashike:0:::0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0::0:0:0:0:0:0:0:0:0::0:0:0:0:HEARTS:0:0:e0d07db8-f7e8-43c7-9ded-864dfc6f3b7c:5:1600906906:", + "" //EMPTY LINE + }; + + private static final String[] emptyNameDatabaseData = { + ":1000:::0:1000:640:1000:1000:1000:1000:1000:1000:1000:1000:16:0:500:0:0:0:0:0::1000:0:0:0:1593543012:0:0:0:0::1000:0:0:1593806053:HEARTS:1000:0:588fe472-1c82-4c4e-9aa1-7eefccb277e3:0:0:", + "mrfloris:2420:::0:2452:0:1983:1937:1790:3042:1138:3102:2408:3411:0:0:0:0:0:0:0:0::642:0:1617583171:0:1617165043:0:1617583004:1617563189:1616785408::2184:0:0:1617852413:HEARTS:415:0:631e3896-da2a-4077-974b-d047859d76bc:5:1600906906:", + "aikar:0:::0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0::0:0:0:0:0:0:0:0:0::0:0:0:0:HEARTS:0:0:e0d07db8-f7e8-43c7-9ded-864dfc6f3b7c:5:1600906906:" + }; + + private static final String[] duplicateNameDatabaseData = { + "mochi:1000:::0:1000:640:1000:1000:1000:1000:1000:1000:1000:1000:16:0:500:0:0:0:0:0::1000:0:0:0:1593543012:0:0:0:0::1000:0:0:1593806053:HEARTS:1000:0:588fe472-1c82-4c4e-9aa1-7eefccb277e3:0:0:", + "mochi:1000:::0:1000:640:1000:1000:1000:1000:1000:1000:1000:1000:16:0:500:0:0:0:0:0::1000:0:0:0:1593543012:0:0:0:0::1000:0:0:1593806053:HEARTS:1000:0:631e3896-da2a-4077-974b-d047859d76bc:0:0:", + }; + + private static final String[] duplicateUUIDDatabaseData = { + "nossr50:1000:::0:1000:640:1000:1000:1000:1000:1000:1000:1000:1000:16:0:500:0:0:0:0:0::1000:0:0:0:1593543012:0:0:0:0::1000:0:0:1593806053:HEARTS:1000:0:588fe472-1c82-4c4e-9aa1-7eefccb277e3:0:0:", + "mrfloris:1000:::0:1000:640:1000:1000:1000:1000:1000:1000:1000:1000:16:0:500:0:0:0:0:0::1000:0:0:0:1593543012:0:0:0:0::1000:0:0:1593806053:HEARTS:1000:0:588fe472-1c82-4c4e-9aa1-7eefccb277e3:0:0:", + }; + + private static final String[] corruptDatabaseData = { + "nossr50:1000:::0:100:0:0::1000:0:0:1593806053:HEARTS:1000:0:588fe472-1c82-4c4e-9aa1-7eefccb277e3:0:0:", + "mrfloris:2420:::0:2452:0:1983:1937:1790:3042:1138:3102:2408:3411:0:0:0:0:0:0:0:0::642:0:1617583171:0:1617165043:0:1617583004:1617563189:1616785408::2184:0:0:1617852413:HEARTS:415:0:631e3896-da2a-4077-974b-d047859d76bc:5:1600906906:", + "corruptdataboy:の:::ののの0:2452:0:1983:1937:1790:3042ののののの:1138:3102:2408:3411:0:0:0:0:0:0:0:0::642:0:1617のののののの583171:0:1617165043:0:1617583004:1617563189:1616785408::2184:0:0:1617852413:HEARTS:415:0:d20c6e8d-5615-4284-b8d1-e20b92011530:5:1600906906:", + "のjapaneseuserの:333:::0:2452:0:444:1937:1790:3042:1138:3102:2408:3411:0:0:0:0:0:0:0:0::642:0:1617583171:0:1617165043:0:1617583004:1617563189:1616785408::2184:0:0:1617852413:HEARTS:415:0:25870f0e-7558-4659-9f60-417e24cb3332:5:1600906906:", + "sameUUIDasjapaneseuser:333:::0:442:0:544:1937:1790:3042:1138:3102:2408:3411:0:0:0:0:0:0:0:0::642:0:1617583171:0:1617165043:0:1617583004:1617563189:1616785408::2184:0:0:1617852413:HEARTS:415:0:25870f0e-7558-4659-9f60-417e24cb3332:5:1600906906:", + }; + + private static final String[] badDatabaseData = { + //First entry here is missing some values + "nossr50:1000:0:500:0:0:0:0:0::1000:0:0:0:1593543012:0:0:0:0::1000:0:0:1593806053:HEARTS:1000:0:588fe472-1c82-4c4e-9aa1-7eefccb277e3:0:0:", + //Second entry here has an integer value replaced by a string + "mrfloris:2420:::0:2452:0:1983:1937:1790:3042:badvalue:3102:2408:3411:0:0:0:0:0:0:0:0::642:0:1617583171:0:1617165043:0:1617583004:1617563189:1616785408::2184:0:0:1617852413:HEARTS:415:0:631e3896-da2a-4077-974b-d047859d76bc:5:1600906906:" + }; + + @Test + void testDefaultInit() { + db = new FlatFileDatabaseManager(getTemporaryUserFilePath(), logger, PURGE_TIME, 0); + } + + @Test + void testUpdateLeaderboards() { + assertNotNull(db); + assertEquals(LeaderboardStatus.UPDATED, db.updateLeaderboards()); + } + + @Test + void testSaveUser() { + //Make a Profile to save and check to see if it worked + UUID uuid = UUID.fromString("588fe472-1c82-4c4e-9aa1-7eefccb277e3"); + String playerName = "nossr50"; + PlayerProfile testProfile = new PlayerProfile(playerName, uuid, 0); + //The above profile should be "zero" initialized + + //Save the zero version and see if it looks correct + assertNotNull(db); + assertTrue(db.getUsersFile().exists()); //Users file should have been created from the above com.gmail.nossr50.database.FlatFileDatabaseManager.checkFileHealthAndStructure + assertNotNull(db.getUsersFile()); + + //The DB is empty at this point, add our user + assertTrue(db.saveUser(testProfile)); //True means we saved the user + + //Check for the empty profile + PlayerProfile retrievedFromData = db.loadPlayerProfile(uuid); + assertTrue(retrievedFromData.isLoaded()); //PlayerProfile::isLoaded returns true if the data was created from the file, false if it wasn't found and a dummy profile was returned + assertEquals(uuid, retrievedFromData.getUniqueId()); + assertEquals(playerName, retrievedFromData.getPlayerName()); + + /* + * Test overwriting names with new names + */ + + String alteredName = "changedmyname"; + PlayerProfile changedNameProfile = new PlayerProfile(alteredName, uuid, 0); + assertTrue(db.saveUser(changedNameProfile)); //True means we saved the user + + retrievedFromData = db.loadPlayerProfile(uuid); + assertTrue(retrievedFromData.isLoaded()); //PlayerProfile::isLoaded returns true if the data was created from the file, false if it wasn't found and a dummy profile was returned + assertEquals(uuid, retrievedFromData.getUniqueId()); + assertEquals(alteredName, retrievedFromData.getPlayerName()); + } + + @Test + void testAddedMissingLastLoginValues() { + File dbFile = prepareDatabaseTestResource(DB_MISSING_LAST_LOGIN); + + //This makes sure our private method is working before the tests run afterwards + ArrayList dataFromFile = getSplitDataFromFile(dbFile); + logger.info("File Path: "+ dbFile.getAbsolutePath()); + assertArrayEquals(LINE_TWO_FROM_MISSING_DB.split(":"), dataFromFile.get(1)); + assertEquals(dataFromFile.get(1)[FlatFileDatabaseManager.UUID_INDEX], HEALTHY_DB_LINE_ONE_UUID_STR); + + db = new FlatFileDatabaseManager(dbFile, logger, PURGE_TIME, 0, true); + List flagsFound = db.checkFileHealthAndStructure(); + assertNotNull(flagsFound); + assertTrue(flagsFound.contains(FlatFileDataFlag.LAST_LOGIN_SCHEMA_UPGRADE)); + + //Check for the fixed value + PlayerProfile profile = db.loadPlayerProfile("nossr50"); + assertEquals(-1, (long) profile.getLastLogin()); + } + + @Test + void testLoadByName() { + File healthyDB = prepareDatabaseTestResource(DB_HEALTHY); + + /* + * We have established the files are in good order, so now for the actual testing + */ + + //This makes sure our private method is working before the tests run afterwards + ArrayList dataFromFile = getSplitDataFromFile(healthyDB); + logger.info("File Path: "+healthyDB.getAbsolutePath()); + assertArrayEquals(HEALTHY_DB_LINE_1.split(":"), dataFromFile.get(0)); + assertEquals(dataFromFile.get(0)[FlatFileDatabaseManager.UUID_INDEX], HEALTHY_DB_LINE_ONE_UUID_STR); + UUID healthDBEntryOneUUID = UUID.fromString(HEALTHY_DB_LINE_ONE_UUID_STR); + + db = new FlatFileDatabaseManager(healthyDB, logger, PURGE_TIME, 0, true); + List flagsFound = db.checkFileHealthAndStructure(); + assertNull(flagsFound); //No flags should be found + + /* + * Once the DB looks fine load the profile + */ + + String playerName = "nossr50"; + UUID uuid = UUID.fromString("588fe472-1c82-4c4e-9aa1-7eefccb277e3"); + + PlayerProfile profile = db.loadPlayerProfile(playerName); + testHealthyDataProfileValues(playerName, uuid, profile); + } + + @Test + void testNewUser() { + //We will test that new user values line up with our expectations + UUID uuid = new UUID(0, 1); + String playerName = "nossr50"; + + int newUserTestStartingLvl = 1337; + db = new FlatFileDatabaseManager(new File(tempDir.getPath() + File.separator + TEST_FILE_NAME), logger, PURGE_TIME, newUserTestStartingLvl, true); + db.checkFileHealthAndStructure(); + + PlayerProfile playerProfile = db.newUser(playerName, uuid); + + assertTrue(playerProfile.isLoaded()); + assertEquals(playerName, playerProfile.getPlayerName()); + assertEquals(uuid, playerProfile.getUniqueId()); + + PlayerProfile retrievedFromDisk = db.loadPlayerProfile(uuid); + assertTrue(retrievedFromDisk.isLoaded()); + assertEquals(playerName, retrievedFromDisk.getPlayerName()); + assertEquals(uuid, retrievedFromDisk.getUniqueId()); + + //Checking a new user for being "zero" initialized + checkNewUserValues(playerProfile, newUserTestStartingLvl); + checkNewUserValues(retrievedFromDisk, newUserTestStartingLvl); + + //TODO: Should we do any dupe checking? Probably not needed as it would be caught on the next load + db.newUser("disco", new UUID(3, 3)); + db.newUser("dingus", new UUID(3, 4)); + db.newUser("duped_dingus", new UUID(3, 4)); + + assertEquals(5, getSplitDataFromFile(db.getUsersFile()).size()); + } + + @Test + void testAddingUsersToEndOfExistingDB() { + //We will test that new user values line up with our expectations + UUID uuid = new UUID(0, 80); + String playerName = "the_kitty_man"; + + File file = prepareDatabaseTestResource(DB_HEALTHY); //Existing DB + + int newUserTestStartingLvl = 1337; + db = new FlatFileDatabaseManager(file, logger, PURGE_TIME, newUserTestStartingLvl, true); + db.checkFileHealthAndStructure(); + + PlayerProfile playerProfile = db.newUser(playerName, uuid); + + assertTrue(playerProfile.isLoaded()); + assertEquals(playerName, playerProfile.getPlayerName()); + assertEquals(uuid, playerProfile.getUniqueId()); + + PlayerProfile retrievedFromDisk = db.loadPlayerProfile(uuid); + assertTrue(retrievedFromDisk.isLoaded()); + assertEquals(playerName, retrievedFromDisk.getPlayerName()); + assertEquals(uuid, retrievedFromDisk.getUniqueId()); + + //Checking a new user for being "zero" initialized + checkNewUserValues(playerProfile, newUserTestStartingLvl); + checkNewUserValues(retrievedFromDisk, newUserTestStartingLvl); + + //TODO: Should we do any dupe checking? Probably not needed as it would be caught on the next load + db.newUser("bidoof", new UUID(3, 3)); + db.newUser("derp", new UUID(3, 4)); + db.newUser("pizza", new UUID(3, 4)); + + assertEquals(7, getSplitDataFromFile(db.getUsersFile()).size()); + + //Now we *fix* the DB and there should be one less + db.checkFileHealthAndStructure(); + assertEquals(6, getSplitDataFromFile(db.getUsersFile()).size()); + } + + private void checkNewUserValues(@NotNull PlayerProfile playerProfile, int startingLevel) { + //Checking a new user for being zero initialized + for(PrimarySkillType primarySkillType : PrimarySkillType.values()) { + if(SkillTools.isChildSkill(primarySkillType)) + continue; + + assertEquals(startingLevel, playerProfile.getSkillLevel(primarySkillType)); + assertEquals(0, playerProfile.getSkillXpLevelRaw(primarySkillType), 0); + } + + for(SuperAbilityType superAbilityType : SuperAbilityType.values()) { + assertEquals(0, playerProfile.getAbilityDATS(superAbilityType)); + } + + assertTrue(playerProfile.getLastLogin() > 0); + assertEquals(playerProfile.getChimaerWingDATS(), 0); + assertEquals(playerProfile.getScoreboardTipsShown(), 0); + } + + @Test + void testLoadByUUID() { + File dbFile = prepareDatabaseTestResource(DB_HEALTHY); + + /* + * We have established the files are in good order, so now for the actual testing + */ + + //This makes sure our private method is working before the tests run afterwards + ArrayList dataFromFile = getSplitDataFromFile(dbFile); + logger.info("File Path: " + dbFile.getAbsolutePath()); + assertArrayEquals(HEALTHY_DB_LINE_1.split(":"), dataFromFile.get(0)); + assertEquals(dataFromFile.get(0)[FlatFileDatabaseManager.UUID_INDEX], HEALTHY_DB_LINE_ONE_UUID_STR); + + db = new FlatFileDatabaseManager(dbFile, logger, PURGE_TIME, 0, true); + List flagsFound = db.checkFileHealthAndStructure(); + assertNull(flagsFound); //No flags should be found + + /* + * Once the DB looks fine load the profile + */ + + String playerName = "nossr50"; + UUID uuid = UUID.fromString("588fe472-1c82-4c4e-9aa1-7eefccb277e3"); + + PlayerProfile profile1 = db.loadPlayerProfile(uuid); + testHealthyDataProfileValues(playerName, uuid, profile1); + + + assertFalse(db.loadPlayerProfile(new UUID(0, 1)).isLoaded()); //This profile should not exist and therefor will return unloaded + } + + @Test + void testLoadByUUIDAndName() { + File dbFile = prepareDatabaseTestResource(DB_HEALTHY); + + /* + * We have established the files are in good order, so now for the actual testing + */ + + //This makes sure our private method is working before the tests run afterwards + ArrayList dataFromFile = getSplitDataFromFile(dbFile); + logger.info("File Path: " + dbFile.getAbsolutePath()); + assertArrayEquals(HEALTHY_DB_LINE_1.split(":"), dataFromFile.get(0)); + assertEquals(dataFromFile.get(0)[FlatFileDatabaseManager.UUID_INDEX], HEALTHY_DB_LINE_ONE_UUID_STR); + + db = new FlatFileDatabaseManager(dbFile, logger, PURGE_TIME, 0, true); + List flagsFound = db.checkFileHealthAndStructure(); + assertNull(flagsFound); //No flags should be found + + /* + * Once the DB looks fine load the profile + */ + + String playerName = "nossr50"; + UUID uuid = UUID.fromString("588fe472-1c82-4c4e-9aa1-7eefccb277e3"); + + Player player = initMockPlayer(playerName, uuid); + PlayerProfile profile1 = db.loadPlayerProfile(player); + testHealthyDataProfileValues(playerName, uuid, profile1); + + String updatedName = "updatedName"; + Player updatedNamePlayer = initMockPlayer(updatedName, uuid); + PlayerProfile updatedNameProfile = db.loadPlayerProfile(updatedNamePlayer); + testHealthyDataProfileValues(updatedName, uuid, updatedNameProfile); + + Player shouldNotExist = initMockPlayer("doesntexist", new UUID(0, 1)); + PlayerProfile profile3 = db.loadPlayerProfile(shouldNotExist); + assertFalse(profile3.isLoaded()); + } + + private File prepareDatabaseTestResource(@NotNull String dbFileName) { + ClassLoader classLoader = getClass().getClassLoader(); + URI resourceFileURI = null; + + try { + resourceFileURI = classLoader.getResource(dbFileName).toURI(); + } catch (URISyntaxException e) { + e.printStackTrace(); + } + + assertNotNull(resourceFileURI); + File fromResourcesFile = new File(resourceFileURI); + assertNotNull(resourceFileURI); + File copyOfFile = new File(tempDir.getPath() + File.separator + dbFileName); + + if(copyOfFile.exists()) { + //noinspection ResultOfMethodCallIgnored + copyOfFile.delete(); + } + + assertTrue(fromResourcesFile.exists()); + + try { + //noinspection UnstableApiUsage + Files.copy(fromResourcesFile, copyOfFile); + } catch (IOException e) { + e.printStackTrace(); + } + + assertNotNull(copyOfFile); + return copyOfFile; + } + + private void testHealthyDataProfileValues(@NotNull String playerName, @NotNull UUID uuid, @NotNull PlayerProfile profile) { + assertTrue(profile.isLoaded()); //PlayerProfile::isLoaded returns true if the data was created from the file, false if it wasn't found and a dummy profile was returned + assertEquals(uuid, profile.getUniqueId()); + assertEquals(playerName, profile.getPlayerName()); + + /* + * Player is a match and data is loaded, check values + */ + + for(PrimarySkillType primarySkillType : PrimarySkillType.values()) { + if(SkillTools.isChildSkill(primarySkillType)) + continue; + +// logger.info("Checking expected values for: "+primarySkillType); +// logger.info("Profile Level Value: "+profile.getSkillLevel(primarySkillType)); +// logger.info("Expected Lvl Value: "+getExpectedLevelHealthyDBEntryOne(primarySkillType)); +// logger.info("Profile Exp Value: "+profile.getSkillXpLevelRaw(primarySkillType)); +// logger.info("Expected Exp Value: "+getExpectedExperienceHealthyDBEntryOne(primarySkillType)); + + assertEquals(getExpectedLevelHealthyDBEntryOne(primarySkillType), profile.getSkillLevel(primarySkillType)); + assertEquals(getExpectedExperienceHealthyDBEntryOne(primarySkillType), profile.getSkillXpLevelRaw(primarySkillType), 0); + } + + //Check the other things + for(SuperAbilityType superAbilityType : SuperAbilityType.values()) { + assertEquals(getExpectedSuperAbilityDATS(superAbilityType), profile.getAbilityDATS(superAbilityType)); + } + + assertEquals(expectedChimaeraWingCd, profile.getUniqueData(UniqueDataType.CHIMAERA_WING_DATS)); + assertEquals(expectedScoreboardTips, profile.getScoreboardTipsShown()); + assertEquals(expectedLastLogin, profile.getLastLogin()); + } + + private long getExpectedSuperAbilityDATS(@NotNull SuperAbilityType superAbilityType) { + switch(superAbilityType) { + case BERSERK: + return expectedBerserkCd; + case SUPER_BREAKER: + return expectedSuperBreakerCd; + case GIGA_DRILL_BREAKER: + return expectedGigaDrillBreakerCd; + case GREEN_TERRA: + return expectedGreenTerraCd; + case SKULL_SPLITTER: + return expectedSkullSplitterCd; + case TREE_FELLER: + return expectedTreeFellerCd; + case SERRATED_STRIKES: + return expectedSerratedStrikesCd; + case BLAST_MINING: + return expectedBlastMiningCd; + } + + return -1; + } + + //TODO: Why is this stuff a float? + private float getExpectedExperienceHealthyDBEntryOne(@NotNull PrimarySkillType primarySkillType) { + switch(primarySkillType) { + case ACROBATICS: + return expectedExpAcrobatics; + case ALCHEMY: + return expectedExpAlchemy; + case ARCHERY: + return expectedExpArchery; + case AXES: + return expectedExpAxes; + case EXCAVATION: + return expectedExpExcavation; + case FISHING: + return expectedExpFishing; + case HERBALISM: + return expectedExpHerbalism; + case MINING: + return expectedExpMining; + case REPAIR: + return expectedExpRepair; + case SALVAGE: + case SMELTING: + return 0; + case SWORDS: + return expectedExpSwords; + case TAMING: + return expectedExpTaming; + case UNARMED: + return expectedExpUnarmed; + case WOODCUTTING: + return expectedExpWoodcutting; + } + + return -1; + } + + private int getExpectedLevelHealthyDBEntryOne(@NotNull PrimarySkillType primarySkillType) { + switch(primarySkillType) { + case ACROBATICS: + return expectedLvlAcrobatics; + case ALCHEMY: + return expectedLvlAlchemy; + case ARCHERY: + return expectedLvlArchery; + case AXES: + return expectedLvlAxes; + case EXCAVATION: + return expectedLvlExcavation; + case FISHING: + return expectedLvlFishing; + case HERBALISM: + return expectedLvlHerbalism; + case MINING: + return expectedLvlMining; + case REPAIR: + return expectedLvlRepair; + case SALVAGE: + case SMELTING: + return 0; + case SWORDS: + return expectedLvlSwords; + case TAMING: + return expectedLvlTaming; + case UNARMED: + return expectedLvlUnarmed; + case WOODCUTTING: + return expectedLvlWoodcutting; + } + + return -1; + } + + @Test + void testOverwriteName() { + overwriteDataAndCheckForFlag(db, duplicateNameDatabaseData, FlatFileDataFlag.DUPLICATE_NAME); + ArrayList splitDataLines = getSplitDataFromFile(db.getUsersFile()); + assertNotEquals(splitDataLines.get(1)[0], splitDataLines.get(0)[0]); //Name comparison + } + + @Test + void testDataNotFound() { + //Save the zero version and see if it looks correct + assertNotNull(db); + assertTrue(db.getUsersFile().exists()); + assertNotNull(db.getUsersFile()); + + //Check for the "unloaded" profile + PlayerProfile retrievedFromData = db.loadPlayerProfile("nossr50"); + assertFalse(retrievedFromData.isLoaded()); //PlayerProfile::isLoaded returns false if data doesn't exist for the user + } + + @Test + void testPurgePowerlessUsers() { + replaceDataInFile(db, normalDatabaseData); + int purgeCount = db.purgePowerlessUsers(); + assertEquals(purgeCount, 1); //1 User should have been purged + } + + @Test + void testCheckFileHealthAndStructure() { + replaceDataInFile(db, badDatabaseData); + + List dataFlags = db.checkFileHealthAndStructure(); + assertNotNull(dataFlags); + assertNotEquals(dataFlags.size(), 0); + } + + @Test + void testFindFixableDuplicateNames() { + overwriteDataAndCheckForFlag(db, duplicateNameDatabaseData, FlatFileDataFlag.DUPLICATE_NAME); + } + + @Test + void testFindDuplicateUUIDs() { + overwriteDataAndCheckForFlag(db, duplicateUUIDDatabaseData, FlatFileDataFlag.DUPLICATE_UUID); + } + + @Test() + void findBadUUIDData() { + overwriteDataAndCheckForFlag(db, badUUIDDatabaseData, FlatFileDataFlag.BAD_UUID_DATA); + } + + @Test + void testFindCorruptData() { + overwriteDataAndCheckForFlag(db, corruptDatabaseData, FlatFileDataFlag.CORRUPTED_OR_UNRECOGNIZABLE); + } + + @Test + void testFindEmptyNames() { + overwriteDataAndCheckForFlag(db, emptyNameDatabaseData, FlatFileDataFlag.MISSING_NAME); + } + + @Test + void testFindBadValues() { + overwriteDataAndCheckForFlag(db, badDatabaseData, FlatFileDataFlag.BAD_VALUES); + } + + @Test + void testFindOutdatedData() { + overwriteDataAndCheckForFlag(db, outdatedDatabaseData, FlatFileDataFlag.INCOMPLETE); + } + + @Test + void testGetDatabaseType() { + assertNotNull(db); + assertEquals(db.getDatabaseType(), DatabaseType.FLATFILE); + } + + @Test + void testReadRank() { + //This is an empty DB + assertNotNull(db); + String rankBoyName = "rankBoy"; + UUID rankBoyUUID = new UUID(1337, 1337); + String rankGirlName = "rankGirl"; + UUID rankGirlUUID = new UUID(7331, 7331); + + PlayerProfile rankGirlProfile = addPlayerProfileWithLevelsAndSave(rankGirlName, rankGirlUUID, 100); //Rank 1 + PlayerProfile rankBoyProfile = addPlayerProfileWithLevelsAndSave(rankBoyName, rankBoyUUID, 10); //Rank 2 + + assertEquals(LeaderboardStatus.UPDATED, db.updateLeaderboards()); + Map rankGirlPositions = db.readRank(rankGirlName); + Map rankBoyPositions = db.readRank(rankBoyName); + + for(PrimarySkillType primarySkillType : PrimarySkillType.values()) { + if(primarySkillType.isChildSkill()) { + assertNull(rankBoyPositions.get(primarySkillType)); + assertNull(rankGirlPositions.get(primarySkillType)); + } else { + assertEquals(1, rankGirlPositions.get(primarySkillType)); + assertEquals(2, rankBoyPositions.get(primarySkillType)); + } + } + + assertEquals(1, db.readRank(rankGirlName).get(null)); //Girl should be position 1 + assertEquals(2, db.readRank(rankBoyName).get(null)); //Boy should be position 2 + } + + @Test + void testLoadFromFile() { + ClassLoader classLoader = getClass().getClassLoader(); + URI resourceFileURI = null; + + try { + resourceFileURI = classLoader.getResource(DB_BADDATA).toURI(); + } catch (URISyntaxException e) { + e.printStackTrace(); + } + + assertNotNull(resourceFileURI); + File fromResourcesFile = new File(resourceFileURI); + assertNotNull(resourceFileURI); + File copyOfFile = new File(tempDir.getPath() + File.separator + DB_BADDATA); + + if(copyOfFile.exists()) { + copyOfFile.delete(); + } + + assertTrue(fromResourcesFile.exists()); + + try { + Files.copy(fromResourcesFile, copyOfFile); + } catch (IOException e) { + e.printStackTrace(); + } + + assertNotNull(copyOfFile); + + //This makes sure our private method is working before the tests run afterwards + ArrayList dataFromFile = getSplitDataFromFile(copyOfFile); + logger.info("File Path: "+copyOfFile.getAbsolutePath()); + assertArrayEquals(BAD_FILE_LINE_ONE.split(":"), dataFromFile.get(0)); + assertEquals(dataFromFile.get(22)[0], "nossr51"); + assertArrayEquals(BAD_DATA_FILE_LINE_TWENTY_THREE.split(":"), dataFromFile.get(22)); + + FlatFileDatabaseManager db_a = new FlatFileDatabaseManager(copyOfFile, logger, PURGE_TIME, 0, true); + List flagsFound = db_a.checkFileHealthAndStructure(); + assertNotNull(flagsFound); + assertTrue(flagsFound.contains(FlatFileDataFlag.BAD_VALUES)); + } + + private @NotNull ArrayList getSplitDataFromFile(@NotNull File file) { + ArrayList splitDataList = new ArrayList<>(); + + try (BufferedReader bufferedReader = new BufferedReader(new FileReader(file))) { + String line; + + while ((line = bufferedReader.readLine()) != null) { + if (line.isEmpty()) + continue; + + String[] splitData = line.split(":"); + splitDataList.add(splitData); + } + + } catch (Exception e) { + e.printStackTrace(); + } + + return splitDataList; + } + + private @NotNull PlayerProfile addPlayerProfileWithLevelsAndSave(String playerName, UUID uuid, int levels) { + assertNotNull(db); + assertFalse(db.loadPlayerProfile(uuid).isLoaded()); + + db.newUser(playerName, uuid); + PlayerProfile leveledProfile = db.loadPlayerProfile(uuid); + + assertTrue(leveledProfile.isLoaded()); + assertEquals(playerName, leveledProfile.getPlayerName()); + assertEquals(uuid, leveledProfile.getUniqueId()); + + for(PrimarySkillType primarySkillType : PrimarySkillType.values()) { + if(SkillTools.isChildSkill(primarySkillType)) + continue; + + leveledProfile.modifySkill(primarySkillType, levels); //TODO: This method also resets XP, not cool + } + + db.saveUser(leveledProfile); + leveledProfile = db.loadPlayerProfile(uuid); + + for(PrimarySkillType primarySkillType : PrimarySkillType.values()) { + if(SkillTools.isChildSkill(primarySkillType)) { + continue; + } + + assertEquals(levels, leveledProfile.getSkillLevel(primarySkillType)); + } + + return leveledProfile; + } + + private void replaceDataInFile(@NotNull FlatFileDatabaseManager flatFileDatabaseManager, @NotNull String[] dataEntries) { + String filePath = flatFileDatabaseManager.getUsersFile().getAbsolutePath(); + BufferedReader in = null; + FileWriter out = null; + + try { + StringBuilder writer = new StringBuilder(); + + for(String data : dataEntries) { + writer.append(data).append("\r\n"); + } + + out = new FileWriter(filePath); + out.write(writer.toString()); + } catch (FileNotFoundException e) { + e.printStackTrace(); + logger.info("File not found"); + } catch (IOException e) { + e.printStackTrace(); + } finally { + if (out != null) { + try { + out.close(); + } + catch (IOException e) { + // Ignore + } + } + } + + try { + logger.info("Added the following lines to the FlatFileDatabase for the purposes of the test..."); + // Open the file + in = new BufferedReader(new FileReader(filePath)); + String line; + while ((line = in.readLine()) != null) { + logger.info(line); + } + } catch (IOException e) { + e.printStackTrace(); + } finally { + if (in != null) { + try { + in.close(); + } + catch (IOException e) { + // Ignore + } + } + } + } + + private void overwriteDataAndCheckForFlag(@NotNull FlatFileDatabaseManager targetDatabase, @NotNull String[] data, @NotNull FlatFileDataFlag flag) { + replaceDataInFile(targetDatabase, data); + + List dataFlags = targetDatabase.checkFileHealthAndStructure(); + assertNotNull(dataFlags); + assertTrue(dataFlags.contains(flag)); + } + + @NotNull + private Player initMockPlayer(@NotNull String name, @NotNull UUID uuid) { + Player mockPlayer = mock(Player.class); + Mockito.when(mockPlayer.getName()).thenReturn(name); + Mockito.when(mockPlayer.getUniqueId()).thenReturn(uuid); + return mockPlayer; + } + + private static class DebugFilter implements Filter { + @Override + public boolean isLoggable(LogRecord record) { + return false; + } + } + + public static void recursiveDelete(@NotNull File directoryToBeDeleted) { + if (directoryToBeDeleted.isDirectory()) { + for (File file : directoryToBeDeleted.listFiles()) { + recursiveDelete(file); + } + } + directoryToBeDeleted.delete(); + } + +} \ No newline at end of file diff --git a/src/test/java/com/gmail/nossr50/database/flatfile/FlatFileDataUtilTest.java b/src/test/java/com/gmail/nossr50/database/flatfile/FlatFileDataUtilTest.java new file mode 100644 index 000000000..db7fad9f5 --- /dev/null +++ b/src/test/java/com/gmail/nossr50/database/flatfile/FlatFileDataUtilTest.java @@ -0,0 +1,33 @@ +package com.gmail.nossr50.database.flatfile; + +import com.gmail.nossr50.database.FlatFileDatabaseManager; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; + +import java.util.HashSet; + +class FlatFileDataUtilTest { + + @Test + void getPreparedSaveDataLine() { + + } + + @Test + void repairBadData() { + + } + + @Test + void getZeroInitialisedData() { + + } + + @Test + void testTooManyDataEntriesSplitString() { + Assertions.assertThrows(AssertionError.class, () -> { + FlatFileDataContainer dataContainer = new CategorizedFlatFileData(0, new HashSet<>(), new String[FlatFileDatabaseManager.DATA_ENTRY_COUNT + 1]); + FlatFileDataUtil.getPreparedSaveDataLine(dataContainer); + }); + } +} diff --git a/src/test/java/com/gmail/nossr50/datatypes/BlockLocationHistoryTest.java b/src/test/java/com/gmail/nossr50/datatypes/BlockLocationHistoryTest.java new file mode 100644 index 000000000..aa1ce3afa --- /dev/null +++ b/src/test/java/com/gmail/nossr50/datatypes/BlockLocationHistoryTest.java @@ -0,0 +1,37 @@ +package com.gmail.nossr50.datatypes; + +import org.bukkit.Location; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; + +class BlockLocationHistoryTest { + @Test + void testRemovesOldestElement() { + BlockLocationHistory history = new BlockLocationHistory(2); + Location locationA = new Location(null, 0, 1, 2); + Location locationB = new Location(null, 1, 2, 3); + Location locationC = new Location(null, 2, 3, 4); + + history.add(locationA); + history.add(locationB); + history.add(locationC); + Assertions.assertFalse(history.contains(locationA)); + Assertions.assertTrue(history.contains(locationB)); + Assertions.assertTrue(history.contains(locationC)); + } + + @Test + void testSupportsDuplicateElement() { + BlockLocationHistory history = new BlockLocationHistory(2); + Location locationA = new Location(null, 0, 1, 2); + Location locationB = new Location(null, 1, 2, 3); + + history.add(locationA); + history.add(locationA); + history.add(locationB); + Assertions.assertTrue(history.contains(locationA)); + Assertions.assertTrue(history.contains(locationB)); + history.add(locationB); + Assertions.assertFalse(history.contains(locationA)); + } +} diff --git a/src/test/java/com/gmail/nossr50/util/blockmeta/ChunkStoreTest.java b/src/test/java/com/gmail/nossr50/util/blockmeta/ChunkStoreTest.java new file mode 100644 index 000000000..969de6ec4 --- /dev/null +++ b/src/test/java/com/gmail/nossr50/util/blockmeta/ChunkStoreTest.java @@ -0,0 +1,432 @@ +package com.gmail.nossr50.util.blockmeta; + + +import com.gmail.nossr50.mcMMO; +import com.gmail.nossr50.util.BlockUtils; +import com.google.common.io.Files; +import org.bukkit.Bukkit; +import org.bukkit.World; +import org.bukkit.block.Block; +import org.jetbrains.annotations.NotNull; +import org.junit.jupiter.api.*; +import org.mockito.MockedStatic; +import org.mockito.Mockito; + +import java.io.*; +import java.util.UUID; + +/** + * Could be a lot better. But some tests are better than none! Tests the major things, still kinda unit-testy. Verifies + * that the serialization isn't completely broken. + */ +class ChunkStoreTest { + + public static final int LEGACY_WORLD_HEIGHT_MAX = 256; + public static final int LEGACY_WORLD_HEIGHT_MIN = 0; + private static File tempDir; + + @BeforeAll + public static void setUpClass() { + tempDir = Files.createTempDir(); + } + + @AfterAll + public static void tearDownClass() { + recursiveDelete(tempDir); + } + + private World mockWorld; + + private MockedStatic bukkitMock; + private MockedStatic mcMMOMock; + + @BeforeEach + void setUpMock() { + UUID worldUUID = UUID.randomUUID(); + mockWorld = Mockito.mock(World.class); + Mockito.when(mockWorld.getUID()).thenReturn(worldUUID); + Mockito.when(mockWorld.getMaxHeight()).thenReturn(256); + Mockito.when(mockWorld.getWorldFolder()).thenReturn(tempDir); + + bukkitMock = Mockito.mockStatic(Bukkit.class); + bukkitMock.when(() -> Bukkit.getWorld(worldUUID)).thenReturn(mockWorld); + + mcMMOMock = Mockito.mockStatic(mcMMO.class); + + Mockito.when(mockWorld.getMinHeight()).thenReturn(LEGACY_WORLD_HEIGHT_MIN); + Mockito.when(mockWorld.getMaxHeight()).thenReturn(LEGACY_WORLD_HEIGHT_MAX); + } + + @AfterEach + void teardownMock() { + bukkitMock.close(); + mcMMOMock.close(); + } + + @Test + void testIndexOutOfBounds() { + Mockito.when(mockWorld.getMinHeight()).thenReturn(-64); + HashChunkManager hashChunkManager = new HashChunkManager(); + + // Top Block + Block illegalHeightBlock = initMockBlock(1337, 256, -1337); + Assertions.assertFalse(hashChunkManager.isTrue(illegalHeightBlock)); + Assertions.assertThrows(IndexOutOfBoundsException.class, () -> hashChunkManager.setTrue(illegalHeightBlock)); + } + + @Test + void testSetTrue() { + Mockito.when(mockWorld.getMinHeight()).thenReturn(-64); + HashChunkManager hashChunkManager = new HashChunkManager(); + int radius = 2; // Could be anything but drastically changes test time + + for (int x = -radius; x <= radius; x++) { + for (int y = mockWorld.getMinHeight(); y < mockWorld.getMaxHeight(); y++) { + for (int z = -radius; z <= radius; z++) { + Block testBlock = initMockBlock(x, y, z); + + hashChunkManager.setTrue(testBlock); + Assertions.assertTrue(hashChunkManager.isTrue(testBlock)); + hashChunkManager.setFalse(testBlock); + Assertions.assertFalse(hashChunkManager.isTrue(testBlock)); + } + } + } + + // Bot Block + Block bottomBlock = initMockBlock(1337, 0, -1337); + Assertions.assertFalse(hashChunkManager.isTrue(bottomBlock)); + + Assertions.assertTrue(BlockUtils.isWithinWorldBounds(bottomBlock)); + hashChunkManager.setTrue(bottomBlock); + Assertions.assertTrue(hashChunkManager.isTrue(bottomBlock)); + + // Top Block + Block topBlock = initMockBlock(1337, 255, -1337); + Assertions.assertFalse(hashChunkManager.isTrue(topBlock)); + + Assertions.assertTrue(BlockUtils.isWithinWorldBounds(topBlock)); + hashChunkManager.setTrue(topBlock); + Assertions.assertTrue(hashChunkManager.isTrue(topBlock)); + } + + @Test + void testSetValue() { + BitSetChunkStore original = new BitSetChunkStore(mockWorld, 0, 0); + original.setTrue(0, 0, 0); + Assertions.assertTrue(original.isTrue(0, 0, 0)); + original.setFalse(0, 0, 0); + Assertions.assertFalse(original.isTrue(0, 0, 0)); + } + + @Test + void testIsEmpty() { + BitSetChunkStore original = new BitSetChunkStore(mockWorld, 0, 0); + Assertions.assertTrue(original.isEmpty()); + original.setTrue(0, 0, 0); + original.setFalse(0, 0, 0); + Assertions.assertTrue(original.isEmpty()); + } + + @Test + void testRoundTrip() throws IOException { + BitSetChunkStore original = new BitSetChunkStore(mockWorld, 1, 2); + original.setTrue(14, 89, 12); + original.setTrue(14, 90, 12); + original.setTrue(13, 89, 12); + byte[] serializedBytes = serializeChunkstore(original); + ChunkStore deserialized = BitSetChunkStore.Serialization.readChunkStore(new DataInputStream(new ByteArrayInputStream(serializedBytes))); + assertEqual(original, deserialized); + } + + @Test + void testNegativeWorldMin() throws IOException { + Mockito.when(mockWorld.getMinHeight()).thenReturn(-64); + + BitSetChunkStore original = new BitSetChunkStore(mockWorld, 1, 2); + original.setTrue(14, -32, 12); + original.setTrue(14, -64, 12); + original.setTrue(13, -63, 12); + byte[] serializedBytes = serializeChunkstore(original); + ChunkStore deserialized = BitSetChunkStore.Serialization.readChunkStore(new DataInputStream(new ByteArrayInputStream(serializedBytes))); + assertEqual(original, deserialized); + } + + @Test + void testNegativeWorldMinUpgrade() throws IOException { + BitSetChunkStore original = new BitSetChunkStore(mockWorld, 1, 2); + original.setTrue(14, 1, 12); + original.setTrue(14, 2, 12); + original.setTrue(13, 3, 12); + byte[] serializedBytes = serializeChunkstore(original); + + Mockito.when(mockWorld.getMinHeight()).thenReturn(-64); + ChunkStore deserialized = BitSetChunkStore.Serialization.readChunkStore(new DataInputStream(new ByteArrayInputStream(serializedBytes))); + assert deserialized != null; + assertEqualIgnoreMinMax(original, deserialized); + } + + @Test + void testChunkCoords() throws IOException { + for (int x = -96; x < 0; x++) { + int cx = x >> 4; + int ix = Math.abs(x) % 16; + //System.out.print(cx + ":" + ix + " "); + } + } + + @Test + void testUpgrade() throws IOException { + LegacyChunkStore original = new LegacyChunkStore(mockWorld, 12, 32); + original.setTrue(14, 89, 12); + original.setTrue(14, 90, 12); + original.setTrue(13, 89, 12); + byte[] serializedBytes = serializeChunkstore(original); + ChunkStore deserialized = BitSetChunkStore.Serialization.readChunkStore(new DataInputStream(new ByteArrayInputStream(serializedBytes))); + assert deserialized != null; + assertEqual(original, deserialized); + } + + @Test + void testSimpleRegionRoundtrip() throws IOException { + LegacyChunkStore original = new LegacyChunkStore(mockWorld, 12, 12); + original.setTrue(14, 89, 12); + original.setTrue(14, 90, 12); + original.setTrue(13, 89, 12); + File file = new File(tempDir, "SimpleRegionRoundTrip.region"); + McMMOSimpleRegionFile region = new McMMOSimpleRegionFile(file, 0, 0); + try (DataOutputStream outputStream = region.getOutputStream(12, 12)) { + outputStream.write(serializeChunkstore(original)); + } + region.close(); + region = new McMMOSimpleRegionFile(file, 0, 0); + try (DataInputStream is = region.getInputStream(original.getChunkX(), original.getChunkZ())) { + Assertions.assertNotNull(is); + ChunkStore deserialized = BitSetChunkStore.Serialization.readChunkStore(is); + assert deserialized != null; + assertEqual(original, deserialized); + } + region.close(); + file.delete(); + } + + @Test + void testSimpleRegionRejectsOutOfBounds() { + File file = new File(tempDir, "SimpleRegionRoundTrip.region"); + McMMOSimpleRegionFile region = new McMMOSimpleRegionFile(file, 0, 0); + Assertions.assertThrows(IndexOutOfBoundsException.class, () -> region.getOutputStream(-1, 0)); + Assertions.assertThrows(IndexOutOfBoundsException.class, () -> region.getOutputStream(0, -1)); + Assertions.assertThrows(IndexOutOfBoundsException.class, () -> region.getOutputStream(32, 0)); + Assertions.assertThrows(IndexOutOfBoundsException.class, () -> region.getOutputStream(0, 32)); + region.close(); + } + + @Test + void testChunkStoreRejectsOutOfBounds() { + ChunkStore chunkStore = new BitSetChunkStore(mockWorld, 0, 0); + Assertions.assertThrows(IndexOutOfBoundsException.class, () -> chunkStore.setTrue(-1, 0, 0)); + Assertions.assertThrows(IndexOutOfBoundsException.class, () -> chunkStore.setTrue(0, -1, 0)); + Assertions.assertThrows(IndexOutOfBoundsException.class, () -> chunkStore.setTrue(0, 0, -1)); + Assertions.assertThrows(IndexOutOfBoundsException.class, () -> chunkStore.setTrue(16, 0, 0)); + Assertions.assertThrows(IndexOutOfBoundsException.class, () -> chunkStore.setTrue(0, mockWorld.getMaxHeight(), 0)); + Assertions.assertThrows(IndexOutOfBoundsException.class, () -> chunkStore.setTrue(0, 0, 16)); + } + + @Test + void testRegressionChunkMirrorBug() { + ChunkManager chunkManager = new HashChunkManager(); + Block mockBlockA = Mockito.mock(Block.class); + Mockito.when(mockBlockA.getX()).thenReturn(15); + Mockito.when(mockBlockA.getZ()).thenReturn(15); + Mockito.when(mockBlockA.getY()).thenReturn(0); + Mockito.when(mockBlockA.getWorld()).thenReturn(mockWorld); + Block mockBlockB = Mockito.mock(Block.class); + Mockito.when(mockBlockB.getX()).thenReturn(-15); + Mockito.when(mockBlockB.getZ()).thenReturn(-15); + Mockito.when(mockBlockB.getY()).thenReturn(0); + Mockito.when(mockBlockB.getWorld()).thenReturn(mockWorld); + + chunkManager.setTrue(mockBlockA); + chunkManager.setFalse(mockBlockB); + Assertions.assertTrue(chunkManager.isTrue(mockBlockA)); + } + + private void assertEqual(ChunkStore expected, ChunkStore actual) { + Assertions.assertEquals(expected.getChunkMin(), actual.getChunkMin()); + Assertions.assertEquals(expected.getChunkMax(), actual.getChunkMax()); + assertEqualIgnoreMinMax(expected, actual); + } + + private void assertEqualIgnoreMinMax(ChunkStore expected, ChunkStore actual) { + Assertions.assertEquals(expected.getChunkX(), actual.getChunkX()); + Assertions.assertEquals(expected.getChunkZ(), actual.getChunkZ()); + Assertions.assertEquals(expected.getWorldId(), actual.getWorldId()); + for (int y = Math.min(actual.getChunkMin(), expected.getChunkMin()); y < Math.max(actual.getChunkMax(), expected.getChunkMax()); y++) { + if (expected.getChunkMin() > y || actual.getChunkMin() > y || expected.getChunkMax() <= y || actual.getChunkMax() <= y) + continue; // Ignore + for (int x = 0; x < 16; x++) + for (int z = 0; z < 16; z++) + Assertions.assertEquals(expected.isTrue(x, y, z), actual.isTrue(x, y, z)); + } + } + + private static byte[] serializeChunkstore(@NotNull ChunkStore chunkStore) throws IOException { + ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream(); + if (chunkStore instanceof BitSetChunkStore) + BitSetChunkStore.Serialization.writeChunkStore(new DataOutputStream(byteArrayOutputStream), chunkStore); + else + new UnitTestObjectOutputStream(byteArrayOutputStream).writeObject(chunkStore); // Serializes the class as if + // it were the old + // PrimitiveChunkStore + return byteArrayOutputStream.toByteArray(); + } + + public static class LegacyChunkStore implements ChunkStore, Serializable { + private static final long serialVersionUID = -1L; + transient private boolean dirty = false; + public boolean[][][] store; + private static final int CURRENT_VERSION = 7; + private static final int MAGIC_NUMBER = 0xEA5EDEBB; + private final int cx; + private final int cz; + private final @NotNull UUID worldUid; + + public LegacyChunkStore(@NotNull World world, int cx, int cz) { + this.cx = cx; + this.cz = cz; + this.worldUid = world.getUID(); + this.store = new boolean[16][16][world.getMaxHeight()]; + } + + @Override + public boolean isDirty() { + return dirty; + } + + @Override + public void setDirty(boolean dirty) { + this.dirty = dirty; + } + + @Override + public int getChunkX() { + return cx; + } + + @Override + public int getChunkZ() { + return cz; + } + + @Override + public int getChunkMin() { + return 0; + } + + @Override + public int getChunkMax() { + return store[0][0].length; + } + + @Override + public @NotNull UUID getWorldId() { + return worldUid; + } + + @Override + public boolean isTrue(int x, int y, int z) { + return store[x][z][y]; + } + + @Override + public void setTrue(int x, int y, int z) { + if (y >= store[0][0].length || y < 0) + return; + store[x][z][y] = true; + dirty = true; + } + + @Override + public void setFalse(int x, int y, int z) { + if (y >= store[0][0].length || y < 0) + return; + store[x][z][y] = false; + dirty = true; + } + + @Override + public void set(int x, int y, int z, boolean value) { + if (y >= store[0][0].length || y < 0) + return; + store[x][z][y] = value; + dirty = true; + } + + @Override + public boolean isEmpty() { + for (int x = 0; x < 16; x++) { + for (int z = 0; z < 16; z++) { + for (int y = 0; y < store[0][0].length; y++) { + if (store[x][z][y]) { + return false; + } + } + } + } + return true; + } + + private void writeObject(@NotNull ObjectOutputStream out) throws IOException { + out.writeInt(MAGIC_NUMBER); + out.writeInt(CURRENT_VERSION); + + out.writeLong(worldUid.getLeastSignificantBits()); + out.writeLong(worldUid.getMostSignificantBits()); + out.writeInt(cx); + out.writeInt(cz); + out.writeObject(store); + + dirty = false; + } + + private void readObject(@NotNull ObjectInputStream in) throws IOException, ClassNotFoundException { + throw new UnsupportedOperationException(); + } + + } + + private static class UnitTestObjectOutputStream extends ObjectOutputStream { + + public UnitTestObjectOutputStream(@NotNull OutputStream outputStream) throws IOException { + super(outputStream); + } + + @Override + public void writeUTF(@NotNull String str) throws IOException { + // Pretend to be the old class + if (str.equals(LegacyChunkStore.class.getName())) + str = "com.gmail.nossr50.util.blockmeta.chunkmeta.PrimitiveChunkStore"; + super.writeUTF(str); + } + + } + + @NotNull + private Block initMockBlock(int x, int y, int z) { + Block mockBlock = Mockito.mock(Block.class); + Mockito.when(mockBlock.getX()).thenReturn(x); + Mockito.when(mockBlock.getY()).thenReturn(y); + Mockito.when(mockBlock.getZ()).thenReturn(z); + Mockito.when(mockBlock.getWorld()).thenReturn(mockWorld); + return mockBlock; + } + + public static void recursiveDelete(@NotNull File directoryToBeDeleted) { + if (directoryToBeDeleted.isDirectory()) { + for (File file : directoryToBeDeleted.listFiles()) { + recursiveDelete(file); + } + } + directoryToBeDeleted.delete(); + } +} diff --git a/src/test/java/com/gmail/nossr50/util/platform/MinecraftGameVersionTest.java b/src/test/java/com/gmail/nossr50/util/platform/MinecraftGameVersionTest.java new file mode 100644 index 000000000..3af0553a3 --- /dev/null +++ b/src/test/java/com/gmail/nossr50/util/platform/MinecraftGameVersionTest.java @@ -0,0 +1,130 @@ +package com.gmail.nossr50.util.platform; + +import com.gmail.nossr50.mcMMO; +import org.bukkit.Bukkit; +import org.jetbrains.annotations.NotNull; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.Arguments; +import org.junit.jupiter.params.provider.MethodSource; +import org.mockito.MockedStatic; +import org.mockito.Mockito; + +import java.util.logging.Logger; +import java.util.stream.Stream; + +import static org.junit.jupiter.api.Assertions.*; + +class MinecraftGameVersionTest { + + @Test + void testAtLeast() { + // TODO: Remove redundant tests + MinecraftGameVersion oneEightEight = new MinecraftGameVersion(1, 8, 8); + MinecraftGameVersion oneSixteenFive = new MinecraftGameVersion(1, 16, 5); + MinecraftGameVersion oneTwo = new MinecraftGameVersion(1, 2); + + // 1.8.8 + assertTrue(oneEightEight.isAtLeast(1, 8, 7)); + assertFalse(oneEightEight.isAtLeast(1, 9, 0)); + + // 1.16.5 + assertTrue(oneSixteenFive.isAtLeast(1, 15, 2)); + assertFalse(oneSixteenFive.isAtLeast(1, 17, 0)); + + // 1.2 + assertTrue(oneTwo.isAtLeast(1, 2, 0)); + + // Test major version number + MinecraftGameVersion majorVersionTest = new MinecraftGameVersion(2, 0, 0); + + assertFalse(majorVersionTest.isAtLeast(3, 0, 0)); + assertFalse(majorVersionTest.isAtLeast(3, 1, 0)); + assertFalse(majorVersionTest.isAtLeast(3, 0, 2)); + + assertTrue(majorVersionTest.isAtLeast(2, 0, 0)); + assertTrue(majorVersionTest.isAtLeast(1, 0, 0)); + + // Test minor version number + MinecraftGameVersion minorVersionTest = new MinecraftGameVersion(0, 3, 0); + + assertFalse(minorVersionTest.isAtLeast(0, 4, 0)); + assertFalse(minorVersionTest.isAtLeast(1, 4, 0)); + assertFalse(minorVersionTest.isAtLeast(0, 4, 1)); + + assertTrue(minorVersionTest.isAtLeast(0, 1, 0)); + assertTrue(minorVersionTest.isAtLeast(0, 2, 0)); + assertTrue(minorVersionTest.isAtLeast(0, 2, 1)); + assertTrue(minorVersionTest.isAtLeast(0, 3, 0)); + + // Test patch version number + + MinecraftGameVersion patchVersionTest = new MinecraftGameVersion(0, 0, 5); + + assertFalse(patchVersionTest.isAtLeast(1, 0, 0)); + assertFalse(patchVersionTest.isAtLeast(0, 0, 6)); + assertFalse(patchVersionTest.isAtLeast(0, 1, 4)); + assertFalse(patchVersionTest.isAtLeast(1, 1, 4)); + + assertTrue(patchVersionTest.isAtLeast(0, 0, 1)); + assertTrue(patchVersionTest.isAtLeast(0, 0, 2)); + assertTrue(patchVersionTest.isAtLeast(0, 0, 3)); + assertTrue(patchVersionTest.isAtLeast(0, 0, 4)); + assertTrue(patchVersionTest.isAtLeast(0, 0, 5)); + } + + @MethodSource("getGameVersions") + @ParameterizedTest(name = "Verify that \"{0}\" is recognized as {1}.{2}.{3}") + void testVersionDetection(String gameVersion, int major, int minor, int patch) { + /* + * The platform manager checks for the type of server software, + * we will just simulate some "Spigot" version here, so that the test can + * continue successfully. + */ + String serverSoftwareVersion = "git-Spigot-12345-abcdef (MC: " + major + '.' + minor + '.' + patch + ')'; + + // Set up a mock plugin for logging. + mcMMO plugin = Mockito.mock(mcMMO.class); + Mockito.when(plugin.getName()).thenReturn("mcMMO"); + Mockito.when(plugin.getLogger()).thenReturn(Logger.getLogger("mcMMO")); + mcMMO.p = plugin; + + try (MockedStatic bukkit = Mockito.mockStatic(Bukkit.class)) { + // Inject our own Bukkit versions + bukkit.when(() -> Bukkit.getVersion()).thenReturn(serverSoftwareVersion); + bukkit.when(() -> Bukkit.getBukkitVersion()).thenReturn(gameVersion); + + PlatformManager manager = new PlatformManager(); + Platform platform = manager.getPlatform(); + MinecraftGameVersion minecraftVersion = platform.getGameVersion(); + + assertEquals(major, minecraftVersion.getMajorVersion().asInt()); + assertEquals(minor, minecraftVersion.getMinorVersion().asInt()); + assertEquals(patch, minecraftVersion.getPatchVersion().asInt()); + } finally { + mcMMO.p = null; + } + } + + private static @NotNull Stream getGameVersions() { + /* + * These samples were taken directly from the historical + * data of CraftBukkit's pom.xml file: + * https://hub.spigotmc.org/stash/projects/SPIGOT/repos/craftbukkit/browse/pom.xml + * + * We should be safe to assume that forks follow these conventions and do not mess + * with this version number (Spigot, Paper and Tuinity do at least). + */ + return Stream.of( + Arguments.of("1.13.2-R0.1-SNAPSHOT", 1, 13, 2), + Arguments.of("1.13-R0.2-SNAPSHOT", 1, 13, 0), + Arguments.of("1.13.2-R0.1-SNAPSHOT", 1, 13, 2), + Arguments.of("1.13-pre7-R0.1-SNAPSHOT", 1, 13, 0), + Arguments.of("1.14-pre5-SNAPSHOT", 1, 14, 0), + Arguments.of("1.15-R0.1-SNAPSHOT", 1, 15, 0), + Arguments.of("1.16.5-R0.1-SNAPSHOT", 1, 16, 5), + Arguments.of("1.17-R0.1-SNAPSHOT", 1, 17, 0) + ); + } + +} diff --git a/src/test/java/com/gmail/nossr50/util/random/RandomChanceTest.java b/src/test/java/com/gmail/nossr50/util/random/RandomChanceTest.java new file mode 100644 index 000000000..f28e7e842 --- /dev/null +++ b/src/test/java/com/gmail/nossr50/util/random/RandomChanceTest.java @@ -0,0 +1,116 @@ +//package com.gmail.nossr50.util.random; +// +//import com.gmail.nossr50.datatypes.player.McMMOPlayer; +//import com.gmail.nossr50.datatypes.skills.PrimarySkillType; +//import com.gmail.nossr50.datatypes.skills.SubSkillType; +//import com.gmail.nossr50.util.Permissions; +//import com.gmail.nossr50.util.player.UserManager; +//import org.bukkit.entity.Player; +//import org.jetbrains.annotations.NotNull; +//import org.junit.Assert; +//import org.junit.Before; +//import org.junit.Test; +//import org.junit.runner.RunWith; +//import org.mockito.Mockito; +//import org.powermock.api.mockito.PowerMockito; +//import org.powermock.core.classloader.annotations.PrepareForTest; +//import org.powermock.modules.junit4.PowerMockRunner; +// +//import static org.mockito.Mockito.mock; +// +////TODO: Rewrite the entire com.gmail.nossr50.util.random package, it was written in haste and it disgusts me +////TODO: Add more tests for the other types of random dice rolls +//@RunWith(PowerMockRunner.class) +//@PrepareForTest({RandomChanceUtil.class, UserManager.class}) +//public class RandomChanceTest { +// +// private Player luckyPlayer; +// private McMMOPlayer mmoPlayerLucky; +// +// private Player normalPlayer; +// private McMMOPlayer mmoPlayerNormal; +// +// private SubSkillType subSkillType; +// private PrimarySkillType primarySkillType; +// +// private final String testASCIIHeader = "---- mcMMO Tests ----"; +// +// @Before +// public void setUpMock() { +// primarySkillType = PrimarySkillType.HERBALISM; +// subSkillType = SubSkillType.HERBALISM_GREEN_THUMB; +// +// //TODO: Likely needs to be changed per skill if more tests were added +// PowerMockito.stub(PowerMockito.method(RandomChanceUtil.class, "getMaximumProbability", subSkillType.getClass())).toReturn(100D); +// PowerMockito.stub(PowerMockito.method(RandomChanceUtil.class, "getMaxBonusLevelCap", subSkillType.getClass())).toReturn(1000D); +// +// normalPlayer = mock(Player.class); +// luckyPlayer = mock(Player.class); +// +// mmoPlayerNormal = mock(McMMOPlayer.class); +// mmoPlayerLucky = mock(McMMOPlayer.class); +// +// PowerMockito.mockStatic(UserManager.class); +// Mockito.when(UserManager.getPlayer(normalPlayer)).thenReturn(mmoPlayerNormal); +// Mockito.when(UserManager.getPlayer(luckyPlayer)).thenReturn(mmoPlayerLucky); +// +// Mockito.when(mmoPlayerNormal.getPlayer()).thenReturn(normalPlayer); +// Mockito.when(mmoPlayerLucky.getPlayer()).thenReturn(luckyPlayer); +// +// //Lucky player has the lucky permission +// //Normal player doesn't have any lucky permission +// Mockito.when(Permissions.lucky(luckyPlayer, primarySkillType)).thenReturn(true); +// Mockito.when(Permissions.lucky(normalPlayer, primarySkillType)).thenReturn(false); +// +// Mockito.when(mmoPlayerNormal.getSkillLevel(primarySkillType)).thenReturn(800); +// Mockito.when(mmoPlayerLucky.getSkillLevel(primarySkillType)).thenReturn(800); +// } +// +// @Test +// public void testLuckyChance() { +// System.out.println(testASCIIHeader); +// System.out.println("Testing success odds to fall within expected values..."); +// assertEquals(80D, getSuccessChance(mmoPlayerNormal),0D); +// assertEquals(80D * RandomChanceUtil.LUCKY_MODIFIER, getSuccessChance(mmoPlayerLucky),0D); +// } +// +// @Test +// public void testNeverFailsSuccessLuckyPlayer() { +// System.out.println(testASCIIHeader); +// System.out.println("Test - Lucky Player with 80% base success should never fail (10,000 iterations)"); +// for(int x = 0; x < 10000; x++) { +// Assert.assertTrue(RandomChanceUtil.checkRandomChanceExecutionSuccess(luckyPlayer, SubSkillType.HERBALISM_GREEN_THUMB, true)); +// if(x == 10000-1) +// System.out.println("They never failed!"); +// } +// } +// +// @Test +// public void testFailsAboutExpected() { +// System.out.println(testASCIIHeader); +// System.out.println("Test - Player with 800 skill should fail about 20% of the time (100,000 iterations)"); +// double ratioDivisor = 1000; //1000 because we run the test 100,000 times +// double expectedFailRate = 20D; +// +// double win = 0, loss = 0; +// for(int x = 0; x < 100000; x++) { +// if(RandomChanceUtil.checkRandomChanceExecutionSuccess(normalPlayer, SubSkillType.HERBALISM_GREEN_THUMB, true)) { +// win++; +// } else { +// loss++; +// } +// } +// +// double lossRatio = (loss / ratioDivisor); +// Assert.assertEquals(lossRatio, expectedFailRate, 1D); +// } +// +// private double getSuccessChance(@NotNull McMMOPlayer mmoPlayer) { +// RandomChanceSkill randomChanceSkill = new RandomChanceSkill(mmoPlayer.getPlayer(), subSkillType, true); +// return RandomChanceUtil.calculateChanceOfSuccess(randomChanceSkill); +// } +// +// private void assertEquals(double expected, double actual, double delta) { +// Assert.assertEquals(expected, actual, delta); +// } +//} diff --git a/src/test/java/com/gmail/nossr50/util/skills/SkillToolsTest.java b/src/test/java/com/gmail/nossr50/util/skills/SkillToolsTest.java new file mode 100644 index 000000000..4a295d5d3 --- /dev/null +++ b/src/test/java/com/gmail/nossr50/util/skills/SkillToolsTest.java @@ -0,0 +1,16 @@ +//package com.gmail.nossr50.util.skills; +// +//import com.gmail.nossr50.datatypes.skills.PrimarySkillType; +//import com.google.common.collect.ImmutableList; +//import org.junit.Before; +//import org.junit.Test; +//import org.junit.runner.RunWith; +//import org.powermock.core.classloader.annotations.PrepareForTest; +//import org.powermock.core.classloader.annotations.SuppressStaticInitializationFor; +//import org.powermock.modules.junit4.PowerMockRunner; +// +//@RunWith(PowerMockRunner.class) +//@PrepareForTest(SkillTools.class) +//public class SkillToolsTest { +// +//} \ No newline at end of file diff --git a/src/test/java/com/gmail/nossr50/util/text/TextUtilsTest.java b/src/test/java/com/gmail/nossr50/util/text/TextUtilsTest.java new file mode 100644 index 000000000..cefbe7010 --- /dev/null +++ b/src/test/java/com/gmail/nossr50/util/text/TextUtilsTest.java @@ -0,0 +1,32 @@ +package com.gmail.nossr50.util.text; + +import net.kyori.adventure.text.TextComponent; +import net.kyori.adventure.text.format.NamedTextColor; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; + +/** + * This Unit Test checks if Adventure was set up correctly and works as expected. + * Normally we can rely on this to be the case. However sometimes our dependencies + * lack so far behind that things stop working correctly. + * This test ensures that basic functionality is guaranteed to work as we would expect. + * + * See https://github.com/mcMMO-Dev/mcMMO/pull/4446 + * + */ +class TextUtilsTest { + + @Test + void testColorizeText() { + String inputText = "&4This text should be red."; + + /* + * If this method raises an exception, we know Adventure is not set up correctly. + * This will also make the test fail and warn us about it. + */ + TextComponent component = TextUtils.colorizeText(inputText); + + String message = "Looks like Adventure is not working correctly. We likely need to update our dependency!"; + Assertions.assertEquals(NamedTextColor.DARK_RED, component.color(), message); + } +} diff --git a/src/test/resources/baddatadb.users b/src/test/resources/baddatadb.users new file mode 100644 index 000000000..12584deca --- /dev/null +++ b/src/test/resources/baddatadb.users @@ -0,0 +1,23 @@ +mrfloris:2420:::0:2452:0:1983:1937:1790:3042:1138:3102:2408:3411:0:0:0:0:0:0:0:0::642:0:1617583171:0:1617165043:0:1617583004:1617563189:1616785408::2184:0:0:1617852413:HEARTS:415:0:631e3896-da2a-4077-974b-d047859d76bc:5:1600906906: +ender_vine:434:::33:93:0:115:115:389:216:88:287:130:468:380:944:150:90:0:0:1948:584::2:0:1584896276:1586477151:1585264062:0:1576456374:1534725135:1577535765::404:4207:0:1616024209:HEARTS:3:0:812c10b0-7bbf-49e5-ac53-3f0521eb504b:5:0: +electronicboy:225:::1876:16:0:99:137:148:308:109:418:193:430:0:854:0:0:0:0:260:2816::19:0:1604048398:1601216462:1563297488:1533836917:1571449594:1601219209:1601215461::406:4207:0:1617465739:HEARTS:7:0:e0d07db8-f7e8-43c7-9ded-864dfc6f3b7c:5:0: +z750:1074:::21081:231:0:280:65:156:463:612:742:550:1060:1000:1751:3666:5834:4871:11278:1943:13642::25:460:1613103021:1610212680:1609278207:0:1610076033:1586744907:1610150046::399:7050:0:1613611193:HEARTS:11:0:1594aa76-6ce0-46f6-90b2-83896a829db8:5:0: +Aikar:0:::0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0::0:0:0:0:0:0:0:0:0::0:0:0:1617623810:HEARTS:0:0:6c4ed41d-9936-45da-9f57-b0f4cfa451b4:0: +wizjany:0:::0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0::0:0:0:0:0:0:0:0:0::0:0:0:1617624693:HEARTS:0:0:0609efd6-e9ae-4f6a-bcff-69a6c890192f:0: +SpottedLeaf:0:::0:0:0:0:0:0:0:0:0:0:21:0:0:0:0:0:0:0:231::0:0:0:0:0:0:0:0:0::0:0:0:1617628585:HEARTS:0:0:6c002484-c964-4627-8026-9955d0d30aaf:0:0: +Cheesy:0:::0:0:0:0:0:0:0:0:0:0:6:0:0:0:0:0:0:0:882::0:0:0:0:0:0:0:0:0::0:0:0:1617636874:HEARTS:0:0:0a5804b3-f127-4962-8b83-f5f3dfe6d8e3:0:0: +Mochi:0:::0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0::0:0:0:0:0:0:0:0:0::0:0:0:1617642310:HEARTS:0:0:468fb276-444f-4c79-bb07-8a7a30f95606:0: +Futan:0:::0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0::0:0:0:0:0:0:0:0:0::0:0:0:1617644058:HEARTS:0:0:98f9e3c2-75ce-448c-b30b-01f93b69f0ca:0: +Dave:0:::0:0:0:0:0:0:0:0:0:0:0:0:61:0:0:0:0:0:0::0:0:0:0:0:0:0:0:0::0:0:0:1617653877:HEARTS:0:0:23926471-655b-4117-8ee6-7c718677f2e1:0:0: +MomShroom:0:::0:0:0:0:0:0:0:0:0:0:1:0:0:0:0:0:0:0:231::0:0:0:0:0:0:0:0:0::0:0:0:1617700103:HEARTS:0:0:eda1c2d5-7cf6-461c-aced-86954675b905:0:0: +broccolai:0:::0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0::0:0:0:0:0:0:0:0:0::0:0:0:1617736110:HEARTS:0:0:8a4f8f1c-8242-4c52-bd63-3a4f6fe85771:0: +gabizou:0:::0:0:0:0:0:0:0:0:0:0:6:0:0:0:0:0:692:897:231::0:0:0:0:0:0:0:0:0::0:302:0:1617744451:HEARTS:0:0:fd1ad842-8959-4433-9f09-406da1567f98:0:0: +Vera:18:::150:1:769:0:0:0:0:0:0:0:0:0:0:183:0:0:0:540:0::0:0:0:0:0:0:0:0:0::0:0:0:1617744730:HEARTS:0:0:0a95d72c-4316-4b25-a4ad-b0719843d723:0:0: +proxy:0:::189:1:0:1:1:0:0:0:0:1:0:36:96:0:0:0:0:181:0::1:0:0:0:0:0:0:0:0::0:0:0:1617792154:HEARTS:1:0:d8531191-e49b-4132-8223-e3b46f8450d2:0:0: +chew:4:::1011:0:0:0:0:0:2:0:0:0:0:0:61:0:432:0:0:0:651::0:0:0:0:0:0:0:0:0::0:0:0:1617794539:HEARTS:0:0:58cea4a2-1979-48e4-a171-eaa631376835:0:0: +t00thpick1:0:::0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0::0:0:0:0:0:0:0:0:0::0:0:0:1617798657:HEARTS:0:0:1300f1de-0108-43c3-839f-d40d7e0c7027:0: +kashike:1:::756:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0::0:0:0:0:0:0:0:0:0::0:0:0:1617826439:HEARTS:0:0:891825c2-2ceb-4b69-82c3-f2dfb47f9a6d:0:0: +camm:0:::0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0::0:0:0:0:0:0:0:0:0::0:0:0:1617830574:HEARTS:0:0:5c34f924-f7f6-4547-9e36-4234133e2162:0: +brandonxp4000:0:::0:0:0:0:0:0:0:0:2:0:1:0:181:0:0:0:54:0:231::0:0:0:0:0:0:0:0:0::0:0:0:1617887039:HEARTS:0:0:cbf7122b-0271-4daa-aeaa-3bc44e6dae88:0:0: +Tapola:1:::111:0:0:1:0:0:0:0:3:2:0:111:193:0:0:0:1010:92:0::0:0:0:0:0:0:0:0:0::0:0:0:1617886681:HEARTS:0:0:4a21353a-8ca1-436f-9b5f-d2e522dcf79e:0:0: +nossr51:baddata:::baddata:baddata:640:baddata:1000:1000:1000:baddata:baddata:baddata:baddata:16:0:500:20273:0:0:0:0::1000:0:0:baddata:1593543012:0:0:0:0::1000:0:0:baddata:IGNORED:1000:0:588fe472-1c82-4c4e-9aa1-7eefccb277e3:1:0: diff --git a/src/test/resources/healthydb.users b/src/test/resources/healthydb.users new file mode 100644 index 000000000..7ce5ccbad --- /dev/null +++ b/src/test/resources/healthydb.users @@ -0,0 +1,3 @@ +nossr50:1:IGNORED:IGNORED:10:2:20:3:4:5:6:7:8:9:10:30:40:50:60:70:80:90:100:IGNORED:11:110:111:222:333:444:555:666:777:IGNORED:12:120:888:IGNORED:HEARTS:13:130:588fe472-1c82-4c4e-9aa1-7eefccb277e3:1111:999:2020: +mrfloris:2420:::0:2452:0:1983:1937:1790:3042:1138:3102:2408:3411:0:0:0:0:0:0:0:0::642:0:1617583171:0:1617165043:0:1617583004:1617563189:1616785408::2184:0:0:1617852413:HEARTS:415:0:631e3896-da2a-4077-974b-d047859d76bc:5:1600906906:3030: +powerless:0:::0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0::0:0:0:0:0:0:0:0:0::0:0:0:1337:HEARTS:0:0:e0d07db8-f7e8-43c7-9ded-864dfc6f3b7c:5:1600906906:4040: \ No newline at end of file diff --git a/src/test/resources/missinglastlogin.users b/src/test/resources/missinglastlogin.users new file mode 100644 index 000000000..54378e194 --- /dev/null +++ b/src/test/resources/missinglastlogin.users @@ -0,0 +1,4 @@ +# A single comment line is sometimes at the top of the DB +nossr50:1:IGNORED:IGNORED:10:2:20:3:4:5:6:7:8:9:10:30:40:50:60:70:80:90:100:IGNORED:11:110:111:222:333:444:555:666:777:IGNORED:12:120:888:0:HEARTS:13:130:588fe472-1c82-4c4e-9aa1-7eefccb277e3:1111:999: +mrfloris:2420:::0:2452:0:1983:1937:1790:3042:1138:3102:2408:3411:0:0:0:0:0:0:0:0::642:0:1617583171:0:1617165043:0:1617583004:1617563189:1616785408::2184:0:0:1617852413:HEARTS:415:0:631e3896-da2a-4077-974b-d047859d76bc:5:1600906906: +powerless:0:::0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0::0:0:0:0:0:0:0:0:0::0:0:0:1337:HEARTS:0:0:e0d07db8-f7e8-43c7-9ded-864dfc6f3b7c:5:1600906906: \ No newline at end of file